@exodus/react-native-wallet 0.1.16

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.
Files changed (211) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +268 -0
  3. package/android/build.gradle +103 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifestNew.xml +2 -0
  6. package/android/src/main/java/com/expensify/wallet/Utils.kt +148 -0
  7. package/android/src/main/java/com/expensify/wallet/WalletModule.kt +380 -0
  8. package/android/src/main/java/com/expensify/wallet/WalletPackage.kt +48 -0
  9. package/android/src/main/java/com/expensify/wallet/components/RNAddToWalletButtonManager.kt +19 -0
  10. package/android/src/main/java/com/expensify/wallet/components/RNAddToWalletButtonView.kt +42 -0
  11. package/android/src/main/java/com/expensify/wallet/error/InvalidNetworkError.kt +6 -0
  12. package/android/src/main/java/com/expensify/wallet/event/OnCardActivatedEvent.kt +18 -0
  13. package/android/src/main/java/com/expensify/wallet/model/CardData.kt +12 -0
  14. package/android/src/main/java/com/expensify/wallet/model/CardStatus.kt +15 -0
  15. package/android/src/main/java/com/expensify/wallet/model/TokenizationStatus.kt +7 -0
  16. package/android/src/main/java/com/expensify/wallet/model/WalletData.kt +7 -0
  17. package/android/src/main/res/drawable/add_to_googlewallet_button_content.xml +7 -0
  18. package/android/src/main/res/drawable/badge_add_to_googlewallet_button_content.xml +7 -0
  19. package/android/src/main/res/drawable/googlewallet_button_background.xml +5 -0
  20. package/android/src/main/res/drawable/googlewallet_button_overlay.xml +11 -0
  21. package/android/src/main/res/drawable-af/add_to_googlewallet_button_content.xml +31 -0
  22. package/android/src/main/res/drawable-af/badge_add_to_googlewallet_button_content.xml +31 -0
  23. package/android/src/main/res/drawable-am/add_to_googlewallet_button_content.xml +34 -0
  24. package/android/src/main/res/drawable-am/badge_add_to_googlewallet_button_content.xml +34 -0
  25. package/android/src/main/res/drawable-ar/add_to_googlewallet_button_content.xml +7 -0
  26. package/android/src/main/res/drawable-ar/badge_add_to_googlewallet_button_content.xml +7 -0
  27. package/android/src/main/res/drawable-az/add_to_googlewallet_button_content.xml +7 -0
  28. package/android/src/main/res/drawable-az/badge_add_to_googlewallet_button_content.xml +7 -0
  29. package/android/src/main/res/drawable-bg/add_to_googlewallet_button_content.xml +7 -0
  30. package/android/src/main/res/drawable-bg/badge_add_to_googlewallet_button_content.xml +7 -0
  31. package/android/src/main/res/drawable-bn/add_to_googlewallet_button_content.xml +31 -0
  32. package/android/src/main/res/drawable-bn/badge_add_to_googlewallet_button_content.xml +31 -0
  33. package/android/src/main/res/drawable-br/add_to_googlewallet_button_content.xml +7 -0
  34. package/android/src/main/res/drawable-br/badge_add_to_googlewallet_button_content.xml +7 -0
  35. package/android/src/main/res/drawable-bs/add_to_googlewallet_button_content.xml +7 -0
  36. package/android/src/main/res/drawable-bs/badge_add_to_googlewallet_button_content.xml +7 -0
  37. package/android/src/main/res/drawable-by/add_to_googlewallet_button_content.xml +7 -0
  38. package/android/src/main/res/drawable-by/badge_add_to_googlewallet_button_content.xml +7 -0
  39. package/android/src/main/res/drawable-ca/add_to_googlewallet_button_content.xml +7 -0
  40. package/android/src/main/res/drawable-ca/badge_add_to_googlewallet_button_content.xml +7 -0
  41. package/android/src/main/res/drawable-cz/add_to_googlewallet_button_content.xml +7 -0
  42. package/android/src/main/res/drawable-cz/badge_add_to_googlewallet_button_content.xml +7 -0
  43. package/android/src/main/res/drawable-de/add_to_googlewallet_button_content.xml +7 -0
  44. package/android/src/main/res/drawable-de/badge_add_to_googlewallet_button_content.xml +7 -0
  45. package/android/src/main/res/drawable-dk/add_to_googlewallet_button_content.xml +7 -0
  46. package/android/src/main/res/drawable-dk/badge_add_to_googlewallet_button_content.xml +7 -0
  47. package/android/src/main/res/drawable-en-rau/add_to_googlewallet_button_content.xml +7 -0
  48. package/android/src/main/res/drawable-en-rau/badge_add_to_googlewallet_button_content.xml +7 -0
  49. package/android/src/main/res/drawable-en-rca/add_to_googlewallet_button_content.xml +7 -0
  50. package/android/src/main/res/drawable-en-rca/badge_add_to_googlewallet_button_content.xml +7 -0
  51. package/android/src/main/res/drawable-en-rgb/add_to_googlewallet_button_content.xml +7 -0
  52. package/android/src/main/res/drawable-en-rgb/badge_add_to_googlewallet_button_content.xml +7 -0
  53. package/android/src/main/res/drawable-en-rin/add_to_googlewallet_button_content.xml +7 -0
  54. package/android/src/main/res/drawable-en-rin/badge_add_to_googlewallet_button_content.xml +7 -0
  55. package/android/src/main/res/drawable-en-rsg/add_to_googlewallet_button_content.xml +7 -0
  56. package/android/src/main/res/drawable-en-rsg/badge_add_to_googlewallet_button_content.xml +7 -0
  57. package/android/src/main/res/drawable-en-rus/add_to_googlewallet_button_content.xml +7 -0
  58. package/android/src/main/res/drawable-en-rus/badge_add_to_googlewallet_button_content.xml +7 -0
  59. package/android/src/main/res/drawable-en-rza/add_to_googlewallet_button_content.xml +7 -0
  60. package/android/src/main/res/drawable-en-rza/badge_add_to_googlewallet_button_content.xml +7 -0
  61. package/android/src/main/res/drawable-es-res/add_to_googlewallet_button_content.xml +7 -0
  62. package/android/src/main/res/drawable-es-res/badge_add_to_googlewallet_button_content.xml +7 -0
  63. package/android/src/main/res/drawable-es-rus/add_to_googlewallet_button_content.xml +7 -0
  64. package/android/src/main/res/drawable-es-rus/badge_add_to_googlewallet_button_content.xml +7 -0
  65. package/android/src/main/res/drawable-et/add_to_googlewallet_button_content.xml +7 -0
  66. package/android/src/main/res/drawable-et/badge_add_to_googlewallet_button_content.xml +7 -0
  67. package/android/src/main/res/drawable-fa/add_to_googlewallet_button_content.xml +31 -0
  68. package/android/src/main/res/drawable-fa/badge_add_to_googlewallet_button_content.xml +34 -0
  69. package/android/src/main/res/drawable-fl/add_to_googlewallet_button_content.xml +7 -0
  70. package/android/src/main/res/drawable-fl/badge_add_to_googlewallet_button_content.xml +7 -0
  71. package/android/src/main/res/drawable-fp/add_to_googlewallet_button_content.xml +7 -0
  72. package/android/src/main/res/drawable-fp/badge_add_to_googlewallet_button_content.xml +7 -0
  73. package/android/src/main/res/drawable-fr-rca/add_to_googlewallet_button_content.xml +7 -0
  74. package/android/src/main/res/drawable-fr-rca/badge_add_to_googlewallet_button_content.xml +7 -0
  75. package/android/src/main/res/drawable-fr-rfr/add_to_googlewallet_button_content.xml +7 -0
  76. package/android/src/main/res/drawable-fr-rfr/badge_add_to_googlewallet_button_content.xml +7 -0
  77. package/android/src/main/res/drawable-gr/add_to_googlewallet_button_content.xml +7 -0
  78. package/android/src/main/res/drawable-gr/badge_add_to_googlewallet_button_content.xml +7 -0
  79. package/android/src/main/res/drawable-hdpi/googlepay_button_background_image.9.png +0 -0
  80. package/android/src/main/res/drawable-he/add_to_googlewallet_button_content.xml +7 -0
  81. package/android/src/main/res/drawable-he/badge_add_to_googlewallet_button_content.xml +7 -0
  82. package/android/src/main/res/drawable-hr/add_to_googlewallet_button_content.xml +7 -0
  83. package/android/src/main/res/drawable-hr/badge_add_to_googlewallet_button_content.xml +7 -0
  84. package/android/src/main/res/drawable-hu/add_to_googlewallet_button_content.xml +7 -0
  85. package/android/src/main/res/drawable-hu/badge_add_to_googlewallet_button_content.xml +7 -0
  86. package/android/src/main/res/drawable-hy/add_to_googlewallet_button_content.xml +7 -0
  87. package/android/src/main/res/drawable-hy/badge_add_to_googlewallet_button_content.xml +7 -0
  88. package/android/src/main/res/drawable-id/add_to_googlewallet_button_content.xml +7 -0
  89. package/android/src/main/res/drawable-id/badge_add_to_googlewallet_button_content.xml +7 -0
  90. package/android/src/main/res/drawable-is/add_to_googlewallet_button_content.xml +7 -0
  91. package/android/src/main/res/drawable-is/badge_add_to_googlewallet_button_content.xml +7 -0
  92. package/android/src/main/res/drawable-it/add_to_googlewallet_button_content.xml +7 -0
  93. package/android/src/main/res/drawable-it/badge_add_to_googlewallet_button_content.xml +7 -0
  94. package/android/src/main/res/drawable-jp/add_to_googlewallet_button_content.xml +7 -0
  95. package/android/src/main/res/drawable-jp/badge_add_to_googlewallet_button_content.xml +7 -0
  96. package/android/src/main/res/drawable-ka/add_to_googlewallet_button_content.xml +7 -0
  97. package/android/src/main/res/drawable-ka/badge_add_to_googlewallet_button_content.xml +7 -0
  98. package/android/src/main/res/drawable-kh/add_to_googlewallet_button_content.xml +33 -0
  99. package/android/src/main/res/drawable-kh/badge_add_to_googlewallet_button_content.xml +33 -0
  100. package/android/src/main/res/drawable-kk/add_to_googlewallet_button_content.xml +7 -0
  101. package/android/src/main/res/drawable-kk/badge_add_to_googlewallet_button_content.xml +7 -0
  102. package/android/src/main/res/drawable-ky/add_to_googlewallet_button_content.xml +7 -0
  103. package/android/src/main/res/drawable-ky/badge_add_to_googlewallet_button_content.xml +7 -0
  104. package/android/src/main/res/drawable-lo/add_to_googlewallet_button_content.xml +31 -0
  105. package/android/src/main/res/drawable-lo/badge_add_to_googlewallet_button_content.xml +31 -0
  106. package/android/src/main/res/drawable-lt/add_to_googlewallet_button_content.xml +7 -0
  107. package/android/src/main/res/drawable-lt/badge_add_to_googlewallet_button_content.xml +7 -0
  108. package/android/src/main/res/drawable-lv/add_to_googlewallet_button_content.xml +7 -0
  109. package/android/src/main/res/drawable-lv/badge_add_to_googlewallet_button_content.xml +7 -0
  110. package/android/src/main/res/drawable-mdpi/googlepay_button_background_image.9.png +0 -0
  111. package/android/src/main/res/drawable-mk/add_to_googlewallet_button_content.xml +7 -0
  112. package/android/src/main/res/drawable-mk/badge_add_to_googlewallet_button_content.xml +7 -0
  113. package/android/src/main/res/drawable-mn/add_to_googlewallet_button_content.xml +31 -0
  114. package/android/src/main/res/drawable-mn/badge_add_to_googlewallet_button_content.xml +31 -0
  115. package/android/src/main/res/drawable-my/add_to_googlewallet_button_content.xml +31 -0
  116. package/android/src/main/res/drawable-my/badge_add_to_googlewallet_button_content.xml +31 -0
  117. package/android/src/main/res/drawable-ne/add_to_googlewallet_button_content.xml +28 -0
  118. package/android/src/main/res/drawable-ne/badge_add_to_googlewallet_button_content.xml +31 -0
  119. package/android/src/main/res/drawable-nl/add_to_googlewallet_button_content.xml +7 -0
  120. package/android/src/main/res/drawable-nl/badge_add_to_googlewallet_button_content.xml +7 -0
  121. package/android/src/main/res/drawable-no/add_to_googlewallet_button_content.xml +7 -0
  122. package/android/src/main/res/drawable-no/badge_add_to_googlewallet_button_content.xml +7 -0
  123. package/android/src/main/res/drawable-pl/add_to_googlewallet_button_content.xml +7 -0
  124. package/android/src/main/res/drawable-pl/badge_add_to_googlewallet_button_content.xml +7 -0
  125. package/android/src/main/res/drawable-pt/add_to_googlewallet_button_content.xml +7 -0
  126. package/android/src/main/res/drawable-pt/badge_add_to_googlewallet_button_content.xml +7 -0
  127. package/android/src/main/res/drawable-ro/add_to_googlewallet_button_content.xml +7 -0
  128. package/android/src/main/res/drawable-ro/badge_add_to_googlewallet_button_content.xml +7 -0
  129. package/android/src/main/res/drawable-ru/add_to_googlewallet_button_content.xml +7 -0
  130. package/android/src/main/res/drawable-ru/badge_add_to_googlewallet_button_content.xml +7 -0
  131. package/android/src/main/res/drawable-se/add_to_googlewallet_button_content.xml +7 -0
  132. package/android/src/main/res/drawable-se/badge_add_to_googlewallet_button_content.xml +7 -0
  133. package/android/src/main/res/drawable-si/add_to_googlewallet_button_content.xml +31 -0
  134. package/android/src/main/res/drawable-si/badge_add_to_googlewallet_button_content.xml +31 -0
  135. package/android/src/main/res/drawable-sk/add_to_googlewallet_button_content.xml +7 -0
  136. package/android/src/main/res/drawable-sk/badge_add_to_googlewallet_button_content.xml +7 -0
  137. package/android/src/main/res/drawable-sl/add_to_googlewallet_button_content.xml +7 -0
  138. package/android/src/main/res/drawable-sl/badge_add_to_googlewallet_button_content.xml +7 -0
  139. package/android/src/main/res/drawable-sq/add_to_googlewallet_button_content.xml +7 -0
  140. package/android/src/main/res/drawable-sq/badge_add_to_googlewallet_button_content.xml +7 -0
  141. package/android/src/main/res/drawable-sr/add_to_googlewallet_button_content.xml +7 -0
  142. package/android/src/main/res/drawable-sr/badge_add_to_googlewallet_button_content.xml +7 -0
  143. package/android/src/main/res/drawable-sw/add_to_googlewallet_button_content.xml +31 -0
  144. package/android/src/main/res/drawable-sw/badge_add_to_googlewallet_button_content.xml +31 -0
  145. package/android/src/main/res/drawable-th/add_to_googlewallet_button_content.xml +7 -0
  146. package/android/src/main/res/drawable-th/badge_add_to_googlewallet_button_content.xml +7 -0
  147. package/android/src/main/res/drawable-tr/add_to_googlewallet_button_content.xml +7 -0
  148. package/android/src/main/res/drawable-tr/badge_add_to_googlewallet_button_content.xml +7 -0
  149. package/android/src/main/res/drawable-uk/add_to_googlewallet_button_content.xml +7 -0
  150. package/android/src/main/res/drawable-uk/badge_add_to_googlewallet_button_content.xml +7 -0
  151. package/android/src/main/res/drawable-ur/add_to_googlewallet_button_content.xml +34 -0
  152. package/android/src/main/res/drawable-ur/badge_add_to_googlewallet_button_content.xml +34 -0
  153. package/android/src/main/res/drawable-uz/add_to_googlewallet_button_content.xml +7 -0
  154. package/android/src/main/res/drawable-uz/badge_add_to_googlewallet_button_content.xml +7 -0
  155. package/android/src/main/res/drawable-vi/add_to_googlewallet_button_content.xml +7 -0
  156. package/android/src/main/res/drawable-vi/badge_add_to_googlewallet_button_content.xml +7 -0
  157. package/android/src/main/res/drawable-xhdpi/googlepay_button_background_image.9.png +0 -0
  158. package/android/src/main/res/drawable-xxhdpi/googlepay_button_background_image.9.png +0 -0
  159. package/android/src/main/res/drawable-xxxhdpi/googlepay_button_background_image.9.png +0 -0
  160. package/android/src/main/res/drawable-zh-rhk/add_to_googlewallet_button_content.xml +7 -0
  161. package/android/src/main/res/drawable-zh-rhk/badge_add_to_googlewallet_button_content.xml +7 -0
  162. package/android/src/main/res/drawable-zh-rtw/add_to_googlewallet_button_content.xml +7 -0
  163. package/android/src/main/res/drawable-zh-rtw/badge_add_to_googlewallet_button_content.xml +7 -0
  164. package/android/src/main/res/layout/add_to_googlewallet_badge.xml +35 -0
  165. package/android/src/main/res/layout/add_to_googlewallet_button.xml +34 -0
  166. package/android/src/main/res/values/googlewallet_strings.xml +7 -0
  167. package/android/src/paper/java/com/expensify/wallet/NativeWalletSpec.java +83 -0
  168. package/assets/buttons/android_button.svg +16 -0
  169. package/assets/buttons/ios_button.svg +259 -0
  170. package/assets/hero-image.png +0 -0
  171. package/assets/signature-dark.png +0 -0
  172. package/assets/signature-light.png +0 -0
  173. package/ios/RNAddToWalletButtonBridge.m +8 -0
  174. package/ios/RNWallet.h +13 -0
  175. package/ios/RNWallet.mm +153 -0
  176. package/ios/WalletManager.swift +297 -0
  177. package/ios/components/RNAddToWalletButtonManager.swift +13 -0
  178. package/ios/components/RNAddToWalletButtonView.swift +67 -0
  179. package/ios/stucts/AddPassResponse.swift +36 -0
  180. package/ios/stucts/CardInfo.swift +37 -0
  181. package/ios/stucts/WalletEncryptedPayload.swift +27 -0
  182. package/lib/commonjs/AddToWalletButton.js +83 -0
  183. package/lib/commonjs/AddToWalletButton.js.map +1 -0
  184. package/lib/commonjs/NativeWallet.js +22 -0
  185. package/lib/commonjs/NativeWallet.js.map +1 -0
  186. package/lib/commonjs/index.js +156 -0
  187. package/lib/commonjs/index.js.map +1 -0
  188. package/lib/commonjs/utils.js +38 -0
  189. package/lib/commonjs/utils.js.map +1 -0
  190. package/lib/module/AddToWalletButton.js +76 -0
  191. package/lib/module/AddToWalletButton.js.map +1 -0
  192. package/lib/module/NativeWallet.js +17 -0
  193. package/lib/module/NativeWallet.js.map +1 -0
  194. package/lib/module/index.js +132 -0
  195. package/lib/module/index.js.map +1 -0
  196. package/lib/module/utils.js +32 -0
  197. package/lib/module/utils.js.map +1 -0
  198. package/lib/typescript/src/AddToWalletButton.d.ts +16 -0
  199. package/lib/typescript/src/AddToWalletButton.d.ts.map +1 -0
  200. package/lib/typescript/src/NativeWallet.d.ts +77 -0
  201. package/lib/typescript/src/NativeWallet.d.ts.map +1 -0
  202. package/lib/typescript/src/index.d.ts +22 -0
  203. package/lib/typescript/src/index.d.ts.map +1 -0
  204. package/lib/typescript/src/utils.d.ts +5 -0
  205. package/lib/typescript/src/utils.d.ts.map +1 -0
  206. package/package.json +157 -0
  207. package/react-native-wallet.podspec +36 -0
  208. package/src/AddToWalletButton.tsx +78 -0
  209. package/src/NativeWallet.ts +115 -0
  210. package/src/index.tsx +184 -0
  211. package/src/utils.ts +35 -0
package/package.json ADDED
@@ -0,0 +1,157 @@
1
+ {
2
+ "name": "@exodus/react-native-wallet",
3
+ "version": "0.1.16",
4
+ "description": "A React Native module designed for seamless integration of Card Push Provisioning into Apple Wallet and Google Wallet, enabling easy and secure addition of payment cards directly from your application.",
5
+ "source": "./src/index.tsx",
6
+ "main": "lib/commonjs/index",
7
+ "module": "lib/module/index",
8
+ "types": "lib/typescript/src/index.d.ts",
9
+ "react-native": "src/index",
10
+ "files": [
11
+ "src",
12
+ "lib",
13
+ "assets",
14
+ "android",
15
+ "ios",
16
+ "cpp",
17
+ "*.podspec",
18
+ "react-native.config.js",
19
+ "!ios/build",
20
+ "!android/build",
21
+ "!android/gradle",
22
+ "!android/gradlew",
23
+ "!android/gradlew.bat",
24
+ "!android/local.properties",
25
+ "!**/__tests__",
26
+ "!**/__fixtures__",
27
+ "!**/__mocks__",
28
+ "!**/.*"
29
+ ],
30
+ "scripts": {
31
+ "test": "jest",
32
+ "typecheck": "tsc --noEmit",
33
+ "lint": "eslint . --ext .js,.ts,.tsx",
34
+ "lint:root": "eslint . --ext .js,.ts,.tsx --ignore-pattern '/example/**/*' --ignore-pattern '/WebExample/**/*'",
35
+ "lint:example": "eslint example --ext .js,.ts,.tsx",
36
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
37
+ "prepare": "bob build",
38
+ "build:watch": "nodemon --watch src --ext .ts,.tsx,.css --exec \"rm -f .build_complete && npm run prepare && npm pack && touch .build_complete\"",
39
+ "release": "release-it"
40
+ },
41
+ "keywords": [
42
+ "react-native",
43
+ "ios",
44
+ "android"
45
+ ],
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/ExodusForks/react-native-wallet.git"
49
+ },
50
+ "author": "Expensify, Inc.",
51
+ "license": "MIT",
52
+ "bugs": {
53
+ "url": "https://github.com/Expensify/react-native-wallet/issues"
54
+ },
55
+ "homepage": "https://github.com/Expensify/react-native-wallet#readme",
56
+ "publishConfig": {
57
+ "registry": "https://registry.npmjs.org/",
58
+ "access": "public"
59
+ },
60
+ "devDependencies": {
61
+ "@babel/preset-env": "^7.25.3",
62
+ "@babel/preset-react": "^7.18.6",
63
+ "@commitlint/config-conventional": "^17.0.2",
64
+ "@evilmartians/lefthook": "^1.5.0",
65
+ "@lwc/eslint-plugin-lwc": "^1.7.2",
66
+ "@react-native-community/cli": "20.0.0",
67
+ "@react-native-community/cli-platform-android": "20.0.0",
68
+ "@react-native-community/cli-platform-ios": "20.0.0",
69
+ "@react-native/eslint-config": "0.81.0",
70
+ "@react-native/gradle-plugin": "0.81.0",
71
+ "@release-it/conventional-changelog": "^5.0.0",
72
+ "@types/jest": "^29.5.14",
73
+ "@types/react": "^19.1.0",
74
+ "@typescript-eslint/eslint-plugin": "^6.15.0",
75
+ "@typescript-eslint/parser": "^6.15.0",
76
+ "del-cli": "^5.0.0",
77
+ "eslint": "^8.57.1",
78
+ "eslint-config-expensify": "^2.0.24",
79
+ "eslint-config-prettier": "^8.5.0",
80
+ "eslint-import-resolver-alias": "^1.1.2",
81
+ "eslint-plugin-deprecation": "^2.0.0",
82
+ "eslint-plugin-es": "^4.1.0",
83
+ "eslint-plugin-filenames": "^1.3.2",
84
+ "eslint-plugin-header": "^3.1.1",
85
+ "eslint-plugin-import": "^2.29.1",
86
+ "eslint-plugin-jsx-a11y": "^6.8.0",
87
+ "eslint-plugin-prettier": "^4.0.0",
88
+ "eslint-plugin-promise": "^6.1.1",
89
+ "eslint-plugin-tsdoc": "^0.2.17",
90
+ "jest": "^29.6.3",
91
+ "prettier": "2.8.8",
92
+ "react": "19.1.0",
93
+ "react-native": "0.81.0",
94
+ "react-native-builder-bob": "^0.20.0",
95
+ "release-it": "^15.0.0",
96
+ "turbo": "^1.10.7",
97
+ "typescript": "^5.8.3"
98
+ },
99
+ "peerDependencies": {
100
+ "react": "*",
101
+ "react-native": "*"
102
+ },
103
+ "workspaces": [
104
+ "./example"
105
+ ],
106
+ "jest": {
107
+ "preset": "react-native",
108
+ "modulePathIgnorePatterns": [
109
+ "<rootDir>/example/node_modules",
110
+ "<rootDir>/lib/"
111
+ ]
112
+ },
113
+ "commitlint": {
114
+ "extends": [
115
+ "@commitlint/config-conventional"
116
+ ]
117
+ },
118
+ "release-it": {
119
+ "git": {
120
+ "commitMessage": "chore: release ${version}",
121
+ "tagName": "v${version}"
122
+ },
123
+ "npm": {
124
+ "publish": true
125
+ },
126
+ "github": {
127
+ "release": true
128
+ },
129
+ "plugins": {
130
+ "@release-it/conventional-changelog": {
131
+ "preset": "angular"
132
+ }
133
+ }
134
+ },
135
+ "react-native-builder-bob": {
136
+ "source": "src",
137
+ "output": "lib",
138
+ "targets": [
139
+ "commonjs",
140
+ "module",
141
+ [
142
+ "typescript",
143
+ {
144
+ "project": "tsconfig.json"
145
+ }
146
+ ]
147
+ ]
148
+ },
149
+ "codegenConfig": {
150
+ "name": "RNWalletSpec",
151
+ "type": "all",
152
+ "jsSrcsDir": "src",
153
+ "android": {
154
+ "javaPackageName": "com.expensify.wallet"
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,36 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ $RNWallet = Object.new
6
+
7
+ def $RNWallet._add_compiler_flags(sp, extra_flags)
8
+ exisiting_flags = sp.attributes_hash["compiler_flags"]
9
+ if exisiting_flags.present?
10
+ sp.compiler_flags = exisiting_flags + " #{extra_flags}"
11
+ else
12
+ sp.compiler_flags = extra_flags
13
+ end
14
+ end
15
+
16
+ Pod::Spec.new do |s|
17
+ s.name = "react-native-wallet"
18
+ s.version = package["version"]
19
+ s.summary = package["description"]
20
+ s.homepage = package["homepage"]
21
+ s.license = package["license"]
22
+ s.authors = package["author"]
23
+
24
+ s.platforms = { :ios => min_ios_version_supported }
25
+ s.source = { :git => "https://github.com/ExodusForks/react-native-wallet.git", :tag => "#{s.version}" }
26
+
27
+ s.source_files = "ios/**/*.{h,m,mm,cpp,swift}"
28
+
29
+ s.dependency "React-Core"
30
+
31
+ install_modules_dependencies(s);
32
+
33
+ if ENV['USE_FRAMEWORKS']
34
+ $RNWallet._add_compiler_flags(s, "-DRNWallet_USE_FRAMEWORKS=1")
35
+ end
36
+ end
@@ -0,0 +1,78 @@
1
+ import React from 'react';
2
+ import type {ViewStyle, GestureResponderEvent, HostComponent, StyleProp} from 'react-native';
3
+ import {Platform, requireNativeComponent, StyleSheet, TouchableOpacity} from 'react-native';
4
+
5
+ type ButtonStyle = 'black' | 'blackOutline';
6
+ type ButtonType = 'basic' | 'badge';
7
+
8
+ interface NativeWalletButtonProps {
9
+ style?: StyleProp<ViewStyle>;
10
+ buttonStyle?: ButtonStyle;
11
+ buttonType?: ButtonType;
12
+ borderRadius?: number;
13
+ }
14
+
15
+ type Props = NativeWalletButtonProps & {
16
+ onPress?: (e: GestureResponderEvent) => void;
17
+ };
18
+
19
+ const NativeWalletButton: HostComponent<NativeWalletButtonProps> = requireNativeComponent('RNAddToWalletButton');
20
+
21
+ const BUTTON_TYPE_BREAKPOINT = 236;
22
+ const BUTTON_DIMENSIONS = {
23
+ basic: {
24
+ ios: {width: 300, height: 40},
25
+ android: {width: 300, height: 48},
26
+ },
27
+ badge: {
28
+ ios: {width: 120, height: 40},
29
+ android: {width: 200, height: 56},
30
+ },
31
+ };
32
+
33
+ function AddToWalletButton({style, buttonStyle = 'black', buttonType = 'basic', borderRadius = 4, onPress}: Props) {
34
+ const flattenedStyle = StyleSheet.flatten(style) || {};
35
+ const safeButtonType: ButtonType = buttonType === 'badge' ? 'badge' : 'basic';
36
+ const currentDimensions = BUTTON_DIMENSIONS[safeButtonType][Platform.OS as 'ios' | 'android'];
37
+ const {width = currentDimensions.width, height = currentDimensions.height, ...rest} = flattenedStyle;
38
+
39
+ return (
40
+ <TouchableOpacity
41
+ onPress={onPress}
42
+ activeOpacity={0.8}
43
+ style={[
44
+ rest,
45
+ // Android allows us to define the type of the button, however on iOS type depends on the width.
46
+ // Adding this limits to ensure consistent behavior across platforms.
47
+ buttonType === 'badge' ? {maxWidth: BUTTON_TYPE_BREAKPOINT - 1} : {minWidth: BUTTON_TYPE_BREAKPOINT},
48
+ {
49
+ width,
50
+ height,
51
+ },
52
+ styles.touchable,
53
+ ]}
54
+ >
55
+ <NativeWalletButton
56
+ style={styles.fill}
57
+ buttonStyle={buttonStyle}
58
+ borderRadius={borderRadius}
59
+ buttonType={safeButtonType}
60
+ />
61
+ </TouchableOpacity>
62
+ );
63
+ }
64
+
65
+ const styles = StyleSheet.create({
66
+ touchable: {
67
+ justifyContent: 'center',
68
+ alignItems: 'center',
69
+ margin: 10,
70
+ },
71
+ fill: {
72
+ flex: 1,
73
+ width: '100%',
74
+ height: '100%',
75
+ },
76
+ });
77
+
78
+ export default AddToWalletButton;
@@ -0,0 +1,115 @@
1
+ import type {TurboModule} from 'react-native';
2
+ import {TurboModuleRegistry} from 'react-native';
3
+
4
+ type AndroidWalletData = {
5
+ deviceID: string;
6
+ walletAccountID: string;
7
+ };
8
+
9
+ type CardStatus = 'not found' | 'requireActivation' | 'pending' | 'active' | 'suspended' | 'deactivated';
10
+
11
+ type Platform = 'android' | 'ios';
12
+
13
+ type UserAddress = {
14
+ name: string;
15
+ addressOne: string;
16
+ addressTwo?: string;
17
+ administrativeArea: string;
18
+ locality: string;
19
+ countryCode: string;
20
+ postalCode: string;
21
+ phoneNumber: string;
22
+ };
23
+
24
+ type AndroidCardData = {
25
+ network: string;
26
+ opaquePaymentCard: string;
27
+ cardHolderName: string;
28
+ lastDigits: string;
29
+ userAddress: UserAddress;
30
+ };
31
+
32
+ type AndroidResumeCardData = {
33
+ network: string;
34
+ tokenReferenceID: string;
35
+ cardHolderName?: string;
36
+ lastDigits?: string;
37
+ };
38
+
39
+ type IOSCardData = {
40
+ network: string;
41
+ cardHolderName: string;
42
+ lastDigits: string;
43
+ cardDescription: string;
44
+ };
45
+
46
+ type onCardActivatedPayload = {
47
+ tokenId: string;
48
+ actionStatus: 'active' | 'canceled';
49
+ };
50
+
51
+ type IOSAddPaymentPassData = {
52
+ status: number;
53
+ nonce: string;
54
+ nonceSignature: string;
55
+ certificates: string[];
56
+ };
57
+
58
+ type IOSEncryptPayload = {
59
+ encryptedPassData: string;
60
+ activationData: string;
61
+ ephemeralPublicKey: string;
62
+ };
63
+
64
+ type TokenizationStatus = 'canceled' | 'success' | 'error';
65
+
66
+ type TokenInfo = {
67
+ identifier: string;
68
+ lastDigits: string;
69
+ tokenState: number;
70
+ };
71
+
72
+ export interface Spec extends TurboModule {
73
+ checkWalletAvailability(): Promise<boolean>;
74
+ ensureGoogleWalletInitialized(): Promise<boolean>;
75
+ getSecureWalletInfo(): Promise<AndroidWalletData>;
76
+ getCardStatusBySuffix(last4Digits: string): Promise<number>;
77
+ getCardStatusByIdentifier(identifier: string, tsp: string): Promise<number>;
78
+ addCardToGoogleWallet(cardData: AndroidCardData): Promise<number>;
79
+ resumeAddCardToGoogleWallet(cardData: AndroidResumeCardData): Promise<number>;
80
+ listTokens(): Promise<TokenInfo[]>;
81
+ IOSPresentAddPaymentPassView(cardData: IOSCardData): Promise<IOSAddPaymentPassData>;
82
+ IOSHandleAddPaymentPassResponse(payload: IOSEncryptPayload): Promise<IOSAddPaymentPassData | null>;
83
+ addListener: (eventType: string) => void;
84
+ removeListeners: (count: number) => void;
85
+ }
86
+
87
+ const PACKAGE_NAME = '@expensify/react-native-wallet';
88
+ // Try catch block to prevent crashing in case the module is not linked.
89
+ // Especialy useful for builds where Google SDK is not available
90
+ // eslint-disable-next-line import/no-mutable-exports
91
+ let Wallet: Spec | undefined;
92
+ try {
93
+ Wallet = TurboModuleRegistry.getEnforcing<Spec>('RNWallet');
94
+ } catch (error) {
95
+ if (error instanceof Error) {
96
+ // eslint-disable-next-line no-console
97
+ console.warn(`[${PACKAGE_NAME}] Failed to load Wallet module, ${error.message}`);
98
+ }
99
+ }
100
+ export default Wallet;
101
+ export {PACKAGE_NAME};
102
+ export type {
103
+ AndroidCardData,
104
+ AndroidResumeCardData,
105
+ IOSCardData,
106
+ AndroidWalletData,
107
+ CardStatus,
108
+ UserAddress,
109
+ onCardActivatedPayload,
110
+ Platform,
111
+ IOSAddPaymentPassData,
112
+ IOSEncryptPayload,
113
+ TokenizationStatus,
114
+ TokenInfo,
115
+ };
package/src/index.tsx ADDED
@@ -0,0 +1,184 @@
1
+ /* eslint-disable @lwc/lwc/no-async-await */
2
+ import {NativeEventEmitter, Platform} from 'react-native';
3
+ import type {EmitterSubscription} from 'react-native';
4
+ import Wallet, {PACKAGE_NAME} from './NativeWallet';
5
+ import type {
6
+ TokenizationStatus,
7
+ AndroidCardData,
8
+ AndroidResumeCardData,
9
+ CardStatus,
10
+ IOSCardData,
11
+ IOSEncryptPayload,
12
+ AndroidWalletData,
13
+ onCardActivatedPayload,
14
+ IOSAddPaymentPassData,
15
+ TokenInfo,
16
+ } from './NativeWallet';
17
+ import {getCardState, getTokenizationStatus} from './utils';
18
+ import AddToWalletButton from './AddToWalletButton';
19
+
20
+ function getModuleLinkingRejection() {
21
+ return Promise.reject(new Error(`Failed to load Wallet module, make sure to link ${PACKAGE_NAME} correctly`));
22
+ }
23
+
24
+ let eventEmitter: NativeEventEmitter | null = null;
25
+
26
+ function getEventEmitter(): NativeEventEmitter {
27
+ if (!Wallet) {
28
+ throw new Error(`Failed to load Wallet module, make sure to link ${PACKAGE_NAME} correctly`);
29
+ }
30
+ if (!eventEmitter) {
31
+ eventEmitter = new NativeEventEmitter(Wallet);
32
+ }
33
+ return eventEmitter;
34
+ }
35
+
36
+ function addListener(event: string, callback: (data: onCardActivatedPayload) => void): EmitterSubscription {
37
+ return getEventEmitter().addListener(event, callback);
38
+ }
39
+
40
+ function removeListener(subscription: EmitterSubscription): void {
41
+ subscription.remove();
42
+ }
43
+
44
+ function checkWalletAvailability(): Promise<boolean> {
45
+ if (!Wallet) {
46
+ return getModuleLinkingRejection();
47
+ }
48
+ return Wallet.checkWalletAvailability();
49
+ }
50
+
51
+ async function getSecureWalletInfo(): Promise<AndroidWalletData> {
52
+ if (Platform.OS === 'ios') {
53
+ throw new Error('getSecureWalletInfo is not available on iOS');
54
+ }
55
+
56
+ if (!Wallet) {
57
+ return getModuleLinkingRejection();
58
+ }
59
+ const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized();
60
+ if (!isWalletInitialized) {
61
+ throw new Error('Wallet could not be initialized');
62
+ }
63
+
64
+ return Wallet.getSecureWalletInfo();
65
+ }
66
+
67
+ async function getCardStatusBySuffix(last4Digits: string): Promise<CardStatus> {
68
+ if (!Wallet) {
69
+ return getModuleLinkingRejection();
70
+ }
71
+
72
+ const cardState = await Wallet.getCardStatusBySuffix(last4Digits);
73
+ return getCardState(cardState);
74
+ }
75
+
76
+ /**
77
+ * Returns the state of a card based on a platform-specific identifier.
78
+ * @param identifier - The card identifier. On Android, it's `Token Reference ID` and on iOS, it's `Primary Account Identifier`
79
+ * @param tsp - The Token Service Provider, e.g. `VISA`, `MASTERCARD`
80
+ * @returns CardStatus - The card status
81
+ */
82
+ async function getCardStatusByIdentifier(identifier: string, tsp: string): Promise<CardStatus> {
83
+ if (!Wallet) {
84
+ return getModuleLinkingRejection();
85
+ }
86
+
87
+ const tokenState = await Wallet.getCardStatusByIdentifier(identifier, tsp.toUpperCase());
88
+ return getCardState(tokenState);
89
+ }
90
+
91
+ async function addCardToGoogleWallet(cardData: AndroidCardData): Promise<TokenizationStatus> {
92
+ if (Platform.OS === 'ios') {
93
+ throw new Error('addCardToGoogleWallet is not available on iOS');
94
+ }
95
+
96
+ if (!Wallet) {
97
+ return getModuleLinkingRejection();
98
+ }
99
+ const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized();
100
+ if (!isWalletInitialized) {
101
+ throw new Error('Wallet could not be initialized');
102
+ }
103
+ const tokenizationStatus = await Wallet.addCardToGoogleWallet(cardData);
104
+ return getTokenizationStatus(tokenizationStatus);
105
+ }
106
+
107
+ async function resumeAddCardToGoogleWallet(cardData: AndroidResumeCardData): Promise<TokenizationStatus> {
108
+ if (Platform.OS === 'ios') {
109
+ throw new Error('resumeAddCardToGoogleWallet is not available on iOS');
110
+ }
111
+
112
+ if (!Wallet) {
113
+ return getModuleLinkingRejection();
114
+ }
115
+ const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized();
116
+ if (!isWalletInitialized) {
117
+ throw new Error('Wallet could not be initialized');
118
+ }
119
+ const tokenizationStatus = await Wallet.resumeAddCardToGoogleWallet(cardData);
120
+ return getTokenizationStatus(tokenizationStatus);
121
+ }
122
+
123
+ async function listTokens(): Promise<TokenInfo[]> {
124
+ if (Platform.OS === 'ios') {
125
+ return Promise.resolve([]);
126
+ }
127
+
128
+ if (!Wallet) {
129
+ return getModuleLinkingRejection();
130
+ }
131
+ const isWalletInitialized = await Wallet.ensureGoogleWalletInitialized();
132
+ if (!isWalletInitialized) {
133
+ throw new Error('Wallet could not be initialized');
134
+ }
135
+ return Wallet.listTokens();
136
+ }
137
+
138
+ async function addCardToAppleWallet(
139
+ cardData: IOSCardData,
140
+ issuerEncryptPayloadCallback: (nonce: string, nonceSignature: string, certificate: string[]) => Promise<IOSEncryptPayload>,
141
+ ): Promise<TokenizationStatus> {
142
+ if (Platform.OS === 'android') {
143
+ throw new Error('addCardToAppleWallet is not available on Android');
144
+ }
145
+
146
+ if (!Wallet) {
147
+ return getModuleLinkingRejection();
148
+ }
149
+ const wallet = Wallet;
150
+
151
+ const passData = await wallet.IOSPresentAddPaymentPassView(cardData);
152
+
153
+ if (!passData || passData.status !== 0) {
154
+ return getTokenizationStatus(passData?.status || -1);
155
+ }
156
+
157
+ async function addPaymentPassToWallet(paymentPassData: IOSAddPaymentPassData): Promise<number> {
158
+ const responseData = await issuerEncryptPayloadCallback(paymentPassData.nonce, paymentPassData.nonceSignature, paymentPassData.certificates);
159
+ const response = await wallet.IOSHandleAddPaymentPassResponse(responseData);
160
+ // Response is null when a pass is successfully added to the wallet or the user cancels the process
161
+ // In case the user presses the `Try again` option, new pass data is returned, and it should reenter the function
162
+ if (response) {
163
+ return addPaymentPassToWallet(response);
164
+ }
165
+ return 0;
166
+ }
167
+ const status = await addPaymentPassToWallet(passData);
168
+ return getTokenizationStatus(status);
169
+ }
170
+
171
+ export type {AndroidCardData, AndroidWalletData, CardStatus, IOSEncryptPayload, IOSCardData, IOSAddPaymentPassData, onCardActivatedPayload, TokenizationStatus, TokenInfo};
172
+ export {
173
+ AddToWalletButton,
174
+ checkWalletAvailability,
175
+ getSecureWalletInfo,
176
+ getCardStatusBySuffix,
177
+ getCardStatusByIdentifier,
178
+ addCardToGoogleWallet,
179
+ resumeAddCardToGoogleWallet,
180
+ listTokens,
181
+ addCardToAppleWallet,
182
+ addListener,
183
+ removeListener,
184
+ };
package/src/utils.ts ADDED
@@ -0,0 +1,35 @@
1
+ import type {CardStatus, TokenizationStatus} from './NativeWallet';
2
+
3
+ function getCardState(stateId: number): CardStatus {
4
+ switch (stateId) {
5
+ case -1:
6
+ return 'not found';
7
+ case 0:
8
+ return 'active';
9
+ case 1:
10
+ return 'requireActivation';
11
+ case 2:
12
+ return 'pending';
13
+ case 3:
14
+ return 'suspended';
15
+ case 4:
16
+ return 'deactivated';
17
+ default:
18
+ throw new Error(`Unknown card state: ${stateId}`);
19
+ }
20
+ }
21
+
22
+ function getTokenizationStatus(stateId: number): TokenizationStatus {
23
+ switch (stateId) {
24
+ case -1:
25
+ return 'error';
26
+ case 0:
27
+ return 'success';
28
+ case 1:
29
+ return 'canceled';
30
+ default:
31
+ throw new Error(`Unknown tokenization status: ${stateId}`);
32
+ }
33
+ }
34
+
35
+ export {getCardState, getTokenizationStatus};