react-native-persona 2.42.1-beta.2 → 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.
- package/RNPersonaInquiry2.podspec +1 -1
- package/android/src/main/java/com/withpersona/sdk2/reactnative/PersonaInquiryViewManager.java +130 -0
- package/ios/PersonaInquiryBridge.m +2 -0
- package/ios/PersonaInquiryViewManager.swift +52 -0
- package/lib/commonjs/PersonaInquiryView.js +16 -4
- package/lib/commonjs/PersonaInquiryView.js.map +1 -1
- package/lib/module/PersonaInquiryView.js +16 -4
- package/lib/module/PersonaInquiryView.js.map +1 -1
- package/lib/typescript/PersonaInquiryView.d.ts +2 -0
- package/package.json +1 -1
- package/src/PersonaInquiryView.tsx +26 -5
package/android/src/main/java/com/withpersona/sdk2/reactnative/PersonaInquiryViewManager.java
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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":[]}
|
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.
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
);
|