react-native-persona 2.42.1-beta.1 → 2.42.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ require 'json'
2
2
 
3
3
  package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
4
4
 
5
- persona_sdk_version = '2.48.0'
5
+ persona_sdk_version = '2.48.1-beta.2'
6
6
 
7
7
  Pod::Spec.new do |s|
8
8
  s.name = 'RNPersonaInquiry2'
@@ -17,6 +17,7 @@ import androidx.fragment.app.FragmentActivity;
17
17
  import com.facebook.react.bridge.ReactApplicationContext;
18
18
  import com.facebook.react.bridge.ReadableArray;
19
19
  import com.facebook.react.bridge.ReadableMap;
20
+ import com.facebook.react.bridge.UiThreadUtil;
20
21
  import com.facebook.react.common.MapBuilder;
21
22
  import com.facebook.react.uimanager.ThemedReactContext;
22
23
  import com.facebook.react.uimanager.ViewGroupManager;
@@ -27,6 +28,11 @@ import com.withpersona.sdk2.inquiry.inline_inquiry.InquiryEvent;
27
28
  import com.withpersona.sdk2.inquiry.types.collected_data.ErrorCode;
28
29
 
29
30
  import java.util.Map;
31
+ import java.util.WeakHashMap;
32
+ import java.util.concurrent.Executors;
33
+ import java.util.concurrent.ScheduledExecutorService;
34
+ import java.util.concurrent.ScheduledFuture;
35
+ import java.util.concurrent.TimeUnit;
30
36
 
31
37
  class PersonaInquiryViewManager extends ViewGroupManager<FrameLayout> {
32
38
  public static final String REACT_CLASS = "PersonaInquiryView";
@@ -42,6 +48,26 @@ class PersonaInquiryViewManager extends ViewGroupManager<FrameLayout> {
42
48
  private FrameLayout pendingRoot;
43
49
  private int pendingViewId = -1;
44
50
 
51
+ // --- Init watchdog (opt-in via the `enableInitWatchdog` prop) ---
52
+ // Guards against the create command never reaching native (e.g. when the RN
53
+ // bridge / JS thread is congested), which otherwise leaves the view blank
54
+ // with no callback ever firing. When enabled, fires onError if the inquiry
55
+ // hasn't started within the configured timeout. Off by default, so
56
+ // integrations that don't opt in never arm a timer.
57
+ private static final int DEFAULT_INIT_WATCHDOG_TIMEOUT_MS = 10_000;
58
+ private static final String INIT_WATCHDOG_ERROR = "The inquiry failed to start in time.";
59
+
60
+ @Nullable
61
+ private ScheduledExecutorService watchdogExecutor;
62
+ private final WeakHashMap<FrameLayout, WatchdogState> watchdogStates = new WeakHashMap<>();
63
+
64
+ private static final class WatchdogState {
65
+ boolean enabled = false;
66
+ int timeoutMs = DEFAULT_INIT_WATCHDOG_TIMEOUT_MS;
67
+ boolean inquiryStarted = false;
68
+ @Nullable ScheduledFuture<?> future;
69
+ }
70
+
45
71
  public PersonaInquiryViewManager(@NonNull ReactApplicationContext reactContext) {
46
72
  this.reactContext = reactContext;
47
73
  }
@@ -111,6 +137,106 @@ class PersonaInquiryViewManager extends ViewGroupManager<FrameLayout> {
111
137
  }
112
138
  }
113
139
 
140
+ @ReactProp(name = "enableInitWatchdog")
141
+ public void setEnableInitWatchdog(FrameLayout view, boolean enabled) {
142
+ // Only record intent here; arming happens in onAfterUpdateTransaction once
143
+ // the whole prop batch (including the timeout) has been applied.
144
+ getOrCreateWatchdogState(view).enabled = enabled;
145
+ }
146
+
147
+ @ReactProp(name = "initWatchdogTimeoutMs", defaultInt = DEFAULT_INIT_WATCHDOG_TIMEOUT_MS)
148
+ public void setInitWatchdogTimeoutMs(FrameLayout view, int timeoutMs) {
149
+ getOrCreateWatchdogState(view).timeoutMs =
150
+ timeoutMs > 0 ? timeoutMs : DEFAULT_INIT_WATCHDOG_TIMEOUT_MS;
151
+ }
152
+
153
+ @Override
154
+ protected void onAfterUpdateTransaction(@NonNull FrameLayout view) {
155
+ super.onAfterUpdateTransaction(view);
156
+ // Arm here (not in the prop setters) so both enableInitWatchdog and the
157
+ // timeout are known, regardless of the order RN applied them in.
158
+ WatchdogState state = watchdogStates.get(view);
159
+ if (state != null && state.enabled && !state.inquiryStarted && state.future == null) {
160
+ armInitWatchdog(view, state);
161
+ }
162
+ }
163
+
164
+ private WatchdogState getOrCreateWatchdogState(@NonNull FrameLayout view) {
165
+ WatchdogState state = watchdogStates.get(view);
166
+ if (state == null) {
167
+ state = new WatchdogState();
168
+ watchdogStates.put(view, state);
169
+ }
170
+ return state;
171
+ }
172
+
173
+ private ScheduledExecutorService getWatchdogExecutor() {
174
+ if (watchdogExecutor == null) {
175
+ watchdogExecutor = Executors.newSingleThreadScheduledExecutor();
176
+ }
177
+ return watchdogExecutor;
178
+ }
179
+
180
+ /**
181
+ * Starts a background timer that fires onError if the inquiry hasn't started
182
+ * within the timeout. The timer runs off the main thread so a congested main
183
+ * thread doesn't also stall the watchdog. Note this only rescues cases where
184
+ * the JS runtime recovers enough to deliver the event; a permanently blocked
185
+ * JS thread cannot receive any callback.
186
+ */
187
+ private void armInitWatchdog(@NonNull FrameLayout view, @NonNull WatchdogState state) {
188
+ final WatchdogState finalState = state;
189
+ final int timeoutMs = state.timeoutMs;
190
+ state.future = getWatchdogExecutor().schedule(
191
+ () -> UiThreadUtil.runOnUiThread(() -> {
192
+ // Skip if the inquiry started, or the view is gone (unmounted).
193
+ if (finalState.inquiryStarted || !view.isAttachedToWindow()) {
194
+ return;
195
+ }
196
+ new InquiryResultEmitter(reactContext).emitResponse(
197
+ new InquiryResponse.Error(
198
+ INIT_WATCHDOG_ERROR,
199
+ ErrorCode.UnexpectedError,
200
+ "Inquiry did not start within "
201
+ + (timeoutMs / 1000) + "s of mount."
202
+ ),
203
+ view
204
+ );
205
+ }),
206
+ timeoutMs,
207
+ TimeUnit.MILLISECONDS
208
+ );
209
+ }
210
+
211
+ /**
212
+ * Marks the inquiry as started and cancels any pending timer. Called once the
213
+ * create path runs (success or failure) or the view is dropped, so onError is
214
+ * never fired after the inquiry has started or the view has gone away.
215
+ *
216
+ * Early-returns when no state exists so non-opted-in views stay allocation
217
+ * free. This relies on the watchdog being set at mount (its props land before
218
+ * the deferred create command), not toggled on after an inquiry has already
219
+ * started.
220
+ */
221
+ private void resolveInitWatchdog(@NonNull FrameLayout view) {
222
+ WatchdogState state = watchdogStates.get(view);
223
+ if (state == null) {
224
+ return;
225
+ }
226
+ state.inquiryStarted = true;
227
+ if (state.future != null) {
228
+ state.future.cancel(false);
229
+ state.future = null;
230
+ }
231
+ }
232
+
233
+ @Override
234
+ public void onDropViewInstance(@NonNull FrameLayout view) {
235
+ resolveInitWatchdog(view);
236
+ watchdogStates.remove(view);
237
+ super.onDropViewInstance(view);
238
+ }
239
+
114
240
  @Override
115
241
  @NonNull
116
242
  public Map getExportedCustomBubblingEventTypeConstants() {
@@ -146,6 +272,10 @@ class PersonaInquiryViewManager extends ViewGroupManager<FrameLayout> {
146
272
  * Replace React Native view with an Inquiry fragment
147
273
  */
148
274
  public void createFragment(FrameLayout root, int reactNativeViewId) {
275
+ // The create path has been reached, so the init watchdog (if armed) is no
276
+ // longer needed.
277
+ resolveInitWatchdog(root);
278
+
149
279
  ViewGroup parentView = root.findViewById(reactNativeViewId);
150
280
  setupLayout(parentView);
151
281
 
@@ -11,6 +11,8 @@ RCT_EXTERN_METHOD(startInquiry:(NSDictionary *)options)
11
11
  @interface RCT_EXTERN_MODULE(PersonaInquiryView, RCTViewManager)
12
12
 
13
13
  RCT_EXPORT_VIEW_PROPERTY(inquiry, NSDictionary)
14
+ RCT_EXPORT_VIEW_PROPERTY(enableInitWatchdog, BOOL)
15
+ RCT_EXPORT_VIEW_PROPERTY(initWatchdogTimeoutMs, NSNumber)
14
16
  RCT_EXPORT_VIEW_PROPERTY(onComplete, RCTDirectEventBlock)
15
17
  RCT_EXPORT_VIEW_PROPERTY(onCanceled, RCTDirectEventBlock)
16
18
  RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
@@ -25,6 +25,21 @@ final class PersonaInquiryView: UIView {
25
25
  manager?.createInlineInquiry(view: self)
26
26
  }
27
27
  }
28
+ // Opt-in init watchdog config. When enabled, fires onError if the inquiry
29
+ // hasn't started within the timeout. Off by default, so integrations that
30
+ // don't opt in are unaffected.
31
+ @objc var enableInitWatchdog: Bool = false {
32
+ didSet {
33
+ // Defer to the next main-queue tick so the rest of this prop batch
34
+ // (notably initWatchdogTimeoutMs) is applied before we read it,
35
+ // regardless of the order RN set the props in.
36
+ DispatchQueue.main.async { [weak self] in
37
+ guard let self = self else { return }
38
+ self.manager?.armInitWatchdogIfNeeded(view: self)
39
+ }
40
+ }
41
+ }
42
+ @objc var initWatchdogTimeoutMs: NSNumber = 10_000
28
43
  @objc var onComplete: RCTDirectEventBlock?
29
44
  @objc var onCanceled: RCTDirectEventBlock?
30
45
  @objc var onError: RCTDirectEventBlock?
@@ -32,6 +47,10 @@ final class PersonaInquiryView: UIView {
32
47
  @objc var onReady: RCTDirectEventBlock?
33
48
 
34
49
  weak var manager: PersonaInquiryViewManager?
50
+
51
+ // Watchdog bookkeeping. Read/written only on the main thread.
52
+ var inquiryStarted = false
53
+ var watchdogWorkItem: DispatchWorkItem?
35
54
  }
36
55
 
37
56
  // file private for this variable avoids clang module linker bug
@@ -76,10 +95,43 @@ final class PersonaInquiryViewManager: RCTViewManager {
76
95
  }
77
96
  }
78
97
 
98
+ /// Starts a background timer that fires onError if the inquiry hasn't started
99
+ /// within the timeout. The timer runs off the main thread so a congested main
100
+ /// thread doesn't also stall the watchdog. Note this only rescues cases where
101
+ /// the JS runtime recovers enough to deliver the event; a permanently blocked
102
+ /// JS thread cannot receive any callback.
103
+ @objc
104
+ func armInitWatchdogIfNeeded(view: PersonaInquiryView) {
105
+ guard view.enableInitWatchdog else { return }
106
+ guard view.watchdogWorkItem == nil, !view.inquiryStarted else { return }
107
+
108
+ let timeoutSeconds = view.initWatchdogTimeoutMs.doubleValue / 1000.0
109
+ guard timeoutSeconds > 0 else { return }
110
+
111
+ let workItem = DispatchWorkItem { [weak view] in
112
+ DispatchQueue.main.async {
113
+ // Skip if the inquiry started, or the view is gone (unmounted).
114
+ guard let view = view, view.window != nil, !view.inquiryStarted else { return }
115
+ view.onError?([
116
+ "debugMessage": "Inquiry did not start within \(Int(timeoutSeconds))s of mount.",
117
+ "errorCode": "UnexpectedError",
118
+ ])
119
+ }
120
+ }
121
+ view.watchdogWorkItem = workItem
122
+ DispatchQueue.global().asyncAfter(deadline: .now() + timeoutSeconds, execute: workItem)
123
+ }
124
+
79
125
  private func createInquiry(
80
126
  for inquiryView: PersonaInquiryView,
81
127
  options: NSDictionary
82
128
  ) {
129
+ // The create path has been reached, so the init watchdog (if armed) is no
130
+ // longer needed.
131
+ inquiryView.inquiryStarted = true
132
+ inquiryView.watchdogWorkItem?.cancel()
133
+ inquiryView.watchdogWorkItem = nil
134
+
83
135
  let templateId = options["templateId"] as? String
84
136
  let templateVersion = options["templateVersion"] as? String
85
137
  let inquiryId = options["inquiryId"] as? String
@@ -10,6 +10,7 @@ var _reactNative = require("react-native");
10
10
  var _PersonaInquiryViewManager = require("./PersonaInquiryViewManager");
11
11
  var _util = require("./util");
12
12
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
13
14
  // Each mounted PersonaInquiryView registers a listener here so the module-level
14
15
  // onEvent dispatcher (called from src/index.ts) can route events to the
15
16
  // currently-mounted instances. Holding the state per-instance avoids
@@ -66,7 +67,14 @@ function PersonaInquiryView(props) {
66
67
  }, props.onError);
67
68
  return;
68
69
  }
69
- _reactNative.UIManager.dispatchViewManagerCommand(viewId, viewManagerConfig.Commands.create, [viewId]);
70
+ // Defer the dispatch to the next frame. Dispatching during React's
71
+ // commit phase can leave the command stranded on RN's UIManager queue
72
+ // for ~30s if no other JS work follows. requestAnimationFrame ties into
73
+ // the native frame loop and lands the command in a batch that flushes
74
+ // on the next tick.
75
+ requestAnimationFrame(() => {
76
+ _reactNative.UIManager.dispatchViewManagerCommand(viewId, viewManagerConfig.Commands.create, [viewId]);
77
+ });
70
78
  } catch (error) {
71
79
  (0, _util.callOnErrorCallback)({
72
80
  debugMessage: 'Error dispatching create command.',
@@ -101,15 +109,19 @@ function PersonaInquiryView(props) {
101
109
  const _onReady = (0, _react.useCallback)(() => {
102
110
  (0, _util.callOnReadyCallback)(props.onReady);
103
111
  }, [props.onReady]);
104
- return /*#__PURE__*/_react.default.createElement(_PersonaInquiryViewManager.PersonaInquiryViewManager, {
112
+ return /*#__PURE__*/_react.default.createElement(_PersonaInquiryViewManager.PersonaInquiryViewManager, _extends({
105
113
  style: props.style,
106
114
  inquiry: props.inquiry.toOptionsJson(),
107
115
  onComplete: _onComplete,
108
116
  onCanceled: _onCanceled,
109
117
  onError: _onError,
110
118
  onEvent: _onEvent,
111
- onReady: _onReady,
119
+ onReady: _onReady
120
+ }, props.enableInitWatchdog ? {
121
+ enableInitWatchdog: true,
122
+ initWatchdogTimeoutMs: props.initWatchdogTimeoutMs ?? 10000
123
+ } : {}, {
112
124
  ref: ref
113
- });
125
+ }));
114
126
  }
115
127
  //# sourceMappingURL=PersonaInquiryView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_PersonaInquiryViewManager","_util","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","activeListeners","Set","onPersonaInquiryViewEvent","event","type","forEach","l","onReadyCalled","current","setTimeout","onReadyCallback","exports","PersonaInquiryView","props","ref","useRef","onReadyCalledRef","onReadyCallbackRef","useEffect","onReady","create","viewId","callOnErrorCallback","debugMessage","errorCode","onError","viewManagerConfig","UIManager","getViewManagerConfig","Commands","dispatchViewManagerCommand","error","findNodeHandle","listener","add","delete","_onComplete","useCallback","callOnCompleteCallback","nativeEvent","onComplete","_onCanceled","callOnCanceledCallback","onCanceled","_onError","_onEvent","callOnEventCallback","onEvent","_onReady","callOnReadyCallback","createElement","PersonaInquiryViewManager","style","inquiry","toOptionsJson"],"sources":["PersonaInquiryView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport { findNodeHandle, UIManager } from 'react-native';\nimport { PersonaInquiryViewManager } from './PersonaInquiryViewManager';\nimport {\n callOnCanceledCallback,\n callOnCompleteCallback,\n callOnErrorCallback,\n callOnEventCallback,\n callOnReadyCallback,\n} from './util';\nimport type {\n OnReadyCallback,\n OnCanceledCallback,\n OnCompleteCallback,\n OnErrorCallback,\n OnEventCallback,\n} from './callbacks';\nimport type { InquiryEvent } from './InquiryEvent';\n\n// Each mounted PersonaInquiryView registers a listener here so the module-level\n// onEvent dispatcher (called from src/index.ts) can route events to the\n// currently-mounted instances. Holding the state per-instance avoids\n// cross-mount poisoning when late events arrive from a torn-down SDK after a\n// previous PersonaInquiryView has unmounted but before the next one mounts.\ntype Listener = {\n onReadyCalled: React.MutableRefObject<boolean>;\n onReadyCallback: React.MutableRefObject<() => void>;\n};\n\nconst activeListeners = new Set<Listener>();\n\nexport const onPersonaInquiryViewEvent: OnEventCallback = (\n event: InquiryEvent\n) => {\n if (event.type == 'start') {\n activeListeners.forEach((l) => {\n l.onReadyCalled.current = false;\n });\n } else if (event.type == 'page_change') {\n activeListeners.forEach((l) => {\n if (!l.onReadyCalled.current) {\n l.onReadyCalled.current = true;\n\n setTimeout(function () {\n // The instance may have unmounted between scheduling and firing;\n // skip the callback if so.\n if (activeListeners.has(l)) {\n l.onReadyCallback.current();\n }\n }, 400);\n }\n });\n }\n};\n\nexport default function PersonaInquiryView(props: {\n style: any;\n inquiry: any;\n onComplete: OnCompleteCallback;\n onCanceled: OnCanceledCallback;\n onError: OnErrorCallback;\n onEvent?: OnEventCallback;\n onReady: OnReadyCallback;\n}) {\n const ref = useRef(null);\n const onReadyCalledRef = useRef(false);\n const onReadyCallbackRef = useRef<() => void>(() => {});\n\n // Keep the per-instance callback ref pointing at the latest onReady prop.\n useEffect(() => {\n onReadyCallbackRef.current = () => {\n props.onReady();\n };\n }, [props.onReady]);\n\n const create = (viewId: number | null) => {\n try {\n if (viewId == null) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n\n const viewManagerConfig =\n UIManager.getViewManagerConfig('PersonaInquiryView');\n if (!viewManagerConfig || !viewManagerConfig.Commands) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView config not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n UIManager.dispatchViewManagerCommand(\n viewId,\n viewManagerConfig.Commands.create,\n [viewId]\n );\n } catch (error) {\n callOnErrorCallback({ \n debugMessage: 'Error dispatching create command.', \n errorCode: 'UnexpectedError' \n }, props.onError);\n }\n };\n\n useEffect(() => {\n const viewId = findNodeHandle(ref.current);\n\n const listener: Listener = {\n onReadyCalled: onReadyCalledRef,\n onReadyCallback: onReadyCallbackRef,\n };\n activeListeners.add(listener);\n\n create(viewId);\n\n return () => {\n activeListeners.delete(listener);\n };\n }, []);\n\n const _onComplete = useCallback(\n (event: any) => {\n callOnCompleteCallback(event.nativeEvent, props.onComplete);\n },\n [props.onComplete]\n );\n\n const _onCanceled = useCallback(\n (event: any) => {\n callOnCanceledCallback(event.nativeEvent, props.onCanceled);\n },\n [props.onCanceled]\n );\n\n const _onError = useCallback(\n (event: any) => {\n callOnErrorCallback(event.nativeEvent, props.onError);\n },\n [props.onError]\n );\n\n const _onEvent = useCallback(\n (event: any) => {\n callOnEventCallback(event.nativeEvent, props.onEvent);\n },\n [props.onEvent]\n );\n\n const _onReady = useCallback(() => {\n callOnReadyCallback(props.onReady);\n }, [props.onReady]);\n\n return (\n <PersonaInquiryViewManager\n style={props.style}\n inquiry={props.inquiry.toOptionsJson()}\n onComplete={_onComplete}\n onCanceled={_onCanceled}\n onError={_onError}\n onEvent={_onEvent}\n onReady={_onReady}\n ref={ref}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_PersonaInquiryViewManager","_util","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","activeListeners","Set","onPersonaInquiryViewEvent","event","type","forEach","l","onReadyCalled","current","setTimeout","onReadyCallback","exports","PersonaInquiryView","props","ref","useRef","onReadyCalledRef","onReadyCallbackRef","useEffect","onReady","create","viewId","callOnErrorCallback","debugMessage","errorCode","onError","viewManagerConfig","UIManager","getViewManagerConfig","Commands","requestAnimationFrame","dispatchViewManagerCommand","error","findNodeHandle","listener","add","delete","_onComplete","useCallback","callOnCompleteCallback","nativeEvent","onComplete","_onCanceled","callOnCanceledCallback","onCanceled","_onError","_onEvent","callOnEventCallback","onEvent","_onReady","callOnReadyCallback","createElement","PersonaInquiryViewManager","style","inquiry","toOptionsJson","enableInitWatchdog","initWatchdogTimeoutMs"],"sources":["PersonaInquiryView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport { findNodeHandle, UIManager } from 'react-native';\nimport { PersonaInquiryViewManager } from './PersonaInquiryViewManager';\nimport {\n callOnCanceledCallback,\n callOnCompleteCallback,\n callOnErrorCallback,\n callOnEventCallback,\n callOnReadyCallback,\n} from './util';\nimport type {\n OnReadyCallback,\n OnCanceledCallback,\n OnCompleteCallback,\n OnErrorCallback,\n OnEventCallback,\n} from './callbacks';\nimport type { InquiryEvent } from './InquiryEvent';\n\n// Each mounted PersonaInquiryView registers a listener here so the module-level\n// onEvent dispatcher (called from src/index.ts) can route events to the\n// currently-mounted instances. Holding the state per-instance avoids\n// cross-mount poisoning when late events arrive from a torn-down SDK after a\n// previous PersonaInquiryView has unmounted but before the next one mounts.\ntype Listener = {\n onReadyCalled: React.MutableRefObject<boolean>;\n onReadyCallback: React.MutableRefObject<() => void>;\n};\n\nconst activeListeners = new Set<Listener>();\n\nexport const onPersonaInquiryViewEvent: OnEventCallback = (\n event: InquiryEvent\n) => {\n if (event.type == 'start') {\n activeListeners.forEach((l) => {\n l.onReadyCalled.current = false;\n });\n } else if (event.type == 'page_change') {\n activeListeners.forEach((l) => {\n if (!l.onReadyCalled.current) {\n l.onReadyCalled.current = true;\n\n setTimeout(function () {\n // The instance may have unmounted between scheduling and firing;\n // skip the callback if so.\n if (activeListeners.has(l)) {\n l.onReadyCallback.current();\n }\n }, 400);\n }\n });\n }\n};\n\nexport default function PersonaInquiryView(props: {\n style: any;\n inquiry: any;\n onComplete: OnCompleteCallback;\n onCanceled: OnCanceledCallback;\n onError: OnErrorCallback;\n onEvent?: OnEventCallback;\n onReady: OnReadyCallback;\n // Opt-in. Fires onError if the inquiry doesn't start within\n // `initWatchdogTimeoutMs` of mount, as a safety net for when the create\n // command stalls before reaching native. Off by default.\n enableInitWatchdog?: boolean;\n // Timeout for the init watchdog, in ms. Only applies when\n // `enableInitWatchdog` is true. Defaults to 10000. Tune higher on slow\n // devices to avoid firing on a legitimately slow cold start.\n initWatchdogTimeoutMs?: number;\n}) {\n const ref = useRef(null);\n const onReadyCalledRef = useRef(false);\n const onReadyCallbackRef = useRef<() => void>(() => {});\n\n // Keep the per-instance callback ref pointing at the latest onReady prop.\n useEffect(() => {\n onReadyCallbackRef.current = () => {\n props.onReady();\n };\n }, [props.onReady]);\n\n const create = (viewId: number | null) => {\n try {\n if (viewId == null) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n\n const viewManagerConfig =\n UIManager.getViewManagerConfig('PersonaInquiryView');\n if (!viewManagerConfig || !viewManagerConfig.Commands) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView config not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n // Defer the dispatch to the next frame. Dispatching during React's\n // commit phase can leave the command stranded on RN's UIManager queue\n // for ~30s if no other JS work follows. requestAnimationFrame ties into\n // the native frame loop and lands the command in a batch that flushes\n // on the next tick.\n requestAnimationFrame(() => {\n UIManager.dispatchViewManagerCommand(\n viewId,\n viewManagerConfig.Commands.create,\n [viewId]\n );\n });\n } catch (error) {\n callOnErrorCallback({ \n debugMessage: 'Error dispatching create command.', \n errorCode: 'UnexpectedError' \n }, props.onError);\n }\n };\n\n useEffect(() => {\n const viewId = findNodeHandle(ref.current);\n\n const listener: Listener = {\n onReadyCalled: onReadyCalledRef,\n onReadyCallback: onReadyCallbackRef,\n };\n activeListeners.add(listener);\n\n create(viewId);\n\n return () => {\n activeListeners.delete(listener);\n };\n }, []);\n\n const _onComplete = useCallback(\n (event: any) => {\n callOnCompleteCallback(event.nativeEvent, props.onComplete);\n },\n [props.onComplete]\n );\n\n const _onCanceled = useCallback(\n (event: any) => {\n callOnCanceledCallback(event.nativeEvent, props.onCanceled);\n },\n [props.onCanceled]\n );\n\n const _onError = useCallback(\n (event: any) => {\n callOnErrorCallback(event.nativeEvent, props.onError);\n },\n [props.onError]\n );\n\n const _onEvent = useCallback(\n (event: any) => {\n callOnEventCallback(event.nativeEvent, props.onEvent);\n },\n [props.onEvent]\n );\n\n const _onReady = useCallback(() => {\n callOnReadyCallback(props.onReady);\n }, [props.onReady]);\n\n return (\n <PersonaInquiryViewManager\n style={props.style}\n inquiry={props.inquiry.toOptionsJson()}\n onComplete={_onComplete}\n onCanceled={_onCanceled}\n onError={_onError}\n onEvent={_onEvent}\n onReady={_onReady}\n {...(props.enableInitWatchdog\n ? {\n enableInitWatchdog: true,\n initWatchdogTimeoutMs: props.initWatchdogTimeoutMs ?? 10000,\n }\n : {})}\n ref={ref}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
1
2
  import React, { useCallback, useEffect, useRef } from 'react';
2
3
  import { findNodeHandle, UIManager } from 'react-native';
3
4
  import { PersonaInquiryViewManager } from './PersonaInquiryViewManager';
@@ -58,7 +59,14 @@ export default function PersonaInquiryView(props) {
58
59
  }, props.onError);
59
60
  return;
60
61
  }
61
- UIManager.dispatchViewManagerCommand(viewId, viewManagerConfig.Commands.create, [viewId]);
62
+ // Defer the dispatch to the next frame. Dispatching during React's
63
+ // commit phase can leave the command stranded on RN's UIManager queue
64
+ // for ~30s if no other JS work follows. requestAnimationFrame ties into
65
+ // the native frame loop and lands the command in a batch that flushes
66
+ // on the next tick.
67
+ requestAnimationFrame(() => {
68
+ UIManager.dispatchViewManagerCommand(viewId, viewManagerConfig.Commands.create, [viewId]);
69
+ });
62
70
  } catch (error) {
63
71
  callOnErrorCallback({
64
72
  debugMessage: 'Error dispatching create command.',
@@ -93,15 +101,19 @@ export default function PersonaInquiryView(props) {
93
101
  const _onReady = useCallback(() => {
94
102
  callOnReadyCallback(props.onReady);
95
103
  }, [props.onReady]);
96
- return /*#__PURE__*/React.createElement(PersonaInquiryViewManager, {
104
+ return /*#__PURE__*/React.createElement(PersonaInquiryViewManager, _extends({
97
105
  style: props.style,
98
106
  inquiry: props.inquiry.toOptionsJson(),
99
107
  onComplete: _onComplete,
100
108
  onCanceled: _onCanceled,
101
109
  onError: _onError,
102
110
  onEvent: _onEvent,
103
- onReady: _onReady,
111
+ onReady: _onReady
112
+ }, props.enableInitWatchdog ? {
113
+ enableInitWatchdog: true,
114
+ initWatchdogTimeoutMs: props.initWatchdogTimeoutMs ?? 10000
115
+ } : {}, {
104
116
  ref: ref
105
- });
117
+ }));
106
118
  }
107
119
  //# sourceMappingURL=PersonaInquiryView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useRef","findNodeHandle","UIManager","PersonaInquiryViewManager","callOnCanceledCallback","callOnCompleteCallback","callOnErrorCallback","callOnEventCallback","callOnReadyCallback","activeListeners","Set","onPersonaInquiryViewEvent","event","type","forEach","l","onReadyCalled","current","setTimeout","has","onReadyCallback","PersonaInquiryView","props","ref","onReadyCalledRef","onReadyCallbackRef","onReady","create","viewId","debugMessage","errorCode","onError","viewManagerConfig","getViewManagerConfig","Commands","dispatchViewManagerCommand","error","listener","add","delete","_onComplete","nativeEvent","onComplete","_onCanceled","onCanceled","_onError","_onEvent","onEvent","_onReady","createElement","style","inquiry","toOptionsJson"],"sources":["PersonaInquiryView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport { findNodeHandle, UIManager } from 'react-native';\nimport { PersonaInquiryViewManager } from './PersonaInquiryViewManager';\nimport {\n callOnCanceledCallback,\n callOnCompleteCallback,\n callOnErrorCallback,\n callOnEventCallback,\n callOnReadyCallback,\n} from './util';\nimport type {\n OnReadyCallback,\n OnCanceledCallback,\n OnCompleteCallback,\n OnErrorCallback,\n OnEventCallback,\n} from './callbacks';\nimport type { InquiryEvent } from './InquiryEvent';\n\n// Each mounted PersonaInquiryView registers a listener here so the module-level\n// onEvent dispatcher (called from src/index.ts) can route events to the\n// currently-mounted instances. Holding the state per-instance avoids\n// cross-mount poisoning when late events arrive from a torn-down SDK after a\n// previous PersonaInquiryView has unmounted but before the next one mounts.\ntype Listener = {\n onReadyCalled: React.MutableRefObject<boolean>;\n onReadyCallback: React.MutableRefObject<() => void>;\n};\n\nconst activeListeners = new Set<Listener>();\n\nexport const onPersonaInquiryViewEvent: OnEventCallback = (\n event: InquiryEvent\n) => {\n if (event.type == 'start') {\n activeListeners.forEach((l) => {\n l.onReadyCalled.current = false;\n });\n } else if (event.type == 'page_change') {\n activeListeners.forEach((l) => {\n if (!l.onReadyCalled.current) {\n l.onReadyCalled.current = true;\n\n setTimeout(function () {\n // The instance may have unmounted between scheduling and firing;\n // skip the callback if so.\n if (activeListeners.has(l)) {\n l.onReadyCallback.current();\n }\n }, 400);\n }\n });\n }\n};\n\nexport default function PersonaInquiryView(props: {\n style: any;\n inquiry: any;\n onComplete: OnCompleteCallback;\n onCanceled: OnCanceledCallback;\n onError: OnErrorCallback;\n onEvent?: OnEventCallback;\n onReady: OnReadyCallback;\n}) {\n const ref = useRef(null);\n const onReadyCalledRef = useRef(false);\n const onReadyCallbackRef = useRef<() => void>(() => {});\n\n // Keep the per-instance callback ref pointing at the latest onReady prop.\n useEffect(() => {\n onReadyCallbackRef.current = () => {\n props.onReady();\n };\n }, [props.onReady]);\n\n const create = (viewId: number | null) => {\n try {\n if (viewId == null) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n\n const viewManagerConfig =\n UIManager.getViewManagerConfig('PersonaInquiryView');\n if (!viewManagerConfig || !viewManagerConfig.Commands) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView config not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n UIManager.dispatchViewManagerCommand(\n viewId,\n viewManagerConfig.Commands.create,\n [viewId]\n );\n } catch (error) {\n callOnErrorCallback({ \n debugMessage: 'Error dispatching create command.', \n errorCode: 'UnexpectedError' \n }, props.onError);\n }\n };\n\n useEffect(() => {\n const viewId = findNodeHandle(ref.current);\n\n const listener: Listener = {\n onReadyCalled: onReadyCalledRef,\n onReadyCallback: onReadyCallbackRef,\n };\n activeListeners.add(listener);\n\n create(viewId);\n\n return () => {\n activeListeners.delete(listener);\n };\n }, []);\n\n const _onComplete = useCallback(\n (event: any) => {\n callOnCompleteCallback(event.nativeEvent, props.onComplete);\n },\n [props.onComplete]\n );\n\n const _onCanceled = useCallback(\n (event: any) => {\n callOnCanceledCallback(event.nativeEvent, props.onCanceled);\n },\n [props.onCanceled]\n );\n\n const _onError = useCallback(\n (event: any) => {\n callOnErrorCallback(event.nativeEvent, props.onError);\n },\n [props.onError]\n );\n\n const _onEvent = useCallback(\n (event: any) => {\n callOnEventCallback(event.nativeEvent, props.onEvent);\n },\n [props.onEvent]\n );\n\n const _onReady = useCallback(() => {\n callOnReadyCallback(props.onReady);\n }, [props.onReady]);\n\n return (\n <PersonaInquiryViewManager\n style={props.style}\n inquiry={props.inquiry.toOptionsJson()}\n onComplete={_onComplete}\n onCanceled={_onCanceled}\n onError={_onError}\n onEvent={_onEvent}\n onReady={_onReady}\n ref={ref}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useEffect","useRef","findNodeHandle","UIManager","PersonaInquiryViewManager","callOnCanceledCallback","callOnCompleteCallback","callOnErrorCallback","callOnEventCallback","callOnReadyCallback","activeListeners","Set","onPersonaInquiryViewEvent","event","type","forEach","l","onReadyCalled","current","setTimeout","has","onReadyCallback","PersonaInquiryView","props","ref","onReadyCalledRef","onReadyCallbackRef","onReady","create","viewId","debugMessage","errorCode","onError","viewManagerConfig","getViewManagerConfig","Commands","requestAnimationFrame","dispatchViewManagerCommand","error","listener","add","delete","_onComplete","nativeEvent","onComplete","_onCanceled","onCanceled","_onError","_onEvent","onEvent","_onReady","createElement","_extends","style","inquiry","toOptionsJson","enableInitWatchdog","initWatchdogTimeoutMs"],"sources":["PersonaInquiryView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef } from 'react';\nimport { findNodeHandle, UIManager } from 'react-native';\nimport { PersonaInquiryViewManager } from './PersonaInquiryViewManager';\nimport {\n callOnCanceledCallback,\n callOnCompleteCallback,\n callOnErrorCallback,\n callOnEventCallback,\n callOnReadyCallback,\n} from './util';\nimport type {\n OnReadyCallback,\n OnCanceledCallback,\n OnCompleteCallback,\n OnErrorCallback,\n OnEventCallback,\n} from './callbacks';\nimport type { InquiryEvent } from './InquiryEvent';\n\n// Each mounted PersonaInquiryView registers a listener here so the module-level\n// onEvent dispatcher (called from src/index.ts) can route events to the\n// currently-mounted instances. Holding the state per-instance avoids\n// cross-mount poisoning when late events arrive from a torn-down SDK after a\n// previous PersonaInquiryView has unmounted but before the next one mounts.\ntype Listener = {\n onReadyCalled: React.MutableRefObject<boolean>;\n onReadyCallback: React.MutableRefObject<() => void>;\n};\n\nconst activeListeners = new Set<Listener>();\n\nexport const onPersonaInquiryViewEvent: OnEventCallback = (\n event: InquiryEvent\n) => {\n if (event.type == 'start') {\n activeListeners.forEach((l) => {\n l.onReadyCalled.current = false;\n });\n } else if (event.type == 'page_change') {\n activeListeners.forEach((l) => {\n if (!l.onReadyCalled.current) {\n l.onReadyCalled.current = true;\n\n setTimeout(function () {\n // The instance may have unmounted between scheduling and firing;\n // skip the callback if so.\n if (activeListeners.has(l)) {\n l.onReadyCallback.current();\n }\n }, 400);\n }\n });\n }\n};\n\nexport default function PersonaInquiryView(props: {\n style: any;\n inquiry: any;\n onComplete: OnCompleteCallback;\n onCanceled: OnCanceledCallback;\n onError: OnErrorCallback;\n onEvent?: OnEventCallback;\n onReady: OnReadyCallback;\n // Opt-in. Fires onError if the inquiry doesn't start within\n // `initWatchdogTimeoutMs` of mount, as a safety net for when the create\n // command stalls before reaching native. Off by default.\n enableInitWatchdog?: boolean;\n // Timeout for the init watchdog, in ms. Only applies when\n // `enableInitWatchdog` is true. Defaults to 10000. Tune higher on slow\n // devices to avoid firing on a legitimately slow cold start.\n initWatchdogTimeoutMs?: number;\n}) {\n const ref = useRef(null);\n const onReadyCalledRef = useRef(false);\n const onReadyCallbackRef = useRef<() => void>(() => {});\n\n // Keep the per-instance callback ref pointing at the latest onReady prop.\n useEffect(() => {\n onReadyCallbackRef.current = () => {\n props.onReady();\n };\n }, [props.onReady]);\n\n const create = (viewId: number | null) => {\n try {\n if (viewId == null) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n\n const viewManagerConfig =\n UIManager.getViewManagerConfig('PersonaInquiryView');\n if (!viewManagerConfig || !viewManagerConfig.Commands) {\n callOnErrorCallback({ \n debugMessage: 'PersonaInquiryView config not found', \n errorCode: 'UnexpectedError' \n }, props.onError);\n return;\n }\n // Defer the dispatch to the next frame. Dispatching during React's\n // commit phase can leave the command stranded on RN's UIManager queue\n // for ~30s if no other JS work follows. requestAnimationFrame ties into\n // the native frame loop and lands the command in a batch that flushes\n // on the next tick.\n requestAnimationFrame(() => {\n UIManager.dispatchViewManagerCommand(\n viewId,\n viewManagerConfig.Commands.create,\n [viewId]\n );\n });\n } catch (error) {\n callOnErrorCallback({ \n debugMessage: 'Error dispatching create command.', \n errorCode: 'UnexpectedError' \n }, props.onError);\n }\n };\n\n useEffect(() => {\n const viewId = findNodeHandle(ref.current);\n\n const listener: Listener = {\n onReadyCalled: onReadyCalledRef,\n onReadyCallback: onReadyCallbackRef,\n };\n activeListeners.add(listener);\n\n create(viewId);\n\n return () => {\n activeListeners.delete(listener);\n };\n }, []);\n\n const _onComplete = useCallback(\n (event: any) => {\n callOnCompleteCallback(event.nativeEvent, props.onComplete);\n },\n [props.onComplete]\n );\n\n const _onCanceled = useCallback(\n (event: any) => {\n callOnCanceledCallback(event.nativeEvent, props.onCanceled);\n },\n [props.onCanceled]\n );\n\n const _onError = useCallback(\n (event: any) => {\n callOnErrorCallback(event.nativeEvent, props.onError);\n },\n [props.onError]\n );\n\n const _onEvent = useCallback(\n (event: any) => {\n callOnEventCallback(event.nativeEvent, props.onEvent);\n },\n [props.onEvent]\n );\n\n const _onReady = useCallback(() => {\n callOnReadyCallback(props.onReady);\n }, [props.onReady]);\n\n return (\n <PersonaInquiryViewManager\n style={props.style}\n inquiry={props.inquiry.toOptionsJson()}\n onComplete={_onComplete}\n onCanceled={_onCanceled}\n onError={_onError}\n onEvent={_onEvent}\n onReady={_onReady}\n {...(props.enableInitWatchdog\n ? {\n enableInitWatchdog: true,\n initWatchdogTimeoutMs: props.initWatchdogTimeoutMs ?? 10000,\n }\n : {})}\n ref={ref}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,4 +9,6 @@ export default function PersonaInquiryView(props: {
9
9
  onError: OnErrorCallback;
10
10
  onEvent?: OnEventCallback;
11
11
  onReady: OnReadyCallback;
12
+ enableInitWatchdog?: boolean;
13
+ initWatchdogTimeoutMs?: number;
12
14
  }): React.JSX.Element;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-native-persona",
3
3
  "title": "React Native Persona",
4
- "version": "2.42.1-beta.1",
4
+ "version": "2.42.1-beta.3",
5
5
  "description": "Launch a mobile native implementation of the Persona inquiry flow from React Native.",
6
6
  "homepage": "https://docs.withpersona.com/docs/react-native-sdk-integration",
7
7
  "bugs": "https://github.com/persona-id/persona-inquiry-sdk-public",
@@ -61,6 +61,14 @@ export default function PersonaInquiryView(props: {
61
61
  onError: OnErrorCallback;
62
62
  onEvent?: OnEventCallback;
63
63
  onReady: OnReadyCallback;
64
+ // Opt-in. Fires onError if the inquiry doesn't start within
65
+ // `initWatchdogTimeoutMs` of mount, as a safety net for when the create
66
+ // command stalls before reaching native. Off by default.
67
+ enableInitWatchdog?: boolean;
68
+ // Timeout for the init watchdog, in ms. Only applies when
69
+ // `enableInitWatchdog` is true. Defaults to 10000. Tune higher on slow
70
+ // devices to avoid firing on a legitimately slow cold start.
71
+ initWatchdogTimeoutMs?: number;
64
72
  }) {
65
73
  const ref = useRef(null);
66
74
  const onReadyCalledRef = useRef(false);
@@ -92,11 +100,18 @@ export default function PersonaInquiryView(props: {
92
100
  }, props.onError);
93
101
  return;
94
102
  }
95
- UIManager.dispatchViewManagerCommand(
96
- viewId,
97
- viewManagerConfig.Commands.create,
98
- [viewId]
99
- );
103
+ // Defer the dispatch to the next frame. Dispatching during React's
104
+ // commit phase can leave the command stranded on RN's UIManager queue
105
+ // for ~30s if no other JS work follows. requestAnimationFrame ties into
106
+ // the native frame loop and lands the command in a batch that flushes
107
+ // on the next tick.
108
+ requestAnimationFrame(() => {
109
+ UIManager.dispatchViewManagerCommand(
110
+ viewId,
111
+ viewManagerConfig.Commands.create,
112
+ [viewId]
113
+ );
114
+ });
100
115
  } catch (error) {
101
116
  callOnErrorCallback({
102
117
  debugMessage: 'Error dispatching create command.',
@@ -162,6 +177,12 @@ export default function PersonaInquiryView(props: {
162
177
  onError={_onError}
163
178
  onEvent={_onEvent}
164
179
  onReady={_onReady}
180
+ {...(props.enableInitWatchdog
181
+ ? {
182
+ enableInitWatchdog: true,
183
+ initWatchdogTimeoutMs: props.initWatchdogTimeoutMs ?? 10000,
184
+ }
185
+ : {})}
165
186
  ref={ref}
166
187
  />
167
188
  );