react-native-persona 2.41.1-beta.1 → 2.42.1-beta.1
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/build.gradle +1 -1
- package/lib/commonjs/PersonaInquiryView.js +37 -15
- package/lib/commonjs/PersonaInquiryView.js.map +1 -1
- package/lib/module/PersonaInquiryView.js +38 -15
- package/lib/module/PersonaInquiryView.js.map +1 -1
- package/package.json +1 -1
- package/src/PersonaInquiryView.tsx +43 -17
package/android/build.gradle
CHANGED
|
@@ -72,7 +72,7 @@ dependencies {
|
|
|
72
72
|
implementation("com.facebook.react:react-android:+")
|
|
73
73
|
|
|
74
74
|
// NB: be sure to bump `nfc-impl` in example/android/app/build.gradle as well
|
|
75
|
-
implementation 'com.withpersona.sdk2:inquiry:2.
|
|
75
|
+
implementation 'com.withpersona.sdk2:inquiry:2.42.0'
|
|
76
76
|
implementation("androidx.fragment:fragment:1.8.6")
|
|
77
77
|
|
|
78
78
|
// Kotlin
|
|
@@ -10,25 +10,45 @@ 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
|
-
|
|
14
|
-
|
|
13
|
+
// Each mounted PersonaInquiryView registers a listener here so the module-level
|
|
14
|
+
// onEvent dispatcher (called from src/index.ts) can route events to the
|
|
15
|
+
// currently-mounted instances. Holding the state per-instance avoids
|
|
16
|
+
// cross-mount poisoning when late events arrive from a torn-down SDK after a
|
|
17
|
+
// previous PersonaInquiryView has unmounted but before the next one mounts.
|
|
18
|
+
|
|
19
|
+
const activeListeners = new Set();
|
|
15
20
|
const onPersonaInquiryViewEvent = event => {
|
|
16
21
|
if (event.type == 'start') {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
activeListeners.forEach(l => {
|
|
23
|
+
l.onReadyCalled.current = false;
|
|
24
|
+
});
|
|
25
|
+
} else if (event.type == 'page_change') {
|
|
26
|
+
activeListeners.forEach(l => {
|
|
27
|
+
if (!l.onReadyCalled.current) {
|
|
28
|
+
l.onReadyCalled.current = true;
|
|
29
|
+
setTimeout(function () {
|
|
30
|
+
// The instance may have unmounted between scheduling and firing;
|
|
31
|
+
// skip the callback if so.
|
|
32
|
+
if (activeListeners.has(l)) {
|
|
33
|
+
l.onReadyCallback.current();
|
|
34
|
+
}
|
|
35
|
+
}, 400);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
23
38
|
}
|
|
24
39
|
};
|
|
25
40
|
exports.onPersonaInquiryViewEvent = onPersonaInquiryViewEvent;
|
|
26
|
-
const resetOnReadyState = () => {
|
|
27
|
-
onReadyCalled = false;
|
|
28
|
-
onReadyCallback = () => {};
|
|
29
|
-
};
|
|
30
41
|
function PersonaInquiryView(props) {
|
|
31
42
|
const ref = (0, _react.useRef)(null);
|
|
43
|
+
const onReadyCalledRef = (0, _react.useRef)(false);
|
|
44
|
+
const onReadyCallbackRef = (0, _react.useRef)(() => {});
|
|
45
|
+
|
|
46
|
+
// Keep the per-instance callback ref pointing at the latest onReady prop.
|
|
47
|
+
(0, _react.useEffect)(() => {
|
|
48
|
+
onReadyCallbackRef.current = () => {
|
|
49
|
+
props.onReady();
|
|
50
|
+
};
|
|
51
|
+
}, [props.onReady]);
|
|
32
52
|
const create = viewId => {
|
|
33
53
|
try {
|
|
34
54
|
if (viewId == null) {
|
|
@@ -56,12 +76,14 @@ function PersonaInquiryView(props) {
|
|
|
56
76
|
};
|
|
57
77
|
(0, _react.useEffect)(() => {
|
|
58
78
|
const viewId = (0, _reactNative.findNodeHandle)(ref.current);
|
|
59
|
-
|
|
60
|
-
|
|
79
|
+
const listener = {
|
|
80
|
+
onReadyCalled: onReadyCalledRef,
|
|
81
|
+
onReadyCallback: onReadyCallbackRef
|
|
61
82
|
};
|
|
83
|
+
activeListeners.add(listener);
|
|
62
84
|
create(viewId);
|
|
63
85
|
return () => {
|
|
64
|
-
|
|
86
|
+
activeListeners.delete(listener);
|
|
65
87
|
};
|
|
66
88
|
}, []);
|
|
67
89
|
const _onComplete = (0, _react.useCallback)(event => {
|
|
@@ -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","
|
|
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":[]}
|
|
@@ -2,24 +2,45 @@ import React, { useCallback, useEffect, useRef } from 'react';
|
|
|
2
2
|
import { findNodeHandle, UIManager } from 'react-native';
|
|
3
3
|
import { PersonaInquiryViewManager } from './PersonaInquiryViewManager';
|
|
4
4
|
import { callOnCanceledCallback, callOnCompleteCallback, callOnErrorCallback, callOnEventCallback, callOnReadyCallback } from './util';
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
|
|
6
|
+
// Each mounted PersonaInquiryView registers a listener here so the module-level
|
|
7
|
+
// onEvent dispatcher (called from src/index.ts) can route events to the
|
|
8
|
+
// currently-mounted instances. Holding the state per-instance avoids
|
|
9
|
+
// cross-mount poisoning when late events arrive from a torn-down SDK after a
|
|
10
|
+
// previous PersonaInquiryView has unmounted but before the next one mounts.
|
|
11
|
+
|
|
12
|
+
const activeListeners = new Set();
|
|
7
13
|
export const onPersonaInquiryViewEvent = event => {
|
|
8
14
|
if (event.type == 'start') {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
activeListeners.forEach(l => {
|
|
16
|
+
l.onReadyCalled.current = false;
|
|
17
|
+
});
|
|
18
|
+
} else if (event.type == 'page_change') {
|
|
19
|
+
activeListeners.forEach(l => {
|
|
20
|
+
if (!l.onReadyCalled.current) {
|
|
21
|
+
l.onReadyCalled.current = true;
|
|
22
|
+
setTimeout(function () {
|
|
23
|
+
// The instance may have unmounted between scheduling and firing;
|
|
24
|
+
// skip the callback if so.
|
|
25
|
+
if (activeListeners.has(l)) {
|
|
26
|
+
l.onReadyCallback.current();
|
|
27
|
+
}
|
|
28
|
+
}, 400);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
15
31
|
}
|
|
16
32
|
};
|
|
17
|
-
const resetOnReadyState = () => {
|
|
18
|
-
onReadyCalled = false;
|
|
19
|
-
onReadyCallback = () => {};
|
|
20
|
-
};
|
|
21
33
|
export default function PersonaInquiryView(props) {
|
|
22
34
|
const ref = useRef(null);
|
|
35
|
+
const onReadyCalledRef = useRef(false);
|
|
36
|
+
const onReadyCallbackRef = useRef(() => {});
|
|
37
|
+
|
|
38
|
+
// Keep the per-instance callback ref pointing at the latest onReady prop.
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
onReadyCallbackRef.current = () => {
|
|
41
|
+
props.onReady();
|
|
42
|
+
};
|
|
43
|
+
}, [props.onReady]);
|
|
23
44
|
const create = viewId => {
|
|
24
45
|
try {
|
|
25
46
|
if (viewId == null) {
|
|
@@ -47,12 +68,14 @@ export default function PersonaInquiryView(props) {
|
|
|
47
68
|
};
|
|
48
69
|
useEffect(() => {
|
|
49
70
|
const viewId = findNodeHandle(ref.current);
|
|
50
|
-
|
|
51
|
-
|
|
71
|
+
const listener = {
|
|
72
|
+
onReadyCalled: onReadyCalledRef,
|
|
73
|
+
onReadyCallback: onReadyCallbackRef
|
|
52
74
|
};
|
|
75
|
+
activeListeners.add(listener);
|
|
53
76
|
create(viewId);
|
|
54
77
|
return () => {
|
|
55
|
-
|
|
78
|
+
activeListeners.delete(listener);
|
|
56
79
|
};
|
|
57
80
|
}, []);
|
|
58
81
|
const _onComplete = useCallback(event => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useRef","findNodeHandle","UIManager","PersonaInquiryViewManager","callOnCanceledCallback","callOnCompleteCallback","callOnErrorCallback","callOnEventCallback","callOnReadyCallback","
|
|
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":[]}
|
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.
|
|
4
|
+
"version": "2.42.1-beta.1",
|
|
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",
|
|
@@ -17,27 +17,42 @@ import type {
|
|
|
17
17
|
} from './callbacks';
|
|
18
18
|
import type { InquiryEvent } from './InquiryEvent';
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
// Each mounted PersonaInquiryView registers a listener here so the module-level
|
|
21
|
+
// onEvent dispatcher (called from src/index.ts) can route events to the
|
|
22
|
+
// currently-mounted instances. Holding the state per-instance avoids
|
|
23
|
+
// cross-mount poisoning when late events arrive from a torn-down SDK after a
|
|
24
|
+
// previous PersonaInquiryView has unmounted but before the next one mounts.
|
|
25
|
+
type Listener = {
|
|
26
|
+
onReadyCalled: React.MutableRefObject<boolean>;
|
|
27
|
+
onReadyCallback: React.MutableRefObject<() => void>;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const activeListeners = new Set<Listener>();
|
|
31
|
+
|
|
22
32
|
export const onPersonaInquiryViewEvent: OnEventCallback = (
|
|
23
33
|
event: InquiryEvent
|
|
24
34
|
) => {
|
|
25
35
|
if (event.type == 'start') {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
activeListeners.forEach((l) => {
|
|
37
|
+
l.onReadyCalled.current = false;
|
|
38
|
+
});
|
|
39
|
+
} else if (event.type == 'page_change') {
|
|
40
|
+
activeListeners.forEach((l) => {
|
|
41
|
+
if (!l.onReadyCalled.current) {
|
|
42
|
+
l.onReadyCalled.current = true;
|
|
43
|
+
|
|
44
|
+
setTimeout(function () {
|
|
45
|
+
// The instance may have unmounted between scheduling and firing;
|
|
46
|
+
// skip the callback if so.
|
|
47
|
+
if (activeListeners.has(l)) {
|
|
48
|
+
l.onReadyCallback.current();
|
|
49
|
+
}
|
|
50
|
+
}, 400);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
33
53
|
}
|
|
34
54
|
};
|
|
35
55
|
|
|
36
|
-
const resetOnReadyState = () => {
|
|
37
|
-
onReadyCalled = false;
|
|
38
|
-
onReadyCallback = () => {};
|
|
39
|
-
};
|
|
40
|
-
|
|
41
56
|
export default function PersonaInquiryView(props: {
|
|
42
57
|
style: any;
|
|
43
58
|
inquiry: any;
|
|
@@ -48,6 +63,15 @@ export default function PersonaInquiryView(props: {
|
|
|
48
63
|
onReady: OnReadyCallback;
|
|
49
64
|
}) {
|
|
50
65
|
const ref = useRef(null);
|
|
66
|
+
const onReadyCalledRef = useRef(false);
|
|
67
|
+
const onReadyCallbackRef = useRef<() => void>(() => {});
|
|
68
|
+
|
|
69
|
+
// Keep the per-instance callback ref pointing at the latest onReady prop.
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
onReadyCallbackRef.current = () => {
|
|
72
|
+
props.onReady();
|
|
73
|
+
};
|
|
74
|
+
}, [props.onReady]);
|
|
51
75
|
|
|
52
76
|
const create = (viewId: number | null) => {
|
|
53
77
|
try {
|
|
@@ -84,14 +108,16 @@ export default function PersonaInquiryView(props: {
|
|
|
84
108
|
useEffect(() => {
|
|
85
109
|
const viewId = findNodeHandle(ref.current);
|
|
86
110
|
|
|
87
|
-
|
|
88
|
-
|
|
111
|
+
const listener: Listener = {
|
|
112
|
+
onReadyCalled: onReadyCalledRef,
|
|
113
|
+
onReadyCallback: onReadyCallbackRef,
|
|
89
114
|
};
|
|
115
|
+
activeListeners.add(listener);
|
|
90
116
|
|
|
91
117
|
create(viewId);
|
|
92
118
|
|
|
93
119
|
return () => {
|
|
94
|
-
|
|
120
|
+
activeListeners.delete(listener);
|
|
95
121
|
};
|
|
96
122
|
}, []);
|
|
97
123
|
|