/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.facebook.react.fabric.events;

import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.bridge.NativeMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;
import com.facebook.react.fabric.FabricSoLoader;

/**
 * This class holds reference to the C++ EventEmitter object. Instances of this class are created on
 * the Bindings.cpp, where the pointer to the C++ event emitter is set.
 */
@SuppressLint("MissingNativeLoadLibrary")
public class EventEmitterWrapper {

  static {
    FabricSoLoader.staticInit();
  }

  @DoNotStrip private final HybridData mHybridData;

  private static native HybridData initHybrid();

  private EventEmitterWrapper() {
    mHybridData = initHybrid();
  }

  private native void invokeEvent(@NonNull String eventName, @NonNull NativeMap params);

  private native void invokeUniqueEvent(
      @NonNull String eventName, @NonNull NativeMap params, int customCoalesceKey);

  /**
   * Invokes the execution of the C++ EventEmitter.
   *
   * @param eventName {@link String} name of the event to execute.
   * @param params {@link WritableMap} payload of the event
   */
  public void invoke(@NonNull String eventName, @Nullable WritableMap params) {
    NativeMap payload = params == null ? new WritableNativeMap() : (NativeMap) params;
    invokeEvent(eventName, payload);
  }

  /**
   * Invokes the execution of the C++ EventEmitter. C++ will coalesce events sent to the same
   * target.
   *
   * @param eventName {@link String} name of the event to execute.
   * @param params {@link WritableMap} payload of the event
   */
  public void invokeUnique(
      @NonNull String eventName, @Nullable WritableMap params, int customCoalesceKey) {
    NativeMap payload = params == null ? new WritableNativeMap() : (NativeMap) params;
    invokeUniqueEvent(eventName, payload, customCoalesceKey);
  }

  public void destroy() {
    if (mHybridData != null) {
      mHybridData.resetNative();
    }
  }
}

@@ -1589,24 +1589,66 @@
 p params) %7B%0A
+    if (!isValid()) %7B%0A      return;%0A    %7D%0A
     NativeMa
@@ -2127,24 +2127,66 @@
 lesceKey) %7B%0A
+    if (!isValid()) %7B%0A      return;%0A    %7D%0A
     NativeMa
@@ -2426,11 +2426,137 @@
    %7D%0A  %7D
+%0A%0A  private boolean isValid() %7B%0A    if (mHybridData != null) %7B%0A      return mHybridData.isValid();%0A    %7D%0A    return false;%0A  %7D
 %0A%7D%0A

Check if instance is valid before calling C++