@crossmint/client-sdk-react-native-ui 0.13.33 → 0.13.34

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 (241) hide show
  1. package/dist/chunk-24MMQ2R4.js +15 -0
  2. package/dist/chunk-24MMQ2R4.js.map +1 -0
  3. package/dist/chunk-2DNOAXOE.mjs +8 -0
  4. package/dist/chunk-2DNOAXOE.mjs.map +1 -0
  5. package/dist/chunk-2TEAOLM6.mjs +149 -0
  6. package/dist/chunk-2TEAOLM6.mjs.map +1 -0
  7. package/dist/chunk-2YRJHM46.mjs +50 -0
  8. package/dist/chunk-2YRJHM46.mjs.map +1 -0
  9. package/dist/chunk-34OVOZB2.mjs +111 -0
  10. package/dist/chunk-34OVOZB2.mjs.map +1 -0
  11. package/dist/chunk-3AWDWMZ2.mjs +18 -0
  12. package/dist/chunk-3AWDWMZ2.mjs.map +1 -0
  13. package/dist/chunk-3MWGBZ5O.js +348 -0
  14. package/dist/chunk-3MWGBZ5O.js.map +1 -0
  15. package/dist/chunk-3PJ6FXFT.mjs +1 -0
  16. package/dist/chunk-3PJ6FXFT.mjs.map +1 -0
  17. package/dist/chunk-3SFSPJXM.mjs +55 -0
  18. package/dist/chunk-3SFSPJXM.mjs.map +1 -0
  19. package/dist/chunk-4AJTICKY.mjs +44 -0
  20. package/dist/chunk-4AJTICKY.mjs.map +1 -0
  21. package/dist/chunk-4HKXTAVR.js +14 -0
  22. package/dist/chunk-4HKXTAVR.js.map +1 -0
  23. package/dist/chunk-4NTIGHRE.js +148 -0
  24. package/dist/chunk-4NTIGHRE.js.map +1 -0
  25. package/dist/chunk-4V7NDO5X.mjs +157 -0
  26. package/dist/chunk-4V7NDO5X.mjs.map +1 -0
  27. package/dist/chunk-4WJIXD7U.mjs +14 -0
  28. package/dist/chunk-4WJIXD7U.mjs.map +1 -0
  29. package/dist/chunk-5ZBDQUNG.js +1 -0
  30. package/dist/chunk-5ZBDQUNG.js.map +1 -0
  31. package/dist/chunk-6W2GOMYU.js +22 -0
  32. package/dist/chunk-6W2GOMYU.js.map +1 -0
  33. package/dist/chunk-6Z74KC25.mjs +1 -0
  34. package/dist/chunk-6Z74KC25.mjs.map +1 -0
  35. package/dist/chunk-7SPIOD4K.mjs +66 -0
  36. package/dist/chunk-7SPIOD4K.mjs.map +1 -0
  37. package/dist/chunk-ALMDA3KN.mjs +199 -0
  38. package/dist/chunk-ALMDA3KN.mjs.map +1 -0
  39. package/dist/chunk-BE4HT2U7.mjs +1 -0
  40. package/dist/chunk-BE4HT2U7.mjs.map +1 -0
  41. package/dist/chunk-BTH5QRIT.js +149 -0
  42. package/dist/chunk-BTH5QRIT.js.map +1 -0
  43. package/dist/chunk-BUB4U2GE.js +44 -0
  44. package/dist/chunk-BUB4U2GE.js.map +1 -0
  45. package/dist/chunk-BUTZZ7JB.js +36 -0
  46. package/dist/chunk-BUTZZ7JB.js.map +1 -0
  47. package/dist/chunk-CFHHVHNZ.mjs +157 -0
  48. package/dist/chunk-CFHHVHNZ.mjs.map +1 -0
  49. package/dist/chunk-DD2MVD6A.mjs +36 -0
  50. package/dist/chunk-DD2MVD6A.mjs.map +1 -0
  51. package/dist/chunk-EKXEDMRD.mjs +71 -0
  52. package/dist/chunk-EKXEDMRD.mjs.map +1 -0
  53. package/dist/chunk-GYBEEYGB.mjs +1 -0
  54. package/dist/chunk-GYBEEYGB.mjs.map +1 -0
  55. package/dist/chunk-HELXBZ7D.js +18 -0
  56. package/dist/chunk-HELXBZ7D.js.map +1 -0
  57. package/dist/chunk-IBQK5B7B.js +71 -0
  58. package/dist/chunk-IBQK5B7B.js.map +1 -0
  59. package/dist/chunk-IHZNXV5S.js +1 -0
  60. package/dist/chunk-IHZNXV5S.js.map +1 -0
  61. package/dist/chunk-J2MDWDV6.mjs +1 -0
  62. package/dist/chunk-J2MDWDV6.mjs.map +1 -0
  63. package/dist/chunk-KK4SQ7WF.js +1 -0
  64. package/dist/chunk-KK4SQ7WF.js.map +1 -0
  65. package/dist/chunk-LMXGU2XA.js +50 -0
  66. package/dist/chunk-LMXGU2XA.js.map +1 -0
  67. package/dist/chunk-LWQ5CJC4.mjs +22 -0
  68. package/dist/chunk-LWQ5CJC4.mjs.map +1 -0
  69. package/dist/chunk-MMVER6VO.js +1 -0
  70. package/dist/chunk-MMVER6VO.js.map +1 -0
  71. package/dist/chunk-MVLQR6RI.js +199 -0
  72. package/dist/chunk-MVLQR6RI.js.map +1 -0
  73. package/dist/chunk-NBWATZY4.js +157 -0
  74. package/dist/chunk-NBWATZY4.js.map +1 -0
  75. package/dist/chunk-NSSAF6CV.mjs +348 -0
  76. package/dist/chunk-NSSAF6CV.mjs.map +1 -0
  77. package/dist/chunk-OLVGVQEA.js +24 -0
  78. package/dist/chunk-OLVGVQEA.js.map +1 -0
  79. package/dist/chunk-OTRMAWWU.js +55 -0
  80. package/dist/chunk-OTRMAWWU.js.map +1 -0
  81. package/dist/chunk-Q2Y5CZT4.js +157 -0
  82. package/dist/chunk-Q2Y5CZT4.js.map +1 -0
  83. package/dist/chunk-Q7YPX4RJ.js +66 -0
  84. package/dist/chunk-Q7YPX4RJ.js.map +1 -0
  85. package/dist/chunk-R2M3HW3E.mjs +61 -0
  86. package/dist/chunk-R2M3HW3E.mjs.map +1 -0
  87. package/dist/chunk-R3ZW4OCR.js +61 -0
  88. package/dist/chunk-R3ZW4OCR.js.map +1 -0
  89. package/dist/chunk-R47XMJ32.js +1 -0
  90. package/dist/chunk-R47XMJ32.js.map +1 -0
  91. package/dist/chunk-R5GF6WFB.mjs +148 -0
  92. package/dist/chunk-R5GF6WFB.mjs.map +1 -0
  93. package/dist/chunk-RSCBYS6I.mjs +15 -0
  94. package/dist/chunk-RSCBYS6I.mjs.map +1 -0
  95. package/dist/chunk-TNPZITVL.mjs +1 -0
  96. package/dist/chunk-TNPZITVL.mjs.map +1 -0
  97. package/dist/chunk-U74INGIF.js +17 -0
  98. package/dist/chunk-U74INGIF.js.map +1 -0
  99. package/dist/chunk-V2PIS2OC.mjs +17 -0
  100. package/dist/chunk-V2PIS2OC.mjs.map +1 -0
  101. package/dist/chunk-VCF2YXCO.js +208 -0
  102. package/dist/chunk-VCF2YXCO.js.map +1 -0
  103. package/dist/chunk-XNVZRSGL.js +111 -0
  104. package/dist/chunk-XNVZRSGL.js.map +1 -0
  105. package/dist/chunk-XUGJXLWC.js +8 -0
  106. package/dist/chunk-XUGJXLWC.js.map +1 -0
  107. package/dist/chunk-XXJ7LQ44.js +1 -0
  108. package/dist/chunk-XXJ7LQ44.js.map +1 -0
  109. package/dist/chunk-YAVGI5BZ.mjs +24 -0
  110. package/dist/chunk-YAVGI5BZ.mjs.map +1 -0
  111. package/dist/chunk-Z7Y7COJM.mjs +208 -0
  112. package/dist/chunk-Z7Y7COJM.mjs.map +1 -0
  113. package/dist/components/embed/index.js +16 -1
  114. package/dist/components/embed/index.js.map +1 -0
  115. package/dist/components/embed/index.mjs +16 -1
  116. package/dist/components/embed/index.mjs.map +1 -0
  117. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.js +14 -1
  118. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.js.map +1 -0
  119. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.mjs +14 -1
  120. package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.mjs.map +1 -0
  121. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.js +13 -1
  122. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.js.map +1 -0
  123. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.mjs +13 -1
  124. package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.mjs.map +1 -0
  125. package/dist/components/embed/v3/crypto/PayerConnectionHandler.js +8 -1
  126. package/dist/components/embed/v3/crypto/PayerConnectionHandler.js.map +1 -0
  127. package/dist/components/embed/v3/crypto/PayerConnectionHandler.mjs +8 -1
  128. package/dist/components/embed/v3/crypto/PayerConnectionHandler.mjs.map +1 -0
  129. package/dist/components/embed/v3/index.js +15 -1
  130. package/dist/components/embed/v3/index.js.map +1 -0
  131. package/dist/components/embed/v3/index.mjs +15 -1
  132. package/dist/components/embed/v3/index.mjs.map +1 -0
  133. package/dist/components/index.js +34 -1
  134. package/dist/components/index.js.map +1 -0
  135. package/dist/components/index.mjs +34 -1
  136. package/dist/components/index.mjs.map +1 -0
  137. package/dist/components/signers/BaseCodeInput.js +9 -1
  138. package/dist/components/signers/BaseCodeInput.js.map +1 -0
  139. package/dist/components/signers/BaseCodeInput.mjs +9 -1
  140. package/dist/components/signers/BaseCodeInput.mjs.map +1 -0
  141. package/dist/components/signers/BaseConfirmation.js +9 -1
  142. package/dist/components/signers/BaseConfirmation.js.map +1 -0
  143. package/dist/components/signers/BaseConfirmation.mjs +9 -1
  144. package/dist/components/signers/BaseConfirmation.mjs.map +1 -0
  145. package/dist/components/signers/EmailSignersDialog.js +11 -1
  146. package/dist/components/signers/EmailSignersDialog.js.map +1 -0
  147. package/dist/components/signers/EmailSignersDialog.mjs +11 -1
  148. package/dist/components/signers/EmailSignersDialog.mjs.map +1 -0
  149. package/dist/components/signers/PhoneSignersDialog.js +11 -1
  150. package/dist/components/signers/PhoneSignersDialog.js.map +1 -0
  151. package/dist/components/signers/PhoneSignersDialog.mjs +11 -1
  152. package/dist/components/signers/PhoneSignersDialog.mjs.map +1 -0
  153. package/dist/components/signers/index.js +16 -1
  154. package/dist/components/signers/index.js.map +1 -0
  155. package/dist/components/signers/index.mjs +16 -1
  156. package/dist/components/signers/index.mjs.map +1 -0
  157. package/dist/components/wallets/ExportPrivateKeyButton.js +8 -1
  158. package/dist/components/wallets/ExportPrivateKeyButton.js.map +1 -0
  159. package/dist/components/wallets/ExportPrivateKeyButton.mjs +8 -1
  160. package/dist/components/wallets/ExportPrivateKeyButton.mjs.map +1 -0
  161. package/dist/components/wallets/index.js +9 -1
  162. package/dist/components/wallets/index.js.map +1 -0
  163. package/dist/components/wallets/index.mjs +9 -1
  164. package/dist/components/wallets/index.mjs.map +1 -0
  165. package/dist/hooks/index.js +26 -1
  166. package/dist/hooks/index.js.map +1 -0
  167. package/dist/hooks/index.mjs +26 -1
  168. package/dist/hooks/index.mjs.map +1 -0
  169. package/dist/hooks/useAuth.js +14 -1
  170. package/dist/hooks/useAuth.js.map +1 -0
  171. package/dist/hooks/useAuth.mjs +14 -1
  172. package/dist/hooks/useAuth.mjs.map +1 -0
  173. package/dist/hooks/useCrossmintCheckout.js +11 -1
  174. package/dist/hooks/useCrossmintCheckout.js.map +1 -0
  175. package/dist/hooks/useCrossmintCheckout.mjs +11 -1
  176. package/dist/hooks/useCrossmintCheckout.mjs.map +1 -0
  177. package/dist/hooks/useWalletEmailSigner.js +8 -1
  178. package/dist/hooks/useWalletEmailSigner.js.map +1 -0
  179. package/dist/hooks/useWalletEmailSigner.mjs +8 -1
  180. package/dist/hooks/useWalletEmailSigner.mjs.map +1 -0
  181. package/dist/index.js +79 -1
  182. package/dist/index.js.map +1 -0
  183. package/dist/index.mjs +79 -1
  184. package/dist/index.mjs.map +1 -0
  185. package/dist/logger/init.js +9 -1
  186. package/dist/logger/init.js.map +1 -0
  187. package/dist/logger/init.mjs +9 -1
  188. package/dist/logger/init.mjs.map +1 -0
  189. package/dist/plugin/mods/addQueryToAndroidManifest.js +8 -1
  190. package/dist/plugin/mods/addQueryToAndroidManifest.js.map +1 -0
  191. package/dist/plugin/mods/addQueryToAndroidManifest.mjs +8 -1
  192. package/dist/plugin/mods/addQueryToAndroidManifest.mjs.map +1 -0
  193. package/dist/plugin/withGooglePay.js +57 -1
  194. package/dist/plugin/withGooglePay.js.map +1 -0
  195. package/dist/plugin/withGooglePay.mjs +57 -1
  196. package/dist/plugin/withGooglePay.mjs.map +1 -0
  197. package/dist/providers/CrossmintAuthProvider.js +14 -1
  198. package/dist/providers/CrossmintAuthProvider.js.map +1 -0
  199. package/dist/providers/CrossmintAuthProvider.mjs +14 -1
  200. package/dist/providers/CrossmintAuthProvider.mjs.map +1 -0
  201. package/dist/providers/CrossmintProvider.js +12 -1
  202. package/dist/providers/CrossmintProvider.js.map +1 -0
  203. package/dist/providers/CrossmintProvider.mjs +12 -1
  204. package/dist/providers/CrossmintProvider.mjs.map +1 -0
  205. package/dist/providers/CrossmintWalletProvider.js +16 -1
  206. package/dist/providers/CrossmintWalletProvider.js.map +1 -0
  207. package/dist/providers/CrossmintWalletProvider.mjs +16 -1
  208. package/dist/providers/CrossmintWalletProvider.mjs.map +1 -0
  209. package/dist/providers/index.js +28 -1
  210. package/dist/providers/index.js.map +1 -0
  211. package/dist/providers/index.mjs +28 -1
  212. package/dist/providers/index.mjs.map +1 -0
  213. package/dist/styles/index.js +8 -1
  214. package/dist/styles/index.js.map +1 -0
  215. package/dist/styles/index.mjs +8 -1
  216. package/dist/styles/index.mjs.map +1 -0
  217. package/dist/styles/theme.js +8 -1
  218. package/dist/styles/theme.js.map +1 -0
  219. package/dist/styles/theme.mjs +8 -1
  220. package/dist/styles/theme.mjs.map +1 -0
  221. package/dist/types/auth.js +1 -1
  222. package/dist/types/auth.js.map +1 -0
  223. package/dist/types/auth.mjs +1 -0
  224. package/dist/types/auth.mjs.map +1 -0
  225. package/dist/utils/SecureStorage.js +8 -1
  226. package/dist/utils/SecureStorage.js.map +1 -0
  227. package/dist/utils/SecureStorage.mjs +8 -1
  228. package/dist/utils/SecureStorage.mjs.map +1 -0
  229. package/dist/utils/createCrossmintApiClient.js +9 -1
  230. package/dist/utils/createCrossmintApiClient.js.map +1 -0
  231. package/dist/utils/createCrossmintApiClient.mjs +9 -1
  232. package/dist/utils/createCrossmintApiClient.mjs.map +1 -0
  233. package/dist/utils/embed/userAgent.js +12 -1
  234. package/dist/utils/embed/userAgent.js.map +1 -0
  235. package/dist/utils/embed/userAgent.mjs +12 -1
  236. package/dist/utils/embed/userAgent.mjs.map +1 -0
  237. package/dist/utils/eventEmitter.js +8 -1
  238. package/dist/utils/eventEmitter.js.map +1 -0
  239. package/dist/utils/eventEmitter.mjs +8 -1
  240. package/dist/utils/eventEmitter.mjs.map +1 -0
  241. package/package.json +5 -5
@@ -0,0 +1,157 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkMVLQR6RIjs = require('./chunk-MVLQR6RI.js');
4
+
5
+
6
+ var _chunkBTH5QRITjs = require('./chunk-BTH5QRIT.js');
7
+
8
+
9
+ var _chunkHELXBZ7Djs = require('./chunk-HELXBZ7D.js');
10
+
11
+ // src/components/signers/PhoneSignersDialog.tsx
12
+ var _reactnative = require('react-native');
13
+ var _lucidereactnative = require('lucide-react-native');
14
+ var _jsxruntime = require('react/jsx-runtime');
15
+ var { width: screenWidth } = _reactnative.Dimensions.get("window");
16
+ function PhoneSignersDialog({
17
+ phone,
18
+ open,
19
+ setOpen,
20
+ step,
21
+ onSubmitOTP,
22
+ onResendOTPCode,
23
+ onSubmitPhone,
24
+ rejectRef,
25
+ appearance
26
+ }) {
27
+ var _a, _b, _c, _d, _e, _f;
28
+ function handleOnCancel() {
29
+ var _a2;
30
+ if (open) {
31
+ (_a2 = rejectRef.current) == null ? void 0 : _a2.call(rejectRef, new Error("User cancelled"));
32
+ setOpen(false);
33
+ }
34
+ }
35
+ const dynamicStyles = _reactnative.StyleSheet.create({
36
+ modalOverlay: {
37
+ flex: 1,
38
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
39
+ justifyContent: "center",
40
+ alignItems: "center",
41
+ padding: 16
42
+ },
43
+ modalContainer: {
44
+ backgroundColor: ((_a = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _a.background) || _chunkHELXBZ7Djs.theme["cm-background-primary"],
45
+ borderRadius: (appearance == null ? void 0 : appearance.borderRadius) || 12,
46
+ padding: 32,
47
+ width: Math.min(screenWidth - 32, 400),
48
+ maxHeight: "80%",
49
+ position: "relative",
50
+ alignItems: "center",
51
+ shadowColor: "#000",
52
+ shadowOffset: {
53
+ width: 0,
54
+ height: 2
55
+ },
56
+ shadowOpacity: 0.25,
57
+ shadowRadius: 4,
58
+ elevation: 5
59
+ },
60
+ closeButton: {
61
+ position: "absolute",
62
+ top: 16,
63
+ right: 16,
64
+ width: 32,
65
+ height: 32,
66
+ borderRadius: 6,
67
+ backgroundColor: ((_b = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _b.inputBackground) || _chunkHELXBZ7Djs.theme["cm-muted-primary"],
68
+ alignItems: "center",
69
+ justifyContent: "center",
70
+ zIndex: 1
71
+ }
72
+ });
73
+ if (!open) {
74
+ return null;
75
+ }
76
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
77
+ _reactnative.Modal,
78
+ {
79
+ visible: open,
80
+ transparent: true,
81
+ animationType: "fade",
82
+ onRequestClose: handleOnCancel,
83
+ statusBarTranslucent: true,
84
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactnative.View, { style: dynamicStyles.modalOverlay, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _reactnative.View, { style: dynamicStyles.modalContainer, children: [
85
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
86
+ _reactnative.TouchableOpacity,
87
+ {
88
+ style: dynamicStyles.closeButton,
89
+ onPress: handleOnCancel,
90
+ hitSlop: { top: 10, bottom: 10, left: 10, right: 10 },
91
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereactnative.X, { size: 16, color: ((_c = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _c.textSecondary) || _chunkHELXBZ7Djs.theme["cm-text-secondary"] })
92
+ }
93
+ ),
94
+ step === "initial" ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
95
+ _chunkBTH5QRITjs.BaseConfirmation,
96
+ {
97
+ contactInfo: phone != null ? phone : "",
98
+ contactType: "phone",
99
+ icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
100
+ _lucidereactnative.PhoneIcon,
101
+ {
102
+ size: 22,
103
+ color: ((_d = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _d.textPrimary) || _chunkHELXBZ7Djs.theme["cm-text-primary"]
104
+ }
105
+ ),
106
+ onConfirm: onSubmitPhone,
107
+ onCancel: handleOnCancel,
108
+ appearance
109
+ }
110
+ ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
111
+ _chunkMVLQR6RIjs.BaseCodeInput,
112
+ {
113
+ contactInfo: phone != null ? phone : "",
114
+ contactType: "phone",
115
+ icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
116
+ _reactnative.View,
117
+ {
118
+ style: {
119
+ backgroundColor: ((_e = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _e.accent) || _chunkHELXBZ7Djs.theme["cm-accent"],
120
+ borderRadius: 999,
121
+ padding: 12
122
+ },
123
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
124
+ _lucidereactnative.Smartphone,
125
+ {
126
+ size: 22,
127
+ color: ((_f = appearance == null ? void 0 : appearance.colors) == null ? void 0 : _f.background) || _chunkHELXBZ7Djs.theme["cm-background-primary"]
128
+ }
129
+ )
130
+ }
131
+ ),
132
+ title: "Check your phone",
133
+ description: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _reactnative.Text, { children: [
134
+ "A temporary login code has been sent via SMS to",
135
+ " ",
136
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactnative.Text, { style: { fontWeight: "bold" }, children: phone })
137
+ ] }),
138
+ helpText: `Can't receive the SMS? Check your phone number.
139
+ Some messages may take several minutes to arrive.`,
140
+ onSubmitOTP,
141
+ onResendCode: onResendOTPCode,
142
+ appearance,
143
+ otpLength: 10,
144
+ keyboardType: "number-pad",
145
+ autoComplete: "sms-otp",
146
+ textContentType: "oneTimeCode"
147
+ }
148
+ )
149
+ ] }) })
150
+ }
151
+ );
152
+ }
153
+
154
+
155
+
156
+ exports.PhoneSignersDialog = PhoneSignersDialog;
157
+ //# sourceMappingURL=chunk-NBWATZY4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/signers/PhoneSignersDialog.tsx"],"names":["_a"],"mappings":"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","sourcesContent":["import type { MutableRefObject } from \"react\";\nimport { View, StyleSheet, Dimensions, Modal, TouchableOpacity, Text } from \"react-native\";\nimport type { UIConfig } from \"@crossmint/common-sdk-base\";\nimport { PhoneIcon, Smartphone, X } from \"lucide-react-native\";\nimport { BaseConfirmation } from \"./BaseConfirmation\";\nimport { BaseCodeInput } from \"./BaseCodeInput\";\nimport { theme } from \"../../styles/theme\";\n\ninterface PhoneSignersDialogProps {\n phone?: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n step: \"initial\" | \"otp\";\n onSubmitOTP: (token: string) => Promise<void>;\n onResendOTPCode: () => Promise<void>;\n onSubmitPhone: () => Promise<void>;\n rejectRef: MutableRefObject<((error: Error) => void) | undefined>;\n appearance?: UIConfig;\n}\n\nconst { width: screenWidth } = Dimensions.get(\"window\");\n\nexport function PhoneSignersDialog({\n phone,\n open,\n setOpen,\n step,\n onSubmitOTP,\n onResendOTPCode,\n onSubmitPhone,\n rejectRef,\n appearance,\n}: PhoneSignersDialogProps) {\n function handleOnCancel() {\n if (open) {\n rejectRef.current?.(new Error(\"User cancelled\"));\n setOpen(false);\n }\n }\n\n const dynamicStyles = StyleSheet.create({\n modalOverlay: {\n flex: 1,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 16,\n },\n modalContainer: {\n backgroundColor: appearance?.colors?.background || theme[\"cm-background-primary\"],\n borderRadius: appearance?.borderRadius || 12,\n padding: 32,\n width: Math.min(screenWidth - 32, 400),\n maxHeight: \"80%\",\n position: \"relative\",\n alignItems: \"center\",\n shadowColor: \"#000\",\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n closeButton: {\n position: \"absolute\",\n top: 16,\n right: 16,\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: appearance?.colors?.inputBackground || theme[\"cm-muted-primary\"],\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1,\n },\n });\n\n if (!open) {\n return null;\n }\n\n return (\n <Modal\n visible={open}\n transparent={true}\n animationType=\"fade\"\n onRequestClose={handleOnCancel}\n statusBarTranslucent={true}\n >\n <View style={dynamicStyles.modalOverlay}>\n <View style={dynamicStyles.modalContainer}>\n <TouchableOpacity\n style={dynamicStyles.closeButton}\n onPress={handleOnCancel}\n hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}\n >\n <X size={16} color={appearance?.colors?.textSecondary || theme[\"cm-text-secondary\"]} />\n </TouchableOpacity>\n\n {step === \"initial\" ? (\n <BaseConfirmation\n contactInfo={phone ?? \"\"}\n contactType=\"phone\"\n icon={\n <PhoneIcon\n size={22}\n color={appearance?.colors?.textPrimary || theme[\"cm-text-primary\"]}\n />\n }\n onConfirm={onSubmitPhone}\n onCancel={handleOnCancel}\n appearance={appearance}\n />\n ) : (\n <BaseCodeInput\n contactInfo={phone ?? \"\"}\n contactType=\"phone\"\n icon={\n <View\n style={{\n backgroundColor: appearance?.colors?.accent || theme[\"cm-accent\"],\n borderRadius: 999,\n padding: 12,\n }}\n >\n <Smartphone\n size={22}\n color={appearance?.colors?.background || theme[\"cm-background-primary\"]}\n />\n </View>\n }\n title=\"Check your phone\"\n description={\n <Text>\n A temporary login code has been sent via SMS to{\" \"}\n <Text style={{ fontWeight: \"bold\" }}>{phone}</Text>\n </Text>\n }\n helpText={`Can't receive the SMS? Check your phone number.\\nSome messages may take several minutes to arrive.`}\n onSubmitOTP={onSubmitOTP}\n onResendCode={onResendOTPCode}\n appearance={appearance}\n otpLength={10}\n keyboardType=\"number-pad\"\n autoComplete=\"sms-otp\"\n textContentType=\"oneTimeCode\"\n />\n )}\n </View>\n </View>\n </Modal>\n );\n}\n"]}
@@ -0,0 +1,348 @@
1
+ import {
2
+ EmailSignersDialog
3
+ } from "./chunk-CFHHVHNZ.mjs";
4
+ import {
5
+ PhoneSignersDialog
6
+ } from "./chunk-4V7NDO5X.mjs";
7
+ import {
8
+ LoggerContext
9
+ } from "./chunk-YAVGI5BZ.mjs";
10
+ import {
11
+ __async,
12
+ __spreadValues
13
+ } from "./chunk-7SPIOD4K.mjs";
14
+
15
+ // src/providers/CrossmintWalletProvider.tsx
16
+ import { useCallback, useRef, useMemo, useEffect, useState } from "react";
17
+ import { Platform, View } from "react-native";
18
+ import { RNWebView, WebViewParent } from "@crossmint/client-sdk-rn-window";
19
+ import {
20
+ environmentUrlConfig,
21
+ signerInboundEvents,
22
+ signerOutboundEvents,
23
+ SignerErrorCode
24
+ } from "@crossmint/client-signers";
25
+ import { validateAPIKey } from "@crossmint/common-sdk-base";
26
+ import {
27
+ CrossmintWalletBaseProvider,
28
+ useCrossmint
29
+ } from "@crossmint/client-sdk-react-base";
30
+ import { useLogger } from "@crossmint/client-sdk-react-base";
31
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
32
+ function CrossmintWalletProviderInternal({
33
+ children,
34
+ createOnLogin,
35
+ appearance,
36
+ headlessSigningFlow = true,
37
+ callbacks
38
+ }) {
39
+ const { crossmint } = useCrossmint("CrossmintWalletProvider must be used within CrossmintProvider");
40
+ const logger = useLogger(LoggerContext);
41
+ const { apiKey, appId } = crossmint;
42
+ const parsedAPIKey = useMemo(() => {
43
+ const result = validateAPIKey(apiKey);
44
+ if (!result.isValid) {
45
+ throw new Error("Invalid API key");
46
+ }
47
+ return result;
48
+ }, [apiKey]);
49
+ const frameUrl = useMemo(() => {
50
+ return environmentUrlConfig[parsedAPIKey.environment];
51
+ }, [parsedAPIKey.environment]);
52
+ const webviewRef = useRef(null);
53
+ const webViewParentRef = useRef(
54
+ null
55
+ );
56
+ const [needsWebView, setNeedsWebView] = useState(false);
57
+ const handshakeTriggeredRef = useRef(false);
58
+ const handshakeInProgressRef = useRef(false);
59
+ const handshakeGenerationRef = useRef(0);
60
+ const handshakeStartTimeRef = useRef(0);
61
+ const secureGlobals = useMemo(() => {
62
+ if (appId != null) {
63
+ return { crossmintAppId: appId };
64
+ }
65
+ return {};
66
+ }, [appId]);
67
+ const performHandshake = useCallback(
68
+ (trigger) => __async(this, null, function* () {
69
+ if (webViewParentRef.current != null) {
70
+ const parent = webViewParentRef.current;
71
+ if (handshakeInProgressRef.current) {
72
+ logger.info("react-native.wallet.webview.handshake.skip.in-progress", {
73
+ trigger,
74
+ generation: handshakeGenerationRef.current
75
+ });
76
+ return;
77
+ }
78
+ if (handshakeTriggeredRef.current && parent.isConnected) {
79
+ logger.info("react-native.wallet.webview.handshake.skip.already-connected", {
80
+ trigger,
81
+ generation: handshakeGenerationRef.current
82
+ });
83
+ return;
84
+ }
85
+ handshakeInProgressRef.current = true;
86
+ const handshakeStartTime = Date.now();
87
+ handshakeStartTimeRef.current = handshakeStartTime;
88
+ const generation = handshakeGenerationRef.current;
89
+ try {
90
+ logger.info("react-native.wallet.webview.handshake.start", {
91
+ trigger,
92
+ generation,
93
+ platform: Platform.OS
94
+ });
95
+ handshakeTriggeredRef.current = true;
96
+ parent.isConnected = false;
97
+ yield parent.handshakeWithChild();
98
+ const durationMs = Date.now() - handshakeStartTime;
99
+ logger.info("react-native.wallet.webview.handshake.success", {
100
+ trigger,
101
+ generation,
102
+ durationMs
103
+ });
104
+ } catch (e) {
105
+ const durationMs = Date.now() - handshakeStartTime;
106
+ if (generation === handshakeGenerationRef.current) {
107
+ handshakeTriggeredRef.current = false;
108
+ }
109
+ logger.error("react-native.wallet.webview.handshake.error", {
110
+ trigger,
111
+ generation,
112
+ durationMs,
113
+ error: e instanceof Error ? e.message : String(e)
114
+ });
115
+ console.error("[CrossmintWalletProvider] Handshake error:", e);
116
+ } finally {
117
+ if (generation === handshakeGenerationRef.current) {
118
+ handshakeInProgressRef.current = false;
119
+ }
120
+ }
121
+ } else {
122
+ logger.warn("react-native.wallet.webview.handshake.skip", {
123
+ trigger,
124
+ reason: "parent not initialized"
125
+ });
126
+ }
127
+ }),
128
+ [logger]
129
+ );
130
+ useEffect(() => {
131
+ if (webviewRef.current != null && webViewParentRef.current == null) {
132
+ logger.info("react-native.wallet.webview.initializing");
133
+ webViewParentRef.current = new WebViewParent(webviewRef, {
134
+ incomingEvents: signerOutboundEvents,
135
+ outgoingEvents: signerInboundEvents,
136
+ handshakeOptions: {
137
+ timeoutMs: 3e4,
138
+ intervalMs: 100
139
+ },
140
+ recovery: {
141
+ recoverableErrorCodes: [SignerErrorCode.IndexedDbFatal]
142
+ }
143
+ });
144
+ logger.info("react-native.wallet.webview.initialized");
145
+ performHandshake("eager");
146
+ }
147
+ }, [needsWebView, logger, performHandshake]);
148
+ const onWebViewLoad = useCallback(() => __async(this, null, function* () {
149
+ var _a, _b;
150
+ logger.info("react-native.wallet.webview.onLoadEnd", {
151
+ handshakeInProgress: handshakeInProgressRef.current,
152
+ isConnected: (_b = (_a = webViewParentRef.current) == null ? void 0 : _a.isConnected) != null ? _b : false,
153
+ generation: handshakeGenerationRef.current
154
+ });
155
+ yield performHandshake("onLoadEnd");
156
+ }), [logger, performHandshake]);
157
+ const handleMessage = useCallback(
158
+ (event) => {
159
+ var _a, _b;
160
+ const parent = webViewParentRef.current;
161
+ if (parent == null) {
162
+ return;
163
+ }
164
+ const rawData = event.nativeEvent.data;
165
+ if (rawData === "frame-ready") {
166
+ logger.info("react-native.wallet.webview.frame-ready.received", {
167
+ handshakeInProgress: handshakeInProgressRef.current,
168
+ isConnected: (_b = (_a = webViewParentRef.current) == null ? void 0 : _a.isConnected) != null ? _b : false,
169
+ generation: handshakeGenerationRef.current,
170
+ msSinceHandshakeStart: handshakeStartTimeRef.current > 0 ? Date.now() - handshakeStartTimeRef.current : null
171
+ });
172
+ performHandshake("frame-ready");
173
+ return;
174
+ }
175
+ try {
176
+ const messageData = JSON.parse(rawData);
177
+ if (messageData && typeof messageData.type === "string" && messageData.type.startsWith("console.")) {
178
+ const consoleMethod = messageData.type.split(".")[1];
179
+ const args = (messageData.data || []).map((argStr) => {
180
+ try {
181
+ if (argStr === "[Function]" || argStr === "[Circular Reference]" || argStr === "[Unserializable Object]") {
182
+ return argStr;
183
+ }
184
+ return JSON.parse(argStr);
185
+ } catch (e) {
186
+ return argStr;
187
+ }
188
+ });
189
+ const logMessage = `react-native.wallet.webview.console.${consoleMethod}`;
190
+ const logContext = { webview_args: args };
191
+ switch (consoleMethod) {
192
+ case "log":
193
+ logger.info(logMessage, logContext);
194
+ break;
195
+ case "error":
196
+ logger.error(logMessage, logContext);
197
+ break;
198
+ case "warn":
199
+ logger.warn(logMessage, logContext);
200
+ break;
201
+ case "info":
202
+ logger.info(logMessage, logContext);
203
+ break;
204
+ case "debug":
205
+ logger.debug(logMessage, logContext);
206
+ break;
207
+ default:
208
+ logger.info(`react-native.wallet.webview.console.unknown`, {
209
+ webview_method: consoleMethod,
210
+ webview_args: args
211
+ });
212
+ }
213
+ return;
214
+ }
215
+ } catch (e) {
216
+ }
217
+ parent.handleMessage(event);
218
+ },
219
+ [logger, performHandshake]
220
+ );
221
+ const getClientTEEConnection = () => {
222
+ if (webViewParentRef.current == null) {
223
+ throw new Error("WebView not ready or handshake incomplete");
224
+ }
225
+ return webViewParentRef.current;
226
+ };
227
+ const renderNativeUI = ({ emailSignerProps, phoneSignerProps }) => {
228
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
229
+ /* @__PURE__ */ jsx(EmailSignersDialog, __spreadValues({}, emailSignerProps)),
230
+ /* @__PURE__ */ jsx(PhoneSignersDialog, __spreadValues({}, phoneSignerProps))
231
+ ] });
232
+ };
233
+ const initializeWebView = () => __async(this, null, function* () {
234
+ logger.info("react-native.wallet.webview.init.start");
235
+ setNeedsWebView(true);
236
+ let attempts = 0;
237
+ const maxAttempts = 100;
238
+ while (webViewParentRef.current == null && attempts < maxAttempts) {
239
+ yield new Promise((resolve) => setTimeout(resolve, 50));
240
+ attempts++;
241
+ }
242
+ if (webViewParentRef.current == null) {
243
+ logger.error("react-native.wallet.webview.init.timeout", {
244
+ attempts
245
+ });
246
+ throw new Error("WebView not ready or handshake incomplete");
247
+ }
248
+ logger.info("react-native.wallet.webview.init.success", { attempts });
249
+ });
250
+ return /* @__PURE__ */ jsxs(
251
+ CrossmintWalletBaseProvider,
252
+ {
253
+ createOnLogin,
254
+ appearance,
255
+ headlessSigningFlow,
256
+ initializeWebView,
257
+ callbacks,
258
+ renderUI: headlessSigningFlow ? void 0 : renderNativeUI,
259
+ clientTEEConnection: getClientTEEConnection,
260
+ children: [
261
+ children,
262
+ needsWebView && /* @__PURE__ */ jsx(
263
+ View,
264
+ {
265
+ style: {
266
+ position: "absolute",
267
+ width: 0,
268
+ height: 0,
269
+ overflow: "hidden"
270
+ },
271
+ children: /* @__PURE__ */ jsx(
272
+ RNWebView,
273
+ {
274
+ ref: webviewRef,
275
+ source: { uri: frameUrl },
276
+ globals: secureGlobals,
277
+ onLoadEnd: onWebViewLoad,
278
+ onMessage: handleMessage,
279
+ onError: (syntheticEvent) => {
280
+ console.error("[CrossmintWalletProvider] WebView error:", syntheticEvent.nativeEvent);
281
+ },
282
+ onHttpError: (syntheticEvent) => {
283
+ console.error("[CrossmintWalletProvider] WebView HTTP error:", syntheticEvent.nativeEvent);
284
+ },
285
+ onContentProcessDidTerminate: () => {
286
+ var _a, _b, _c;
287
+ const prevGeneration = handshakeGenerationRef.current;
288
+ handshakeGenerationRef.current++;
289
+ logger.warn("react-native.wallet.webview.process.terminated", {
290
+ prevGeneration,
291
+ newGeneration: handshakeGenerationRef.current,
292
+ wasConnected: (_b = (_a = webViewParentRef.current) == null ? void 0 : _a.isConnected) != null ? _b : false,
293
+ hadHandshakeInProgress: handshakeInProgressRef.current
294
+ });
295
+ handshakeTriggeredRef.current = false;
296
+ handshakeInProgressRef.current = false;
297
+ if (webViewParentRef.current != null) {
298
+ webViewParentRef.current.isConnected = false;
299
+ }
300
+ (_c = webviewRef.current) == null ? void 0 : _c.reload();
301
+ performHandshake("eager");
302
+ },
303
+ onRenderProcessGone: () => {
304
+ var _a, _b, _c;
305
+ const prevGeneration = handshakeGenerationRef.current;
306
+ handshakeGenerationRef.current++;
307
+ logger.warn("react-native.wallet.webview.process.renderGone", {
308
+ prevGeneration,
309
+ newGeneration: handshakeGenerationRef.current,
310
+ wasConnected: (_b = (_a = webViewParentRef.current) == null ? void 0 : _a.isConnected) != null ? _b : false,
311
+ hadHandshakeInProgress: handshakeInProgressRef.current
312
+ });
313
+ handshakeTriggeredRef.current = false;
314
+ handshakeInProgressRef.current = false;
315
+ if (webViewParentRef.current != null) {
316
+ webViewParentRef.current.isConnected = false;
317
+ }
318
+ (_c = webviewRef.current) == null ? void 0 : _c.reload();
319
+ performHandshake("eager");
320
+ },
321
+ style: {
322
+ width: 1,
323
+ height: 1
324
+ },
325
+ javaScriptCanOpenWindowsAutomatically: false,
326
+ thirdPartyCookiesEnabled: false,
327
+ sharedCookiesEnabled: false,
328
+ incognito: false,
329
+ setSupportMultipleWindows: false,
330
+ originWhitelist: [environmentUrlConfig[parsedAPIKey.environment]],
331
+ cacheEnabled: true,
332
+ cacheMode: "LOAD_DEFAULT"
333
+ }
334
+ )
335
+ }
336
+ )
337
+ ]
338
+ }
339
+ );
340
+ }
341
+ function CrossmintWalletProvider(props) {
342
+ return /* @__PURE__ */ jsx(CrossmintWalletProviderInternal, __spreadValues({}, props));
343
+ }
344
+
345
+ export {
346
+ CrossmintWalletProvider
347
+ };
348
+ //# sourceMappingURL=chunk-NSSAF6CV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/CrossmintWalletProvider.tsx"],"sourcesContent":["import { type ReactNode, useCallback, useRef, useMemo, useEffect, useState, type RefObject } from \"react\";\nimport { Platform, View } from \"react-native\";\nimport type { WebView, WebViewMessageEvent } from \"react-native-webview\";\nimport { RNWebView, WebViewParent } from \"@crossmint/client-sdk-rn-window\";\nimport {\n environmentUrlConfig,\n signerInboundEvents,\n signerOutboundEvents,\n SignerErrorCode,\n} from \"@crossmint/client-signers\";\nimport { validateAPIKey, type UIConfig } from \"@crossmint/common-sdk-base\";\nimport {\n CrossmintWalletBaseProvider,\n type UIRenderProps,\n type CreateOnLogin,\n useCrossmint,\n} from \"@crossmint/client-sdk-react-base\";\nimport { EmailSignersDialog } from \"@/components/signers/EmailSignersDialog\";\nimport { PhoneSignersDialog } from \"@/components/signers/PhoneSignersDialog\";\nimport { useLogger } from \"@crossmint/client-sdk-react-base\";\nimport { LoggerContext } from \"./CrossmintProvider\";\n\nexport interface CrossmintWalletProviderProps {\n /** Wallet configuration for automatic creation on user login. Defines the chain and signer type for the wallet. */\n createOnLogin?: CreateOnLogin;\n /** Optional appearance configuration for styling built-in UI components. */\n appearance?: UIConfig;\n /** When true (default), no UI is rendered and signing flows must be handled manually. When false, built-in UI components are rendered. */\n headlessSigningFlow?: boolean;\n /** Optional lifecycle callbacks invoked during wallet creation and transaction signing. */\n callbacks?: {\n /** Called when a wallet creation flow begins. */\n onWalletCreationStart?: () => Promise<void>;\n /** Called when a transaction signing flow begins. */\n onTransactionStart?: () => Promise<void>;\n };\n /** @internal */\n children: ReactNode;\n}\n\nfunction CrossmintWalletProviderInternal({\n children,\n createOnLogin,\n appearance,\n headlessSigningFlow = true,\n callbacks,\n}: CrossmintWalletProviderProps) {\n const { crossmint } = useCrossmint(\"CrossmintWalletProvider must be used within CrossmintProvider\");\n const logger = useLogger(LoggerContext);\n const { apiKey, appId } = crossmint;\n\n const parsedAPIKey = useMemo(() => {\n const result = validateAPIKey(apiKey);\n if (!result.isValid) {\n throw new Error(\"Invalid API key\");\n }\n return result;\n }, [apiKey]);\n\n const frameUrl = useMemo(() => {\n return environmentUrlConfig[parsedAPIKey.environment];\n }, [parsedAPIKey.environment]);\n\n const webviewRef = useRef<WebView>(null);\n const webViewParentRef = useRef<WebViewParent<typeof signerOutboundEvents, typeof signerInboundEvents> | null>(\n null\n );\n\n const [needsWebView, setNeedsWebView] = useState<boolean>(false);\n const handshakeTriggeredRef = useRef<boolean>(false);\n const handshakeInProgressRef = useRef<boolean>(false);\n const handshakeGenerationRef = useRef<number>(0);\n const handshakeStartTimeRef = useRef<number>(0);\n\n const secureGlobals = useMemo(() => {\n if (appId != null) {\n return { crossmintAppId: appId };\n }\n return {};\n }, [appId]);\n\n const performHandshake = useCallback(\n async (trigger: \"frame-ready\" | \"onLoadEnd\" | \"eager\") => {\n if (webViewParentRef.current != null) {\n const parent = webViewParentRef.current;\n\n // Prevent concurrent or duplicate handshakes\n if (handshakeInProgressRef.current) {\n logger.info(\"react-native.wallet.webview.handshake.skip.in-progress\", {\n trigger,\n generation: handshakeGenerationRef.current,\n });\n return;\n }\n if (handshakeTriggeredRef.current && parent.isConnected) {\n logger.info(\"react-native.wallet.webview.handshake.skip.already-connected\", {\n trigger,\n generation: handshakeGenerationRef.current,\n });\n return;\n }\n\n handshakeInProgressRef.current = true;\n const handshakeStartTime = Date.now();\n handshakeStartTimeRef.current = handshakeStartTime;\n const generation = handshakeGenerationRef.current;\n try {\n logger.info(\"react-native.wallet.webview.handshake.start\", {\n trigger,\n generation,\n platform: Platform.OS,\n });\n handshakeTriggeredRef.current = true;\n parent.isConnected = false;\n await parent.handshakeWithChild();\n const durationMs = Date.now() - handshakeStartTime;\n logger.info(\"react-native.wallet.webview.handshake.success\", {\n trigger,\n generation,\n durationMs,\n });\n } catch (e) {\n const durationMs = Date.now() - handshakeStartTime;\n if (generation === handshakeGenerationRef.current) {\n handshakeTriggeredRef.current = false;\n }\n logger.error(\"react-native.wallet.webview.handshake.error\", {\n trigger,\n generation,\n durationMs,\n error: e instanceof Error ? e.message : String(e),\n });\n console.error(\"[CrossmintWalletProvider] Handshake error:\", e);\n } finally {\n if (generation === handshakeGenerationRef.current) {\n handshakeInProgressRef.current = false;\n }\n }\n } else {\n logger.warn(\"react-native.wallet.webview.handshake.skip\", {\n trigger,\n reason: \"parent not initialized\",\n });\n }\n },\n [logger]\n );\n\n useEffect(() => {\n if (webviewRef.current != null && webViewParentRef.current == null) {\n logger.info(\"react-native.wallet.webview.initializing\");\n webViewParentRef.current = new WebViewParent(webviewRef as RefObject<WebView>, {\n incomingEvents: signerOutboundEvents,\n outgoingEvents: signerInboundEvents,\n handshakeOptions: {\n timeoutMs: 30_000,\n intervalMs: 100,\n },\n recovery: {\n recoverableErrorCodes: [SignerErrorCode.IndexedDbFatal],\n },\n });\n logger.info(\"react-native.wallet.webview.initialized\");\n\n // Start handshake immediately — don't wait for onLoadEnd or frame-ready.\n // The parent polls handshakeRequest every 100ms for 30s, so by the time\n // the child finishes init and calls handshakeWithParent(), the request\n // will arrive within 100ms. This eliminates the 15-23s gap on slow\n // devices where onLoadEnd fires long after the child is ready.\n performHandshake(\"eager\");\n }\n }, [needsWebView, logger, performHandshake]);\n\n const onWebViewLoad = useCallback(async () => {\n // onLoadEnd is a fallback — eager handshake should have started already.\n // This still triggers in case the eager start couldn't run (e.g. ref timing).\n logger.info(\"react-native.wallet.webview.onLoadEnd\", {\n handshakeInProgress: handshakeInProgressRef.current,\n isConnected: webViewParentRef.current?.isConnected ?? false,\n generation: handshakeGenerationRef.current,\n });\n await performHandshake(\"onLoadEnd\");\n }, [logger, performHandshake]);\n\n const handleMessage = useCallback(\n (event: WebViewMessageEvent) => {\n const parent = webViewParentRef.current;\n if (parent == null) {\n return;\n }\n\n const rawData = event.nativeEvent.data;\n\n // Handle \"frame-ready\" signal from child — child is ready to handshake.\n // With eager handshake, the parent is already polling, so the handshake\n // should already be in progress or complete. Log for diagnostics.\n if (rawData === \"frame-ready\") {\n logger.info(\"react-native.wallet.webview.frame-ready.received\", {\n handshakeInProgress: handshakeInProgressRef.current,\n isConnected: webViewParentRef.current?.isConnected ?? false,\n generation: handshakeGenerationRef.current,\n msSinceHandshakeStart:\n handshakeStartTimeRef.current > 0 ? Date.now() - handshakeStartTimeRef.current : null,\n });\n performHandshake(\"frame-ready\");\n return;\n }\n\n try {\n const messageData = JSON.parse(rawData);\n if (messageData && typeof messageData.type === \"string\" && messageData.type.startsWith(\"console.\")) {\n const consoleMethod = messageData.type.split(\".\")[1];\n const args = (messageData.data || []).map((argStr: string) => {\n try {\n if (\n argStr === \"[Function]\" ||\n argStr === \"[Circular Reference]\" ||\n argStr === \"[Unserializable Object]\"\n ) {\n return argStr;\n }\n return JSON.parse(argStr);\n } catch {\n return argStr;\n }\n });\n\n const logMessage = `react-native.wallet.webview.console.${consoleMethod}`;\n const logContext = { webview_args: args };\n\n switch (consoleMethod) {\n case \"log\":\n logger.info(logMessage, logContext);\n break;\n case \"error\":\n logger.error(logMessage, logContext);\n break;\n case \"warn\":\n logger.warn(logMessage, logContext);\n break;\n case \"info\":\n logger.info(logMessage, logContext);\n break;\n case \"debug\":\n logger.debug(logMessage, logContext);\n break;\n default:\n logger.info(`react-native.wallet.webview.console.unknown`, {\n webview_method: consoleMethod,\n webview_args: args,\n });\n }\n return;\n }\n } catch {}\n\n parent.handleMessage(event);\n },\n [logger, performHandshake]\n );\n\n const getClientTEEConnection = () => {\n if (webViewParentRef.current == null) {\n throw new Error(\"WebView not ready or handshake incomplete\");\n }\n return webViewParentRef.current;\n };\n\n const renderNativeUI = ({ emailSignerProps, phoneSignerProps }: UIRenderProps) => {\n return (\n <>\n <EmailSignersDialog {...emailSignerProps} />\n <PhoneSignersDialog {...phoneSignerProps} />\n </>\n );\n };\n\n const initializeWebView = async () => {\n logger.info(\"react-native.wallet.webview.init.start\");\n setNeedsWebView(true);\n let attempts = 0;\n const maxAttempts = 100; // 5 seconds total with 50ms intervals\n while (webViewParentRef.current == null && attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n attempts++;\n }\n\n if (webViewParentRef.current == null) {\n logger.error(\"react-native.wallet.webview.init.timeout\", {\n attempts,\n });\n throw new Error(\"WebView not ready or handshake incomplete\");\n }\n logger.info(\"react-native.wallet.webview.init.success\", { attempts });\n };\n\n return (\n <CrossmintWalletBaseProvider\n createOnLogin={createOnLogin}\n appearance={appearance}\n headlessSigningFlow={headlessSigningFlow}\n initializeWebView={initializeWebView}\n callbacks={callbacks}\n renderUI={headlessSigningFlow ? undefined : renderNativeUI}\n clientTEEConnection={getClientTEEConnection}\n >\n {children}\n\n {needsWebView && (\n <View\n style={{\n position: \"absolute\",\n width: 0,\n height: 0,\n overflow: \"hidden\",\n }}\n >\n <RNWebView\n ref={webviewRef}\n source={{ uri: frameUrl }}\n globals={secureGlobals}\n onLoadEnd={onWebViewLoad}\n onMessage={handleMessage}\n onError={(syntheticEvent) => {\n console.error(\"[CrossmintWalletProvider] WebView error:\", syntheticEvent.nativeEvent);\n }}\n onHttpError={(syntheticEvent) => {\n console.error(\"[CrossmintWalletProvider] WebView HTTP error:\", syntheticEvent.nativeEvent);\n }}\n onContentProcessDidTerminate={() => {\n const prevGeneration = handshakeGenerationRef.current;\n handshakeGenerationRef.current++;\n logger.warn(\"react-native.wallet.webview.process.terminated\", {\n prevGeneration,\n newGeneration: handshakeGenerationRef.current,\n wasConnected: webViewParentRef.current?.isConnected ?? false,\n hadHandshakeInProgress: handshakeInProgressRef.current,\n });\n handshakeTriggeredRef.current = false;\n handshakeInProgressRef.current = false;\n if (webViewParentRef.current != null) {\n webViewParentRef.current.isConnected = false;\n }\n webviewRef.current?.reload();\n // Start polling immediately — don't wait for onLoadEnd which fires 15-23s late on slow devices\n performHandshake(\"eager\");\n }}\n onRenderProcessGone={() => {\n const prevGeneration = handshakeGenerationRef.current;\n handshakeGenerationRef.current++;\n logger.warn(\"react-native.wallet.webview.process.renderGone\", {\n prevGeneration,\n newGeneration: handshakeGenerationRef.current,\n wasConnected: webViewParentRef.current?.isConnected ?? false,\n hadHandshakeInProgress: handshakeInProgressRef.current,\n });\n handshakeTriggeredRef.current = false;\n handshakeInProgressRef.current = false;\n if (webViewParentRef.current != null) {\n webViewParentRef.current.isConnected = false;\n }\n webviewRef.current?.reload();\n // Start polling immediately — don't wait for onLoadEnd which fires 15-23s late on slow devices\n performHandshake(\"eager\");\n }}\n style={{\n width: 1,\n height: 1,\n }}\n javaScriptCanOpenWindowsAutomatically={false}\n thirdPartyCookiesEnabled={false}\n sharedCookiesEnabled={false}\n incognito={false}\n setSupportMultipleWindows={false}\n originWhitelist={[environmentUrlConfig[parsedAPIKey.environment]]}\n cacheEnabled={true}\n cacheMode=\"LOAD_DEFAULT\"\n />\n </View>\n )}\n </CrossmintWalletBaseProvider>\n );\n}\n\n/**\n * Provider for wallet creation and management. Must be nested inside {@link CrossmintProvider}.\n * Handles secure communication with the Crossmint signer via a hidden WebView.\n */\nexport function CrossmintWalletProvider(props: CrossmintWalletProviderProps) {\n return <CrossmintWalletProviderInternal {...props} />;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
+
3
+ var _chunkLMXGU2XAjs = require('./chunk-LMXGU2XA.js');
4
+
5
+ // src/providers/CrossmintProvider.tsx
6
+ var _react = require('react');
7
+ var _expoconstants = require('expo-constants'); var _expoconstants2 = _interopRequireDefault(_expoconstants);
8
+ var _clientsdkreactbase = require('@crossmint/client-sdk-react-base');
9
+ var _jsxruntime = require('react/jsx-runtime');
10
+ var LoggerContext = _clientsdkreactbase.createLoggerContext.call(void 0, );
11
+ function CrossmintProvider({ children, apiKey, overrideBaseUrl, consoleLogLevel }) {
12
+ var _a, _b, _c, _d, _e;
13
+ const logger = _react.useMemo.call(void 0, () => {
14
+ return _chunkLMXGU2XAjs.initReactNativeLogger.call(void 0, apiKey, consoleLogLevel);
15
+ }, [apiKey, consoleLogLevel]);
16
+ const appId = (_e = (_b = (_a = _expoconstants2.default.expoConfig) == null ? void 0 : _a.ios) == null ? void 0 : _b.bundleIdentifier) != null ? _e : (_d = (_c = _expoconstants2.default.expoConfig) == null ? void 0 : _c.android) == null ? void 0 : _d.package;
17
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LoggerContext.Provider, { value: logger, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _clientsdkreactbase.CrossmintProvider, { apiKey, appId, overrideBaseUrl, children }) });
18
+ }
19
+
20
+
21
+
22
+
23
+ exports.LoggerContext = LoggerContext; exports.CrossmintProvider = CrossmintProvider;
24
+ //# sourceMappingURL=chunk-OLVGVQEA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/CrossmintProvider.tsx"],"names":[],"mappings":";;;;;AAAA,SAAS,eAAe;AAExB,OAAO,eAAe;AACtB,SAAS,qBAAqB,uBAAuB,2BAA2B;AAgCpE;AA5BL,IAAM,gBAAgB,oBAAoB;AAkB1C,SAAS,kBAAkB,EAAE,UAAU,QAAQ,iBAAiB,gBAAgB,GAA2B;AAzBlH;AA0BI,QAAM,SAAS,QAAQ,MAAM;AACzB,WAAO,sBAAsB,QAAQ,eAAe;AAAA,EACxD,GAAG,CAAC,QAAQ,eAAe,CAAC;AAG5B,QAAM,SAAQ,2BAAU,eAAV,mBAAsB,QAAtB,mBAA2B,qBAA3B,aAA+C,qBAAU,eAAV,mBAAsB,YAAtB,mBAA+B;AAE5F,SACI,oBAAC,cAAc,UAAd,EAAuB,OAAO,QAC3B,8BAAC,yBAAsB,QAAgB,OAAc,iBAChD,UACL,GACJ;AAER","sourcesContent":["import { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport Constants from \"expo-constants\";\nimport { CrossmintProvider as BaseCrossmintProvider, createLoggerContext } from \"@crossmint/client-sdk-react-base\";\nimport type { CrossmintConfig, ConsoleLogLevel } from \"@crossmint/common-sdk-base\";\nimport { initReactNativeLogger } from \"../logger/init\";\n\nexport const LoggerContext = createLoggerContext();\n\nexport interface CrossmintProviderProps extends Pick<CrossmintConfig, \"apiKey\" | \"overrideBaseUrl\"> {\n /**\n * Minimum log level for console output (or \"silent\" to suppress all output).\n * Logs below this level will not be written to the console.\n * Set to \"silent\" to completely suppress console output.\n * Defaults to \"debug\" (all logs shown) for backward compatibility.\n */\n consoleLogLevel?: ConsoleLogLevel;\n /** @internal */\n children: ReactNode;\n}\n\n/**\n * Root provider for the Crossmint SDK. Must wrap your entire application.\n * Initializes the SDK with your API key and sets up logging.\n */\nexport function CrossmintProvider({ children, apiKey, overrideBaseUrl, consoleLogLevel }: CrossmintProviderProps) {\n const logger = useMemo(() => {\n return initReactNativeLogger(apiKey, consoleLogLevel);\n }, [apiKey, consoleLogLevel]);\n\n // Get app ID from Expo constants\n const appId = Constants.expoConfig?.ios?.bundleIdentifier ?? Constants.expoConfig?.android?.package;\n\n return (\n <LoggerContext.Provider value={logger}>\n <BaseCrossmintProvider apiKey={apiKey} appId={appId} overrideBaseUrl={overrideBaseUrl}>\n {children}\n </BaseCrossmintProvider>\n </LoggerContext.Provider>\n );\n}\n"]}
@@ -0,0 +1,55 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkQ7YPX4RJjs = require('./chunk-Q7YPX4RJ.js');
4
+
5
+ // src/hooks/useWalletEmailSigner.ts
6
+ var _react = require('react');
7
+ var _clientsdkreactbase = require('@crossmint/client-sdk-react-base');
8
+ var throwNotAvailable = (functionName) => () => {
9
+ throw new Error(`${functionName} is not available. Make sure you're using an email signer wallet.`);
10
+ };
11
+ function useWalletEmailSigner() {
12
+ const context = _react.useContext.call(void 0, _clientsdkreactbase.CrossmintWalletBaseContext);
13
+ if (context == null) {
14
+ throw new Error("useWalletEmailSigner must be used within CrossmintWalletProvider");
15
+ }
16
+ const { emailSignerState } = context;
17
+ const sendEmailWithOtp = _react.useCallback.call(void 0, () => _chunkQ7YPX4RJjs.__async.call(void 0, this, null, function* () {
18
+ var _a;
19
+ if (!emailSignerState.sendEmailWithOtp) {
20
+ throwNotAvailable("sendEmailWithOtp")();
21
+ }
22
+ return yield (_a = emailSignerState.sendEmailWithOtp) == null ? void 0 : _a.call(emailSignerState);
23
+ }), [emailSignerState.sendEmailWithOtp]);
24
+ const verifyOtp = _react.useCallback.call(void 0,
25
+ (otp) => _chunkQ7YPX4RJjs.__async.call(void 0, this, null, function* () {
26
+ var _a;
27
+ if (!emailSignerState.verifyOtp) {
28
+ throwNotAvailable("verifyOtp")();
29
+ }
30
+ return yield (_a = emailSignerState.verifyOtp) == null ? void 0 : _a.call(emailSignerState, otp);
31
+ }),
32
+ [emailSignerState.verifyOtp]
33
+ );
34
+ const reject = _react.useCallback.call(void 0,
35
+ (error) => {
36
+ var _a;
37
+ if (!emailSignerState.reject) {
38
+ throwNotAvailable("reject")();
39
+ }
40
+ (_a = emailSignerState.reject) == null ? void 0 : _a.call(emailSignerState, error);
41
+ },
42
+ [emailSignerState.reject]
43
+ );
44
+ return {
45
+ needsAuth: emailSignerState.needsAuth,
46
+ sendEmailWithOtp,
47
+ verifyOtp,
48
+ reject
49
+ };
50
+ }
51
+
52
+
53
+
54
+ exports.useWalletEmailSigner = useWalletEmailSigner;
55
+ //# sourceMappingURL=chunk-OTRMAWWU.js.map