@crossmint/client-sdk-react-native-ui 0.13.32 → 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.
- package/dist/chunk-24MMQ2R4.js +15 -0
- package/dist/chunk-24MMQ2R4.js.map +1 -0
- package/dist/chunk-2DNOAXOE.mjs +8 -0
- package/dist/chunk-2DNOAXOE.mjs.map +1 -0
- package/dist/chunk-2TEAOLM6.mjs +149 -0
- package/dist/chunk-2TEAOLM6.mjs.map +1 -0
- package/dist/chunk-2YRJHM46.mjs +50 -0
- package/dist/chunk-2YRJHM46.mjs.map +1 -0
- package/dist/chunk-34OVOZB2.mjs +111 -0
- package/dist/chunk-34OVOZB2.mjs.map +1 -0
- package/dist/chunk-3AWDWMZ2.mjs +18 -0
- package/dist/chunk-3AWDWMZ2.mjs.map +1 -0
- package/dist/chunk-3MWGBZ5O.js +348 -0
- package/dist/chunk-3MWGBZ5O.js.map +1 -0
- package/dist/chunk-3PJ6FXFT.mjs +1 -0
- package/dist/chunk-3PJ6FXFT.mjs.map +1 -0
- package/dist/chunk-3SFSPJXM.mjs +55 -0
- package/dist/chunk-3SFSPJXM.mjs.map +1 -0
- package/dist/chunk-4AJTICKY.mjs +44 -0
- package/dist/chunk-4AJTICKY.mjs.map +1 -0
- package/dist/chunk-4HKXTAVR.js +14 -0
- package/dist/chunk-4HKXTAVR.js.map +1 -0
- package/dist/chunk-4NTIGHRE.js +148 -0
- package/dist/chunk-4NTIGHRE.js.map +1 -0
- package/dist/chunk-4V7NDO5X.mjs +157 -0
- package/dist/chunk-4V7NDO5X.mjs.map +1 -0
- package/dist/chunk-4WJIXD7U.mjs +14 -0
- package/dist/chunk-4WJIXD7U.mjs.map +1 -0
- package/dist/chunk-5ZBDQUNG.js +1 -0
- package/dist/chunk-5ZBDQUNG.js.map +1 -0
- package/dist/chunk-6W2GOMYU.js +22 -0
- package/dist/chunk-6W2GOMYU.js.map +1 -0
- package/dist/chunk-6Z74KC25.mjs +1 -0
- package/dist/chunk-6Z74KC25.mjs.map +1 -0
- package/dist/chunk-7SPIOD4K.mjs +66 -0
- package/dist/chunk-7SPIOD4K.mjs.map +1 -0
- package/dist/chunk-ALMDA3KN.mjs +199 -0
- package/dist/chunk-ALMDA3KN.mjs.map +1 -0
- package/dist/chunk-BE4HT2U7.mjs +1 -0
- package/dist/chunk-BE4HT2U7.mjs.map +1 -0
- package/dist/chunk-BTH5QRIT.js +149 -0
- package/dist/chunk-BTH5QRIT.js.map +1 -0
- package/dist/chunk-BUB4U2GE.js +44 -0
- package/dist/chunk-BUB4U2GE.js.map +1 -0
- package/dist/chunk-BUTZZ7JB.js +36 -0
- package/dist/chunk-BUTZZ7JB.js.map +1 -0
- package/dist/chunk-CFHHVHNZ.mjs +157 -0
- package/dist/chunk-CFHHVHNZ.mjs.map +1 -0
- package/dist/chunk-DD2MVD6A.mjs +36 -0
- package/dist/chunk-DD2MVD6A.mjs.map +1 -0
- package/dist/chunk-EKXEDMRD.mjs +71 -0
- package/dist/chunk-EKXEDMRD.mjs.map +1 -0
- package/dist/chunk-GYBEEYGB.mjs +1 -0
- package/dist/chunk-GYBEEYGB.mjs.map +1 -0
- package/dist/chunk-HELXBZ7D.js +18 -0
- package/dist/chunk-HELXBZ7D.js.map +1 -0
- package/dist/chunk-IBQK5B7B.js +71 -0
- package/dist/chunk-IBQK5B7B.js.map +1 -0
- package/dist/chunk-IHZNXV5S.js +1 -0
- package/dist/chunk-IHZNXV5S.js.map +1 -0
- package/dist/chunk-J2MDWDV6.mjs +1 -0
- package/dist/chunk-J2MDWDV6.mjs.map +1 -0
- package/dist/chunk-KK4SQ7WF.js +1 -0
- package/dist/chunk-KK4SQ7WF.js.map +1 -0
- package/dist/chunk-LMXGU2XA.js +50 -0
- package/dist/chunk-LMXGU2XA.js.map +1 -0
- package/dist/chunk-LWQ5CJC4.mjs +22 -0
- package/dist/chunk-LWQ5CJC4.mjs.map +1 -0
- package/dist/chunk-MMVER6VO.js +1 -0
- package/dist/chunk-MMVER6VO.js.map +1 -0
- package/dist/chunk-MVLQR6RI.js +199 -0
- package/dist/chunk-MVLQR6RI.js.map +1 -0
- package/dist/chunk-NBWATZY4.js +157 -0
- package/dist/chunk-NBWATZY4.js.map +1 -0
- package/dist/chunk-NSSAF6CV.mjs +348 -0
- package/dist/chunk-NSSAF6CV.mjs.map +1 -0
- package/dist/chunk-OLVGVQEA.js +24 -0
- package/dist/chunk-OLVGVQEA.js.map +1 -0
- package/dist/chunk-OTRMAWWU.js +55 -0
- package/dist/chunk-OTRMAWWU.js.map +1 -0
- package/dist/chunk-Q2Y5CZT4.js +157 -0
- package/dist/chunk-Q2Y5CZT4.js.map +1 -0
- package/dist/chunk-Q7YPX4RJ.js +66 -0
- package/dist/chunk-Q7YPX4RJ.js.map +1 -0
- package/dist/chunk-R2M3HW3E.mjs +61 -0
- package/dist/chunk-R2M3HW3E.mjs.map +1 -0
- package/dist/chunk-R3ZW4OCR.js +61 -0
- package/dist/chunk-R3ZW4OCR.js.map +1 -0
- package/dist/chunk-R47XMJ32.js +1 -0
- package/dist/chunk-R47XMJ32.js.map +1 -0
- package/dist/chunk-R5GF6WFB.mjs +148 -0
- package/dist/chunk-R5GF6WFB.mjs.map +1 -0
- package/dist/chunk-RSCBYS6I.mjs +15 -0
- package/dist/chunk-RSCBYS6I.mjs.map +1 -0
- package/dist/chunk-TNPZITVL.mjs +1 -0
- package/dist/chunk-TNPZITVL.mjs.map +1 -0
- package/dist/chunk-U74INGIF.js +17 -0
- package/dist/chunk-U74INGIF.js.map +1 -0
- package/dist/chunk-V2PIS2OC.mjs +17 -0
- package/dist/chunk-V2PIS2OC.mjs.map +1 -0
- package/dist/chunk-VCF2YXCO.js +208 -0
- package/dist/chunk-VCF2YXCO.js.map +1 -0
- package/dist/chunk-XNVZRSGL.js +111 -0
- package/dist/chunk-XNVZRSGL.js.map +1 -0
- package/dist/chunk-XUGJXLWC.js +8 -0
- package/dist/chunk-XUGJXLWC.js.map +1 -0
- package/dist/chunk-XXJ7LQ44.js +1 -0
- package/dist/chunk-XXJ7LQ44.js.map +1 -0
- package/dist/chunk-YAVGI5BZ.mjs +24 -0
- package/dist/chunk-YAVGI5BZ.mjs.map +1 -0
- package/dist/chunk-Z7Y7COJM.mjs +208 -0
- package/dist/chunk-Z7Y7COJM.mjs.map +1 -0
- package/dist/components/embed/index.js +16 -1
- package/dist/components/embed/index.js.map +1 -0
- package/dist/components/embed/index.mjs +16 -1
- package/dist/components/embed/index.mjs.map +1 -0
- package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.js +14 -1
- package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.js.map +1 -0
- package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.mjs +14 -1
- package/dist/components/embed/v3/CrossmintEmbeddedCheckoutV3.mjs.map +1 -0
- package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.js +13 -1
- package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.js.map +1 -0
- package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.mjs +13 -1
- package/dist/components/embed/v3/EmbeddedCheckoutV3WebView.mjs.map +1 -0
- package/dist/components/embed/v3/crypto/PayerConnectionHandler.js +8 -1
- package/dist/components/embed/v3/crypto/PayerConnectionHandler.js.map +1 -0
- package/dist/components/embed/v3/crypto/PayerConnectionHandler.mjs +8 -1
- package/dist/components/embed/v3/crypto/PayerConnectionHandler.mjs.map +1 -0
- package/dist/components/embed/v3/index.js +15 -1
- package/dist/components/embed/v3/index.js.map +1 -0
- package/dist/components/embed/v3/index.mjs +15 -1
- package/dist/components/embed/v3/index.mjs.map +1 -0
- package/dist/components/index.js +34 -1
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +34 -1
- package/dist/components/index.mjs.map +1 -0
- package/dist/components/signers/BaseCodeInput.js +9 -1
- package/dist/components/signers/BaseCodeInput.js.map +1 -0
- package/dist/components/signers/BaseCodeInput.mjs +9 -1
- package/dist/components/signers/BaseCodeInput.mjs.map +1 -0
- package/dist/components/signers/BaseConfirmation.js +9 -1
- package/dist/components/signers/BaseConfirmation.js.map +1 -0
- package/dist/components/signers/BaseConfirmation.mjs +9 -1
- package/dist/components/signers/BaseConfirmation.mjs.map +1 -0
- package/dist/components/signers/EmailSignersDialog.js +11 -1
- package/dist/components/signers/EmailSignersDialog.js.map +1 -0
- package/dist/components/signers/EmailSignersDialog.mjs +11 -1
- package/dist/components/signers/EmailSignersDialog.mjs.map +1 -0
- package/dist/components/signers/PhoneSignersDialog.js +11 -1
- package/dist/components/signers/PhoneSignersDialog.js.map +1 -0
- package/dist/components/signers/PhoneSignersDialog.mjs +11 -1
- package/dist/components/signers/PhoneSignersDialog.mjs.map +1 -0
- package/dist/components/signers/index.js +16 -1
- package/dist/components/signers/index.js.map +1 -0
- package/dist/components/signers/index.mjs +16 -1
- package/dist/components/signers/index.mjs.map +1 -0
- package/dist/components/wallets/ExportPrivateKeyButton.js +8 -1
- package/dist/components/wallets/ExportPrivateKeyButton.js.map +1 -0
- package/dist/components/wallets/ExportPrivateKeyButton.mjs +8 -1
- package/dist/components/wallets/ExportPrivateKeyButton.mjs.map +1 -0
- package/dist/components/wallets/index.js +9 -1
- package/dist/components/wallets/index.js.map +1 -0
- package/dist/components/wallets/index.mjs +9 -1
- package/dist/components/wallets/index.mjs.map +1 -0
- package/dist/hooks/index.js +26 -1
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +26 -1
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/useAuth.js +14 -1
- package/dist/hooks/useAuth.js.map +1 -0
- package/dist/hooks/useAuth.mjs +14 -1
- package/dist/hooks/useAuth.mjs.map +1 -0
- package/dist/hooks/useCrossmintCheckout.js +11 -1
- package/dist/hooks/useCrossmintCheckout.js.map +1 -0
- package/dist/hooks/useCrossmintCheckout.mjs +11 -1
- package/dist/hooks/useCrossmintCheckout.mjs.map +1 -0
- package/dist/hooks/useWalletEmailSigner.js +8 -1
- package/dist/hooks/useWalletEmailSigner.js.map +1 -0
- package/dist/hooks/useWalletEmailSigner.mjs +8 -1
- package/dist/hooks/useWalletEmailSigner.mjs.map +1 -0
- package/dist/index.js +79 -1
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +79 -1
- package/dist/index.mjs.map +1 -0
- package/dist/logger/init.js +9 -1
- package/dist/logger/init.js.map +1 -0
- package/dist/logger/init.mjs +9 -1
- package/dist/logger/init.mjs.map +1 -0
- package/dist/plugin/mods/addQueryToAndroidManifest.js +8 -1
- package/dist/plugin/mods/addQueryToAndroidManifest.js.map +1 -0
- package/dist/plugin/mods/addQueryToAndroidManifest.mjs +8 -1
- package/dist/plugin/mods/addQueryToAndroidManifest.mjs.map +1 -0
- package/dist/plugin/withGooglePay.js +57 -1
- package/dist/plugin/withGooglePay.js.map +1 -0
- package/dist/plugin/withGooglePay.mjs +57 -1
- package/dist/plugin/withGooglePay.mjs.map +1 -0
- package/dist/providers/CrossmintAuthProvider.js +14 -1
- package/dist/providers/CrossmintAuthProvider.js.map +1 -0
- package/dist/providers/CrossmintAuthProvider.mjs +14 -1
- package/dist/providers/CrossmintAuthProvider.mjs.map +1 -0
- package/dist/providers/CrossmintProvider.js +12 -1
- package/dist/providers/CrossmintProvider.js.map +1 -0
- package/dist/providers/CrossmintProvider.mjs +12 -1
- package/dist/providers/CrossmintProvider.mjs.map +1 -0
- package/dist/providers/CrossmintWalletProvider.js +16 -1
- package/dist/providers/CrossmintWalletProvider.js.map +1 -0
- package/dist/providers/CrossmintWalletProvider.mjs +16 -1
- package/dist/providers/CrossmintWalletProvider.mjs.map +1 -0
- package/dist/providers/index.js +28 -1
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/index.mjs +28 -1
- package/dist/providers/index.mjs.map +1 -0
- package/dist/styles/index.js +8 -1
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/index.mjs +8 -1
- package/dist/styles/index.mjs.map +1 -0
- package/dist/styles/theme.js +8 -1
- package/dist/styles/theme.js.map +1 -0
- package/dist/styles/theme.mjs +8 -1
- package/dist/styles/theme.mjs.map +1 -0
- package/dist/types/auth.js +1 -1
- package/dist/types/auth.js.map +1 -0
- package/dist/types/auth.mjs +1 -0
- package/dist/types/auth.mjs.map +1 -0
- package/dist/utils/SecureStorage.js +8 -1
- package/dist/utils/SecureStorage.js.map +1 -0
- package/dist/utils/SecureStorage.mjs +8 -1
- package/dist/utils/SecureStorage.mjs.map +1 -0
- package/dist/utils/createCrossmintApiClient.js +9 -1
- package/dist/utils/createCrossmintApiClient.js.map +1 -0
- package/dist/utils/createCrossmintApiClient.mjs +9 -1
- package/dist/utils/createCrossmintApiClient.mjs.map +1 -0
- package/dist/utils/embed/userAgent.js +12 -1
- package/dist/utils/embed/userAgent.js.map +1 -0
- package/dist/utils/embed/userAgent.mjs +12 -1
- package/dist/utils/embed/userAgent.mjs.map +1 -0
- package/dist/utils/eventEmitter.js +8 -1
- package/dist/utils/eventEmitter.js.map +1 -0
- package/dist/utils/eventEmitter.mjs +8 -1
- package/dist/utils/eventEmitter.mjs.map +1 -0
- package/package.json +58 -54
|
@@ -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
|