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.
@@ -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-beta.1'
5
+ persona_sdk_version = '2.48.0'
6
6
 
7
7
  Pod::Spec.new do |s|
8
8
  s.name = 'RNPersonaInquiry2'
@@ -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.41.2-beta.1-SNAPSHOT'
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
- let onReadyCalled = false;
14
- let onReadyCallback = () => {};
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
- onReadyCalled = false;
18
- } else if (event.type == 'page_change' && !onReadyCalled) {
19
- onReadyCalled = true;
20
- setTimeout(function () {
21
- onReadyCallback();
22
- }, 400);
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
- onReadyCallback = () => {
60
- props.onReady();
79
+ const listener = {
80
+ onReadyCalled: onReadyCalledRef,
81
+ onReadyCallback: onReadyCallbackRef
61
82
  };
83
+ activeListeners.add(listener);
62
84
  create(viewId);
63
85
  return () => {
64
- resetOnReadyState();
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","onReadyCalled","onReadyCallback","onPersonaInquiryViewEvent","event","type","setTimeout","exports","resetOnReadyState","PersonaInquiryView","props","ref","useRef","create","viewId","callOnErrorCallback","debugMessage","errorCode","onError","viewManagerConfig","UIManager","getViewManagerConfig","Commands","dispatchViewManagerCommand","error","useEffect","findNodeHandle","current","onReady","_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\nlet onReadyCalled = false;\nlet onReadyCallback = () => {};\nexport const onPersonaInquiryViewEvent: OnEventCallback = (\n event: InquiryEvent\n) => {\n if (event.type == 'start') {\n onReadyCalled = false;\n } else if (event.type == 'page_change' && !onReadyCalled) {\n onReadyCalled = true;\n\n setTimeout(function () {\n onReadyCallback();\n }, 400);\n }\n};\n\nconst resetOnReadyState = () => {\n onReadyCalled = false;\n onReadyCallback = () => {};\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\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 onReadyCallback = () => {\n props.onReady();\n };\n\n create(viewId);\n\n return () => {\n resetOnReadyState();\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","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
- let onReadyCalled = false;
6
- let onReadyCallback = () => {};
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
- onReadyCalled = false;
10
- } else if (event.type == 'page_change' && !onReadyCalled) {
11
- onReadyCalled = true;
12
- setTimeout(function () {
13
- onReadyCallback();
14
- }, 400);
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
- onReadyCallback = () => {
51
- props.onReady();
71
+ const listener = {
72
+ onReadyCalled: onReadyCalledRef,
73
+ onReadyCallback: onReadyCallbackRef
52
74
  };
75
+ activeListeners.add(listener);
53
76
  create(viewId);
54
77
  return () => {
55
- resetOnReadyState();
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","onReadyCalled","onReadyCallback","onPersonaInquiryViewEvent","event","type","setTimeout","resetOnReadyState","PersonaInquiryView","props","ref","create","viewId","debugMessage","errorCode","onError","viewManagerConfig","getViewManagerConfig","Commands","dispatchViewManagerCommand","error","current","onReady","_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\nlet onReadyCalled = false;\nlet onReadyCallback = () => {};\nexport const onPersonaInquiryViewEvent: OnEventCallback = (\n event: InquiryEvent\n) => {\n if (event.type == 'start') {\n onReadyCalled = false;\n } else if (event.type == 'page_change' && !onReadyCalled) {\n onReadyCalled = true;\n\n setTimeout(function () {\n onReadyCallback();\n }, 400);\n }\n};\n\nconst resetOnReadyState = () => {\n onReadyCalled = false;\n onReadyCallback = () => {};\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\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 onReadyCallback = () => {\n props.onReady();\n };\n\n create(viewId);\n\n return () => {\n resetOnReadyState();\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","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.41.1-beta.1",
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
- let onReadyCalled = false;
21
- let onReadyCallback = () => {};
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
- onReadyCalled = false;
27
- } else if (event.type == 'page_change' && !onReadyCalled) {
28
- onReadyCalled = true;
29
-
30
- setTimeout(function () {
31
- onReadyCallback();
32
- }, 400);
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
- onReadyCallback = () => {
88
- props.onReady();
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
- resetOnReadyState();
120
+ activeListeners.delete(listener);
95
121
  };
96
122
  }, []);
97
123