@circle-fin/w3s-pw-react-native-sdk 2.0.2 → 2.2.0

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.
@@ -8,9 +8,10 @@ This guide provides step-by-step instructions for integrating the Circle User-Co
8
8
  ## System Requirements
9
9
 
10
10
  - React Native 0.60+ (recommended 0.76-0.81)
11
- - Node.js 16+ and npm/yarn
12
- - Android API 21+ (recommended API 33+)
11
+ - Node.js 20.19+ and npm/yarn
12
+ - Android API 21+ (recommended API 36+)
13
13
  - iOS 15.1+ (recommended iOS 17+)
14
+ - Xcode 16.1+ (recommended 16.3+)
14
15
  - CocoaPods (for iOS projects)
15
16
 
16
17
  > [!NOTE]
@@ -314,7 +315,7 @@ Learn more about [Running On Device](https://reactnative.dev/docs/running-on-dev
314
315
 
315
316
  **Issue**: `npx install-expo-modules@latest` fails with other errors
316
317
 
317
- - **Solution**: Ensure Node.js 16+ is installed. Try clearing npm cache: `npm cache clean --force`
318
+ - **Solution**: Ensure Node.js 20.19+ is installed. Try clearing npm cache: `npm cache clean --force`
318
319
 
319
320
  ### Android Build Issues
320
321
 
package/README.md CHANGED
@@ -22,8 +22,10 @@ You can also find the SDK v1 sample app in the sample app repository's [sdk-v1 b
22
22
  | ------------ | --------------- | ------------------- |
23
23
  | React Native | 0.60+ | 0.76-0.81 |
24
24
  | iOS | 15.1+ | iOS 17+ |
25
- | Android | API 21+ | API 33+ |
26
- | Expo SDK | 49+ | 53+ |
25
+ | Android | API 21+ | API 36+ |
26
+ | Expo SDK | 49+ | 54+ |
27
+ | Node.js | 20.19+ | 20.20+ |
28
+ | Xcode | 16.1+ | 16.3+ |
27
29
 
28
30
  ## Installation
29
31
 
@@ -31,10 +31,10 @@ if (useManagedAndroidSdkVersions) {
31
31
  }
32
32
  }
33
33
  project.android {
34
- compileSdkVersion safeExtGet("compileSdkVersion", 34)
34
+ compileSdkVersion safeExtGet("compileSdkVersion", 36)
35
35
  defaultConfig {
36
36
  minSdkVersion safeExtGet("minSdkVersion", 21)
37
- targetSdkVersion safeExtGet("targetSdkVersion", 34)
37
+ targetSdkVersion safeExtGet("targetSdkVersion", 36)
38
38
  }
39
39
  }
40
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WalletSdk.d.ts","sourceRoot":"","sources":["../src/WalletSdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,UAAU,EAmBX,MAAM,SAAS,CAAA;AAmChB,eAAO,MAAM,SAAS,YAmUlB,CAAA"}
1
+ {"version":3,"file":"WalletSdk.d.ts","sourceRoot":"","sources":["../src/WalletSdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,UAAU,EAmBX,MAAM,SAAS,CAAA;AAmChB,eAAO,MAAM,SAAS,YAuWlB,CAAA"}
@@ -72,12 +72,19 @@ export const WalletSdk = (() => {
72
72
  }
73
73
  },
74
74
  execute(userToken, encryptionKey, challengeIds, successCallback, errorCallback) {
75
+ let settled = false;
75
76
  const successListener = ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_SUCCESS, (event) => {
77
+ if (settled)
78
+ return;
79
+ settled = true;
76
80
  console.debug('[WalletSdk] Execute result');
77
81
  successCallback(event);
78
82
  cleanup();
79
83
  });
80
84
  const errorListener = ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_ERROR, (event) => {
85
+ if (settled)
86
+ return;
87
+ settled = true;
81
88
  console.debug('[WalletSdk] Error event received:', event);
82
89
  // Convert event to Error object if needed
83
90
  const error = event instanceof Error
@@ -94,12 +101,18 @@ export const WalletSdk = (() => {
94
101
  // Call native execute method
95
102
  ProgrammablewalletRnSdk.execute(userToken, encryptionKey, challengeIds)
96
103
  .then((successResult) => {
104
+ if (settled)
105
+ return;
106
+ settled = true;
97
107
  // If Promise resolves but no event was fired, call success callback
98
108
  console.debug('[WalletSdk] Promise resolved');
99
109
  successCallback(successResult);
100
110
  cleanup();
101
111
  })
102
112
  .catch((e) => {
113
+ if (settled)
114
+ return;
115
+ settled = true;
103
116
  // If Promise rejects but no event was fired, call error callback
104
117
  console.debug('[WalletSdk] Promise rejected:', e);
105
118
  errorCallback(e);
@@ -107,22 +120,35 @@ export const WalletSdk = (() => {
107
120
  });
108
121
  },
109
122
  verifyOTP(otpToken, deviceToken, deviceEncryptionKey, successCallback, errorCallback) {
110
- ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_ERROR, (event) => {
123
+ let settled = false;
124
+ const errorListener = ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_ERROR, (event) => {
125
+ if (settled)
126
+ return;
127
+ settled = true;
111
128
  // Convert event to Error object if needed
112
129
  const error = event instanceof Error
113
130
  ? event
114
131
  : new Error(event?.message || 'Unknown error');
115
132
  errorCallback(error);
133
+ cleanup();
116
134
  });
135
+ const cleanup = () => {
136
+ errorListener?.remove();
137
+ };
117
138
  ProgrammablewalletRnSdk.verifyOTP(otpToken, deviceToken, deviceEncryptionKey)
118
139
  .then((result) => {
140
+ if (settled)
141
+ return;
142
+ settled = true;
119
143
  successCallback(result);
144
+ cleanup();
120
145
  })
121
146
  .catch((e) => {
147
+ if (settled)
148
+ return;
149
+ settled = true;
122
150
  errorCallback(e);
123
- })
124
- .finally(() => {
125
- ProgrammablewalletRnSdk.removeAllListeners(EVENT_NAME_ON_ERROR);
151
+ cleanup();
126
152
  });
127
153
  },
128
154
  performLogin(provider, deviceToken, deviceEncryptionKey, successCallback, errorCallback) {
@@ -148,11 +174,18 @@ export const WalletSdk = (() => {
148
174
  });
149
175
  },
150
176
  setBiometricsPin(userToken, encryptionKey, successCallback, errorCallback) {
177
+ let settled = false;
151
178
  const successListener = ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_SUCCESS, (event) => {
179
+ if (settled)
180
+ return;
181
+ settled = true;
152
182
  successCallback(event);
153
183
  cleanup();
154
184
  });
155
185
  const errorListener = ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_ERROR, (event) => {
186
+ if (settled)
187
+ return;
188
+ settled = true;
156
189
  console.debug('[WalletSdk] setBiometricsPin Error event received:', event);
157
190
  // Convert event to Error object if needed
158
191
  const error = event instanceof Error
@@ -169,12 +202,18 @@ export const WalletSdk = (() => {
169
202
  // Call native setBiometricsPin method
170
203
  ProgrammablewalletRnSdk.setBiometricsPin(userToken, encryptionKey)
171
204
  .then((successResult) => {
205
+ if (settled)
206
+ return;
207
+ settled = true;
172
208
  // If Promise resolves but no event was fired, call success callback
173
209
  console.debug('[WalletSdk] setBiometricsPin Promise resolved:', successResult);
174
210
  successCallback(successResult);
175
211
  cleanup();
176
212
  })
177
213
  .catch((e) => {
214
+ if (settled)
215
+ return;
216
+ settled = true;
178
217
  // If Promise rejects but no event was fired, call error callback
179
218
  console.debug('[WalletSdk] setBiometricsPin Promise rejected:', e);
180
219
  errorCallback(e);
@@ -1 +1 @@
1
- {"version":3,"file":"WalletSdk.js","sourceRoot":"","sources":["../src/WalletSdk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright 2025 Circle Internet Group, Inc. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n IWalletSdk,\n Configuration,\n TextsKey,\n IconTextsKey,\n TextKey,\n ImageKey,\n DateFormat,\n ErrorCode,\n SuccessCallback,\n LoginSuccessCallback,\n CompletedCallback,\n ErrorCallback,\n SuccessResult,\n LoginResult,\n IconTextConfig,\n TextConfig,\n SocialProvider,\n SecurityQuestion,\n InputType,\n} from './types'\nimport { bridgeSafe } from './bridgeSafe'\nconst packageJson = require('../package.json')\n\nimport ProgrammablewalletRnSdk from './ProgrammablewalletRnSdkModule'\nimport { ImageSourcePropType, Image } from 'react-native'\n\n// SDK event identifiers\nconst EVENT_NAME_ON_SUCCESS = 'CirclePwOnSuccess'\nconst EVENT_NAME_ON_ERROR = 'CirclePwOnError'\nconst USER_AGENT_RN = 'Circle-Programmable-Wallet-SDK-RN'\n\n/**\n * Resolves React Native image sources to URI strings for native bridge\n * @param source - React Native image source\n * @returns Resolved URI string or null\n */\nfunction getImageUrl(source: ImageSourcePropType): string | null {\n if (!source) {\n return null\n }\n const resolved = Image.resolveAssetSource(source)\n if (\n !resolved ||\n typeof resolved.uri !== 'string' ||\n resolved.uri.trim() === ''\n ) {\n return null\n }\n return resolved.uri\n}\n\n// Import security question utility functions\nimport { toPlainSecurityQuestion } from './utils/securityQuestionUtils'\n\nexport const WalletSdk = ((): IWalletSdk => {\n const defaultUserAgentRn = USER_AGENT_RN + '/' + packageJson.version\n return {\n sdkVersion: {\n native: ProgrammablewalletRnSdk.sdkVersion,\n rn: packageJson.version,\n },\n get deviceId() {\n return ProgrammablewalletRnSdk.getDeviceId()\n },\n getDeviceId: ProgrammablewalletRnSdk.getDeviceId,\n init(configuration: Configuration): Promise<void> {\n const promise = ProgrammablewalletRnSdk.initSdk(configuration)\n ProgrammablewalletRnSdk.setCustomUserAgent(defaultUserAgentRn)\n return promise\n },\n setSecurityQuestions(securityQuestions: Array<{ title: string; inputType?: InputType | string | number }>): void {\n try {\n // Convert each input to a proper SecurityQuestion object\n const normalized: SecurityQuestion[] = (securityQuestions || []).map(q => toPlainSecurityQuestion(q))\n\n // toPlainSecurityQuestion already performs the necessary serialization\n // No need for bridgeSafe here as each question has been converted to a plain object\n // with only primitive properties (string title and enum inputType)\n ProgrammablewalletRnSdk.setSecurityQuestions(normalized)\n } catch (e) {\n console.error('setSecurityQuestions failed:', e)\n }\n },\n execute(\n userToken: string,\n encryptionKey: string,\n challengeIds: string[],\n successCallback: SuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n const successListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_SUCCESS,\n (event: unknown) => {\n console.debug('[WalletSdk] Execute result')\n successCallback(event as SuccessResult)\n cleanup()\n },\n )\n\n const errorListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_ERROR,\n (event: unknown) => {\n console.debug('[WalletSdk] Error event received:', event)\n // Convert event to Error object if needed\n const error =\n event instanceof Error\n ? event\n : new Error((event as { message?: string })?.message || 'Unknown error')\n errorCallback(error)\n cleanup()\n },\n )\n\n // Cleanup function to remove listeners\n const cleanup = () => {\n successListener?.remove()\n errorListener?.remove()\n }\n\n // Call native execute method\n ProgrammablewalletRnSdk.execute(userToken, encryptionKey, challengeIds)\n .then((successResult: SuccessResult) => {\n // If Promise resolves but no event was fired, call success callback\n console.debug('[WalletSdk] Promise resolved')\n successCallback(successResult)\n cleanup()\n })\n .catch((e: Error) => {\n // If Promise rejects but no event was fired, call error callback\n console.debug('[WalletSdk] Promise rejected:', e)\n errorCallback(e)\n cleanup()\n })\n },\n verifyOTP(\n otpToken: string,\n deviceToken: string,\n deviceEncryptionKey: string,\n successCallback: LoginSuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_ERROR, (event: unknown) => {\n // Convert event to Error object if needed\n const error =\n event instanceof Error\n ? event\n : new Error((event as { message?: string })?.message || 'Unknown error')\n errorCallback(error)\n })\n ProgrammablewalletRnSdk.verifyOTP(\n otpToken,\n deviceToken,\n deviceEncryptionKey,\n )\n .then((result: LoginResult) => {\n successCallback(result)\n })\n .catch((e: Error) => {\n errorCallback(e)\n })\n .finally(() => {\n ProgrammablewalletRnSdk.removeAllListeners(EVENT_NAME_ON_ERROR)\n })\n },\n performLogin(\n provider: SocialProvider,\n deviceToken: string,\n deviceEncryptionKey: string,\n successCallback: LoginSuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n ProgrammablewalletRnSdk.performLogin(\n provider,\n deviceToken,\n deviceEncryptionKey,\n )\n .then((successResult: LoginResult) => {\n console.debug(\n '[WalletSdk] performLogin Promise resolved:',\n successResult,\n )\n successCallback(successResult)\n })\n .catch((e: Error) => {\n console.debug('[WalletSdk] performLogin Promise rejected:', e)\n errorCallback(e)\n })\n },\n performLogout(\n provider: SocialProvider,\n completedCallback: CompletedCallback,\n errorCallback: ErrorCallback,\n ): void {\n ProgrammablewalletRnSdk.performLogout(provider)\n .then(() => {\n console.debug('[WalletSdk] performLogout Promise resolved')\n completedCallback()\n })\n .catch((e: Error) => {\n console.debug('[WalletSdk] performLogout Promise rejected:', e)\n errorCallback(e)\n })\n },\n setBiometricsPin(\n userToken: string,\n encryptionKey: string,\n successCallback: SuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n const successListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_SUCCESS,\n (event: unknown) => {\n successCallback(event as SuccessResult)\n cleanup()\n },\n )\n\n const errorListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_ERROR,\n (event: unknown) => {\n console.debug(\n '[WalletSdk] setBiometricsPin Error event received:',\n event,\n )\n // Convert event to Error object if needed\n const error =\n event instanceof Error\n ? event\n : new Error((event as { message?: string })?.message || 'Unknown error')\n errorCallback(error)\n cleanup()\n },\n )\n\n // Cleanup function to remove listeners\n const cleanup = () => {\n successListener?.remove()\n errorListener?.remove()\n }\n\n // Call native setBiometricsPin method\n ProgrammablewalletRnSdk.setBiometricsPin(userToken, encryptionKey)\n .then((successResult: SuccessResult) => {\n // If Promise resolves but no event was fired, call success callback\n console.debug(\n '[WalletSdk] setBiometricsPin Promise resolved:',\n successResult,\n )\n successCallback(successResult)\n cleanup()\n })\n .catch((e: Error) => {\n // If Promise rejects but no event was fired, call error callback\n console.debug('[WalletSdk] setBiometricsPin Promise rejected:', e)\n errorCallback(e)\n cleanup()\n })\n },\n\n setDismissOnCallbackMap(map: Map<ErrorCode, boolean>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, boolean>\n ProgrammablewalletRnSdk.setDismissOnCallbackMap(serialized)\n } catch (e) {\n console.error('setDismissOnCallbackMap failed:', e)\n }\n },\n moveTaskToFront(): void {\n try {\n ProgrammablewalletRnSdk.moveTaskToFront()\n } catch (e) {\n console.error('moveTaskToFront failed:', e)\n }\n },\n moveRnTaskToFront(): void {\n try {\n ProgrammablewalletRnSdk.moveRnTaskToFront()\n } catch (e) {\n console.error('moveRnTaskToFront failed:', e)\n }\n },\n setTextConfigsMap(map: Map<TextsKey, TextConfig[]>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, TextConfig[]>\n ProgrammablewalletRnSdk.setTextConfigsMap(serialized)\n } catch (e) {\n console.error('setTextConfigsMap failed:', e)\n }\n },\n\n setIconTextConfigsMap(\n rawMap: Map<IconTextsKey, Array<IconTextConfig>>,\n ): void {\n try {\n // Create a transformed plain object instead of a Map\n const processedObj: Record<string, Array<{ image: string | null; textConfig: TextConfig }>> = {}\n\n Array.from(rawMap.entries()).forEach(([key, configs]) => {\n const processedConfigs = configs.map(config => {\n const { image, textConfig = {} } = config as IconTextConfig\n // Process image URL, as this is React Native specific logic\n return {\n image: image ? getImageUrl(image) : null,\n textConfig,\n }\n })\n processedObj[String(key)] = processedConfigs\n })\n\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(processedObj) as Record<string, unknown>\n ProgrammablewalletRnSdk.setIconTextConfigsMap(serialized)\n } catch (e) {\n console.error('setIconTextConfigsMap Error:', e)\n }\n },\n setTextConfigMap(map: Map<TextKey, TextConfig>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, TextConfig>\n ProgrammablewalletRnSdk.setTextConfigMap(serialized)\n } catch (e) {\n console.error('setTextConfigMap failed:', e)\n }\n },\n\n setImageMap(map: Map<ImageKey, ImageSourcePropType>): void {\n try {\n // Process image URLs, this part needs to be preserved\n const processedMap = new Map<ImageKey, string>()\n\n map.forEach((value, key) => {\n const url = getImageUrl(value)\n // Only keep non-null URLs\n if (url !== null) {\n processedMap.set(key, url)\n }\n })\n\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(processedMap) as Record<string, string>\n ProgrammablewalletRnSdk.setImageMap(serialized)\n } catch (e) {\n console.error('setImageMap failed:', e)\n }\n },\n setDateFormat(format: DateFormat): void {\n try {\n ProgrammablewalletRnSdk.setDateFormat(format)\n } catch (e) {\n console.error('setDateFormat failed:', e)\n }\n },\n setDebugging(debugging: boolean): void {\n try {\n ProgrammablewalletRnSdk.setDebugging(debugging)\n } catch (e) {\n console.error('setDebugging failed:', e)\n }\n },\n setCustomUserAgent(userAgent: string): void {\n ProgrammablewalletRnSdk.setCustomUserAgent(\n defaultUserAgentRn + ' | ' + userAgent,\n )\n },\n setErrorStringMap(map: Map<ErrorCode, string>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, string>\n ProgrammablewalletRnSdk.setErrorStringMap(serialized)\n } catch (e) {\n console.error('setErrorStringMap failed:', e)\n }\n },\n }\n})()\n"]}
1
+ {"version":3,"file":"WalletSdk.js","sourceRoot":"","sources":["../src/WalletSdk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright 2025 Circle Internet Group, Inc. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n IWalletSdk,\n Configuration,\n TextsKey,\n IconTextsKey,\n TextKey,\n ImageKey,\n DateFormat,\n ErrorCode,\n SuccessCallback,\n LoginSuccessCallback,\n CompletedCallback,\n ErrorCallback,\n SuccessResult,\n LoginResult,\n IconTextConfig,\n TextConfig,\n SocialProvider,\n SecurityQuestion,\n InputType,\n} from './types'\nimport { bridgeSafe } from './bridgeSafe'\nconst packageJson = require('../package.json')\n\nimport ProgrammablewalletRnSdk from './ProgrammablewalletRnSdkModule'\nimport { ImageSourcePropType, Image } from 'react-native'\n\n// SDK event identifiers\nconst EVENT_NAME_ON_SUCCESS = 'CirclePwOnSuccess'\nconst EVENT_NAME_ON_ERROR = 'CirclePwOnError'\nconst USER_AGENT_RN = 'Circle-Programmable-Wallet-SDK-RN'\n\n/**\n * Resolves React Native image sources to URI strings for native bridge\n * @param source - React Native image source\n * @returns Resolved URI string or null\n */\nfunction getImageUrl(source: ImageSourcePropType): string | null {\n if (!source) {\n return null\n }\n const resolved = Image.resolveAssetSource(source)\n if (\n !resolved ||\n typeof resolved.uri !== 'string' ||\n resolved.uri.trim() === ''\n ) {\n return null\n }\n return resolved.uri\n}\n\n// Import security question utility functions\nimport { toPlainSecurityQuestion } from './utils/securityQuestionUtils'\n\nexport const WalletSdk = ((): IWalletSdk => {\n const defaultUserAgentRn = USER_AGENT_RN + '/' + packageJson.version\n return {\n sdkVersion: {\n native: ProgrammablewalletRnSdk.sdkVersion,\n rn: packageJson.version,\n },\n get deviceId() {\n return ProgrammablewalletRnSdk.getDeviceId()\n },\n getDeviceId: ProgrammablewalletRnSdk.getDeviceId,\n init(configuration: Configuration): Promise<void> {\n const promise = ProgrammablewalletRnSdk.initSdk(configuration)\n ProgrammablewalletRnSdk.setCustomUserAgent(defaultUserAgentRn)\n return promise\n },\n setSecurityQuestions(securityQuestions: Array<{ title: string; inputType?: InputType | string | number }>): void {\n try {\n // Convert each input to a proper SecurityQuestion object\n const normalized: SecurityQuestion[] = (securityQuestions || []).map(q => toPlainSecurityQuestion(q))\n\n // toPlainSecurityQuestion already performs the necessary serialization\n // No need for bridgeSafe here as each question has been converted to a plain object\n // with only primitive properties (string title and enum inputType)\n ProgrammablewalletRnSdk.setSecurityQuestions(normalized)\n } catch (e) {\n console.error('setSecurityQuestions failed:', e)\n }\n },\n execute(\n userToken: string,\n encryptionKey: string,\n challengeIds: string[],\n successCallback: SuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n let settled = false\n\n const successListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_SUCCESS,\n (event: unknown) => {\n if (settled) return\n settled = true\n console.debug('[WalletSdk] Execute result')\n successCallback(event as SuccessResult)\n cleanup()\n },\n )\n\n const errorListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_ERROR,\n (event: unknown) => {\n if (settled) return\n settled = true\n console.debug('[WalletSdk] Error event received:', event)\n // Convert event to Error object if needed\n const error =\n event instanceof Error\n ? event\n : new Error((event as { message?: string })?.message || 'Unknown error')\n errorCallback(error)\n cleanup()\n },\n )\n\n // Cleanup function to remove listeners\n const cleanup = () => {\n successListener?.remove()\n errorListener?.remove()\n }\n\n // Call native execute method\n ProgrammablewalletRnSdk.execute(userToken, encryptionKey, challengeIds)\n .then((successResult: SuccessResult) => {\n if (settled) return\n settled = true\n // If Promise resolves but no event was fired, call success callback\n console.debug('[WalletSdk] Promise resolved')\n successCallback(successResult)\n cleanup()\n })\n .catch((e: Error) => {\n if (settled) return\n settled = true\n // If Promise rejects but no event was fired, call error callback\n console.debug('[WalletSdk] Promise rejected:', e)\n errorCallback(e)\n cleanup()\n })\n },\n verifyOTP(\n otpToken: string,\n deviceToken: string,\n deviceEncryptionKey: string,\n successCallback: LoginSuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n let settled = false\n\n const errorListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_ERROR,\n (event: unknown) => {\n if (settled) return\n settled = true\n // Convert event to Error object if needed\n const error =\n event instanceof Error\n ? event\n : new Error((event as { message?: string })?.message || 'Unknown error')\n errorCallback(error)\n cleanup()\n },\n )\n\n const cleanup = () => {\n errorListener?.remove()\n }\n\n ProgrammablewalletRnSdk.verifyOTP(\n otpToken,\n deviceToken,\n deviceEncryptionKey,\n )\n .then((result: LoginResult) => {\n if (settled) return\n settled = true\n successCallback(result)\n cleanup()\n })\n .catch((e: Error) => {\n if (settled) return\n settled = true\n errorCallback(e)\n cleanup()\n })\n },\n performLogin(\n provider: SocialProvider,\n deviceToken: string,\n deviceEncryptionKey: string,\n successCallback: LoginSuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n ProgrammablewalletRnSdk.performLogin(\n provider,\n deviceToken,\n deviceEncryptionKey,\n )\n .then((successResult: LoginResult) => {\n console.debug(\n '[WalletSdk] performLogin Promise resolved:',\n successResult,\n )\n successCallback(successResult)\n })\n .catch((e: Error) => {\n console.debug('[WalletSdk] performLogin Promise rejected:', e)\n errorCallback(e)\n })\n },\n performLogout(\n provider: SocialProvider,\n completedCallback: CompletedCallback,\n errorCallback: ErrorCallback,\n ): void {\n ProgrammablewalletRnSdk.performLogout(provider)\n .then(() => {\n console.debug('[WalletSdk] performLogout Promise resolved')\n completedCallback()\n })\n .catch((e: Error) => {\n console.debug('[WalletSdk] performLogout Promise rejected:', e)\n errorCallback(e)\n })\n },\n setBiometricsPin(\n userToken: string,\n encryptionKey: string,\n successCallback: SuccessCallback,\n errorCallback: ErrorCallback,\n ): void {\n let settled = false\n\n const successListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_SUCCESS,\n (event: unknown) => {\n if (settled) return\n settled = true\n successCallback(event as SuccessResult)\n cleanup()\n },\n )\n\n const errorListener = ProgrammablewalletRnSdk.addListener(\n EVENT_NAME_ON_ERROR,\n (event: unknown) => {\n if (settled) return\n settled = true\n console.debug(\n '[WalletSdk] setBiometricsPin Error event received:',\n event,\n )\n // Convert event to Error object if needed\n const error =\n event instanceof Error\n ? event\n : new Error((event as { message?: string })?.message || 'Unknown error')\n errorCallback(error)\n cleanup()\n },\n )\n\n // Cleanup function to remove listeners\n const cleanup = () => {\n successListener?.remove()\n errorListener?.remove()\n }\n\n // Call native setBiometricsPin method\n ProgrammablewalletRnSdk.setBiometricsPin(userToken, encryptionKey)\n .then((successResult: SuccessResult) => {\n if (settled) return\n settled = true\n // If Promise resolves but no event was fired, call success callback\n console.debug(\n '[WalletSdk] setBiometricsPin Promise resolved:',\n successResult,\n )\n successCallback(successResult)\n cleanup()\n })\n .catch((e: Error) => {\n if (settled) return\n settled = true\n // If Promise rejects but no event was fired, call error callback\n console.debug('[WalletSdk] setBiometricsPin Promise rejected:', e)\n errorCallback(e)\n cleanup()\n })\n },\n\n setDismissOnCallbackMap(map: Map<ErrorCode, boolean>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, boolean>\n ProgrammablewalletRnSdk.setDismissOnCallbackMap(serialized)\n } catch (e) {\n console.error('setDismissOnCallbackMap failed:', e)\n }\n },\n moveTaskToFront(): void {\n try {\n ProgrammablewalletRnSdk.moveTaskToFront()\n } catch (e) {\n console.error('moveTaskToFront failed:', e)\n }\n },\n moveRnTaskToFront(): void {\n try {\n ProgrammablewalletRnSdk.moveRnTaskToFront()\n } catch (e) {\n console.error('moveRnTaskToFront failed:', e)\n }\n },\n setTextConfigsMap(map: Map<TextsKey, TextConfig[]>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, TextConfig[]>\n ProgrammablewalletRnSdk.setTextConfigsMap(serialized)\n } catch (e) {\n console.error('setTextConfigsMap failed:', e)\n }\n },\n\n setIconTextConfigsMap(\n rawMap: Map<IconTextsKey, Array<IconTextConfig>>,\n ): void {\n try {\n // Create a transformed plain object instead of a Map\n const processedObj: Record<string, Array<{ image: string | null; textConfig: TextConfig }>> = {}\n\n Array.from(rawMap.entries()).forEach(([key, configs]) => {\n const processedConfigs = configs.map(config => {\n const { image, textConfig = {} } = config as IconTextConfig\n // Process image URL, as this is React Native specific logic\n return {\n image: image ? getImageUrl(image) : null,\n textConfig,\n }\n })\n processedObj[String(key)] = processedConfigs\n })\n\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(processedObj) as Record<string, unknown>\n ProgrammablewalletRnSdk.setIconTextConfigsMap(serialized)\n } catch (e) {\n console.error('setIconTextConfigsMap Error:', e)\n }\n },\n setTextConfigMap(map: Map<TextKey, TextConfig>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, TextConfig>\n ProgrammablewalletRnSdk.setTextConfigMap(serialized)\n } catch (e) {\n console.error('setTextConfigMap failed:', e)\n }\n },\n\n setImageMap(map: Map<ImageKey, ImageSourcePropType>): void {\n try {\n // Process image URLs, this part needs to be preserved\n const processedMap = new Map<ImageKey, string>()\n\n map.forEach((value, key) => {\n const url = getImageUrl(value)\n // Only keep non-null URLs\n if (url !== null) {\n processedMap.set(key, url)\n }\n })\n\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(processedMap) as Record<string, string>\n ProgrammablewalletRnSdk.setImageMap(serialized)\n } catch (e) {\n console.error('setImageMap failed:', e)\n }\n },\n setDateFormat(format: DateFormat): void {\n try {\n ProgrammablewalletRnSdk.setDateFormat(format)\n } catch (e) {\n console.error('setDateFormat failed:', e)\n }\n },\n setDebugging(debugging: boolean): void {\n try {\n ProgrammablewalletRnSdk.setDebugging(debugging)\n } catch (e) {\n console.error('setDebugging failed:', e)\n }\n },\n setCustomUserAgent(userAgent: string): void {\n ProgrammablewalletRnSdk.setCustomUserAgent(\n defaultUserAgentRn + ' | ' + userAgent,\n )\n },\n setErrorStringMap(map: Map<ErrorCode, string>): void {\n try {\n // Use bridgeSafe for serialization and ensure the result is a non-null object\n const serialized = bridgeSafe(map) as Record<string, string>\n ProgrammablewalletRnSdk.setErrorStringMap(serialized)\n } catch (e) {\n console.error('setErrorStringMap failed:', e)\n }\n },\n }\n})()\n"]}
@@ -19,7 +19,7 @@ Pod::Spec.new do |s|
19
19
  s.static_framework = true
20
20
 
21
21
  s.dependency 'ExpoModulesCore'
22
- s.dependency 'CircleProgrammableWalletSDK_static', '1.1.9'
22
+ s.dependency 'CircleProgrammableWalletSDK_static', '1.4.0'
23
23
 
24
24
  # Swift/Objective-C compatibility
25
25
  s.pod_target_xcconfig = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@circle-fin/w3s-pw-react-native-sdk",
3
- "version": "2.0.2",
3
+ "version": "2.2.0",
4
4
  "packageManager": "yarn@1.22.22",
5
5
  "description": "React Native SDK for Circle Programmable Wallet",
6
6
  "main": "build/index.js",
@@ -73,23 +73,23 @@
73
73
  "homepage": "https://github.com/circlefin/w3s-react-native-sdk.git #readme",
74
74
  "devDependencies": {
75
75
  "@babel/core": "^7.28.5",
76
- "@expo/config-plugins": "~10.1.2",
77
- "@types/jest": "^30.0.0",
78
- "@types/react": "~19.0.0",
76
+ "@expo/config-plugins": "~54.0.4",
77
+ "@types/jest": "29.5.14",
78
+ "@types/react": "~19.1.10",
79
79
  "@typescript-eslint/eslint-plugin": "^8.38.0",
80
80
  "@typescript-eslint/parser": "^8.38.0",
81
81
  "eslint": "^9.26.0",
82
82
  "eslint-config-prettier": "^10.1.8",
83
83
  "eslint-plugin-react": "^7.37.5",
84
84
  "eslint-plugin-react-native": "^5.0.0",
85
- "expo": "~53.0.12",
86
- "expo-module-scripts": "^4.1.6",
87
- "expo-modules-core": "~2.4.2",
85
+ "expo": "~54.0.0",
86
+ "expo-module-scripts": "^5.0.8",
87
+ "expo-modules-core": "~3.0.29",
88
88
  "jest": "^29.7.0",
89
89
  "prettier": "^3.6.2",
90
- "react": "^19.2.0",
91
- "react-native": "0.79.3",
92
- "react-test-renderer": "^19.2.0",
90
+ "react": "~19.1.0",
91
+ "react-native": "0.81.5",
92
+ "react-test-renderer": "~19.1.0",
93
93
  "ts-jest": "^29.4.5",
94
94
  "typescript": "^5.9.3"
95
95
  },
package/src/WalletSdk.ts CHANGED
@@ -107,9 +107,13 @@ export const WalletSdk = ((): IWalletSdk => {
107
107
  successCallback: SuccessCallback,
108
108
  errorCallback: ErrorCallback,
109
109
  ): void {
110
+ let settled = false
111
+
110
112
  const successListener = ProgrammablewalletRnSdk.addListener(
111
113
  EVENT_NAME_ON_SUCCESS,
112
114
  (event: unknown) => {
115
+ if (settled) return
116
+ settled = true
113
117
  console.debug('[WalletSdk] Execute result')
114
118
  successCallback(event as SuccessResult)
115
119
  cleanup()
@@ -119,6 +123,8 @@ export const WalletSdk = ((): IWalletSdk => {
119
123
  const errorListener = ProgrammablewalletRnSdk.addListener(
120
124
  EVENT_NAME_ON_ERROR,
121
125
  (event: unknown) => {
126
+ if (settled) return
127
+ settled = true
122
128
  console.debug('[WalletSdk] Error event received:', event)
123
129
  // Convert event to Error object if needed
124
130
  const error =
@@ -139,12 +145,16 @@ export const WalletSdk = ((): IWalletSdk => {
139
145
  // Call native execute method
140
146
  ProgrammablewalletRnSdk.execute(userToken, encryptionKey, challengeIds)
141
147
  .then((successResult: SuccessResult) => {
148
+ if (settled) return
149
+ settled = true
142
150
  // If Promise resolves but no event was fired, call success callback
143
151
  console.debug('[WalletSdk] Promise resolved')
144
152
  successCallback(successResult)
145
153
  cleanup()
146
154
  })
147
155
  .catch((e: Error) => {
156
+ if (settled) return
157
+ settled = true
148
158
  // If Promise rejects but no event was fired, call error callback
149
159
  console.debug('[WalletSdk] Promise rejected:', e)
150
160
  errorCallback(e)
@@ -158,27 +168,43 @@ export const WalletSdk = ((): IWalletSdk => {
158
168
  successCallback: LoginSuccessCallback,
159
169
  errorCallback: ErrorCallback,
160
170
  ): void {
161
- ProgrammablewalletRnSdk.addListener(EVENT_NAME_ON_ERROR, (event: unknown) => {
162
- // Convert event to Error object if needed
163
- const error =
164
- event instanceof Error
165
- ? event
166
- : new Error((event as { message?: string })?.message || 'Unknown error')
167
- errorCallback(error)
168
- })
171
+ let settled = false
172
+
173
+ const errorListener = ProgrammablewalletRnSdk.addListener(
174
+ EVENT_NAME_ON_ERROR,
175
+ (event: unknown) => {
176
+ if (settled) return
177
+ settled = true
178
+ // Convert event to Error object if needed
179
+ const error =
180
+ event instanceof Error
181
+ ? event
182
+ : new Error((event as { message?: string })?.message || 'Unknown error')
183
+ errorCallback(error)
184
+ cleanup()
185
+ },
186
+ )
187
+
188
+ const cleanup = () => {
189
+ errorListener?.remove()
190
+ }
191
+
169
192
  ProgrammablewalletRnSdk.verifyOTP(
170
193
  otpToken,
171
194
  deviceToken,
172
195
  deviceEncryptionKey,
173
196
  )
174
197
  .then((result: LoginResult) => {
198
+ if (settled) return
199
+ settled = true
175
200
  successCallback(result)
201
+ cleanup()
176
202
  })
177
203
  .catch((e: Error) => {
204
+ if (settled) return
205
+ settled = true
178
206
  errorCallback(e)
179
- })
180
- .finally(() => {
181
- ProgrammablewalletRnSdk.removeAllListeners(EVENT_NAME_ON_ERROR)
207
+ cleanup()
182
208
  })
183
209
  },
184
210
  performLogin(
@@ -226,9 +252,13 @@ export const WalletSdk = ((): IWalletSdk => {
226
252
  successCallback: SuccessCallback,
227
253
  errorCallback: ErrorCallback,
228
254
  ): void {
255
+ let settled = false
256
+
229
257
  const successListener = ProgrammablewalletRnSdk.addListener(
230
258
  EVENT_NAME_ON_SUCCESS,
231
259
  (event: unknown) => {
260
+ if (settled) return
261
+ settled = true
232
262
  successCallback(event as SuccessResult)
233
263
  cleanup()
234
264
  },
@@ -237,6 +267,8 @@ export const WalletSdk = ((): IWalletSdk => {
237
267
  const errorListener = ProgrammablewalletRnSdk.addListener(
238
268
  EVENT_NAME_ON_ERROR,
239
269
  (event: unknown) => {
270
+ if (settled) return
271
+ settled = true
240
272
  console.debug(
241
273
  '[WalletSdk] setBiometricsPin Error event received:',
242
274
  event,
@@ -260,6 +292,8 @@ export const WalletSdk = ((): IWalletSdk => {
260
292
  // Call native setBiometricsPin method
261
293
  ProgrammablewalletRnSdk.setBiometricsPin(userToken, encryptionKey)
262
294
  .then((successResult: SuccessResult) => {
295
+ if (settled) return
296
+ settled = true
263
297
  // If Promise resolves but no event was fired, call success callback
264
298
  console.debug(
265
299
  '[WalletSdk] setBiometricsPin Promise resolved:',
@@ -269,6 +303,8 @@ export const WalletSdk = ((): IWalletSdk => {
269
303
  cleanup()
270
304
  })
271
305
  .catch((e: Error) => {
306
+ if (settled) return
307
+ settled = true
272
308
  // If Promise rejects but no event was fired, call error callback
273
309
  console.debug('[WalletSdk] setBiometricsPin Promise rejected:', e)
274
310
  errorCallback(e)