@kryptos_connect/mobile-sdk 1.0.0 → 1.0.2
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/README.md +341 -40
- package/dist/index.d.mts +16 -17
- package/dist/index.d.ts +16 -17
- package/dist/index.js +1581 -1250
- package/dist/index.mjs +1603 -1266
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -38,8 +38,8 @@ __export(index_exports, {
|
|
|
38
38
|
module.exports = __toCommonJS(index_exports);
|
|
39
39
|
|
|
40
40
|
// src/KryptosConnectButton.tsx
|
|
41
|
-
var
|
|
42
|
-
var
|
|
41
|
+
var import_react36 = __toESM(require("react"));
|
|
42
|
+
var import_react_native21 = require("react-native");
|
|
43
43
|
|
|
44
44
|
// src/assets/LogoIcon.tsx
|
|
45
45
|
var import_react = __toESM(require("react"));
|
|
@@ -80,6 +80,152 @@ var LogoIcon = ({ size = 36 }) => {
|
|
|
80
80
|
|
|
81
81
|
// src/contexts/KryptosContext.tsx
|
|
82
82
|
var import_react2 = __toESM(require("react"));
|
|
83
|
+
|
|
84
|
+
// src/services/api.ts
|
|
85
|
+
var import_axios = __toESM(require("axios"));
|
|
86
|
+
|
|
87
|
+
// src/config/index.ts
|
|
88
|
+
var getBaseUrl = () => {
|
|
89
|
+
return getGlobalBaseUrl() || "https://connect-api.kryptos.io/";
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/services/api.ts
|
|
93
|
+
var api = import_axios.default.create({
|
|
94
|
+
headers: {
|
|
95
|
+
"Content-Type": "application/json"
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
api.interceptors.request.use((config) => {
|
|
99
|
+
config.baseURL = getBaseUrl();
|
|
100
|
+
return config;
|
|
101
|
+
});
|
|
102
|
+
var SCOPES = "openid profile offline_access email portfolios:read transactions:read integrations:read tax:read accounting:read reports:read workspace:read users:read";
|
|
103
|
+
async function sendEmailOtp(linkToken, email, clientId) {
|
|
104
|
+
const res = await api.post(
|
|
105
|
+
"/v1/sendEmailOTP",
|
|
106
|
+
{
|
|
107
|
+
email,
|
|
108
|
+
purpose: "login",
|
|
109
|
+
clientId
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
headers: {
|
|
113
|
+
"X-LINK-TOKEN": linkToken
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
return res.data;
|
|
118
|
+
}
|
|
119
|
+
async function loginWithOtp(linkToken, email, code, clientId) {
|
|
120
|
+
const res = await api.post(
|
|
121
|
+
"/v1/loginUserUsingOTP",
|
|
122
|
+
{
|
|
123
|
+
email,
|
|
124
|
+
code,
|
|
125
|
+
clientId,
|
|
126
|
+
purpose: "login"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
headers: {
|
|
130
|
+
"X-LINK-TOKEN": linkToken
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
return res.data;
|
|
135
|
+
}
|
|
136
|
+
async function createAnonymousUser(linkToken, clientId) {
|
|
137
|
+
const res = await api.post(
|
|
138
|
+
"/link-token/login",
|
|
139
|
+
{ clientId },
|
|
140
|
+
{
|
|
141
|
+
headers: {
|
|
142
|
+
"X-LINK-TOKEN": linkToken
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
return res.data;
|
|
147
|
+
}
|
|
148
|
+
async function addUserIntegration(linkToken, integration) {
|
|
149
|
+
const res = await api.post(
|
|
150
|
+
"/integrations/keys",
|
|
151
|
+
{ keys: [...integration] },
|
|
152
|
+
{
|
|
153
|
+
headers: {
|
|
154
|
+
"X-LINK-TOKEN": linkToken
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
return res.data?.data;
|
|
159
|
+
}
|
|
160
|
+
async function giveUserConsent(linkToken) {
|
|
161
|
+
const res = await api.post(
|
|
162
|
+
"/consent",
|
|
163
|
+
{
|
|
164
|
+
granted_scopes: SCOPES
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
headers: {
|
|
168
|
+
"X-LINK-TOKEN": linkToken
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
return res.data?.data;
|
|
173
|
+
}
|
|
174
|
+
async function testCredentials(linkToken, data) {
|
|
175
|
+
const res = await api.post("/integrations/credentials/test", data, {
|
|
176
|
+
headers: {
|
|
177
|
+
"X-LINK-TOKEN": linkToken
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
return res.data?.data;
|
|
181
|
+
}
|
|
182
|
+
async function getSupportedProviders(linkToken) {
|
|
183
|
+
const res = await api.get("/integrations/providers", {
|
|
184
|
+
headers: {
|
|
185
|
+
"X-LINK-TOKEN": linkToken
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return res.data?.data;
|
|
189
|
+
}
|
|
190
|
+
async function getUserIntegrations(linkToken) {
|
|
191
|
+
const res = await api.get("/integrations", {
|
|
192
|
+
headers: {
|
|
193
|
+
"X-LINK-TOKEN": linkToken
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
return res.data?.data;
|
|
197
|
+
}
|
|
198
|
+
async function getUserUsedChains(linkToken, address) {
|
|
199
|
+
const res = await api.get("/integrations/user-used-chain", {
|
|
200
|
+
headers: {
|
|
201
|
+
"X-LINK-TOKEN": linkToken
|
|
202
|
+
},
|
|
203
|
+
params: {
|
|
204
|
+
id: address
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return res.data?.data?.chains || [];
|
|
208
|
+
}
|
|
209
|
+
async function getClientInfo(linkToken) {
|
|
210
|
+
const res = await api.get("/client", {
|
|
211
|
+
headers: {
|
|
212
|
+
"X-LINK-TOKEN": linkToken
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
return res.data?.data;
|
|
216
|
+
}
|
|
217
|
+
async function getUserInfo(linkToken) {
|
|
218
|
+
const res = await api.get("/link-token/session", {
|
|
219
|
+
headers: {
|
|
220
|
+
"X-LINK-TOKEN": linkToken
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
return res.data?.data;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// src/contexts/KryptosContext.tsx
|
|
227
|
+
var globalBaseUrl;
|
|
228
|
+
var getGlobalBaseUrl = () => globalBaseUrl;
|
|
83
229
|
var KryptosContext = import_react2.default.createContext(
|
|
84
230
|
void 0
|
|
85
231
|
);
|
|
@@ -91,6 +237,20 @@ var KryptosConnectProvider = ({ children, config }) => {
|
|
|
91
237
|
const [userConsent, setUserConsent] = import_react2.default.useState(
|
|
92
238
|
null
|
|
93
239
|
);
|
|
240
|
+
const [isAuthorized, setIsAuthorized] = import_react2.default.useState(false);
|
|
241
|
+
const [clientInfo, setClientInfo] = import_react2.default.useState(null);
|
|
242
|
+
import_react2.default.useEffect(() => {
|
|
243
|
+
globalBaseUrl = config.baseUrl;
|
|
244
|
+
}, [config.baseUrl]);
|
|
245
|
+
import_react2.default.useEffect(() => {
|
|
246
|
+
const fetchClientInfo = async () => {
|
|
247
|
+
if (linkToken) {
|
|
248
|
+
const res = await getClientInfo(linkToken);
|
|
249
|
+
setClientInfo(res);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
fetchClientInfo();
|
|
253
|
+
}, [linkToken]);
|
|
94
254
|
return /* @__PURE__ */ import_react2.default.createElement(
|
|
95
255
|
KryptosContext.Provider,
|
|
96
256
|
{
|
|
@@ -105,7 +265,10 @@ var KryptosConnectProvider = ({ children, config }) => {
|
|
|
105
265
|
email,
|
|
106
266
|
setEmail,
|
|
107
267
|
userConsent,
|
|
108
|
-
setUserConsent
|
|
268
|
+
setUserConsent,
|
|
269
|
+
clientInfo,
|
|
270
|
+
isAuthorized,
|
|
271
|
+
setIsAuthorized
|
|
109
272
|
}
|
|
110
273
|
},
|
|
111
274
|
children
|
|
@@ -142,6 +305,7 @@ var lightTheme = {
|
|
|
142
305
|
successLight: "#D1FAE5",
|
|
143
306
|
warning: "#F59E0B",
|
|
144
307
|
warningLight: "#FEF3C7",
|
|
308
|
+
warningText: "#92400E",
|
|
145
309
|
overlay: "rgba(0, 0, 0, 0.5)",
|
|
146
310
|
white: "#FFFFFF",
|
|
147
311
|
black: "#000000"
|
|
@@ -221,6 +385,7 @@ var darkTheme = {
|
|
|
221
385
|
successLight: "#065F46",
|
|
222
386
|
warning: "#F59E0B",
|
|
223
387
|
warningLight: "#78350F",
|
|
388
|
+
warningText: "#FEF3C7",
|
|
224
389
|
overlay: "rgba(0, 0, 0, 0.7)",
|
|
225
390
|
white: "#FFFFFF",
|
|
226
391
|
black: "#000000"
|
|
@@ -266,192 +431,56 @@ var useTheme = () => {
|
|
|
266
431
|
return currentTheme;
|
|
267
432
|
};
|
|
268
433
|
|
|
269
|
-
// src/
|
|
270
|
-
var import_react12 = __toESM(require("react"));
|
|
271
|
-
var import_react_native5 = require("react-native");
|
|
272
|
-
|
|
273
|
-
// src/assets/LinkIcon.tsx
|
|
434
|
+
// src/components/Button.tsx
|
|
274
435
|
var import_react4 = __toESM(require("react"));
|
|
275
|
-
var import_react_native_svg2 = __toESM(require("react-native-svg"));
|
|
276
|
-
var LinkIcon = ({
|
|
277
|
-
size = 20,
|
|
278
|
-
color = "#00C693"
|
|
279
|
-
}) => {
|
|
280
|
-
return /* @__PURE__ */ import_react4.default.createElement(import_react_native_svg2.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react4.default.createElement(
|
|
281
|
-
import_react_native_svg2.Path,
|
|
282
|
-
{
|
|
283
|
-
d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",
|
|
284
|
-
stroke: color,
|
|
285
|
-
strokeWidth: 2,
|
|
286
|
-
strokeLinecap: "round",
|
|
287
|
-
strokeLinejoin: "round"
|
|
288
|
-
}
|
|
289
|
-
), /* @__PURE__ */ import_react4.default.createElement(
|
|
290
|
-
import_react_native_svg2.Path,
|
|
291
|
-
{
|
|
292
|
-
d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",
|
|
293
|
-
stroke: color,
|
|
294
|
-
strokeWidth: 2,
|
|
295
|
-
strokeLinecap: "round",
|
|
296
|
-
strokeLinejoin: "round"
|
|
297
|
-
}
|
|
298
|
-
));
|
|
299
|
-
};
|
|
300
|
-
|
|
301
|
-
// src/assets/ShieldIcon.tsx
|
|
302
|
-
var import_react5 = __toESM(require("react"));
|
|
303
|
-
var import_react_native_svg3 = __toESM(require("react-native-svg"));
|
|
304
|
-
var ShieldIcon = ({
|
|
305
|
-
size = 20,
|
|
306
|
-
color = "#00C693"
|
|
307
|
-
}) => {
|
|
308
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_react_native_svg3.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react5.default.createElement(
|
|
309
|
-
import_react_native_svg3.Path,
|
|
310
|
-
{
|
|
311
|
-
d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",
|
|
312
|
-
stroke: color,
|
|
313
|
-
strokeWidth: 2,
|
|
314
|
-
strokeLinecap: "round",
|
|
315
|
-
strokeLinejoin: "round"
|
|
316
|
-
}
|
|
317
|
-
), /* @__PURE__ */ import_react5.default.createElement(
|
|
318
|
-
import_react_native_svg3.Path,
|
|
319
|
-
{
|
|
320
|
-
d: "m9 12 2 2 4-4",
|
|
321
|
-
stroke: color,
|
|
322
|
-
strokeWidth: 2,
|
|
323
|
-
strokeLinecap: "round",
|
|
324
|
-
strokeLinejoin: "round"
|
|
325
|
-
}
|
|
326
|
-
));
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
// src/components/Alert.tsx
|
|
330
|
-
var import_react6 = __toESM(require("react"));
|
|
331
436
|
var import_react_native = require("react-native");
|
|
332
|
-
var
|
|
333
|
-
variant = "
|
|
437
|
+
var Button = ({
|
|
438
|
+
variant = "primary",
|
|
439
|
+
size = "md",
|
|
334
440
|
children,
|
|
335
|
-
|
|
441
|
+
onPress,
|
|
442
|
+
disabled = false,
|
|
443
|
+
loading = false,
|
|
444
|
+
style,
|
|
445
|
+
textStyle
|
|
336
446
|
}) => {
|
|
337
447
|
const theme = useTheme();
|
|
338
448
|
const getVariantStyles = () => {
|
|
339
449
|
switch (variant) {
|
|
340
|
-
case "
|
|
450
|
+
case "primary":
|
|
341
451
|
return {
|
|
342
|
-
backgroundColor: theme.colors.
|
|
343
|
-
|
|
452
|
+
backgroundColor: disabled ? theme.colors.textTertiary : theme.colors.primary,
|
|
453
|
+
borderWidth: 0
|
|
344
454
|
};
|
|
345
|
-
|
|
455
|
+
case "secondary":
|
|
346
456
|
return {
|
|
347
|
-
backgroundColor: theme.colors.surface,
|
|
457
|
+
backgroundColor: disabled ? theme.colors.surfaceSecondary : theme.colors.surface,
|
|
458
|
+
borderWidth: 1,
|
|
348
459
|
borderColor: theme.colors.border
|
|
349
460
|
};
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
{
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
return /* @__PURE__ */ import_react6.default.createElement(
|
|
374
|
-
import_react_native.Text,
|
|
375
|
-
{
|
|
376
|
-
style: [
|
|
377
|
-
styles.description,
|
|
378
|
-
{
|
|
379
|
-
color: theme.colors.text,
|
|
380
|
-
fontSize: theme.fontSize.md
|
|
381
|
-
},
|
|
382
|
-
style
|
|
383
|
-
]
|
|
384
|
-
},
|
|
385
|
-
children
|
|
386
|
-
);
|
|
387
|
-
};
|
|
388
|
-
var styles = import_react_native.StyleSheet.create({
|
|
389
|
-
alert: {
|
|
390
|
-
borderWidth: 1,
|
|
391
|
-
marginVertical: 12
|
|
392
|
-
// theme.spacing.md - consistent alert spacing
|
|
393
|
-
},
|
|
394
|
-
title: {
|
|
395
|
-
fontWeight: "600",
|
|
396
|
-
marginBottom: 4
|
|
397
|
-
// theme.spacing.xs
|
|
398
|
-
},
|
|
399
|
-
description: {
|
|
400
|
-
lineHeight: 18,
|
|
401
|
-
textAlign: "center"
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
// src/components/Button.tsx
|
|
406
|
-
var import_react7 = __toESM(require("react"));
|
|
407
|
-
var import_react_native2 = require("react-native");
|
|
408
|
-
var Button = ({
|
|
409
|
-
variant = "primary",
|
|
410
|
-
size = "md",
|
|
411
|
-
children,
|
|
412
|
-
onPress,
|
|
413
|
-
disabled = false,
|
|
414
|
-
loading = false,
|
|
415
|
-
style,
|
|
416
|
-
textStyle
|
|
417
|
-
}) => {
|
|
418
|
-
const theme = useTheme();
|
|
419
|
-
const getVariantStyles = () => {
|
|
420
|
-
switch (variant) {
|
|
421
|
-
case "primary":
|
|
422
|
-
return {
|
|
423
|
-
backgroundColor: disabled ? theme.colors.textTertiary : theme.colors.primary,
|
|
424
|
-
borderWidth: 0
|
|
425
|
-
};
|
|
426
|
-
case "secondary":
|
|
427
|
-
return {
|
|
428
|
-
backgroundColor: disabled ? theme.colors.surfaceSecondary : theme.colors.surface,
|
|
429
|
-
borderWidth: 1,
|
|
430
|
-
borderColor: theme.colors.border
|
|
431
|
-
};
|
|
432
|
-
case "outline":
|
|
433
|
-
return {
|
|
434
|
-
backgroundColor: "transparent",
|
|
435
|
-
borderWidth: 1,
|
|
436
|
-
borderColor: disabled ? theme.colors.textTertiary : theme.colors.primary
|
|
437
|
-
};
|
|
438
|
-
case "ghost":
|
|
439
|
-
return {
|
|
440
|
-
backgroundColor: "transparent",
|
|
441
|
-
borderWidth: 0
|
|
442
|
-
};
|
|
443
|
-
case "success":
|
|
444
|
-
return {
|
|
445
|
-
backgroundColor: disabled ? theme.colors.textTertiary : theme.colors.success,
|
|
446
|
-
borderWidth: 0
|
|
447
|
-
};
|
|
448
|
-
case "error":
|
|
449
|
-
return {
|
|
450
|
-
backgroundColor: disabled ? theme.colors.textTertiary : theme.colors.error,
|
|
451
|
-
borderWidth: 0
|
|
452
|
-
};
|
|
453
|
-
default:
|
|
454
|
-
return {};
|
|
461
|
+
case "outline":
|
|
462
|
+
return {
|
|
463
|
+
backgroundColor: "transparent",
|
|
464
|
+
borderWidth: 1,
|
|
465
|
+
borderColor: disabled ? theme.colors.textTertiary : theme.colors.primary
|
|
466
|
+
};
|
|
467
|
+
case "ghost":
|
|
468
|
+
return {
|
|
469
|
+
backgroundColor: "transparent",
|
|
470
|
+
borderWidth: 0
|
|
471
|
+
};
|
|
472
|
+
case "success":
|
|
473
|
+
return {
|
|
474
|
+
backgroundColor: disabled ? theme.colors.textTertiary : theme.colors.success,
|
|
475
|
+
borderWidth: 0
|
|
476
|
+
};
|
|
477
|
+
case "error":
|
|
478
|
+
return {
|
|
479
|
+
backgroundColor: disabled ? theme.colors.textTertiary : theme.colors.error,
|
|
480
|
+
borderWidth: 0
|
|
481
|
+
};
|
|
482
|
+
default:
|
|
483
|
+
return {};
|
|
455
484
|
}
|
|
456
485
|
};
|
|
457
486
|
const getTextColor = () => {
|
|
@@ -516,35 +545,35 @@ var Button = ({
|
|
|
516
545
|
}
|
|
517
546
|
};
|
|
518
547
|
const sizeStyles = getSizeStyles();
|
|
519
|
-
return /* @__PURE__ */
|
|
520
|
-
|
|
548
|
+
return /* @__PURE__ */ import_react4.default.createElement(
|
|
549
|
+
import_react_native.TouchableOpacity,
|
|
521
550
|
{
|
|
522
551
|
onPress,
|
|
523
552
|
disabled: disabled || loading,
|
|
524
553
|
activeOpacity: 0.7,
|
|
525
554
|
style: [
|
|
526
|
-
|
|
555
|
+
styles.button,
|
|
527
556
|
getVariantStyles(),
|
|
528
557
|
sizeStyles.button,
|
|
529
|
-
disabled &&
|
|
558
|
+
disabled && styles.disabled,
|
|
530
559
|
style
|
|
531
560
|
]
|
|
532
561
|
},
|
|
533
|
-
loading ? /* @__PURE__ */
|
|
534
|
-
|
|
562
|
+
loading ? /* @__PURE__ */ import_react4.default.createElement(import_react_native.ActivityIndicator, { size: "small", color: getTextColor() }) : typeof children === "string" ? /* @__PURE__ */ import_react4.default.createElement(
|
|
563
|
+
import_react_native.Text,
|
|
535
564
|
{
|
|
536
565
|
style: [
|
|
537
|
-
|
|
566
|
+
styles.text,
|
|
538
567
|
{ color: getTextColor() },
|
|
539
568
|
sizeStyles.text,
|
|
540
569
|
textStyle
|
|
541
570
|
]
|
|
542
571
|
},
|
|
543
572
|
children
|
|
544
|
-
) : /* @__PURE__ */
|
|
573
|
+
) : /* @__PURE__ */ import_react4.default.createElement(import_react_native.View, { style: styles.contentContainer }, children)
|
|
545
574
|
);
|
|
546
575
|
};
|
|
547
|
-
var
|
|
576
|
+
var styles = import_react_native.StyleSheet.create({
|
|
548
577
|
button: {
|
|
549
578
|
flexDirection: "row",
|
|
550
579
|
alignItems: "center",
|
|
@@ -565,165 +594,342 @@ var styles2 = import_react_native2.StyleSheet.create({
|
|
|
565
594
|
}
|
|
566
595
|
});
|
|
567
596
|
|
|
568
|
-
// src/components/
|
|
569
|
-
var
|
|
570
|
-
var
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
import_react_native_svg4.Path,
|
|
581
|
-
{
|
|
582
|
-
d: "M15 5L5 15M5 5L15 15",
|
|
583
|
-
stroke: color,
|
|
584
|
-
strokeWidth: 2,
|
|
585
|
-
strokeLinecap: "round",
|
|
586
|
-
strokeLinejoin: "round"
|
|
587
|
-
}
|
|
588
|
-
));
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
// src/components/Modal.tsx
|
|
592
|
-
var { height: SCREEN_HEIGHT } = import_react_native3.Dimensions.get("window");
|
|
593
|
-
var Modal = ({
|
|
594
|
-
isOpen,
|
|
595
|
-
onClose,
|
|
596
|
-
children,
|
|
597
|
-
size = "md",
|
|
598
|
-
closeOnOverlayClick = true,
|
|
599
|
-
disableClose = true,
|
|
600
|
-
style
|
|
597
|
+
// src/components/Input.tsx
|
|
598
|
+
var import_react5 = __toESM(require("react"));
|
|
599
|
+
var import_react_native2 = require("react-native");
|
|
600
|
+
var Input = ({
|
|
601
|
+
label,
|
|
602
|
+
error,
|
|
603
|
+
helperText,
|
|
604
|
+
status = "default",
|
|
605
|
+
containerStyle,
|
|
606
|
+
inputStyle,
|
|
607
|
+
labelStyle,
|
|
608
|
+
...props
|
|
601
609
|
}) => {
|
|
602
610
|
const theme = useTheme();
|
|
603
|
-
const
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
return { maxHeight: SCREEN_HEIGHT * 0.55 };
|
|
611
|
-
case "lg":
|
|
612
|
-
return { maxHeight: SCREEN_HEIGHT * 0.65 };
|
|
613
|
-
case "xl":
|
|
614
|
-
return { maxHeight: SCREEN_HEIGHT * 0.75 };
|
|
615
|
-
case "full":
|
|
616
|
-
return { maxHeight: SCREEN_HEIGHT * 0.85 };
|
|
611
|
+
const inputStatus = error ? "error" : status;
|
|
612
|
+
const getBorderColor = () => {
|
|
613
|
+
switch (inputStatus) {
|
|
614
|
+
case "error":
|
|
615
|
+
return theme.colors.error;
|
|
616
|
+
case "success":
|
|
617
|
+
return theme.colors.success;
|
|
617
618
|
default:
|
|
618
|
-
return
|
|
619
|
+
return theme.colors.border;
|
|
619
620
|
}
|
|
620
621
|
};
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
};
|
|
624
|
-
return /* @__PURE__ */ import_react9.default.createElement(
|
|
625
|
-
import_react_native3.KeyboardAvoidingView,
|
|
622
|
+
return /* @__PURE__ */ import_react5.default.createElement(import_react_native2.View, { style: [styles2.wrapper, containerStyle] }, label && /* @__PURE__ */ import_react5.default.createElement(
|
|
623
|
+
import_react_native2.Text,
|
|
626
624
|
{
|
|
627
|
-
|
|
628
|
-
|
|
625
|
+
style: [
|
|
626
|
+
styles2.label,
|
|
627
|
+
{ color: theme.colors.text, fontSize: theme.fontSize.sm },
|
|
628
|
+
labelStyle
|
|
629
|
+
]
|
|
629
630
|
},
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
visible: isOpen,
|
|
634
|
-
transparent: true,
|
|
635
|
-
animationType: "none",
|
|
636
|
-
statusBarTranslucent: true,
|
|
637
|
-
onRequestClose: disableClose ? void 0 : onClose
|
|
638
|
-
},
|
|
639
|
-
/* @__PURE__ */ import_react9.default.createElement(
|
|
640
|
-
import_react_native3.TouchableOpacity,
|
|
641
|
-
{
|
|
642
|
-
activeOpacity: 1,
|
|
643
|
-
style: [styles3.overlay, { backgroundColor: theme.colors.overlay }],
|
|
644
|
-
onPress: handleOverlayPress
|
|
645
|
-
},
|
|
646
|
-
/* @__PURE__ */ import_react9.default.createElement(
|
|
647
|
-
import_react_native3.View,
|
|
648
|
-
{
|
|
649
|
-
style: [
|
|
650
|
-
styles3.container,
|
|
651
|
-
{
|
|
652
|
-
backgroundColor: theme.colors.background,
|
|
653
|
-
borderTopLeftRadius: theme.borderRadius.xl,
|
|
654
|
-
borderTopRightRadius: theme.borderRadius.xl,
|
|
655
|
-
...theme.shadow.lg,
|
|
656
|
-
paddingBottom: theme.spacing.xl
|
|
657
|
-
// 20
|
|
658
|
-
},
|
|
659
|
-
getSizeStyles(),
|
|
660
|
-
style
|
|
661
|
-
],
|
|
662
|
-
onStartShouldSetResponder: () => true
|
|
663
|
-
},
|
|
664
|
-
children
|
|
665
|
-
)
|
|
666
|
-
)
|
|
667
|
-
)
|
|
668
|
-
);
|
|
669
|
-
};
|
|
670
|
-
var ModalHeader = ({
|
|
671
|
-
children,
|
|
672
|
-
onClose,
|
|
673
|
-
showCloseButton = true,
|
|
674
|
-
style
|
|
675
|
-
}) => {
|
|
676
|
-
const theme = useTheme();
|
|
677
|
-
return /* @__PURE__ */ import_react9.default.createElement(
|
|
678
|
-
import_react_native3.View,
|
|
631
|
+
label
|
|
632
|
+
), /* @__PURE__ */ import_react5.default.createElement(
|
|
633
|
+
import_react_native2.TextInput,
|
|
679
634
|
{
|
|
635
|
+
placeholderTextColor: theme.colors.textTertiary,
|
|
680
636
|
style: [
|
|
681
|
-
|
|
637
|
+
styles2.input,
|
|
682
638
|
{
|
|
683
|
-
|
|
639
|
+
backgroundColor: theme.colors.surface,
|
|
640
|
+
borderColor: getBorderColor(),
|
|
641
|
+
color: theme.colors.text,
|
|
642
|
+
fontSize: theme.fontSize.md,
|
|
643
|
+
borderRadius: theme.borderRadius.md,
|
|
684
644
|
paddingHorizontal: theme.spacing.lg,
|
|
685
645
|
paddingVertical: theme.spacing.md
|
|
686
646
|
},
|
|
687
|
-
|
|
647
|
+
inputStyle
|
|
648
|
+
],
|
|
649
|
+
...props
|
|
650
|
+
}
|
|
651
|
+
), error && /* @__PURE__ */ import_react5.default.createElement(
|
|
652
|
+
import_react_native2.Text,
|
|
653
|
+
{
|
|
654
|
+
style: [
|
|
655
|
+
styles2.error,
|
|
656
|
+
{ color: theme.colors.error, fontSize: theme.fontSize.sm }
|
|
688
657
|
]
|
|
689
658
|
},
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
hitSlop: { top: 10, bottom: 10, left: 10, right: 10 },
|
|
705
|
-
style: [
|
|
706
|
-
styles3.closeButton,
|
|
707
|
-
{ backgroundColor: theme.colors.surface }
|
|
708
|
-
]
|
|
709
|
-
},
|
|
710
|
-
/* @__PURE__ */ import_react9.default.createElement(CloseIcon, { color: theme.colors.text, size: 20 })
|
|
711
|
-
)
|
|
712
|
-
);
|
|
659
|
+
error
|
|
660
|
+
), helperText && !error && /* @__PURE__ */ import_react5.default.createElement(
|
|
661
|
+
import_react_native2.Text,
|
|
662
|
+
{
|
|
663
|
+
style: [
|
|
664
|
+
styles2.helper,
|
|
665
|
+
{
|
|
666
|
+
color: theme.colors.textSecondary,
|
|
667
|
+
fontSize: theme.fontSize.sm
|
|
668
|
+
}
|
|
669
|
+
]
|
|
670
|
+
},
|
|
671
|
+
helperText
|
|
672
|
+
));
|
|
713
673
|
};
|
|
714
|
-
var
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
674
|
+
var styles2 = import_react_native2.StyleSheet.create({
|
|
675
|
+
wrapper: {
|
|
676
|
+
marginBottom: 16
|
|
677
|
+
// theme.spacing.lg - consistent form spacing
|
|
678
|
+
},
|
|
679
|
+
label: {
|
|
680
|
+
fontWeight: "500",
|
|
681
|
+
marginBottom: 8
|
|
682
|
+
// theme.spacing.sm
|
|
683
|
+
},
|
|
684
|
+
input: {
|
|
685
|
+
borderWidth: 1,
|
|
686
|
+
minHeight: 48
|
|
687
|
+
},
|
|
688
|
+
error: {
|
|
689
|
+
marginTop: 4
|
|
690
|
+
// theme.spacing.xs
|
|
691
|
+
},
|
|
692
|
+
helper: {
|
|
693
|
+
marginTop: 4
|
|
694
|
+
// theme.spacing.xs
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
// src/components/Alert.tsx
|
|
699
|
+
var import_react6 = __toESM(require("react"));
|
|
700
|
+
var import_react_native3 = require("react-native");
|
|
701
|
+
var Alert = ({
|
|
702
|
+
variant = "default",
|
|
703
|
+
children,
|
|
704
|
+
style
|
|
705
|
+
}) => {
|
|
706
|
+
const theme = useTheme();
|
|
707
|
+
const getVariantStyles = () => {
|
|
708
|
+
switch (variant) {
|
|
709
|
+
case "destructive":
|
|
710
|
+
return {
|
|
711
|
+
backgroundColor: theme.colors.errorLight,
|
|
712
|
+
borderColor: theme.colors.error
|
|
713
|
+
};
|
|
714
|
+
default:
|
|
715
|
+
return {
|
|
716
|
+
backgroundColor: theme.colors.surface,
|
|
717
|
+
borderColor: theme.colors.border
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
};
|
|
721
|
+
return /* @__PURE__ */ import_react6.default.createElement(
|
|
722
|
+
import_react_native3.View,
|
|
723
|
+
{
|
|
724
|
+
style: [
|
|
725
|
+
styles3.alert,
|
|
726
|
+
{
|
|
727
|
+
borderRadius: theme.borderRadius.md,
|
|
728
|
+
padding: theme.spacing.md
|
|
729
|
+
},
|
|
730
|
+
getVariantStyles(),
|
|
731
|
+
style
|
|
732
|
+
]
|
|
733
|
+
},
|
|
734
|
+
children
|
|
735
|
+
);
|
|
736
|
+
};
|
|
737
|
+
var AlertDescription = ({
|
|
738
|
+
children,
|
|
739
|
+
style
|
|
740
|
+
}) => {
|
|
741
|
+
const theme = useTheme();
|
|
742
|
+
return /* @__PURE__ */ import_react6.default.createElement(
|
|
743
|
+
import_react_native3.Text,
|
|
744
|
+
{
|
|
745
|
+
style: [
|
|
746
|
+
styles3.description,
|
|
747
|
+
{
|
|
748
|
+
color: theme.colors.text,
|
|
749
|
+
fontSize: theme.fontSize.md
|
|
750
|
+
},
|
|
751
|
+
style
|
|
752
|
+
]
|
|
753
|
+
},
|
|
754
|
+
children
|
|
755
|
+
);
|
|
756
|
+
};
|
|
757
|
+
var styles3 = import_react_native3.StyleSheet.create({
|
|
758
|
+
alert: {
|
|
759
|
+
borderWidth: 1,
|
|
760
|
+
marginVertical: 12
|
|
761
|
+
// theme.spacing.md - consistent alert spacing
|
|
762
|
+
},
|
|
763
|
+
title: {
|
|
764
|
+
fontWeight: "600",
|
|
765
|
+
marginBottom: 4
|
|
766
|
+
// theme.spacing.xs
|
|
767
|
+
},
|
|
768
|
+
description: {
|
|
769
|
+
lineHeight: 18,
|
|
770
|
+
textAlign: "center"
|
|
771
|
+
}
|
|
772
|
+
});
|
|
773
|
+
|
|
774
|
+
// src/components/Modal.tsx
|
|
775
|
+
var import_react8 = __toESM(require("react"));
|
|
776
|
+
var import_react_native4 = require("react-native");
|
|
777
|
+
|
|
778
|
+
// src/assets/CloseIcon.tsx
|
|
779
|
+
var import_react7 = __toESM(require("react"));
|
|
780
|
+
var import_react_native_svg2 = __toESM(require("react-native-svg"));
|
|
781
|
+
var CloseIcon = ({
|
|
782
|
+
size = 20,
|
|
783
|
+
color = "#000"
|
|
784
|
+
}) => {
|
|
785
|
+
return /* @__PURE__ */ import_react7.default.createElement(import_react_native_svg2.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none" }, /* @__PURE__ */ import_react7.default.createElement(
|
|
786
|
+
import_react_native_svg2.Path,
|
|
787
|
+
{
|
|
788
|
+
d: "M15 5L5 15M5 5L15 15",
|
|
789
|
+
stroke: color,
|
|
790
|
+
strokeWidth: 2,
|
|
791
|
+
strokeLinecap: "round",
|
|
792
|
+
strokeLinejoin: "round"
|
|
793
|
+
}
|
|
794
|
+
));
|
|
795
|
+
};
|
|
796
|
+
|
|
797
|
+
// src/components/Modal.tsx
|
|
798
|
+
var { height: SCREEN_HEIGHT } = import_react_native4.Dimensions.get("window");
|
|
799
|
+
var Modal = ({
|
|
800
|
+
isOpen,
|
|
801
|
+
onClose,
|
|
802
|
+
children,
|
|
803
|
+
size = "md",
|
|
804
|
+
closeOnOverlayClick = true,
|
|
805
|
+
disableClose = true,
|
|
806
|
+
style
|
|
807
|
+
}) => {
|
|
808
|
+
const theme = useTheme();
|
|
809
|
+
const getSizeStyles = () => {
|
|
810
|
+
switch (size) {
|
|
811
|
+
case "xs":
|
|
812
|
+
return { maxHeight: SCREEN_HEIGHT * 0.35 };
|
|
813
|
+
case "sm":
|
|
814
|
+
return { maxHeight: SCREEN_HEIGHT * 0.45 };
|
|
815
|
+
case "md":
|
|
816
|
+
return { maxHeight: SCREEN_HEIGHT * 0.55 };
|
|
817
|
+
case "lg":
|
|
818
|
+
return { maxHeight: SCREEN_HEIGHT * 0.65 };
|
|
819
|
+
case "xl":
|
|
820
|
+
return { maxHeight: SCREEN_HEIGHT * 0.75 };
|
|
821
|
+
case "full":
|
|
822
|
+
return { maxHeight: SCREEN_HEIGHT * 0.85 };
|
|
823
|
+
default:
|
|
824
|
+
return { maxHeight: SCREEN_HEIGHT * 0.6 };
|
|
825
|
+
}
|
|
826
|
+
};
|
|
827
|
+
const handleOverlayPress = () => {
|
|
828
|
+
if (!disableClose && closeOnOverlayClick) onClose();
|
|
829
|
+
};
|
|
830
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
831
|
+
import_react_native4.KeyboardAvoidingView,
|
|
832
|
+
{
|
|
833
|
+
behavior: import_react_native4.Platform.OS === "ios" ? "padding" : "height",
|
|
834
|
+
style: styles4.keyboardView
|
|
835
|
+
},
|
|
836
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
837
|
+
import_react_native4.Modal,
|
|
838
|
+
{
|
|
839
|
+
visible: isOpen,
|
|
840
|
+
transparent: true,
|
|
841
|
+
animationType: "none",
|
|
842
|
+
statusBarTranslucent: true,
|
|
843
|
+
onRequestClose: disableClose ? void 0 : onClose
|
|
844
|
+
},
|
|
845
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
846
|
+
import_react_native4.TouchableOpacity,
|
|
847
|
+
{
|
|
848
|
+
activeOpacity: 1,
|
|
849
|
+
style: [styles4.overlay, { backgroundColor: theme.colors.overlay }],
|
|
850
|
+
onPress: handleOverlayPress
|
|
851
|
+
},
|
|
852
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
853
|
+
import_react_native4.View,
|
|
854
|
+
{
|
|
855
|
+
style: [
|
|
856
|
+
styles4.container,
|
|
857
|
+
{
|
|
858
|
+
backgroundColor: theme.colors.background,
|
|
859
|
+
borderTopLeftRadius: theme.borderRadius.xl,
|
|
860
|
+
borderTopRightRadius: theme.borderRadius.xl,
|
|
861
|
+
...theme.shadow.lg,
|
|
862
|
+
paddingBottom: theme.spacing.xl
|
|
863
|
+
// 20
|
|
864
|
+
},
|
|
865
|
+
getSizeStyles(),
|
|
866
|
+
style
|
|
867
|
+
],
|
|
868
|
+
onStartShouldSetResponder: () => true
|
|
869
|
+
},
|
|
870
|
+
children
|
|
871
|
+
)
|
|
872
|
+
)
|
|
873
|
+
)
|
|
874
|
+
);
|
|
875
|
+
};
|
|
876
|
+
var ModalHeader = ({
|
|
877
|
+
children,
|
|
878
|
+
onClose,
|
|
879
|
+
showCloseButton = true,
|
|
880
|
+
style
|
|
881
|
+
}) => {
|
|
882
|
+
const theme = useTheme();
|
|
883
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
884
|
+
import_react_native4.View,
|
|
885
|
+
{
|
|
886
|
+
style: [
|
|
887
|
+
styles4.header,
|
|
888
|
+
{
|
|
889
|
+
borderBottomColor: theme.colors.border,
|
|
890
|
+
paddingHorizontal: theme.spacing.lg,
|
|
891
|
+
paddingVertical: theme.spacing.md
|
|
892
|
+
},
|
|
893
|
+
style
|
|
894
|
+
]
|
|
895
|
+
},
|
|
896
|
+
/* @__PURE__ */ import_react8.default.createElement(import_react_native4.View, { style: styles4.headerContent }, typeof children === "string" ? /* @__PURE__ */ import_react8.default.createElement(
|
|
897
|
+
import_react_native4.Text,
|
|
898
|
+
{
|
|
899
|
+
style: [
|
|
900
|
+
styles4.title,
|
|
901
|
+
{ color: theme.colors.text, fontSize: theme.fontSize.lg }
|
|
902
|
+
]
|
|
903
|
+
},
|
|
904
|
+
children
|
|
905
|
+
) : children),
|
|
906
|
+
showCloseButton && onClose && /* @__PURE__ */ import_react8.default.createElement(
|
|
907
|
+
import_react_native4.TouchableOpacity,
|
|
908
|
+
{
|
|
909
|
+
onPress: onClose,
|
|
910
|
+
hitSlop: { top: 10, bottom: 10, left: 10, right: 10 },
|
|
911
|
+
style: [
|
|
912
|
+
styles4.closeButton,
|
|
913
|
+
{ backgroundColor: theme.colors.surface }
|
|
914
|
+
]
|
|
915
|
+
},
|
|
916
|
+
/* @__PURE__ */ import_react8.default.createElement(CloseIcon, { color: theme.colors.text, size: 20 })
|
|
917
|
+
)
|
|
918
|
+
);
|
|
919
|
+
};
|
|
920
|
+
var ModalBody = ({
|
|
921
|
+
children,
|
|
922
|
+
style,
|
|
923
|
+
scrollable = true
|
|
924
|
+
}) => {
|
|
925
|
+
const theme = useTheme();
|
|
926
|
+
if (scrollable) {
|
|
927
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
928
|
+
import_react_native4.ScrollView,
|
|
929
|
+
{
|
|
930
|
+
style: styles4.bodyScroll,
|
|
725
931
|
contentContainerStyle: [
|
|
726
|
-
|
|
932
|
+
styles4.bodyContent,
|
|
727
933
|
{ padding: theme.spacing.lg },
|
|
728
934
|
style
|
|
729
935
|
],
|
|
@@ -733,18 +939,18 @@ var ModalBody = ({
|
|
|
733
939
|
children
|
|
734
940
|
);
|
|
735
941
|
}
|
|
736
|
-
return /* @__PURE__ */
|
|
942
|
+
return /* @__PURE__ */ import_react8.default.createElement(import_react_native4.View, { style: [styles4.body, { padding: theme.spacing.lg }, style] }, children);
|
|
737
943
|
};
|
|
738
944
|
var ModalFooter = ({
|
|
739
945
|
children,
|
|
740
946
|
style
|
|
741
947
|
}) => {
|
|
742
948
|
const theme = useTheme();
|
|
743
|
-
return /* @__PURE__ */
|
|
744
|
-
|
|
949
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
950
|
+
import_react_native4.View,
|
|
745
951
|
{
|
|
746
952
|
style: [
|
|
747
|
-
|
|
953
|
+
styles4.footer,
|
|
748
954
|
{
|
|
749
955
|
borderTopColor: theme.colors.border,
|
|
750
956
|
paddingHorizontal: theme.spacing.lg,
|
|
@@ -756,7 +962,7 @@ var ModalFooter = ({
|
|
|
756
962
|
children
|
|
757
963
|
);
|
|
758
964
|
};
|
|
759
|
-
var
|
|
965
|
+
var styles4 = import_react_native4.StyleSheet.create({
|
|
760
966
|
keyboardView: {
|
|
761
967
|
flex: 1
|
|
762
968
|
},
|
|
@@ -813,140 +1019,370 @@ var styles3 = import_react_native3.StyleSheet.create({
|
|
|
813
1019
|
}
|
|
814
1020
|
});
|
|
815
1021
|
|
|
816
|
-
// src/
|
|
817
|
-
var
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
const
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
purpose: "login",
|
|
836
|
-
clientId
|
|
837
|
-
},
|
|
838
|
-
{
|
|
839
|
-
headers: {
|
|
840
|
-
"X-LINK-TOKEN": linkToken
|
|
841
|
-
}
|
|
842
|
-
}
|
|
1022
|
+
// src/components/OTP.tsx
|
|
1023
|
+
var import_react9 = __toESM(require("react"));
|
|
1024
|
+
var import_react_native5 = require("react-native");
|
|
1025
|
+
var OTP = ({
|
|
1026
|
+
length = 6,
|
|
1027
|
+
value = "",
|
|
1028
|
+
onChange,
|
|
1029
|
+
onComplete,
|
|
1030
|
+
error,
|
|
1031
|
+
label,
|
|
1032
|
+
disabled = false,
|
|
1033
|
+
containerStyle,
|
|
1034
|
+
inputStyle,
|
|
1035
|
+
setErrorMessage
|
|
1036
|
+
}) => {
|
|
1037
|
+
const theme = useTheme();
|
|
1038
|
+
const AUTO_SUBMIT_DELAY = 500;
|
|
1039
|
+
const [otp, setOtp] = import_react9.default.useState(
|
|
1040
|
+
value.split("").concat(Array(length).fill("")).slice(0, length)
|
|
843
1041
|
);
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
clientId,
|
|
853
|
-
purpose: "login"
|
|
854
|
-
},
|
|
855
|
-
{
|
|
856
|
-
headers: {
|
|
857
|
-
"X-LINK-TOKEN": linkToken
|
|
858
|
-
}
|
|
1042
|
+
const inputRefs = import_react9.default.useRef([]);
|
|
1043
|
+
import_react9.default.useEffect(() => {
|
|
1044
|
+
const isComplete = otp.every((digit) => digit !== "");
|
|
1045
|
+
let timer;
|
|
1046
|
+
if (isComplete && onComplete) {
|
|
1047
|
+
timer = setTimeout(() => {
|
|
1048
|
+
onComplete(otp.join(""));
|
|
1049
|
+
}, AUTO_SUBMIT_DELAY);
|
|
859
1050
|
}
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
1051
|
+
return () => {
|
|
1052
|
+
if (timer) clearTimeout(timer);
|
|
1053
|
+
};
|
|
1054
|
+
}, [otp, onComplete]);
|
|
1055
|
+
import_react9.default.useEffect(() => {
|
|
1056
|
+
setTimeout(() => {
|
|
1057
|
+
inputRefs.current[0]?.focus();
|
|
1058
|
+
}, 100);
|
|
1059
|
+
}, []);
|
|
1060
|
+
const handleChange = import_react9.default.useCallback(
|
|
1061
|
+
(index, val) => {
|
|
1062
|
+
if (disabled) return;
|
|
1063
|
+
setErrorMessage("");
|
|
1064
|
+
const numericValue = val.replace(/[^0-9]/g, "");
|
|
1065
|
+
const newValue = numericValue.slice(-1);
|
|
1066
|
+
if (val && !numericValue) {
|
|
1067
|
+
return;
|
|
870
1068
|
}
|
|
871
|
-
|
|
1069
|
+
const newOtp = [...otp];
|
|
1070
|
+
newOtp[index] = newValue;
|
|
1071
|
+
setOtp(newOtp);
|
|
1072
|
+
const otpString = newOtp.join("");
|
|
1073
|
+
onChange?.(otpString);
|
|
1074
|
+
if (newValue && index < length - 1) {
|
|
1075
|
+
inputRefs.current[index + 1]?.focus();
|
|
1076
|
+
}
|
|
1077
|
+
if (otpString.length === length && !otpString.includes("")) {
|
|
1078
|
+
onComplete?.(otpString);
|
|
1079
|
+
}
|
|
1080
|
+
},
|
|
1081
|
+
[otp, length, onChange, onComplete, disabled]
|
|
872
1082
|
);
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
1083
|
+
const handleKeyPress = import_react9.default.useCallback(
|
|
1084
|
+
(index, e) => {
|
|
1085
|
+
if (disabled) return;
|
|
1086
|
+
if (e.nativeEvent.key === "Backspace") {
|
|
1087
|
+
if (!otp[index] && index > 0) {
|
|
1088
|
+
inputRefs.current[index - 1]?.focus();
|
|
1089
|
+
} else {
|
|
1090
|
+
const newOtp = [...otp];
|
|
1091
|
+
newOtp[index] = "";
|
|
1092
|
+
setOtp(newOtp);
|
|
1093
|
+
onChange?.(newOtp.join(""));
|
|
1094
|
+
}
|
|
882
1095
|
}
|
|
883
|
-
}
|
|
1096
|
+
},
|
|
1097
|
+
[otp, onChange, disabled]
|
|
884
1098
|
);
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
1099
|
+
const getBorderColor = (index) => {
|
|
1100
|
+
if (error) return theme.colors.error;
|
|
1101
|
+
if (otp[index]) return theme.colors.success;
|
|
1102
|
+
return theme.colors.border;
|
|
1103
|
+
};
|
|
1104
|
+
return /* @__PURE__ */ import_react9.default.createElement(import_react_native5.View, { style: [styles5.wrapper, containerStyle] }, label && /* @__PURE__ */ import_react9.default.createElement(
|
|
1105
|
+
import_react_native5.Text,
|
|
890
1106
|
{
|
|
891
|
-
|
|
1107
|
+
style: [
|
|
1108
|
+
styles5.label,
|
|
1109
|
+
{ color: theme.colors.text, fontSize: theme.fontSize.sm }
|
|
1110
|
+
]
|
|
892
1111
|
},
|
|
1112
|
+
label
|
|
1113
|
+
), /* @__PURE__ */ import_react9.default.createElement(import_react_native5.View, { style: styles5.container }, Array.from({ length }, (_, index) => /* @__PURE__ */ import_react9.default.createElement(
|
|
1114
|
+
import_react_native5.TextInput,
|
|
893
1115
|
{
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
1116
|
+
key: index,
|
|
1117
|
+
ref: (el) => inputRefs.current[index] = el,
|
|
1118
|
+
style: [
|
|
1119
|
+
styles5.input,
|
|
1120
|
+
{
|
|
1121
|
+
backgroundColor: theme.colors.surface,
|
|
1122
|
+
borderColor: getBorderColor(index),
|
|
1123
|
+
color: theme.colors.text,
|
|
1124
|
+
fontSize: theme.fontSize.xxl,
|
|
1125
|
+
borderRadius: theme.borderRadius.md
|
|
1126
|
+
},
|
|
1127
|
+
inputStyle
|
|
1128
|
+
],
|
|
1129
|
+
keyboardType: "numeric",
|
|
1130
|
+
maxLength: 1,
|
|
1131
|
+
value: otp[index] || "",
|
|
1132
|
+
onChangeText: (val) => handleChange(index, val),
|
|
1133
|
+
onKeyPress: (e) => handleKeyPress(index, e),
|
|
1134
|
+
editable: !disabled,
|
|
1135
|
+
selectTextOnFocus: true,
|
|
1136
|
+
caretHidden: true
|
|
897
1137
|
}
|
|
898
|
-
)
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
1138
|
+
))), error && /* @__PURE__ */ import_react9.default.createElement(
|
|
1139
|
+
import_react_native5.Text,
|
|
1140
|
+
{
|
|
1141
|
+
style: [
|
|
1142
|
+
styles5.error,
|
|
1143
|
+
{ color: theme.colors.error, fontSize: theme.fontSize.sm }
|
|
1144
|
+
]
|
|
1145
|
+
},
|
|
1146
|
+
error
|
|
1147
|
+
));
|
|
1148
|
+
};
|
|
1149
|
+
var styles5 = import_react_native5.StyleSheet.create({
|
|
1150
|
+
wrapper: {
|
|
1151
|
+
marginBottom: 16
|
|
1152
|
+
// theme.spacing.lg
|
|
1153
|
+
},
|
|
1154
|
+
label: {
|
|
1155
|
+
fontWeight: "500",
|
|
1156
|
+
marginBottom: 12,
|
|
1157
|
+
// theme.spacing.md - consistent label spacing
|
|
1158
|
+
textAlign: "center"
|
|
1159
|
+
},
|
|
1160
|
+
container: {
|
|
1161
|
+
flexDirection: "row",
|
|
1162
|
+
justifyContent: "center",
|
|
1163
|
+
gap: 8
|
|
1164
|
+
// theme.spacing.sm
|
|
1165
|
+
},
|
|
1166
|
+
input: {
|
|
1167
|
+
width: 48,
|
|
1168
|
+
height: 56,
|
|
1169
|
+
borderWidth: 1,
|
|
1170
|
+
textAlign: "center",
|
|
1171
|
+
fontWeight: "600"
|
|
1172
|
+
},
|
|
1173
|
+
error: {
|
|
1174
|
+
marginTop: 12,
|
|
1175
|
+
// theme.spacing.md - consistent error spacing
|
|
1176
|
+
textAlign: "center"
|
|
1177
|
+
}
|
|
1178
|
+
});
|
|
1179
|
+
|
|
1180
|
+
// src/components/SkeletonItem.tsx
|
|
1181
|
+
var import_react10 = __toESM(require("react"));
|
|
1182
|
+
var import_react_native6 = require("react-native");
|
|
1183
|
+
var SkeletonItem = () => {
|
|
1184
|
+
const opacity = (0, import_react10.useRef)(new import_react_native6.Animated.Value(0.3)).current;
|
|
1185
|
+
(0, import_react10.useEffect)(() => {
|
|
1186
|
+
import_react_native6.Animated.loop(
|
|
1187
|
+
import_react_native6.Animated.sequence([
|
|
1188
|
+
import_react_native6.Animated.timing(opacity, {
|
|
1189
|
+
toValue: 1,
|
|
1190
|
+
duration: 600,
|
|
1191
|
+
useNativeDriver: true
|
|
1192
|
+
}),
|
|
1193
|
+
import_react_native6.Animated.timing(opacity, {
|
|
1194
|
+
toValue: 0.3,
|
|
1195
|
+
duration: 600,
|
|
1196
|
+
useNativeDriver: true
|
|
1197
|
+
})
|
|
1198
|
+
])
|
|
1199
|
+
).start();
|
|
1200
|
+
}, []);
|
|
1201
|
+
return /* @__PURE__ */ import_react10.default.createElement(import_react_native6.Animated.View, { style: [styles6.row, { opacity }] }, /* @__PURE__ */ import_react10.default.createElement(import_react_native6.View, { style: styles6.iconCircle }), /* @__PURE__ */ import_react10.default.createElement(import_react_native6.View, { style: styles6.textBlock }, /* @__PURE__ */ import_react10.default.createElement(import_react_native6.View, { style: styles6.lineLong }), /* @__PURE__ */ import_react10.default.createElement(import_react_native6.View, { style: styles6.lineShort })));
|
|
1202
|
+
};
|
|
1203
|
+
var styles6 = import_react_native6.StyleSheet.create({
|
|
1204
|
+
row: {
|
|
1205
|
+
flexDirection: "row",
|
|
1206
|
+
alignItems: "center",
|
|
1207
|
+
paddingVertical: 16
|
|
1208
|
+
},
|
|
1209
|
+
iconCircle: {
|
|
1210
|
+
width: 45,
|
|
1211
|
+
height: 45,
|
|
1212
|
+
borderRadius: 22.5,
|
|
1213
|
+
backgroundColor: "#E5E5E5"
|
|
1214
|
+
},
|
|
1215
|
+
textBlock: {
|
|
1216
|
+
marginLeft: 12,
|
|
1217
|
+
flex: 1
|
|
1218
|
+
},
|
|
1219
|
+
lineShort: {
|
|
1220
|
+
width: "50%",
|
|
1221
|
+
height: 14,
|
|
1222
|
+
borderRadius: 6,
|
|
1223
|
+
backgroundColor: "#E5E5E5"
|
|
1224
|
+
},
|
|
1225
|
+
lineLong: {
|
|
1226
|
+
marginBottom: 6,
|
|
1227
|
+
width: "100%",
|
|
1228
|
+
height: 14,
|
|
1229
|
+
borderRadius: 6,
|
|
1230
|
+
backgroundColor: "#E5E5E5"
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
var SkeletonItem_default = SkeletonItem;
|
|
1234
|
+
|
|
1235
|
+
// src/components/Mode.tsx
|
|
1236
|
+
var import_react11 = __toESM(require("react"));
|
|
1237
|
+
var import_react_native7 = require("react-native");
|
|
1238
|
+
var Mode = () => {
|
|
1239
|
+
const { clientInfo } = useKryptosConnect();
|
|
1240
|
+
const theme = useTheme();
|
|
1241
|
+
if (!clientInfo) return null;
|
|
1242
|
+
if (clientInfo?.project_stage === "production") return null;
|
|
1243
|
+
return /* @__PURE__ */ import_react11.default.createElement(import_react_native7.View, { style: [styles7.container, { backgroundColor: theme.colors.warning }] }, /* @__PURE__ */ import_react11.default.createElement(import_react_native7.Text, { style: [styles7.text, { color: theme.colors.warningText }] }, "Sandbox Mode"));
|
|
1244
|
+
};
|
|
1245
|
+
var styles7 = import_react_native7.StyleSheet.create({
|
|
1246
|
+
container: {
|
|
1247
|
+
paddingVertical: 4,
|
|
1248
|
+
paddingHorizontal: 8,
|
|
1249
|
+
borderRadius: 8,
|
|
1250
|
+
alignItems: "center",
|
|
1251
|
+
justifyContent: "center"
|
|
1252
|
+
},
|
|
1253
|
+
text: {
|
|
1254
|
+
fontSize: 12,
|
|
1255
|
+
fontWeight: "600"
|
|
1256
|
+
}
|
|
1257
|
+
});
|
|
1258
|
+
|
|
1259
|
+
// src/components/Footer.tsx
|
|
1260
|
+
var import_react13 = __toESM(require("react"));
|
|
1261
|
+
var import_react_native9 = require("react-native");
|
|
1262
|
+
|
|
1263
|
+
// src/components/PoweredByKryptos.tsx
|
|
1264
|
+
var import_react12 = __toESM(require("react"));
|
|
1265
|
+
var import_react_native8 = require("react-native");
|
|
1266
|
+
var PoweredByKryptos = () => {
|
|
1267
|
+
const theme = useTheme();
|
|
1268
|
+
const handlePress = () => {
|
|
1269
|
+
import_react_native8.Linking.openURL("https://kryptos.io");
|
|
1270
|
+
};
|
|
1271
|
+
return /* @__PURE__ */ import_react12.default.createElement(import_react_native8.View, { style: styles8.container }, /* @__PURE__ */ import_react12.default.createElement(import_react_native8.Text, { style: [styles8.text, { color: theme.colors.textSecondary }] }, "Powered by", " "), /* @__PURE__ */ import_react12.default.createElement(import_react_native8.TouchableOpacity, { onPress: handlePress, activeOpacity: 0.7 }, /* @__PURE__ */ import_react12.default.createElement(LogoIcon, { size: 16 })));
|
|
1272
|
+
};
|
|
1273
|
+
var styles8 = import_react_native8.StyleSheet.create({
|
|
1274
|
+
container: {
|
|
1275
|
+
flexDirection: "row",
|
|
1276
|
+
alignItems: "center"
|
|
1277
|
+
},
|
|
1278
|
+
text: {
|
|
1279
|
+
fontSize: 12,
|
|
1280
|
+
fontWeight: "400"
|
|
1281
|
+
}
|
|
1282
|
+
});
|
|
1283
|
+
|
|
1284
|
+
// src/components/Footer.tsx
|
|
1285
|
+
var Footer = () => {
|
|
1286
|
+
return /* @__PURE__ */ import_react13.default.createElement(import_react_native9.View, { style: styles9.container }, /* @__PURE__ */ import_react13.default.createElement(PoweredByKryptos, null), /* @__PURE__ */ import_react13.default.createElement(import_react_native9.View, { style: styles9.modeWrapper }, /* @__PURE__ */ import_react13.default.createElement(Mode, null)));
|
|
1287
|
+
};
|
|
1288
|
+
var styles9 = import_react_native9.StyleSheet.create({
|
|
1289
|
+
container: {
|
|
1290
|
+
width: "100%",
|
|
1291
|
+
paddingVertical: 8,
|
|
1292
|
+
alignItems: "center",
|
|
1293
|
+
justifyContent: "center"
|
|
1294
|
+
},
|
|
1295
|
+
// Anchor Mode to the right side
|
|
1296
|
+
modeWrapper: {
|
|
1297
|
+
position: "absolute",
|
|
1298
|
+
right: 8,
|
|
1299
|
+
top: 4
|
|
1300
|
+
}
|
|
1301
|
+
});
|
|
1302
|
+
|
|
1303
|
+
// src/molecules/Auth.tsx
|
|
1304
|
+
var import_react19 = __toESM(require("react"));
|
|
1305
|
+
var import_react_native11 = require("react-native");
|
|
1306
|
+
|
|
1307
|
+
// src/assets/LinkIcon.tsx
|
|
1308
|
+
var import_react14 = __toESM(require("react"));
|
|
1309
|
+
var import_react_native_svg3 = __toESM(require("react-native-svg"));
|
|
1310
|
+
var LinkIcon = ({
|
|
1311
|
+
size = 20,
|
|
1312
|
+
color = "#00C693"
|
|
1313
|
+
}) => {
|
|
1314
|
+
return /* @__PURE__ */ import_react14.default.createElement(import_react_native_svg3.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react14.default.createElement(
|
|
1315
|
+
import_react_native_svg3.Path,
|
|
1316
|
+
{
|
|
1317
|
+
d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",
|
|
1318
|
+
stroke: color,
|
|
1319
|
+
strokeWidth: 2,
|
|
1320
|
+
strokeLinecap: "round",
|
|
1321
|
+
strokeLinejoin: "round"
|
|
905
1322
|
}
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
"
|
|
1323
|
+
), /* @__PURE__ */ import_react14.default.createElement(
|
|
1324
|
+
import_react_native_svg3.Path,
|
|
1325
|
+
{
|
|
1326
|
+
d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",
|
|
1327
|
+
stroke: color,
|
|
1328
|
+
strokeWidth: 2,
|
|
1329
|
+
strokeLinecap: "round",
|
|
1330
|
+
strokeLinejoin: "round"
|
|
913
1331
|
}
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
1332
|
+
));
|
|
1333
|
+
};
|
|
1334
|
+
|
|
1335
|
+
// src/assets/ShieldIcon.tsx
|
|
1336
|
+
var import_react15 = __toESM(require("react"));
|
|
1337
|
+
var import_react_native_svg4 = __toESM(require("react-native-svg"));
|
|
1338
|
+
var ShieldIcon = ({
|
|
1339
|
+
size = 20,
|
|
1340
|
+
color = "#00C693"
|
|
1341
|
+
}) => {
|
|
1342
|
+
return /* @__PURE__ */ import_react15.default.createElement(import_react_native_svg4.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react15.default.createElement(
|
|
1343
|
+
import_react_native_svg4.Path,
|
|
1344
|
+
{
|
|
1345
|
+
d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",
|
|
1346
|
+
stroke: color,
|
|
1347
|
+
strokeWidth: 2,
|
|
1348
|
+
strokeLinecap: "round",
|
|
1349
|
+
strokeLinejoin: "round"
|
|
921
1350
|
}
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
"
|
|
929
|
-
|
|
930
|
-
params: {
|
|
931
|
-
id: address
|
|
1351
|
+
), /* @__PURE__ */ import_react15.default.createElement(
|
|
1352
|
+
import_react_native_svg4.Path,
|
|
1353
|
+
{
|
|
1354
|
+
d: "m9 12 2 2 4-4",
|
|
1355
|
+
stroke: color,
|
|
1356
|
+
strokeWidth: 2,
|
|
1357
|
+
strokeLinecap: "round",
|
|
1358
|
+
strokeLinejoin: "round"
|
|
932
1359
|
}
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
1360
|
+
));
|
|
1361
|
+
};
|
|
1362
|
+
|
|
1363
|
+
// src/assets/eye.tsx
|
|
1364
|
+
var import_react16 = __toESM(require("react"));
|
|
1365
|
+
var import_react_native_svg5 = __toESM(require("react-native-svg"));
|
|
1366
|
+
var EyeIcon = ({
|
|
1367
|
+
size = 20,
|
|
1368
|
+
color = "#00C693"
|
|
1369
|
+
}) => {
|
|
1370
|
+
return /* @__PURE__ */ import_react16.default.createElement(import_react_native_svg5.default, { fill: color, width: size, height: size, viewBox: "0 0 0.72 0.72" }, /* @__PURE__ */ import_react16.default.createElement(import_react_native_svg5.Path, { d: "M0.658 0.348C0.597 0.207 0.483 0.12 0.36 0.12s-0.237 0.087 -0.298 0.228a0.03 0.03 0 0 0 0 0.024C0.123 0.513 0.237 0.6 0.36 0.6s0.237 -0.087 0.298 -0.228a0.03 0.03 0 0 0 0 -0.024M0.36 0.54c-0.095 0 -0.185 -0.069 -0.237 -0.18C0.175 0.249 0.265 0.18 0.36 0.18s0.185 0.069 0.237 0.18c-0.052 0.111 -0.142 0.18 -0.237 0.18m0 -0.3a0.12 0.12 0 1 0 0.12 0.12 0.12 0.12 0 0 0 -0.12 -0.12m0 0.18a0.06 0.06 0 1 1 0.06 -0.06 0.06 0.06 0 0 1 -0.06 0.06" }));
|
|
1371
|
+
};
|
|
936
1372
|
|
|
937
1373
|
// src/molecules/ConnectLogo.tsx
|
|
938
|
-
var
|
|
939
|
-
var
|
|
1374
|
+
var import_react18 = __toESM(require("react"));
|
|
1375
|
+
var import_react_native10 = require("react-native");
|
|
940
1376
|
|
|
941
1377
|
// src/assets/UnplugIcon.tsx
|
|
942
|
-
var
|
|
943
|
-
var
|
|
1378
|
+
var import_react17 = __toESM(require("react"));
|
|
1379
|
+
var import_react_native_svg6 = __toESM(require("react-native-svg"));
|
|
944
1380
|
var UnplugIcon = ({
|
|
945
1381
|
size = 24,
|
|
946
1382
|
color = "#6B7280"
|
|
947
1383
|
}) => {
|
|
948
|
-
return /* @__PURE__ */
|
|
949
|
-
|
|
1384
|
+
return /* @__PURE__ */ import_react17.default.createElement(import_react_native_svg6.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react17.default.createElement(
|
|
1385
|
+
import_react_native_svg6.Path,
|
|
950
1386
|
{
|
|
951
1387
|
d: "m19 5 3-3",
|
|
952
1388
|
stroke: color,
|
|
@@ -954,8 +1390,8 @@ var UnplugIcon = ({
|
|
|
954
1390
|
strokeLinecap: "round",
|
|
955
1391
|
strokeLinejoin: "round"
|
|
956
1392
|
}
|
|
957
|
-
), /* @__PURE__ */
|
|
958
|
-
|
|
1393
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1394
|
+
import_react_native_svg6.Path,
|
|
959
1395
|
{
|
|
960
1396
|
d: "m2 22 3-3",
|
|
961
1397
|
stroke: color,
|
|
@@ -963,8 +1399,8 @@ var UnplugIcon = ({
|
|
|
963
1399
|
strokeLinecap: "round",
|
|
964
1400
|
strokeLinejoin: "round"
|
|
965
1401
|
}
|
|
966
|
-
), /* @__PURE__ */
|
|
967
|
-
|
|
1402
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1403
|
+
import_react_native_svg6.Path,
|
|
968
1404
|
{
|
|
969
1405
|
d: "M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",
|
|
970
1406
|
stroke: color,
|
|
@@ -972,8 +1408,8 @@ var UnplugIcon = ({
|
|
|
972
1408
|
strokeLinecap: "round",
|
|
973
1409
|
strokeLinejoin: "round"
|
|
974
1410
|
}
|
|
975
|
-
), /* @__PURE__ */
|
|
976
|
-
|
|
1411
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1412
|
+
import_react_native_svg6.Path,
|
|
977
1413
|
{
|
|
978
1414
|
d: "m18 12-6-6 2.3-2.3a2.4 2.4 0 0 1 3.4 0l2.6 2.6a2.4 2.4 0 0 1 0 3.4Z",
|
|
979
1415
|
stroke: color,
|
|
@@ -981,8 +1417,8 @@ var UnplugIcon = ({
|
|
|
981
1417
|
strokeLinecap: "round",
|
|
982
1418
|
strokeLinejoin: "round"
|
|
983
1419
|
}
|
|
984
|
-
), /* @__PURE__ */
|
|
985
|
-
|
|
1420
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1421
|
+
import_react_native_svg6.Line,
|
|
986
1422
|
{
|
|
987
1423
|
x1: 7.5,
|
|
988
1424
|
y1: 13.5,
|
|
@@ -998,12 +1434,12 @@ var UnplugIcon = ({
|
|
|
998
1434
|
// src/molecules/ConnectLogo.tsx
|
|
999
1435
|
var KryptosLogo = () => {
|
|
1000
1436
|
const theme = useTheme();
|
|
1001
|
-
return /* @__PURE__ */
|
|
1002
|
-
|
|
1437
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1438
|
+
import_react_native10.View,
|
|
1003
1439
|
{
|
|
1004
|
-
style: [
|
|
1440
|
+
style: [styles10.logoContainer, { backgroundColor: theme.colors.surface }]
|
|
1005
1441
|
},
|
|
1006
|
-
/* @__PURE__ */
|
|
1442
|
+
/* @__PURE__ */ import_react18.default.createElement(LogoIcon, { size: 36 })
|
|
1007
1443
|
);
|
|
1008
1444
|
};
|
|
1009
1445
|
var ConnectLogo = () => {
|
|
@@ -1018,49 +1454,47 @@ var ConnectLogo = () => {
|
|
|
1018
1454
|
}
|
|
1019
1455
|
};
|
|
1020
1456
|
const renderLogo = () => {
|
|
1021
|
-
if ((0,
|
|
1457
|
+
if ((0, import_react18.isValidElement)(appLogo)) {
|
|
1022
1458
|
return appLogo;
|
|
1023
1459
|
} else if (typeof appLogo === "string" && isValidUrl(appLogo)) {
|
|
1024
|
-
return /* @__PURE__ */
|
|
1025
|
-
|
|
1460
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1461
|
+
import_react_native10.Image,
|
|
1026
1462
|
{
|
|
1027
1463
|
source: { uri: appLogo },
|
|
1028
|
-
style:
|
|
1464
|
+
style: styles10.appLogoImage,
|
|
1029
1465
|
resizeMode: "contain"
|
|
1030
1466
|
}
|
|
1031
1467
|
);
|
|
1032
1468
|
} else if (typeof appLogo === "number" || typeof appLogo === "object" && appLogo !== null) {
|
|
1033
|
-
return /* @__PURE__ */
|
|
1034
|
-
|
|
1469
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1470
|
+
import_react_native10.Image,
|
|
1035
1471
|
{
|
|
1036
1472
|
source: appLogo,
|
|
1037
|
-
style:
|
|
1473
|
+
style: styles10.appLogoImage,
|
|
1038
1474
|
resizeMode: "contain"
|
|
1039
1475
|
}
|
|
1040
1476
|
);
|
|
1041
1477
|
} else if (appName) {
|
|
1042
|
-
return /* @__PURE__ */
|
|
1478
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native10.Text, { style: [styles10.appLogoText, { color: theme.colors.text }] }, appName.charAt(0).toUpperCase());
|
|
1043
1479
|
}
|
|
1044
|
-
return /* @__PURE__ */
|
|
1480
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native10.Text, { style: [styles10.appLogoText, { color: theme.colors.text }] }, "?");
|
|
1045
1481
|
};
|
|
1046
|
-
return /* @__PURE__ */
|
|
1047
|
-
|
|
1482
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native10.View, { style: styles10.container }, /* @__PURE__ */ import_react18.default.createElement(KryptosLogo, null), /* @__PURE__ */ import_react18.default.createElement(import_react_native10.View, { style: styles10.iconContainer }, /* @__PURE__ */ import_react18.default.createElement(UnplugIcon, { size: 24, color: theme.colors.textSecondary })), /* @__PURE__ */ import_react18.default.createElement(
|
|
1483
|
+
import_react_native10.View,
|
|
1048
1484
|
{
|
|
1049
1485
|
style: [
|
|
1050
|
-
|
|
1486
|
+
styles10.logoContainer,
|
|
1051
1487
|
{ backgroundColor: theme.colors.surface }
|
|
1052
1488
|
]
|
|
1053
1489
|
},
|
|
1054
1490
|
renderLogo()
|
|
1055
1491
|
));
|
|
1056
1492
|
};
|
|
1057
|
-
var
|
|
1493
|
+
var styles10 = import_react_native10.StyleSheet.create({
|
|
1058
1494
|
container: {
|
|
1059
1495
|
flexDirection: "row",
|
|
1060
1496
|
alignItems: "center",
|
|
1061
1497
|
justifyContent: "center",
|
|
1062
|
-
marginVertical: 24,
|
|
1063
|
-
// theme.spacing.xxl
|
|
1064
1498
|
gap: 12
|
|
1065
1499
|
// theme.spacing.md
|
|
1066
1500
|
},
|
|
@@ -1078,461 +1512,250 @@ var styles4 = import_react_native4.StyleSheet.create({
|
|
|
1078
1512
|
// theme.spacing.sm
|
|
1079
1513
|
},
|
|
1080
1514
|
appLogoImage: {
|
|
1081
|
-
width: 32,
|
|
1082
|
-
height: 32
|
|
1083
|
-
},
|
|
1084
|
-
appLogoText: {
|
|
1085
|
-
fontSize: 24,
|
|
1086
|
-
// theme.fontSize.xxxl
|
|
1087
|
-
fontWeight: "700"
|
|
1088
|
-
}
|
|
1089
|
-
});
|
|
1090
|
-
|
|
1091
|
-
// src/molecules/Auth.tsx
|
|
1092
|
-
var Auth = ({
|
|
1093
|
-
open,
|
|
1094
|
-
onEmailSuccess,
|
|
1095
|
-
onGuestSuccess,
|
|
1096
|
-
onClose
|
|
1097
|
-
}) => {
|
|
1098
|
-
const { appName, linkToken, clientId, setUser, setEmail } = useKryptosConnect();
|
|
1099
|
-
const theme = useTheme();
|
|
1100
|
-
const [isLoading, setIsLoading] = import_react12.default.useState(false);
|
|
1101
|
-
const [errorMessage, setErrorMessage] = import_react12.default.useState("");
|
|
1102
|
-
const [emailValue, setEmailValue] = import_react12.default.useState("");
|
|
1103
|
-
const [emailError, setEmailError] = import_react12.default.useState("");
|
|
1104
|
-
const [loadingType, setLoadingType] = import_react12.default.useState(null);
|
|
1105
|
-
const validateEmail = (email) => {
|
|
1106
|
-
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
1107
|
-
if (!email) {
|
|
1108
|
-
setEmailError("Email is required");
|
|
1109
|
-
return false;
|
|
1110
|
-
}
|
|
1111
|
-
if (!emailRegex.test(email)) {
|
|
1112
|
-
setEmailError("Invalid email address");
|
|
1113
|
-
return false;
|
|
1114
|
-
}
|
|
1115
|
-
setEmailError("");
|
|
1116
|
-
return true;
|
|
1117
|
-
};
|
|
1118
|
-
const handleClose = () => {
|
|
1119
|
-
onClose();
|
|
1120
|
-
setEmailValue("");
|
|
1121
|
-
setEmailError("");
|
|
1122
|
-
setErrorMessage("");
|
|
1123
|
-
};
|
|
1124
|
-
const handleEmailSubmit = async () => {
|
|
1125
|
-
if (!validateEmail(emailValue)) return;
|
|
1126
|
-
try {
|
|
1127
|
-
setIsLoading(true);
|
|
1128
|
-
setLoadingType("email");
|
|
1129
|
-
setErrorMessage("");
|
|
1130
|
-
await sendEmailOtp(linkToken, emailValue, clientId);
|
|
1131
|
-
setEmail(emailValue);
|
|
1132
|
-
setEmailError("");
|
|
1133
|
-
onEmailSuccess();
|
|
1134
|
-
} catch (error) {
|
|
1135
|
-
const err = error;
|
|
1136
|
-
setErrorMessage(
|
|
1137
|
-
err?.response?.data?.message || "Failed to send email OTP"
|
|
1138
|
-
);
|
|
1139
|
-
} finally {
|
|
1140
|
-
setIsLoading(false);
|
|
1141
|
-
setLoadingType(null);
|
|
1142
|
-
}
|
|
1143
|
-
};
|
|
1144
|
-
const handleContinueAsGuest = async () => {
|
|
1145
|
-
try {
|
|
1146
|
-
setIsLoading(true);
|
|
1147
|
-
setLoadingType("guest");
|
|
1148
|
-
setErrorMessage("");
|
|
1149
|
-
const res = await createAnonymousUser(linkToken, clientId);
|
|
1150
|
-
setUser(res);
|
|
1151
|
-
setEmailError("");
|
|
1152
|
-
onGuestSuccess();
|
|
1153
|
-
} catch (error) {
|
|
1154
|
-
const err = error;
|
|
1155
|
-
console.error(error);
|
|
1156
|
-
setErrorMessage(
|
|
1157
|
-
err?.response?.data?.message || "Failed to continue as guest"
|
|
1158
|
-
);
|
|
1159
|
-
} finally {
|
|
1160
|
-
setIsLoading(false);
|
|
1161
|
-
setLoadingType(null);
|
|
1162
|
-
}
|
|
1163
|
-
};
|
|
1164
|
-
const infoSections = [
|
|
1165
|
-
{
|
|
1166
|
-
icon: /* @__PURE__ */ import_react12.default.createElement(LinkIcon, { size: 20, color: theme.colors.primary }),
|
|
1167
|
-
title: "Simple and secure",
|
|
1168
|
-
text: "Connect your Web3 accounts with Kryptos in just a few clicks"
|
|
1169
|
-
},
|
|
1170
|
-
{
|
|
1171
|
-
icon: /* @__PURE__ */ import_react12.default.createElement(ShieldIcon, { size: 20, color: theme.colors.primary }),
|
|
1172
|
-
title: "Control what you share",
|
|
1173
|
-
text: "We never share your data without your permission"
|
|
1174
|
-
}
|
|
1175
|
-
];
|
|
1176
|
-
return /* @__PURE__ */ import_react12.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react12.default.createElement(ModalHeader, { onClose: handleClose }, ""), /* @__PURE__ */ import_react12.default.createElement(ModalBody, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { style: styles5.container }, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.title, { color: theme.colors.text }] }, "Connect ", appName, " to your Kryptos account"), /* @__PURE__ */ import_react12.default.createElement(ConnectLogo, null), infoSections.map((section, index) => /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { key: `info-${index}`, style: styles5.infoSection }, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { style: styles5.infoIcon }, section.icon), /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { style: styles5.infoContent }, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.infoTitle, { color: theme.colors.text }] }, section.title), /* @__PURE__ */ import_react12.default.createElement(
|
|
1177
|
-
import_react_native5.Text,
|
|
1178
|
-
{
|
|
1179
|
-
style: [
|
|
1180
|
-
styles5.infoDescription,
|
|
1181
|
-
{ color: theme.colors.textSecondary }
|
|
1182
|
-
]
|
|
1183
|
-
},
|
|
1184
|
-
section.text
|
|
1185
|
-
)))), errorMessage ? /* @__PURE__ */ import_react12.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react12.default.createElement(AlertDescription, null, errorMessage)) : null, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.footer, { color: theme.colors.textSecondary }] }, "By continuing, you agree to Kryptos", " ", /* @__PURE__ */ import_react12.default.createElement(
|
|
1186
|
-
import_react_native5.Text,
|
|
1187
|
-
{
|
|
1188
|
-
style: {
|
|
1189
|
-
color: theme.colors.primary,
|
|
1190
|
-
textDecorationLine: "underline"
|
|
1191
|
-
}
|
|
1192
|
-
},
|
|
1193
|
-
"Privacy Policy"
|
|
1194
|
-
)), /* @__PURE__ */ import_react12.default.createElement(
|
|
1195
|
-
Button,
|
|
1196
|
-
{
|
|
1197
|
-
variant: "outline",
|
|
1198
|
-
size: "lg",
|
|
1199
|
-
onPress: handleContinueAsGuest,
|
|
1200
|
-
loading: loadingType === "guest",
|
|
1201
|
-
disabled: isLoading,
|
|
1202
|
-
style: styles5.button
|
|
1203
|
-
},
|
|
1204
|
-
"Continue as guest"
|
|
1205
|
-
))));
|
|
1206
|
-
};
|
|
1207
|
-
var styles5 = import_react_native5.StyleSheet.create({
|
|
1208
|
-
container: {
|
|
1209
|
-
flex: 1
|
|
1210
|
-
},
|
|
1211
|
-
title: {
|
|
1212
|
-
fontSize: 18,
|
|
1213
|
-
// theme.fontSize.xl
|
|
1214
|
-
fontWeight: "600",
|
|
1215
|
-
textAlign: "center",
|
|
1216
|
-
marginBottom: 16
|
|
1217
|
-
// theme.spacing.lg - consistent section spacing
|
|
1218
|
-
},
|
|
1219
|
-
infoSection: {
|
|
1220
|
-
flexDirection: "row",
|
|
1221
|
-
marginBottom: 16,
|
|
1222
|
-
// theme.spacing.lg
|
|
1223
|
-
alignItems: "flex-start"
|
|
1224
|
-
},
|
|
1225
|
-
infoIcon: {
|
|
1226
|
-
width: 32,
|
|
1227
|
-
height: 32,
|
|
1228
|
-
borderRadius: 16,
|
|
1229
|
-
// theme.borderRadius.lg
|
|
1230
|
-
alignItems: "center",
|
|
1231
|
-
justifyContent: "center",
|
|
1232
|
-
marginRight: 12
|
|
1233
|
-
// theme.spacing.md
|
|
1234
|
-
},
|
|
1235
|
-
infoContent: {
|
|
1236
|
-
flex: 1
|
|
1237
|
-
},
|
|
1238
|
-
infoTitle: {
|
|
1239
|
-
fontSize: 14,
|
|
1240
|
-
// theme.fontSize.md
|
|
1241
|
-
fontWeight: "600",
|
|
1242
|
-
marginBottom: 4
|
|
1243
|
-
// theme.spacing.xs
|
|
1244
|
-
},
|
|
1245
|
-
infoDescription: {
|
|
1246
|
-
fontSize: 13,
|
|
1247
|
-
lineHeight: 18
|
|
1248
|
-
},
|
|
1249
|
-
button: {
|
|
1250
|
-
width: "100%",
|
|
1251
|
-
marginTop: 16
|
|
1252
|
-
// theme.spacing.lg - consistent button spacing
|
|
1253
|
-
},
|
|
1254
|
-
footer: {
|
|
1255
|
-
fontSize: 12,
|
|
1256
|
-
// theme.fontSize.sm
|
|
1257
|
-
textAlign: "center",
|
|
1258
|
-
marginTop: 16
|
|
1259
|
-
// theme.spacing.lg
|
|
1260
|
-
}
|
|
1261
|
-
});
|
|
1262
|
-
|
|
1263
|
-
// src/components/Input.tsx
|
|
1264
|
-
var import_react13 = __toESM(require("react"));
|
|
1265
|
-
var import_react_native6 = require("react-native");
|
|
1266
|
-
var Input = ({
|
|
1267
|
-
label,
|
|
1268
|
-
error,
|
|
1269
|
-
helperText,
|
|
1270
|
-
status = "default",
|
|
1271
|
-
containerStyle,
|
|
1272
|
-
inputStyle,
|
|
1273
|
-
labelStyle,
|
|
1274
|
-
...props
|
|
1275
|
-
}) => {
|
|
1276
|
-
const theme = useTheme();
|
|
1277
|
-
const inputStatus = error ? "error" : status;
|
|
1278
|
-
const getBorderColor = () => {
|
|
1279
|
-
switch (inputStatus) {
|
|
1280
|
-
case "error":
|
|
1281
|
-
return theme.colors.error;
|
|
1282
|
-
case "success":
|
|
1283
|
-
return theme.colors.success;
|
|
1284
|
-
default:
|
|
1285
|
-
return theme.colors.border;
|
|
1286
|
-
}
|
|
1287
|
-
};
|
|
1288
|
-
return /* @__PURE__ */ import_react13.default.createElement(import_react_native6.View, { style: [styles6.wrapper, containerStyle] }, label && /* @__PURE__ */ import_react13.default.createElement(
|
|
1289
|
-
import_react_native6.Text,
|
|
1290
|
-
{
|
|
1291
|
-
style: [
|
|
1292
|
-
styles6.label,
|
|
1293
|
-
{ color: theme.colors.text, fontSize: theme.fontSize.sm },
|
|
1294
|
-
labelStyle
|
|
1295
|
-
]
|
|
1296
|
-
},
|
|
1297
|
-
label
|
|
1298
|
-
), /* @__PURE__ */ import_react13.default.createElement(
|
|
1299
|
-
import_react_native6.TextInput,
|
|
1300
|
-
{
|
|
1301
|
-
placeholderTextColor: theme.colors.textTertiary,
|
|
1302
|
-
style: [
|
|
1303
|
-
styles6.input,
|
|
1304
|
-
{
|
|
1305
|
-
backgroundColor: theme.colors.surface,
|
|
1306
|
-
borderColor: getBorderColor(),
|
|
1307
|
-
color: theme.colors.text,
|
|
1308
|
-
fontSize: theme.fontSize.md,
|
|
1309
|
-
borderRadius: theme.borderRadius.md,
|
|
1310
|
-
paddingHorizontal: theme.spacing.lg,
|
|
1311
|
-
paddingVertical: theme.spacing.md
|
|
1312
|
-
},
|
|
1313
|
-
inputStyle
|
|
1314
|
-
],
|
|
1315
|
-
...props
|
|
1316
|
-
}
|
|
1317
|
-
), error && /* @__PURE__ */ import_react13.default.createElement(
|
|
1318
|
-
import_react_native6.Text,
|
|
1319
|
-
{
|
|
1320
|
-
style: [
|
|
1321
|
-
styles6.error,
|
|
1322
|
-
{ color: theme.colors.error, fontSize: theme.fontSize.sm }
|
|
1323
|
-
]
|
|
1324
|
-
},
|
|
1325
|
-
error
|
|
1326
|
-
), helperText && !error && /* @__PURE__ */ import_react13.default.createElement(
|
|
1327
|
-
import_react_native6.Text,
|
|
1328
|
-
{
|
|
1329
|
-
style: [
|
|
1330
|
-
styles6.helper,
|
|
1331
|
-
{
|
|
1332
|
-
color: theme.colors.textSecondary,
|
|
1333
|
-
fontSize: theme.fontSize.sm
|
|
1334
|
-
}
|
|
1335
|
-
]
|
|
1336
|
-
},
|
|
1337
|
-
helperText
|
|
1338
|
-
));
|
|
1339
|
-
};
|
|
1340
|
-
var styles6 = import_react_native6.StyleSheet.create({
|
|
1341
|
-
wrapper: {
|
|
1342
|
-
marginBottom: 16
|
|
1343
|
-
// theme.spacing.lg - consistent form spacing
|
|
1344
|
-
},
|
|
1345
|
-
label: {
|
|
1346
|
-
fontWeight: "500",
|
|
1347
|
-
marginBottom: 8
|
|
1348
|
-
// theme.spacing.sm
|
|
1349
|
-
},
|
|
1350
|
-
input: {
|
|
1351
|
-
borderWidth: 1,
|
|
1352
|
-
minHeight: 48
|
|
1353
|
-
},
|
|
1354
|
-
error: {
|
|
1355
|
-
marginTop: 4
|
|
1356
|
-
// theme.spacing.xs
|
|
1515
|
+
width: 32,
|
|
1516
|
+
height: 32
|
|
1357
1517
|
},
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
// theme.
|
|
1518
|
+
appLogoText: {
|
|
1519
|
+
fontSize: 24,
|
|
1520
|
+
// theme.fontSize.xxxl
|
|
1521
|
+
fontWeight: "700"
|
|
1361
1522
|
}
|
|
1362
1523
|
});
|
|
1363
1524
|
|
|
1364
|
-
// src/
|
|
1365
|
-
var
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
onChange,
|
|
1371
|
-
onComplete,
|
|
1372
|
-
error,
|
|
1373
|
-
label,
|
|
1374
|
-
disabled = false,
|
|
1375
|
-
containerStyle,
|
|
1376
|
-
inputStyle,
|
|
1377
|
-
setErrorMessage
|
|
1525
|
+
// src/molecules/Auth.tsx
|
|
1526
|
+
var Auth = ({
|
|
1527
|
+
open,
|
|
1528
|
+
onEmailSuccess,
|
|
1529
|
+
onGuestSuccess,
|
|
1530
|
+
onClose
|
|
1378
1531
|
}) => {
|
|
1532
|
+
const { appName, linkToken, clientId, setUser, setEmail } = useKryptosConnect();
|
|
1379
1533
|
const theme = useTheme();
|
|
1380
|
-
const
|
|
1381
|
-
const [
|
|
1382
|
-
|
|
1383
|
-
);
|
|
1384
|
-
const
|
|
1385
|
-
|
|
1386
|
-
const
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
onComplete(otp.join(""));
|
|
1391
|
-
}, AUTO_SUBMIT_DELAY);
|
|
1534
|
+
const [isLoading, setIsLoading] = import_react19.default.useState(false);
|
|
1535
|
+
const [errorMessage, setErrorMessage] = import_react19.default.useState("");
|
|
1536
|
+
const [emailValue, setEmailValue] = import_react19.default.useState("");
|
|
1537
|
+
const [emailError, setEmailError] = import_react19.default.useState("");
|
|
1538
|
+
const [loadingType, setLoadingType] = import_react19.default.useState(null);
|
|
1539
|
+
const validateEmail = (email) => {
|
|
1540
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
1541
|
+
if (!email) {
|
|
1542
|
+
setEmailError("Email is required");
|
|
1543
|
+
return false;
|
|
1392
1544
|
}
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
(
|
|
1404
|
-
|
|
1545
|
+
if (!emailRegex.test(email)) {
|
|
1546
|
+
setEmailError("Invalid email address");
|
|
1547
|
+
return false;
|
|
1548
|
+
}
|
|
1549
|
+
setEmailError("");
|
|
1550
|
+
return true;
|
|
1551
|
+
};
|
|
1552
|
+
const handleClose = () => {
|
|
1553
|
+
onClose();
|
|
1554
|
+
setEmailValue("");
|
|
1555
|
+
setEmailError("");
|
|
1556
|
+
setErrorMessage("");
|
|
1557
|
+
};
|
|
1558
|
+
const handleEmailSubmit = async () => {
|
|
1559
|
+
if (!validateEmail(emailValue)) return;
|
|
1560
|
+
try {
|
|
1561
|
+
setIsLoading(true);
|
|
1562
|
+
setLoadingType("email");
|
|
1405
1563
|
setErrorMessage("");
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
const
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
}
|
|
1439
|
-
[otp, onChange, disabled]
|
|
1440
|
-
);
|
|
1441
|
-
const getBorderColor = (index) => {
|
|
1442
|
-
if (error) return theme.colors.error;
|
|
1443
|
-
if (otp[index]) return theme.colors.success;
|
|
1444
|
-
return theme.colors.border;
|
|
1564
|
+
await sendEmailOtp(linkToken, emailValue, clientId);
|
|
1565
|
+
setEmail(emailValue);
|
|
1566
|
+
setEmailError("");
|
|
1567
|
+
onEmailSuccess();
|
|
1568
|
+
} catch (error) {
|
|
1569
|
+
const err = error;
|
|
1570
|
+
setErrorMessage(
|
|
1571
|
+
err?.response?.data?.message || "Failed to send email OTP"
|
|
1572
|
+
);
|
|
1573
|
+
} finally {
|
|
1574
|
+
setIsLoading(false);
|
|
1575
|
+
setLoadingType(null);
|
|
1576
|
+
}
|
|
1577
|
+
};
|
|
1578
|
+
const handleContinueAsGuest = async () => {
|
|
1579
|
+
try {
|
|
1580
|
+
setIsLoading(true);
|
|
1581
|
+
setLoadingType("guest");
|
|
1582
|
+
setErrorMessage("");
|
|
1583
|
+
const res = await createAnonymousUser(linkToken, clientId);
|
|
1584
|
+
setUser(res);
|
|
1585
|
+
setEmailError("");
|
|
1586
|
+
onGuestSuccess();
|
|
1587
|
+
} catch (error) {
|
|
1588
|
+
const err = error;
|
|
1589
|
+
console.error(error);
|
|
1590
|
+
setErrorMessage(
|
|
1591
|
+
err?.response?.data?.message || "Failed to continue as guest"
|
|
1592
|
+
);
|
|
1593
|
+
} finally {
|
|
1594
|
+
setIsLoading(false);
|
|
1595
|
+
setLoadingType(null);
|
|
1596
|
+
}
|
|
1445
1597
|
};
|
|
1446
|
-
|
|
1447
|
-
import_react_native7.Text,
|
|
1598
|
+
const infoSections = [
|
|
1448
1599
|
{
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
]
|
|
1600
|
+
icon: /* @__PURE__ */ import_react19.default.createElement(LinkIcon, { size: 20, color: theme.colors.primary }),
|
|
1601
|
+
title: "Simple and secure",
|
|
1602
|
+
text: "Link your accounts in just a few clicks"
|
|
1453
1603
|
},
|
|
1454
|
-
label
|
|
1455
|
-
), /* @__PURE__ */ import_react14.default.createElement(import_react_native7.View, { style: styles7.container }, Array.from({ length }, (_, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1456
|
-
import_react_native7.TextInput,
|
|
1457
1604
|
{
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
fontSize: theme.fontSize.xxl,
|
|
1467
|
-
borderRadius: theme.borderRadius.md
|
|
1468
|
-
},
|
|
1469
|
-
inputStyle
|
|
1470
|
-
],
|
|
1471
|
-
keyboardType: "numeric",
|
|
1472
|
-
maxLength: 1,
|
|
1473
|
-
value: otp[index] || "",
|
|
1474
|
-
onChangeText: (val) => handleChange(index, val),
|
|
1475
|
-
onKeyPress: (e) => handleKeyPress(index, e),
|
|
1476
|
-
editable: !disabled,
|
|
1477
|
-
selectTextOnFocus: true,
|
|
1478
|
-
caretHidden: true
|
|
1605
|
+
icon: /* @__PURE__ */ import_react19.default.createElement(ShieldIcon, { size: 20, color: theme.colors.primary }),
|
|
1606
|
+
title: "Control what you share",
|
|
1607
|
+
text: "We never share your data without your permission"
|
|
1608
|
+
},
|
|
1609
|
+
{
|
|
1610
|
+
icon: /* @__PURE__ */ import_react19.default.createElement(EyeIcon, { size: 20, color: theme.colors.primary }),
|
|
1611
|
+
title: "View Only Access",
|
|
1612
|
+
text: "Kryptos retrieves view-only data and cannot perform any transactions on your behalf."
|
|
1479
1613
|
}
|
|
1480
|
-
|
|
1481
|
-
|
|
1614
|
+
];
|
|
1615
|
+
return /* @__PURE__ */ import_react19.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react19.default.createElement(ModalHeader, { onClose: handleClose }, ""), /* @__PURE__ */ import_react19.default.createElement(ModalBody, null, /* @__PURE__ */ import_react19.default.createElement(import_react_native11.View, { style: styles11.container }, /* @__PURE__ */ import_react19.default.createElement(import_react_native11.View, { style: styles11.header }, /* @__PURE__ */ import_react19.default.createElement(import_react_native11.Text, { style: [styles11.title, { color: theme.colors.text }] }, "Link your accounts to", " ", /* @__PURE__ */ import_react19.default.createElement(import_react_native11.Text, { style: { fontWeight: "700" } }, appName), " using Kryptos"), /* @__PURE__ */ import_react19.default.createElement(ConnectLogo, null), infoSections.map((section, index) => /* @__PURE__ */ import_react19.default.createElement(import_react_native11.View, { key: `info-${index}`, style: styles11.infoSection }, /* @__PURE__ */ import_react19.default.createElement(import_react_native11.View, { style: styles11.infoIcon }, section.icon), /* @__PURE__ */ import_react19.default.createElement(import_react_native11.View, { style: styles11.infoContent }, /* @__PURE__ */ import_react19.default.createElement(
|
|
1616
|
+
import_react_native11.Text,
|
|
1617
|
+
{
|
|
1618
|
+
style: [styles11.infoTitle, { color: theme.colors.text }]
|
|
1619
|
+
},
|
|
1620
|
+
section.title
|
|
1621
|
+
), /* @__PURE__ */ import_react19.default.createElement(
|
|
1622
|
+
import_react_native11.Text,
|
|
1482
1623
|
{
|
|
1483
1624
|
style: [
|
|
1484
|
-
|
|
1485
|
-
{ color: theme.colors.
|
|
1625
|
+
styles11.infoDescription,
|
|
1626
|
+
{ color: theme.colors.textSecondary }
|
|
1486
1627
|
]
|
|
1487
1628
|
},
|
|
1488
|
-
|
|
1489
|
-
))
|
|
1629
|
+
section.text
|
|
1630
|
+
)))), errorMessage ? /* @__PURE__ */ import_react19.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react19.default.createElement(AlertDescription, null, errorMessage)) : null), /* @__PURE__ */ import_react19.default.createElement(import_react_native11.View, { style: styles11.footer }, /* @__PURE__ */ import_react19.default.createElement(
|
|
1631
|
+
Button,
|
|
1632
|
+
{
|
|
1633
|
+
variant: "outline",
|
|
1634
|
+
size: "lg",
|
|
1635
|
+
onPress: handleContinueAsGuest,
|
|
1636
|
+
loading: loadingType === "guest",
|
|
1637
|
+
disabled: isLoading,
|
|
1638
|
+
style: styles11.button
|
|
1639
|
+
},
|
|
1640
|
+
"Continue"
|
|
1641
|
+
), /* @__PURE__ */ import_react19.default.createElement(
|
|
1642
|
+
import_react_native11.Text,
|
|
1643
|
+
{
|
|
1644
|
+
style: [styles11.footerText, { color: theme.colors.textSecondary }]
|
|
1645
|
+
},
|
|
1646
|
+
"By continuing, you agree to Kryptos",
|
|
1647
|
+
" ",
|
|
1648
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
1649
|
+
import_react_native11.Text,
|
|
1650
|
+
{
|
|
1651
|
+
style: {
|
|
1652
|
+
color: theme.colors.primary,
|
|
1653
|
+
textDecorationLine: "underline"
|
|
1654
|
+
},
|
|
1655
|
+
onPress: () => import_react_native11.Linking.openURL("https://kryptos.io/privacy-policy")
|
|
1656
|
+
},
|
|
1657
|
+
"Privacy Policy"
|
|
1658
|
+
),
|
|
1659
|
+
" ",
|
|
1660
|
+
"and",
|
|
1661
|
+
" ",
|
|
1662
|
+
/* @__PURE__ */ import_react19.default.createElement(
|
|
1663
|
+
import_react_native11.Text,
|
|
1664
|
+
{
|
|
1665
|
+
style: {
|
|
1666
|
+
color: theme.colors.primary,
|
|
1667
|
+
textDecorationLine: "underline"
|
|
1668
|
+
},
|
|
1669
|
+
onPress: () => import_react_native11.Linking.openURL("https://kryptos.io/terms-of-services")
|
|
1670
|
+
},
|
|
1671
|
+
"Terms of Service"
|
|
1672
|
+
)
|
|
1673
|
+
)))), /* @__PURE__ */ import_react19.default.createElement(ModalFooter, { style: { paddingVertical: 0 } }, /* @__PURE__ */ import_react19.default.createElement(Footer, null)));
|
|
1490
1674
|
};
|
|
1491
|
-
var
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1675
|
+
var styles11 = import_react_native11.StyleSheet.create({
|
|
1676
|
+
container: {
|
|
1677
|
+
flex: 1,
|
|
1678
|
+
flexDirection: "column",
|
|
1679
|
+
justifyContent: "space-between"
|
|
1495
1680
|
},
|
|
1496
|
-
|
|
1681
|
+
header: {
|
|
1682
|
+
flex: 1,
|
|
1683
|
+
gap: 8
|
|
1684
|
+
},
|
|
1685
|
+
footer: {
|
|
1686
|
+
flex: 1,
|
|
1687
|
+
justifyContent: "flex-end",
|
|
1688
|
+
gap: 8
|
|
1689
|
+
},
|
|
1690
|
+
title: {
|
|
1691
|
+
fontSize: 18,
|
|
1692
|
+
// theme.fontSize.xl
|
|
1497
1693
|
fontWeight: "500",
|
|
1498
|
-
marginBottom: 12,
|
|
1499
|
-
// theme.spacing.md - consistent label spacing
|
|
1500
1694
|
textAlign: "center"
|
|
1501
1695
|
},
|
|
1502
|
-
|
|
1696
|
+
infoSection: {
|
|
1503
1697
|
flexDirection: "row",
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1698
|
+
alignItems: "flex-start",
|
|
1699
|
+
padding: 8,
|
|
1700
|
+
gap: 12
|
|
1507
1701
|
},
|
|
1508
|
-
|
|
1509
|
-
width:
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1702
|
+
infoIcon: {
|
|
1703
|
+
width: 32,
|
|
1704
|
+
// theme.spacing.xxxl
|
|
1705
|
+
height: 32,
|
|
1706
|
+
// theme.spacing.xxxl
|
|
1707
|
+
borderRadius: 16,
|
|
1708
|
+
// theme.borderRadius.lg
|
|
1709
|
+
alignItems: "center",
|
|
1710
|
+
justifyContent: "center"
|
|
1711
|
+
},
|
|
1712
|
+
infoContent: {
|
|
1713
|
+
flex: 1,
|
|
1714
|
+
gap: 4
|
|
1715
|
+
},
|
|
1716
|
+
infoTitle: {
|
|
1717
|
+
fontSize: 14,
|
|
1718
|
+
// theme.fontSize.md
|
|
1513
1719
|
fontWeight: "600"
|
|
1514
1720
|
},
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
// theme.
|
|
1518
|
-
|
|
1721
|
+
infoDescription: {
|
|
1722
|
+
fontSize: 13,
|
|
1723
|
+
// theme.fontSize.sm + 1
|
|
1724
|
+
lineHeight: 18
|
|
1725
|
+
},
|
|
1726
|
+
button: {
|
|
1727
|
+
width: "100%"
|
|
1728
|
+
},
|
|
1729
|
+
footerText: {
|
|
1730
|
+
fontSize: 12,
|
|
1731
|
+
// theme.fontSize.sm
|
|
1732
|
+
textAlign: "center",
|
|
1733
|
+
padding: 8,
|
|
1734
|
+
maxWidth: "80%",
|
|
1735
|
+
alignSelf: "center"
|
|
1519
1736
|
}
|
|
1520
1737
|
});
|
|
1521
1738
|
|
|
1522
1739
|
// src/molecules/Init.tsx
|
|
1523
|
-
var
|
|
1524
|
-
var
|
|
1740
|
+
var import_react20 = __toESM(require("react"));
|
|
1741
|
+
var import_react_native12 = require("react-native");
|
|
1525
1742
|
var Init = ({
|
|
1526
1743
|
open,
|
|
1527
1744
|
onSuccess,
|
|
1528
1745
|
onClose,
|
|
1529
1746
|
generateLinkToken
|
|
1530
1747
|
}) => {
|
|
1531
|
-
const {
|
|
1748
|
+
const {
|
|
1749
|
+
setIsInitialized,
|
|
1750
|
+
isInitialized,
|
|
1751
|
+
setLinkToken,
|
|
1752
|
+
setIsAuthorized,
|
|
1753
|
+
setUser
|
|
1754
|
+
} = useKryptosConnect();
|
|
1532
1755
|
const theme = useTheme();
|
|
1533
|
-
const [isFetching, setIsFetching] =
|
|
1534
|
-
const [error, setError] =
|
|
1535
|
-
const fetchLinkToken =
|
|
1756
|
+
const [isFetching, setIsFetching] = import_react20.default.useState(false);
|
|
1757
|
+
const [error, setError] = import_react20.default.useState(null);
|
|
1758
|
+
const fetchLinkToken = import_react20.default.useCallback(async () => {
|
|
1536
1759
|
if (!open) return;
|
|
1537
1760
|
setIsFetching(true);
|
|
1538
1761
|
setError(null);
|
|
@@ -1545,6 +1768,11 @@ var Init = ({
|
|
|
1545
1768
|
}
|
|
1546
1769
|
setLinkToken(linkToken.link_token);
|
|
1547
1770
|
setIsInitialized(true);
|
|
1771
|
+
setIsAuthorized(linkToken.isAuthorized || false);
|
|
1772
|
+
if (linkToken.isAuthorized) {
|
|
1773
|
+
const userInfo = await getUserInfo(linkToken.link_token);
|
|
1774
|
+
setUser(userInfo);
|
|
1775
|
+
}
|
|
1548
1776
|
onSuccess(linkToken.isAuthorized ? { isAuthorized: true } : null);
|
|
1549
1777
|
} catch (err) {
|
|
1550
1778
|
console.error("Failed to fetch link token:", err);
|
|
@@ -1553,29 +1781,29 @@ var Init = ({
|
|
|
1553
1781
|
} finally {
|
|
1554
1782
|
setIsFetching(false);
|
|
1555
1783
|
}
|
|
1556
|
-
}, [
|
|
1557
|
-
|
|
1784
|
+
}, []);
|
|
1785
|
+
import_react20.default.useEffect(() => {
|
|
1558
1786
|
fetchLinkToken();
|
|
1559
1787
|
}, [fetchLinkToken]);
|
|
1560
|
-
return /* @__PURE__ */
|
|
1561
|
-
|
|
1788
|
+
return /* @__PURE__ */ import_react20.default.createElement(Modal, { isOpen: open, onClose, size: "xs" }, /* @__PURE__ */ import_react20.default.createElement(ModalHeader, { onClose }, "Kryptos Connect"), /* @__PURE__ */ import_react20.default.createElement(ModalBody, null, /* @__PURE__ */ import_react20.default.createElement(import_react_native12.View, { style: styles12.container }, isFetching && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(
|
|
1789
|
+
import_react_native12.ActivityIndicator,
|
|
1562
1790
|
{
|
|
1563
1791
|
size: "large",
|
|
1564
1792
|
color: theme.colors.primary,
|
|
1565
|
-
style:
|
|
1793
|
+
style: styles12.spinner
|
|
1566
1794
|
}
|
|
1567
|
-
), /* @__PURE__ */
|
|
1795
|
+
), /* @__PURE__ */ import_react20.default.createElement(import_react_native12.Text, { style: [styles12.message, { color: theme.colors.text }] }, isInitialized ? "Fetching link token..." : "Initializing...")), !isFetching && error && /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react20.default.createElement(AlertDescription, null, error)), /* @__PURE__ */ import_react20.default.createElement(
|
|
1568
1796
|
Button,
|
|
1569
1797
|
{
|
|
1570
1798
|
variant: "primary",
|
|
1571
1799
|
size: "lg",
|
|
1572
1800
|
onPress: fetchLinkToken,
|
|
1573
|
-
style:
|
|
1801
|
+
style: styles12.retryButton
|
|
1574
1802
|
},
|
|
1575
1803
|
"Retry"
|
|
1576
|
-
)))));
|
|
1804
|
+
)))), /* @__PURE__ */ import_react20.default.createElement(ModalFooter, { style: { paddingVertical: 0 } }, /* @__PURE__ */ import_react20.default.createElement(Footer, null)));
|
|
1577
1805
|
};
|
|
1578
|
-
var
|
|
1806
|
+
var styles12 = import_react_native12.StyleSheet.create({
|
|
1579
1807
|
container: {
|
|
1580
1808
|
flex: 1,
|
|
1581
1809
|
alignItems: "center",
|
|
@@ -1602,18 +1830,18 @@ var styles8 = import_react_native8.StyleSheet.create({
|
|
|
1602
1830
|
});
|
|
1603
1831
|
|
|
1604
1832
|
// src/molecules/Integration.tsx
|
|
1605
|
-
var
|
|
1606
|
-
var
|
|
1833
|
+
var import_react31 = __toESM(require("react"));
|
|
1834
|
+
var import_react_native16 = require("react-native");
|
|
1607
1835
|
|
|
1608
1836
|
// src/assets/ArrowLeftIcon.tsx
|
|
1609
|
-
var
|
|
1610
|
-
var
|
|
1837
|
+
var import_react21 = __toESM(require("react"));
|
|
1838
|
+
var import_react_native_svg7 = __toESM(require("react-native-svg"));
|
|
1611
1839
|
var ArrowLeftIcon = ({
|
|
1612
1840
|
size = 20,
|
|
1613
1841
|
color = "#000"
|
|
1614
1842
|
}) => {
|
|
1615
|
-
return /* @__PURE__ */
|
|
1616
|
-
|
|
1843
|
+
return /* @__PURE__ */ import_react21.default.createElement(import_react_native_svg7.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
1844
|
+
import_react_native_svg7.Path,
|
|
1617
1845
|
{
|
|
1618
1846
|
d: "M19 12H5M12 19l-7-7 7-7",
|
|
1619
1847
|
stroke: color,
|
|
@@ -1625,14 +1853,14 @@ var ArrowLeftIcon = ({
|
|
|
1625
1853
|
};
|
|
1626
1854
|
|
|
1627
1855
|
// src/assets/CheckCircleIcon.tsx
|
|
1628
|
-
var
|
|
1629
|
-
var
|
|
1856
|
+
var import_react22 = __toESM(require("react"));
|
|
1857
|
+
var import_react_native_svg8 = __toESM(require("react-native-svg"));
|
|
1630
1858
|
var CheckCircleIcon = ({
|
|
1631
1859
|
size = 20,
|
|
1632
1860
|
color = "#10B981"
|
|
1633
1861
|
}) => {
|
|
1634
|
-
return /* @__PURE__ */
|
|
1635
|
-
|
|
1862
|
+
return /* @__PURE__ */ import_react22.default.createElement(import_react_native_svg8.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react22.default.createElement(
|
|
1863
|
+
import_react_native_svg8.Circle,
|
|
1636
1864
|
{
|
|
1637
1865
|
cx: 12,
|
|
1638
1866
|
cy: 12,
|
|
@@ -1640,8 +1868,8 @@ var CheckCircleIcon = ({
|
|
|
1640
1868
|
stroke: color,
|
|
1641
1869
|
strokeWidth: 2
|
|
1642
1870
|
}
|
|
1643
|
-
), /* @__PURE__ */
|
|
1644
|
-
|
|
1871
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
1872
|
+
import_react_native_svg8.Path,
|
|
1645
1873
|
{
|
|
1646
1874
|
d: "m9 12 2 2 4-4",
|
|
1647
1875
|
stroke: color,
|
|
@@ -1653,21 +1881,21 @@ var CheckCircleIcon = ({
|
|
|
1653
1881
|
};
|
|
1654
1882
|
|
|
1655
1883
|
// src/assets/LoaderIcon.tsx
|
|
1656
|
-
var
|
|
1657
|
-
var
|
|
1658
|
-
var
|
|
1659
|
-
var AnimatedSvg =
|
|
1884
|
+
var import_react23 = __toESM(require("react"));
|
|
1885
|
+
var import_react_native13 = require("react-native");
|
|
1886
|
+
var import_react_native_svg9 = __toESM(require("react-native-svg"));
|
|
1887
|
+
var AnimatedSvg = import_react_native13.Animated.createAnimatedComponent(import_react_native_svg9.default);
|
|
1660
1888
|
var LoaderIcon = ({
|
|
1661
1889
|
size = 20,
|
|
1662
1890
|
color = "#00C693"
|
|
1663
1891
|
}) => {
|
|
1664
|
-
const rotateAnim =
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1892
|
+
const rotateAnim = import_react23.default.useRef(new import_react_native13.Animated.Value(0)).current;
|
|
1893
|
+
import_react23.default.useEffect(() => {
|
|
1894
|
+
import_react_native13.Animated.loop(
|
|
1895
|
+
import_react_native13.Animated.timing(rotateAnim, {
|
|
1668
1896
|
toValue: 1,
|
|
1669
1897
|
duration: 1e3,
|
|
1670
|
-
easing:
|
|
1898
|
+
easing: import_react_native13.Easing.linear,
|
|
1671
1899
|
useNativeDriver: true
|
|
1672
1900
|
})
|
|
1673
1901
|
).start();
|
|
@@ -1676,7 +1904,7 @@ var LoaderIcon = ({
|
|
|
1676
1904
|
inputRange: [0, 1],
|
|
1677
1905
|
outputRange: ["0deg", "360deg"]
|
|
1678
1906
|
});
|
|
1679
|
-
return /* @__PURE__ */
|
|
1907
|
+
return /* @__PURE__ */ import_react23.default.createElement(
|
|
1680
1908
|
AnimatedSvg,
|
|
1681
1909
|
{
|
|
1682
1910
|
width: size,
|
|
@@ -1685,8 +1913,8 @@ var LoaderIcon = ({
|
|
|
1685
1913
|
fill: "none",
|
|
1686
1914
|
style: { transform: [{ rotate: spin }] }
|
|
1687
1915
|
},
|
|
1688
|
-
/* @__PURE__ */
|
|
1689
|
-
|
|
1916
|
+
/* @__PURE__ */ import_react23.default.createElement(
|
|
1917
|
+
import_react_native_svg9.Path,
|
|
1690
1918
|
{
|
|
1691
1919
|
d: "M21 12a9 9 0 1 1-6.219-8.56",
|
|
1692
1920
|
stroke: color,
|
|
@@ -1699,11 +1927,11 @@ var LoaderIcon = ({
|
|
|
1699
1927
|
};
|
|
1700
1928
|
|
|
1701
1929
|
// src/assets/SuccessIcon.tsx
|
|
1702
|
-
var
|
|
1703
|
-
var
|
|
1930
|
+
var import_react24 = __toESM(require("react"));
|
|
1931
|
+
var import_react_native_svg10 = __toESM(require("react-native-svg"));
|
|
1704
1932
|
var SuccessIcon = ({ size = 64 }) => {
|
|
1705
|
-
return /* @__PURE__ */
|
|
1706
|
-
|
|
1933
|
+
return /* @__PURE__ */ import_react24.default.createElement(import_react_native_svg10.default, { width: size, height: size, viewBox: "0 0 64 64", fill: "none" }, /* @__PURE__ */ import_react24.default.createElement(
|
|
1934
|
+
import_react_native_svg10.Circle,
|
|
1707
1935
|
{
|
|
1708
1936
|
cx: 32,
|
|
1709
1937
|
cy: 32,
|
|
@@ -1711,16 +1939,16 @@ var SuccessIcon = ({ size = 64 }) => {
|
|
|
1711
1939
|
fill: "#00C693",
|
|
1712
1940
|
opacity: 0.1
|
|
1713
1941
|
}
|
|
1714
|
-
), /* @__PURE__ */
|
|
1715
|
-
|
|
1942
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
1943
|
+
import_react_native_svg10.Circle,
|
|
1716
1944
|
{
|
|
1717
1945
|
cx: 32,
|
|
1718
1946
|
cy: 32,
|
|
1719
1947
|
r: 24,
|
|
1720
1948
|
fill: "#00C693"
|
|
1721
1949
|
}
|
|
1722
|
-
), /* @__PURE__ */
|
|
1723
|
-
|
|
1950
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
1951
|
+
import_react_native_svg10.Path,
|
|
1724
1952
|
{
|
|
1725
1953
|
d: "M24 32l6 6 12-12",
|
|
1726
1954
|
stroke: "white",
|
|
@@ -1732,11 +1960,11 @@ var SuccessIcon = ({ size = 64 }) => {
|
|
|
1732
1960
|
};
|
|
1733
1961
|
|
|
1734
1962
|
// src/assets/ErrorIcon.tsx
|
|
1735
|
-
var
|
|
1736
|
-
var
|
|
1963
|
+
var import_react25 = __toESM(require("react"));
|
|
1964
|
+
var import_react_native_svg11 = __toESM(require("react-native-svg"));
|
|
1737
1965
|
var ErrorIcon = ({ size = 64 }) => {
|
|
1738
|
-
return /* @__PURE__ */
|
|
1739
|
-
|
|
1966
|
+
return /* @__PURE__ */ import_react25.default.createElement(import_react_native_svg11.default, { width: size, height: size, viewBox: "0 0 64 64", fill: "none" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
1967
|
+
import_react_native_svg11.Circle,
|
|
1740
1968
|
{
|
|
1741
1969
|
cx: 32,
|
|
1742
1970
|
cy: 32,
|
|
@@ -1744,16 +1972,16 @@ var ErrorIcon = ({ size = 64 }) => {
|
|
|
1744
1972
|
fill: "#EF4444",
|
|
1745
1973
|
opacity: 0.1
|
|
1746
1974
|
}
|
|
1747
|
-
), /* @__PURE__ */
|
|
1748
|
-
|
|
1975
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
1976
|
+
import_react_native_svg11.Circle,
|
|
1749
1977
|
{
|
|
1750
1978
|
cx: 32,
|
|
1751
1979
|
cy: 32,
|
|
1752
1980
|
r: 24,
|
|
1753
1981
|
fill: "#EF4444"
|
|
1754
1982
|
}
|
|
1755
|
-
), /* @__PURE__ */
|
|
1756
|
-
|
|
1983
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
1984
|
+
import_react_native_svg11.Path,
|
|
1757
1985
|
{
|
|
1758
1986
|
d: "M24 24l16 16M40 24l-16 16",
|
|
1759
1987
|
stroke: "white",
|
|
@@ -1765,18 +1993,18 @@ var ErrorIcon = ({ size = 64 }) => {
|
|
|
1765
1993
|
};
|
|
1766
1994
|
|
|
1767
1995
|
// src/assets/SearchIcon.tsx
|
|
1768
|
-
var
|
|
1769
|
-
var
|
|
1996
|
+
var import_react26 = __toESM(require("react"));
|
|
1997
|
+
var import_react_native_svg12 = __toESM(require("react-native-svg"));
|
|
1770
1998
|
|
|
1771
1999
|
// src/assets/PlusIcon.tsx
|
|
1772
|
-
var
|
|
1773
|
-
var
|
|
2000
|
+
var import_react27 = __toESM(require("react"));
|
|
2001
|
+
var import_react_native_svg13 = __toESM(require("react-native-svg"));
|
|
1774
2002
|
var PlusIcon = ({
|
|
1775
2003
|
size = 14,
|
|
1776
2004
|
color = "#6B7280"
|
|
1777
2005
|
}) => {
|
|
1778
|
-
return /* @__PURE__ */
|
|
1779
|
-
|
|
2006
|
+
return /* @__PURE__ */ import_react27.default.createElement(import_react_native_svg13.default, { width: size, height: size, viewBox: "0 0 14 14", fill: "none" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
2007
|
+
import_react_native_svg13.Path,
|
|
1780
2008
|
{
|
|
1781
2009
|
d: "M7 3.5v7M3.5 7h7",
|
|
1782
2010
|
stroke: color,
|
|
@@ -1788,8 +2016,8 @@ var PlusIcon = ({
|
|
|
1788
2016
|
|
|
1789
2017
|
// src/wallet-connect/index.tsx
|
|
1790
2018
|
var import_appkit_react_native3 = require("@reown/appkit-react-native");
|
|
1791
|
-
var
|
|
1792
|
-
var
|
|
2019
|
+
var import_react29 = __toESM(require("react"));
|
|
2020
|
+
var import_react_native14 = require("react-native");
|
|
1793
2021
|
|
|
1794
2022
|
// src/utils/uuid.ts
|
|
1795
2023
|
function generateUUID() {
|
|
@@ -1801,7 +2029,7 @@ function generateUUID() {
|
|
|
1801
2029
|
}
|
|
1802
2030
|
|
|
1803
2031
|
// src/wallet-connect/wallet-connect.tsx
|
|
1804
|
-
var
|
|
2032
|
+
var import_react28 = __toESM(require("react"));
|
|
1805
2033
|
var import_appkit_react_native2 = require("@reown/appkit-react-native");
|
|
1806
2034
|
|
|
1807
2035
|
// src/wallet-connect/AppKitConfig.ts
|
|
@@ -1900,7 +2128,7 @@ var createAppKitInstance = (projectId) => {
|
|
|
1900
2128
|
// src/wallet-connect/wallet-connect.tsx
|
|
1901
2129
|
var WalletConnectWrapper = ({ children }) => {
|
|
1902
2130
|
const { walletConnectProjectId } = useKryptosConnect();
|
|
1903
|
-
const appKit =
|
|
2131
|
+
const appKit = import_react28.default.useMemo(() => {
|
|
1904
2132
|
if (!walletConnectProjectId) {
|
|
1905
2133
|
console.warn(
|
|
1906
2134
|
"walletConnectProjectId is missing in KryptosConnectProvider config"
|
|
@@ -1910,9 +2138,9 @@ var WalletConnectWrapper = ({ children }) => {
|
|
|
1910
2138
|
return createAppKitInstance(walletConnectProjectId);
|
|
1911
2139
|
}, [walletConnectProjectId]);
|
|
1912
2140
|
if (!appKit) {
|
|
1913
|
-
return /* @__PURE__ */
|
|
2141
|
+
return /* @__PURE__ */ import_react28.default.createElement(import_react28.default.Fragment, null, children);
|
|
1914
2142
|
}
|
|
1915
|
-
return /* @__PURE__ */
|
|
2143
|
+
return /* @__PURE__ */ import_react28.default.createElement(import_appkit_react_native2.AppKitProvider, { instance: appKit }, /* @__PURE__ */ import_react28.default.createElement(import_appkit_react_native2.AppKit, null), children);
|
|
1916
2144
|
};
|
|
1917
2145
|
var wallet_connect_default = WalletConnectWrapper;
|
|
1918
2146
|
|
|
@@ -1928,42 +2156,42 @@ var WalletConnectComponent = ({
|
|
|
1928
2156
|
const { walletConnectProjectId } = useKryptosConnect();
|
|
1929
2157
|
const theme = useTheme();
|
|
1930
2158
|
if (!walletConnectProjectId) {
|
|
1931
|
-
return /* @__PURE__ */
|
|
1932
|
-
|
|
2159
|
+
return /* @__PURE__ */ import_react29.default.createElement(Modal, { isOpen: modalOpen, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react29.default.createElement(ModalHeader, { onClose: handleClose }, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, { style: styles13.headerContent }, /* @__PURE__ */ import_react29.default.createElement(
|
|
2160
|
+
import_react_native14.TouchableOpacity,
|
|
1933
2161
|
{
|
|
1934
2162
|
onPress: () => {
|
|
1935
2163
|
setAddIntegrationMode(null);
|
|
1936
2164
|
},
|
|
1937
|
-
style:
|
|
2165
|
+
style: styles13.backButton
|
|
1938
2166
|
},
|
|
1939
|
-
/* @__PURE__ */
|
|
1940
|
-
), /* @__PURE__ */
|
|
1941
|
-
|
|
2167
|
+
/* @__PURE__ */ import_react29.default.createElement(ArrowLeftIcon, { size: 20, color: theme.colors.text })
|
|
2168
|
+
), /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.headerTitle, { color: theme.colors.text }] }, "Integration"))), /* @__PURE__ */ import_react29.default.createElement(ModalBody, { scrollable: false, style: styles13.contentContainer }, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, { style: styles13.emptyState }, /* @__PURE__ */ import_react29.default.createElement(
|
|
2169
|
+
import_react_native14.Text,
|
|
1942
2170
|
{
|
|
1943
|
-
style: [
|
|
2171
|
+
style: [styles13.emptyStateTitle, { color: theme.colors.text }]
|
|
1944
2172
|
},
|
|
1945
2173
|
"WalletConnect is not configured"
|
|
1946
|
-
), /* @__PURE__ */
|
|
1947
|
-
|
|
2174
|
+
), /* @__PURE__ */ import_react29.default.createElement(
|
|
2175
|
+
import_react_native14.Text,
|
|
1948
2176
|
{
|
|
1949
2177
|
style: [
|
|
1950
|
-
|
|
2178
|
+
styles13.infoText,
|
|
1951
2179
|
{ color: theme.colors.textSecondary, textAlign: "center" }
|
|
1952
2180
|
]
|
|
1953
2181
|
},
|
|
1954
2182
|
"Please add a walletConnectProjectId to KryptosConnectProvider to enable wallet connections."
|
|
1955
|
-
), /* @__PURE__ */
|
|
2183
|
+
), /* @__PURE__ */ import_react29.default.createElement(
|
|
1956
2184
|
Button,
|
|
1957
2185
|
{
|
|
1958
2186
|
variant: "outline",
|
|
1959
2187
|
size: "sm",
|
|
1960
2188
|
onPress: () => setAddIntegrationMode(null),
|
|
1961
|
-
style:
|
|
2189
|
+
style: styles13.emptyStateButton
|
|
1962
2190
|
},
|
|
1963
2191
|
"Go back"
|
|
1964
2192
|
))));
|
|
1965
2193
|
}
|
|
1966
|
-
return /* @__PURE__ */
|
|
2194
|
+
return /* @__PURE__ */ import_react29.default.createElement(wallet_connect_default, null, /* @__PURE__ */ import_react29.default.createElement(
|
|
1967
2195
|
ConnectButton,
|
|
1968
2196
|
{
|
|
1969
2197
|
integration,
|
|
@@ -1986,10 +2214,10 @@ function ConnectButton({
|
|
|
1986
2214
|
const { open, disconnect } = (0, import_appkit_react_native3.useAppKit)();
|
|
1987
2215
|
const { address, isConnected, chainId } = (0, import_appkit_react_native3.useAccount)();
|
|
1988
2216
|
const { linkToken, user, clientId } = useKryptosConnect();
|
|
1989
|
-
const [selectedChains, setSelectedChains] = (0,
|
|
1990
|
-
const [errorMessage, setErrorMessage] = (0,
|
|
1991
|
-
const [chainErrors, setChainErrors] = (0,
|
|
1992
|
-
const [isLoading, setIsLoading] = (0,
|
|
2217
|
+
const [selectedChains, setSelectedChains] = (0, import_react29.useState)(/* @__PURE__ */ new Set());
|
|
2218
|
+
const [errorMessage, setErrorMessage] = (0, import_react29.useState)("");
|
|
2219
|
+
const [chainErrors, setChainErrors] = (0, import_react29.useState)({});
|
|
2220
|
+
const [isLoading, setIsLoading] = (0, import_react29.useState)(false);
|
|
1993
2221
|
const userUsedChains = integration?.walletSupportedChains || [];
|
|
1994
2222
|
const validateForm = () => {
|
|
1995
2223
|
if (!address) {
|
|
@@ -2025,7 +2253,7 @@ function ConnectButton({
|
|
|
2025
2253
|
source: integration.id,
|
|
2026
2254
|
credential: {
|
|
2027
2255
|
address,
|
|
2028
|
-
userId: user?.
|
|
2256
|
+
userId: user?.user_id || "0",
|
|
2029
2257
|
projectId: integration.projectId,
|
|
2030
2258
|
apiKey: "0",
|
|
2031
2259
|
secret: "0",
|
|
@@ -2055,7 +2283,7 @@ function ConnectButton({
|
|
|
2055
2283
|
logo: integration.logo || null,
|
|
2056
2284
|
startTime: null,
|
|
2057
2285
|
endTime: null,
|
|
2058
|
-
uid: user?.
|
|
2286
|
+
uid: user?.user_id || "",
|
|
2059
2287
|
walletId,
|
|
2060
2288
|
clientMetadata: {
|
|
2061
2289
|
clientId,
|
|
@@ -2069,7 +2297,7 @@ function ConnectButton({
|
|
|
2069
2297
|
default_chain_logo: chain.logo || null,
|
|
2070
2298
|
type: integration.type,
|
|
2071
2299
|
isNftSupported: integration.isEvmWallet || integration.nftSupport || false,
|
|
2072
|
-
chainId: chain.chainId || chain.id,
|
|
2300
|
+
chainId: chain?.community_id || chain.chainId || chain.id,
|
|
2073
2301
|
address
|
|
2074
2302
|
};
|
|
2075
2303
|
integrationsToAdd.push(data);
|
|
@@ -2108,16 +2336,16 @@ function ConnectButton({
|
|
|
2108
2336
|
setChainErrors(newErrors);
|
|
2109
2337
|
}
|
|
2110
2338
|
};
|
|
2111
|
-
return /* @__PURE__ */
|
|
2112
|
-
|
|
2339
|
+
return /* @__PURE__ */ import_react29.default.createElement(Modal, { isOpen: modalOpen, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react29.default.createElement(ModalHeader, { onClose: handleClose }, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, { style: styles13.headerContent }, /* @__PURE__ */ import_react29.default.createElement(
|
|
2340
|
+
import_react_native14.TouchableOpacity,
|
|
2113
2341
|
{
|
|
2114
2342
|
onPress: () => {
|
|
2115
2343
|
setAddIntegrationMode(null);
|
|
2116
2344
|
},
|
|
2117
|
-
style:
|
|
2345
|
+
style: styles13.backButton
|
|
2118
2346
|
},
|
|
2119
|
-
/* @__PURE__ */
|
|
2120
|
-
), /* @__PURE__ */
|
|
2347
|
+
/* @__PURE__ */ import_react29.default.createElement(ArrowLeftIcon, { size: 20, color: theme.colors.text })
|
|
2348
|
+
), /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.headerTitle, { color: theme.colors.text }] }, "Integration"))), /* @__PURE__ */ import_react29.default.createElement(ModalBody, { scrollable: false, style: styles13.contentContainer }, !isConnected ? /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, null, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.infoText, { color: theme.colors.text }] }, "Connect your wallet to continue"), /* @__PURE__ */ import_react29.default.createElement(
|
|
2121
2349
|
Button,
|
|
2122
2350
|
{
|
|
2123
2351
|
variant: "primary",
|
|
@@ -2125,32 +2353,32 @@ function ConnectButton({
|
|
|
2125
2353
|
onPress: () => open({ view: "Connect" })
|
|
2126
2354
|
},
|
|
2127
2355
|
"Connect Wallet"
|
|
2128
|
-
)) : /* @__PURE__ */
|
|
2356
|
+
)) : /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, null, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.connectedTitle, { color: theme.colors.text }] }, "Wallet Connected"), /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.connectedText, { color: theme.colors.text }] }, "Address: ", address), /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.connectedText, { color: theme.colors.text }] }, "Chain: ", chainId), /* @__PURE__ */ import_react29.default.createElement(Button, { variant: "ghost", size: "sm", onPress: () => disconnect() }, "Disconnect Wallet"), userUsedChains.length > 0 && address && /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, { style: styles13.chainSelection }, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.Text, { style: [styles13.chainTitle, { color: theme.colors.text }] }, "Select Chains to Add:"), /* @__PURE__ */ import_react29.default.createElement(import_react_native14.ScrollView, { contentContainerStyle: styles13.scrollViewContent }, /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, { style: styles13.chainChips }, userUsedChains.map((chain) => {
|
|
2129
2357
|
const isSelected = selectedChains.has(chain.id);
|
|
2130
2358
|
const hasError = chainErrors[chain.id];
|
|
2131
|
-
return /* @__PURE__ */
|
|
2132
|
-
|
|
2359
|
+
return /* @__PURE__ */ import_react29.default.createElement(
|
|
2360
|
+
import_react_native14.TouchableOpacity,
|
|
2133
2361
|
{
|
|
2134
2362
|
onPress: () => toggleChainSelection(chain.id),
|
|
2135
|
-
style:
|
|
2363
|
+
style: styles13.chainButton,
|
|
2136
2364
|
key: chain.id
|
|
2137
2365
|
},
|
|
2138
|
-
/* @__PURE__ */
|
|
2139
|
-
|
|
2366
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
2367
|
+
import_react_native14.View,
|
|
2140
2368
|
{
|
|
2141
2369
|
style: [
|
|
2142
|
-
|
|
2370
|
+
styles13.chainChip,
|
|
2143
2371
|
{
|
|
2144
2372
|
backgroundColor: hasError ? theme.colors.errorLight : isSelected ? theme.colors.primary + "20" : theme.colors.surface,
|
|
2145
2373
|
borderColor: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.border
|
|
2146
2374
|
}
|
|
2147
2375
|
]
|
|
2148
2376
|
},
|
|
2149
|
-
/* @__PURE__ */
|
|
2150
|
-
|
|
2377
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
2378
|
+
import_react_native14.Text,
|
|
2151
2379
|
{
|
|
2152
2380
|
style: [
|
|
2153
|
-
|
|
2381
|
+
styles13.chainName,
|
|
2154
2382
|
{
|
|
2155
2383
|
color: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.text
|
|
2156
2384
|
}
|
|
@@ -2158,13 +2386,13 @@ function ConnectButton({
|
|
|
2158
2386
|
},
|
|
2159
2387
|
chain.id
|
|
2160
2388
|
),
|
|
2161
|
-
isSelected ? /* @__PURE__ */
|
|
2389
|
+
isSelected ? /* @__PURE__ */ import_react29.default.createElement(
|
|
2162
2390
|
CloseIcon,
|
|
2163
2391
|
{
|
|
2164
2392
|
size: 12,
|
|
2165
2393
|
color: hasError ? theme.colors.error : theme.colors.primary
|
|
2166
2394
|
}
|
|
2167
|
-
) : /* @__PURE__ */
|
|
2395
|
+
) : /* @__PURE__ */ import_react29.default.createElement(
|
|
2168
2396
|
PlusIcon,
|
|
2169
2397
|
{
|
|
2170
2398
|
size: 12,
|
|
@@ -2173,11 +2401,11 @@ function ConnectButton({
|
|
|
2173
2401
|
)
|
|
2174
2402
|
)
|
|
2175
2403
|
);
|
|
2176
|
-
}))), Object.keys(chainErrors).length > 0 && /* @__PURE__ */
|
|
2177
|
-
|
|
2404
|
+
}))), Object.keys(chainErrors).length > 0 && /* @__PURE__ */ import_react29.default.createElement(import_react_native14.View, { style: styles13.chainErrorsContainer }, /* @__PURE__ */ import_react29.default.createElement(
|
|
2405
|
+
import_react_native14.Text,
|
|
2178
2406
|
{
|
|
2179
2407
|
style: [
|
|
2180
|
-
|
|
2408
|
+
styles13.chainErrorsTitle,
|
|
2181
2409
|
{ color: theme.colors.error }
|
|
2182
2410
|
]
|
|
2183
2411
|
},
|
|
@@ -2186,12 +2414,12 @@ function ConnectButton({
|
|
|
2186
2414
|
const chain = userUsedChains.find(
|
|
2187
2415
|
(c) => c.id === chainId2
|
|
2188
2416
|
);
|
|
2189
|
-
return /* @__PURE__ */
|
|
2190
|
-
|
|
2417
|
+
return /* @__PURE__ */ import_react29.default.createElement(
|
|
2418
|
+
import_react_native14.Text,
|
|
2191
2419
|
{
|
|
2192
2420
|
key: chainId2,
|
|
2193
2421
|
style: [
|
|
2194
|
-
|
|
2422
|
+
styles13.chainErrorItem,
|
|
2195
2423
|
{ color: theme.colors.error }
|
|
2196
2424
|
]
|
|
2197
2425
|
},
|
|
@@ -2200,7 +2428,7 @@ function ConnectButton({
|
|
|
2200
2428
|
": ",
|
|
2201
2429
|
error
|
|
2202
2430
|
);
|
|
2203
|
-
}))), errorMessage ? /* @__PURE__ */
|
|
2431
|
+
}))), errorMessage ? /* @__PURE__ */ import_react29.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react29.default.createElement(AlertDescription, null, errorMessage)) : null)), userUsedChains.length > 0 && address && /* @__PURE__ */ import_react29.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react29.default.createElement(
|
|
2204
2432
|
Button,
|
|
2205
2433
|
{
|
|
2206
2434
|
variant: "outline",
|
|
@@ -2208,12 +2436,12 @@ function ConnectButton({
|
|
|
2208
2436
|
onPress: onSubmitWalletConnect,
|
|
2209
2437
|
loading: isLoading,
|
|
2210
2438
|
disabled: isLoading || !!address && userUsedChains.length > 0 && selectedChains.size === 0,
|
|
2211
|
-
style:
|
|
2439
|
+
style: styles13.button
|
|
2212
2440
|
},
|
|
2213
2441
|
selectedChains.size > 0 ? `Add ${selectedChains.size} Chain${selectedChains.size > 1 ? "s" : ""}` : "Add Integration"
|
|
2214
|
-
)));
|
|
2442
|
+
), /* @__PURE__ */ import_react29.default.createElement(Footer, null)));
|
|
2215
2443
|
}
|
|
2216
|
-
var
|
|
2444
|
+
var styles13 = import_react_native14.StyleSheet.create({
|
|
2217
2445
|
connectedTitle: { fontSize: 18, fontWeight: "600", marginBottom: 4 },
|
|
2218
2446
|
connectedText: { fontSize: 14, marginBottom: 4 },
|
|
2219
2447
|
infoText: {
|
|
@@ -2326,8 +2554,8 @@ var styles9 = import_react_native10.StyleSheet.create({
|
|
|
2326
2554
|
});
|
|
2327
2555
|
|
|
2328
2556
|
// src/molecules/IntegrationForm.tsx
|
|
2329
|
-
var
|
|
2330
|
-
var
|
|
2557
|
+
var import_react30 = __toESM(require("react"));
|
|
2558
|
+
var import_react_native15 = require("react-native");
|
|
2331
2559
|
var IntegrationForm = ({
|
|
2332
2560
|
metadata,
|
|
2333
2561
|
onAddHandle,
|
|
@@ -2337,27 +2565,35 @@ var IntegrationForm = ({
|
|
|
2337
2565
|
}) => {
|
|
2338
2566
|
const { clientId, linkToken, user } = useKryptosConnect();
|
|
2339
2567
|
const theme = useTheme();
|
|
2340
|
-
const [isLoading, setIsLoading] =
|
|
2341
|
-
const [
|
|
2342
|
-
const [
|
|
2568
|
+
const [isLoading, setIsLoading] = import_react30.default.useState(false);
|
|
2569
|
+
const [isFetchingChains, setIsFetchingChains] = import_react30.default.useState(false);
|
|
2570
|
+
const [userUsedChains, setUserUsedChains] = import_react30.default.useState([]);
|
|
2571
|
+
const [selectedChains, setSelectedChains] = import_react30.default.useState(
|
|
2343
2572
|
/* @__PURE__ */ new Set()
|
|
2344
2573
|
);
|
|
2345
|
-
const [chainErrors, setChainErrors] =
|
|
2574
|
+
const [chainErrors, setChainErrors] = import_react30.default.useState(
|
|
2346
2575
|
{}
|
|
2347
2576
|
);
|
|
2348
|
-
const [errorMessage, setErrorMessage] =
|
|
2349
|
-
const [formValues, setFormValues] =
|
|
2577
|
+
const [errorMessage, setErrorMessage] = import_react30.default.useState("");
|
|
2578
|
+
const [formValues, setFormValues] = import_react30.default.useState({
|
|
2350
2579
|
address: "",
|
|
2351
2580
|
account_name: "",
|
|
2352
2581
|
api_key: "",
|
|
2353
2582
|
secret_key: "",
|
|
2354
2583
|
password: ""
|
|
2355
2584
|
});
|
|
2356
|
-
const [formErrors, setFormErrors] =
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2585
|
+
const [formErrors, setFormErrors] = import_react30.default.useState({});
|
|
2586
|
+
import_react30.default.useEffect(() => {
|
|
2587
|
+
if (!formValues.address || !formValues.address.trim()) {
|
|
2588
|
+
setUserUsedChains([]);
|
|
2589
|
+
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2590
|
+
setIsFetchingChains(false);
|
|
2591
|
+
return;
|
|
2592
|
+
}
|
|
2593
|
+
const debounceTimer = setTimeout(async () => {
|
|
2594
|
+
if (linkToken && formValues.address && formValues.address.trim() && metadata.isEvmWallet) {
|
|
2360
2595
|
try {
|
|
2596
|
+
setIsFetchingChains(true);
|
|
2361
2597
|
const res = await getUserUsedChains(
|
|
2362
2598
|
linkToken,
|
|
2363
2599
|
formValues.address.trim()
|
|
@@ -2365,18 +2601,22 @@ var IntegrationForm = ({
|
|
|
2365
2601
|
if (res && Array.isArray(res)) {
|
|
2366
2602
|
setUserUsedChains(res);
|
|
2367
2603
|
setSelectedChains(new Set(res.map((chain) => chain.id)));
|
|
2604
|
+
} else {
|
|
2605
|
+
setUserUsedChains([]);
|
|
2606
|
+
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2368
2607
|
}
|
|
2369
2608
|
} catch (error) {
|
|
2370
2609
|
console.error("Failed to fetch user chains:", error);
|
|
2371
2610
|
setUserUsedChains([]);
|
|
2372
2611
|
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2612
|
+
} finally {
|
|
2613
|
+
setIsFetchingChains(false);
|
|
2373
2614
|
}
|
|
2374
|
-
} else {
|
|
2375
|
-
setUserUsedChains([]);
|
|
2376
|
-
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2377
2615
|
}
|
|
2616
|
+
}, 500);
|
|
2617
|
+
return () => {
|
|
2618
|
+
clearTimeout(debounceTimer);
|
|
2378
2619
|
};
|
|
2379
|
-
fetchUserUsedChains();
|
|
2380
2620
|
}, [linkToken, formValues.address]);
|
|
2381
2621
|
const toggleChainSelection = (chainId) => {
|
|
2382
2622
|
const newSelected = new Set(selectedChains);
|
|
@@ -2435,7 +2675,7 @@ var IntegrationForm = ({
|
|
|
2435
2675
|
accountName: formValues.account_name?.trim() || "0",
|
|
2436
2676
|
address: formValues.address?.trim() || "0",
|
|
2437
2677
|
password: formValues.password?.trim() || "0",
|
|
2438
|
-
userId: user?.
|
|
2678
|
+
userId: user?.user_id || "0",
|
|
2439
2679
|
projectId: metadata?.projectId || "0",
|
|
2440
2680
|
privateKey: "0",
|
|
2441
2681
|
alias,
|
|
@@ -2463,7 +2703,7 @@ var IntegrationForm = ({
|
|
|
2463
2703
|
logo: metadata.logo || null,
|
|
2464
2704
|
startTime: null,
|
|
2465
2705
|
endTime: null,
|
|
2466
|
-
uid: user?.
|
|
2706
|
+
uid: user?.user_id || "",
|
|
2467
2707
|
walletId,
|
|
2468
2708
|
clientMetadata: {
|
|
2469
2709
|
clientId,
|
|
@@ -2477,7 +2717,7 @@ var IntegrationForm = ({
|
|
|
2477
2717
|
default_chain_logo: chain.logo || null,
|
|
2478
2718
|
type: metadata.type,
|
|
2479
2719
|
isNftSupported: metadata.isEvmWallet || metadata.nftSupport || false,
|
|
2480
|
-
chainId: chain
|
|
2720
|
+
chainId: chain?.community_id || "",
|
|
2481
2721
|
address: formValues.address
|
|
2482
2722
|
};
|
|
2483
2723
|
if (formValues.account_name)
|
|
@@ -2514,7 +2754,7 @@ var IntegrationForm = ({
|
|
|
2514
2754
|
accountName: formValues.account_name?.trim() || "0",
|
|
2515
2755
|
address: formValues.address?.trim() || "0",
|
|
2516
2756
|
password: formValues.password?.trim() || "0",
|
|
2517
|
-
userId: user?.
|
|
2757
|
+
userId: user?.user_id || "0",
|
|
2518
2758
|
projectId: metadata?.projectId || "0",
|
|
2519
2759
|
privateKey: "0",
|
|
2520
2760
|
alias,
|
|
@@ -2523,7 +2763,7 @@ var IntegrationForm = ({
|
|
|
2523
2763
|
}
|
|
2524
2764
|
};
|
|
2525
2765
|
const testResult = await testCredentials(linkToken, { ...credential });
|
|
2526
|
-
if (!testResult?.
|
|
2766
|
+
if (!testResult?.valid) {
|
|
2527
2767
|
setErrorMessage(
|
|
2528
2768
|
testResult?.value?.message || "Credentials are invalid"
|
|
2529
2769
|
);
|
|
@@ -2539,7 +2779,7 @@ var IntegrationForm = ({
|
|
|
2539
2779
|
logo: metadata.logo || null,
|
|
2540
2780
|
startTime: null,
|
|
2541
2781
|
endTime: null,
|
|
2542
|
-
uid: user?.
|
|
2782
|
+
uid: user?.user_id || "",
|
|
2543
2783
|
walletId,
|
|
2544
2784
|
clientMetadata: {
|
|
2545
2785
|
clientId,
|
|
@@ -2590,24 +2830,24 @@ var IntegrationForm = ({
|
|
|
2590
2830
|
};
|
|
2591
2831
|
const hasNoFields = !metadata.password && !metadata.secret_key && !metadata.api_key && !metadata.address && !metadata.account_name;
|
|
2592
2832
|
const shouldShowFormFields = metadata.password || metadata.secret_key || metadata.api_key || metadata.address || metadata.account_name;
|
|
2593
|
-
const renderLogo = () => metadata.logo ? /* @__PURE__ */
|
|
2594
|
-
|
|
2833
|
+
const renderLogo = () => metadata.logo ? /* @__PURE__ */ import_react30.default.createElement(
|
|
2834
|
+
import_react_native15.Image,
|
|
2595
2835
|
{
|
|
2596
2836
|
source: { uri: metadata.logo },
|
|
2597
|
-
style:
|
|
2837
|
+
style: styles14.logo,
|
|
2598
2838
|
resizeMode: "contain"
|
|
2599
2839
|
}
|
|
2600
|
-
) : /* @__PURE__ */
|
|
2601
|
-
|
|
2840
|
+
) : /* @__PURE__ */ import_react30.default.createElement(
|
|
2841
|
+
import_react_native15.View,
|
|
2602
2842
|
{
|
|
2603
2843
|
style: [
|
|
2604
|
-
|
|
2844
|
+
styles14.logoPlaceholder,
|
|
2605
2845
|
{ backgroundColor: theme.colors.surface }
|
|
2606
2846
|
]
|
|
2607
2847
|
},
|
|
2608
|
-
/* @__PURE__ */
|
|
2848
|
+
/* @__PURE__ */ import_react30.default.createElement(import_react_native15.Text, { style: { color: theme.colors.text } }, metadata.name?.charAt(0) || "?")
|
|
2609
2849
|
);
|
|
2610
|
-
const renderInput = (key, props) => /* @__PURE__ */
|
|
2850
|
+
const renderInput = (key, props) => /* @__PURE__ */ import_react30.default.createElement(
|
|
2611
2851
|
Input,
|
|
2612
2852
|
{
|
|
2613
2853
|
placeholder: props.placeholder,
|
|
@@ -2619,33 +2859,33 @@ var IntegrationForm = ({
|
|
|
2619
2859
|
secureTextEntry: props.secureTextEntry
|
|
2620
2860
|
}
|
|
2621
2861
|
);
|
|
2622
|
-
const renderErrorAlert = () => errorMessage ? /* @__PURE__ */
|
|
2623
|
-
const renderChainSelection = () => userUsedChains.length > 0 && formValues.address && /* @__PURE__ */
|
|
2862
|
+
const renderErrorAlert = () => errorMessage ? /* @__PURE__ */ import_react30.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react30.default.createElement(AlertDescription, null, errorMessage)) : null;
|
|
2863
|
+
const renderChainSelection = () => userUsedChains.length > 0 && formValues.address && /* @__PURE__ */ import_react30.default.createElement(import_react_native15.View, { style: styles14.chainSelection }, /* @__PURE__ */ import_react30.default.createElement(import_react_native15.Text, { style: [styles14.chainTitle, { color: theme.colors.text }] }, "Select Chains to Add:"), /* @__PURE__ */ import_react30.default.createElement(import_react_native15.ScrollView, { contentContainerStyle: styles14.scrollViewContent }, /* @__PURE__ */ import_react30.default.createElement(import_react_native15.View, { style: styles14.chainChips }, userUsedChains.map((chain) => {
|
|
2624
2864
|
const isSelected = selectedChains.has(chain.id);
|
|
2625
2865
|
const hasError = chainErrors[chain.id];
|
|
2626
|
-
return /* @__PURE__ */
|
|
2627
|
-
|
|
2866
|
+
return /* @__PURE__ */ import_react30.default.createElement(
|
|
2867
|
+
import_react_native15.TouchableOpacity,
|
|
2628
2868
|
{
|
|
2629
2869
|
onPress: () => toggleChainSelection(chain.id),
|
|
2630
|
-
style:
|
|
2870
|
+
style: styles14.chainButton,
|
|
2631
2871
|
key: chain.id
|
|
2632
2872
|
},
|
|
2633
|
-
/* @__PURE__ */
|
|
2634
|
-
|
|
2873
|
+
/* @__PURE__ */ import_react30.default.createElement(
|
|
2874
|
+
import_react_native15.View,
|
|
2635
2875
|
{
|
|
2636
2876
|
style: [
|
|
2637
|
-
|
|
2877
|
+
styles14.chainChip,
|
|
2638
2878
|
{
|
|
2639
2879
|
backgroundColor: hasError ? theme.colors.errorLight : isSelected ? theme.colors.primary + "20" : theme.colors.surface,
|
|
2640
2880
|
borderColor: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.border
|
|
2641
2881
|
}
|
|
2642
2882
|
]
|
|
2643
2883
|
},
|
|
2644
|
-
/* @__PURE__ */
|
|
2645
|
-
|
|
2884
|
+
/* @__PURE__ */ import_react30.default.createElement(
|
|
2885
|
+
import_react_native15.Text,
|
|
2646
2886
|
{
|
|
2647
2887
|
style: [
|
|
2648
|
-
|
|
2888
|
+
styles14.chainName,
|
|
2649
2889
|
{
|
|
2650
2890
|
color: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.text
|
|
2651
2891
|
}
|
|
@@ -2653,28 +2893,28 @@ var IntegrationForm = ({
|
|
|
2653
2893
|
},
|
|
2654
2894
|
chain.name
|
|
2655
2895
|
),
|
|
2656
|
-
isSelected ? /* @__PURE__ */
|
|
2896
|
+
isSelected ? /* @__PURE__ */ import_react30.default.createElement(
|
|
2657
2897
|
CloseIcon,
|
|
2658
2898
|
{
|
|
2659
2899
|
size: 12,
|
|
2660
2900
|
color: hasError ? theme.colors.error : theme.colors.primary
|
|
2661
2901
|
}
|
|
2662
|
-
) : /* @__PURE__ */
|
|
2902
|
+
) : /* @__PURE__ */ import_react30.default.createElement(PlusIcon, { size: 12, color: theme.colors.textSecondary })
|
|
2663
2903
|
)
|
|
2664
2904
|
);
|
|
2665
|
-
}))), Object.keys(chainErrors).length > 0 && /* @__PURE__ */
|
|
2666
|
-
|
|
2905
|
+
}))), Object.keys(chainErrors).length > 0 && /* @__PURE__ */ import_react30.default.createElement(import_react_native15.View, { style: styles14.chainErrorsContainer }, /* @__PURE__ */ import_react30.default.createElement(
|
|
2906
|
+
import_react_native15.Text,
|
|
2667
2907
|
{
|
|
2668
|
-
style: [
|
|
2908
|
+
style: [styles14.chainErrorsTitle, { color: theme.colors.error }]
|
|
2669
2909
|
},
|
|
2670
2910
|
"Errors:"
|
|
2671
2911
|
), Object.entries(chainErrors).map(([chainId, error]) => {
|
|
2672
2912
|
const chain = userUsedChains.find((c) => c.id === chainId);
|
|
2673
|
-
return /* @__PURE__ */
|
|
2674
|
-
|
|
2913
|
+
return /* @__PURE__ */ import_react30.default.createElement(
|
|
2914
|
+
import_react_native15.Text,
|
|
2675
2915
|
{
|
|
2676
2916
|
key: chainId,
|
|
2677
|
-
style: [
|
|
2917
|
+
style: [styles14.chainErrorItem, { color: theme.colors.error }]
|
|
2678
2918
|
},
|
|
2679
2919
|
"\u2022 ",
|
|
2680
2920
|
chain?.name,
|
|
@@ -2682,7 +2922,7 @@ var IntegrationForm = ({
|
|
|
2682
2922
|
error
|
|
2683
2923
|
);
|
|
2684
2924
|
})));
|
|
2685
|
-
const renderFormBlock = () => /* @__PURE__ */
|
|
2925
|
+
const renderFormBlock = () => /* @__PURE__ */ import_react30.default.createElement(import_react30.default.Fragment, null, /* @__PURE__ */ import_react30.default.createElement(import_react_native15.View, { style: styles14.header }, renderLogo(), /* @__PURE__ */ import_react30.default.createElement(import_react_native15.Text, { style: [styles14.name, { color: theme.colors.text }] }, metadata.name)), renderErrorAlert(), shouldShowFormFields && /* @__PURE__ */ import_react30.default.createElement(import_react30.default.Fragment, null, metadata.address && /* @__PURE__ */ import_react30.default.createElement(import_react30.default.Fragment, null, renderInput("address", {
|
|
2686
2926
|
placeholder: "Enter address",
|
|
2687
2927
|
autoCapitalize: "none",
|
|
2688
2928
|
autoCorrect: false
|
|
@@ -2698,27 +2938,27 @@ var IntegrationForm = ({
|
|
|
2698
2938
|
}), metadata.password && renderInput("password", {
|
|
2699
2939
|
placeholder: "Enter Password",
|
|
2700
2940
|
secureTextEntry: true
|
|
2701
|
-
})), hasNoFields && !metadata?.isWalletConnectSupported && /* @__PURE__ */
|
|
2941
|
+
})), hasNoFields && !metadata?.isWalletConnectSupported && /* @__PURE__ */ import_react30.default.createElement(Alert, { variant: "default", style: { marginTop: 12 } }, /* @__PURE__ */ import_react30.default.createElement(AlertDescription, null, "This integration is not supported here yet \u2014 try using it through our Kryptos Platform.")));
|
|
2702
2942
|
const addIntegrationLabel = formValues.address && userUsedChains.length > 0 && selectedChains.size > 0 ? `Add ${selectedChains.size} Chain${selectedChains.size !== 1 ? "s" : ""}` : "Add Integration";
|
|
2703
|
-
return /* @__PURE__ */
|
|
2704
|
-
|
|
2943
|
+
return /* @__PURE__ */ import_react30.default.createElement(import_react30.default.Fragment, null, !metadata?.isWalletConnectSupported ? /* @__PURE__ */ import_react30.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react30.default.createElement(ModalHeader, { onClose: handleClose }, /* @__PURE__ */ import_react30.default.createElement(import_react_native15.View, { style: styles14.headerContent }, /* @__PURE__ */ import_react30.default.createElement(
|
|
2944
|
+
import_react_native15.TouchableOpacity,
|
|
2705
2945
|
{
|
|
2706
2946
|
onPress: () => setAddIntegrationMode(null),
|
|
2707
|
-
style:
|
|
2947
|
+
style: styles14.backButton
|
|
2708
2948
|
},
|
|
2709
|
-
/* @__PURE__ */
|
|
2710
|
-
), /* @__PURE__ */
|
|
2949
|
+
/* @__PURE__ */ import_react30.default.createElement(ArrowLeftIcon, { size: 20, color: theme.colors.text })
|
|
2950
|
+
), /* @__PURE__ */ import_react30.default.createElement(import_react_native15.Text, { style: [styles14.headerTitle, { color: theme.colors.text }] }, "Integration"))), /* @__PURE__ */ import_react30.default.createElement(ModalBody, { scrollable: false, style: styles14.contentContainer }, renderFormBlock()), !hasNoFields && /* @__PURE__ */ import_react30.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react30.default.createElement(
|
|
2711
2951
|
Button,
|
|
2712
2952
|
{
|
|
2713
2953
|
variant: "outline",
|
|
2714
2954
|
size: "lg",
|
|
2715
2955
|
onPress: handleSubmit,
|
|
2716
2956
|
loading: isLoading,
|
|
2717
|
-
disabled: isLoading || !!formValues.address && userUsedChains.length > 0 && selectedChains.size === 0,
|
|
2718
|
-
style:
|
|
2957
|
+
disabled: isLoading || isFetchingChains || !!formValues.address && userUsedChains.length > 0 && selectedChains.size === 0,
|
|
2958
|
+
style: styles14.button
|
|
2719
2959
|
},
|
|
2720
2960
|
addIntegrationLabel
|
|
2721
|
-
))) : /* @__PURE__ */
|
|
2961
|
+
), /* @__PURE__ */ import_react30.default.createElement(Footer, null))) : /* @__PURE__ */ import_react30.default.createElement(
|
|
2722
2962
|
WalletConnectComponent,
|
|
2723
2963
|
{
|
|
2724
2964
|
integration: metadata,
|
|
@@ -2730,7 +2970,7 @@ var IntegrationForm = ({
|
|
|
2730
2970
|
}
|
|
2731
2971
|
));
|
|
2732
2972
|
};
|
|
2733
|
-
var
|
|
2973
|
+
var styles14 = import_react_native15.StyleSheet.create({
|
|
2734
2974
|
scrollViewContent: {
|
|
2735
2975
|
flexGrow: 1,
|
|
2736
2976
|
paddingBottom: 100
|
|
@@ -2847,66 +3087,9 @@ var styles10 = import_react_native11.StyleSheet.create({
|
|
|
2847
3087
|
// theme.spacing.xs
|
|
2848
3088
|
},
|
|
2849
3089
|
button: {
|
|
2850
|
-
width: "100%"
|
|
2851
|
-
marginTop: 16
|
|
2852
|
-
// theme.spacing.lg - consistent button spacing
|
|
2853
|
-
}
|
|
2854
|
-
});
|
|
2855
|
-
|
|
2856
|
-
// src/components/SkeletonItem.tsx
|
|
2857
|
-
var import_react26 = __toESM(require("react"));
|
|
2858
|
-
var import_react_native12 = require("react-native");
|
|
2859
|
-
var SkeletonItem = () => {
|
|
2860
|
-
const opacity = (0, import_react26.useRef)(new import_react_native12.Animated.Value(0.3)).current;
|
|
2861
|
-
(0, import_react26.useEffect)(() => {
|
|
2862
|
-
import_react_native12.Animated.loop(
|
|
2863
|
-
import_react_native12.Animated.sequence([
|
|
2864
|
-
import_react_native12.Animated.timing(opacity, {
|
|
2865
|
-
toValue: 1,
|
|
2866
|
-
duration: 600,
|
|
2867
|
-
useNativeDriver: true
|
|
2868
|
-
}),
|
|
2869
|
-
import_react_native12.Animated.timing(opacity, {
|
|
2870
|
-
toValue: 0.3,
|
|
2871
|
-
duration: 600,
|
|
2872
|
-
useNativeDriver: true
|
|
2873
|
-
})
|
|
2874
|
-
])
|
|
2875
|
-
).start();
|
|
2876
|
-
}, []);
|
|
2877
|
-
return /* @__PURE__ */ import_react26.default.createElement(import_react_native12.Animated.View, { style: [styles11.row, { opacity }] }, /* @__PURE__ */ import_react26.default.createElement(import_react_native12.View, { style: styles11.iconCircle }), /* @__PURE__ */ import_react26.default.createElement(import_react_native12.View, { style: styles11.textBlock }, /* @__PURE__ */ import_react26.default.createElement(import_react_native12.View, { style: styles11.lineLong }), /* @__PURE__ */ import_react26.default.createElement(import_react_native12.View, { style: styles11.lineShort })));
|
|
2878
|
-
};
|
|
2879
|
-
var styles11 = import_react_native12.StyleSheet.create({
|
|
2880
|
-
row: {
|
|
2881
|
-
flexDirection: "row",
|
|
2882
|
-
alignItems: "center",
|
|
2883
|
-
paddingVertical: 16
|
|
2884
|
-
},
|
|
2885
|
-
iconCircle: {
|
|
2886
|
-
width: 45,
|
|
2887
|
-
height: 45,
|
|
2888
|
-
borderRadius: 22.5,
|
|
2889
|
-
backgroundColor: "#E5E5E5"
|
|
2890
|
-
},
|
|
2891
|
-
textBlock: {
|
|
2892
|
-
marginLeft: 12,
|
|
2893
|
-
flex: 1
|
|
2894
|
-
},
|
|
2895
|
-
lineShort: {
|
|
2896
|
-
width: "50%",
|
|
2897
|
-
height: 14,
|
|
2898
|
-
borderRadius: 6,
|
|
2899
|
-
backgroundColor: "#E5E5E5"
|
|
2900
|
-
},
|
|
2901
|
-
lineLong: {
|
|
2902
|
-
marginBottom: 6,
|
|
2903
|
-
width: "100%",
|
|
2904
|
-
height: 14,
|
|
2905
|
-
borderRadius: 6,
|
|
2906
|
-
backgroundColor: "#E5E5E5"
|
|
3090
|
+
width: "100%"
|
|
2907
3091
|
}
|
|
2908
3092
|
});
|
|
2909
|
-
var SkeletonItem_default = SkeletonItem;
|
|
2910
3093
|
|
|
2911
3094
|
// src/molecules/Integration.tsx
|
|
2912
3095
|
var Integration = ({
|
|
@@ -2916,13 +3099,14 @@ var Integration = ({
|
|
|
2916
3099
|
}) => {
|
|
2917
3100
|
const { appName, linkToken } = useKryptosConnect();
|
|
2918
3101
|
const theme = useTheme();
|
|
2919
|
-
const [addIntegrationMode, setAddIntegrationMode] =
|
|
2920
|
-
const [query, setQuery] =
|
|
2921
|
-
const [
|
|
2922
|
-
const [
|
|
2923
|
-
const [
|
|
2924
|
-
const [
|
|
2925
|
-
const [
|
|
3102
|
+
const [addIntegrationMode, setAddIntegrationMode] = import_react31.default.useState(null);
|
|
3103
|
+
const [query, setQuery] = import_react31.default.useState("");
|
|
3104
|
+
const [activeTab, setActiveTab] = import_react31.default.useState("all");
|
|
3105
|
+
const [supportedProviders, setSupportedProviders] = import_react31.default.useState([]);
|
|
3106
|
+
const [addedIntegrations, setAddedIntegrations] = import_react31.default.useState([]);
|
|
3107
|
+
const [existingIntegrations, setExistingIntegrations] = import_react31.default.useState([]);
|
|
3108
|
+
const [isLoading, setIsLoading] = import_react31.default.useState(false);
|
|
3109
|
+
const [errorMessage, setErrorMessage] = import_react31.default.useState("");
|
|
2926
3110
|
const handleClose = () => {
|
|
2927
3111
|
onClose();
|
|
2928
3112
|
};
|
|
@@ -2953,13 +3137,13 @@ var Integration = ({
|
|
|
2953
3137
|
setIsLoading(false);
|
|
2954
3138
|
}
|
|
2955
3139
|
};
|
|
2956
|
-
|
|
3140
|
+
import_react31.default.useEffect(() => {
|
|
2957
3141
|
if (linkToken) {
|
|
2958
3142
|
fetchSupportedProviders();
|
|
2959
3143
|
fetchExistingIntegrations();
|
|
2960
3144
|
}
|
|
2961
3145
|
}, [linkToken]);
|
|
2962
|
-
const isIntegrationAdded =
|
|
3146
|
+
const isIntegrationAdded = import_react31.default.useCallback(
|
|
2963
3147
|
(publicName) => {
|
|
2964
3148
|
const integrations = [...addedIntegrations, ...existingIntegrations];
|
|
2965
3149
|
return integrations.some(
|
|
@@ -2968,7 +3152,7 @@ var Integration = ({
|
|
|
2968
3152
|
},
|
|
2969
3153
|
[addedIntegrations, existingIntegrations]
|
|
2970
3154
|
);
|
|
2971
|
-
const getIntegrationCount =
|
|
3155
|
+
const getIntegrationCount = import_react31.default.useCallback(
|
|
2972
3156
|
(publicName) => {
|
|
2973
3157
|
const integrations = [...addedIntegrations, ...existingIntegrations];
|
|
2974
3158
|
return integrations.filter(
|
|
@@ -2977,22 +3161,24 @@ var Integration = ({
|
|
|
2977
3161
|
},
|
|
2978
3162
|
[addedIntegrations, existingIntegrations]
|
|
2979
3163
|
);
|
|
2980
|
-
const filteredResults =
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
3164
|
+
const filteredResults = import_react31.default.useMemo(() => {
|
|
3165
|
+
let filtered = supportedProviders;
|
|
3166
|
+
if (activeTab !== "all") {
|
|
3167
|
+
filtered = filtered.filter((provider) => provider.type === activeTab);
|
|
3168
|
+
}
|
|
3169
|
+
if (query?.trim()) {
|
|
3170
|
+
const lowerQuery = query.trim().toLowerCase();
|
|
3171
|
+
filtered = filtered.filter((provider) => {
|
|
3172
|
+
return provider.name?.toLowerCase().includes(lowerQuery) || provider.public_name?.toLowerCase().includes(lowerQuery) || provider.id?.toLowerCase().includes(lowerQuery);
|
|
3173
|
+
});
|
|
2986
3174
|
}
|
|
2987
|
-
return [...
|
|
3175
|
+
return [...filtered].sort((a, b) => {
|
|
2988
3176
|
const countA = getIntegrationCount(a.public_name);
|
|
2989
3177
|
const countB = getIntegrationCount(b.public_name);
|
|
2990
|
-
if (countB !== countA)
|
|
2991
|
-
|
|
2992
|
-
}
|
|
2993
|
-
return a.name.localeCompare(b.name);
|
|
3178
|
+
if (countB !== countA) return countB - countA;
|
|
3179
|
+
return (a.name ?? "").localeCompare(b.name ?? "");
|
|
2994
3180
|
});
|
|
2995
|
-
}, [query, supportedProviders, getIntegrationCount]);
|
|
3181
|
+
}, [query, supportedProviders, getIntegrationCount, activeTab]);
|
|
2996
3182
|
const handleAddIntegration = async () => {
|
|
2997
3183
|
try {
|
|
2998
3184
|
setIsLoading(true);
|
|
@@ -3015,11 +3201,11 @@ var Integration = ({
|
|
|
3015
3201
|
setIsLoading(false);
|
|
3016
3202
|
}
|
|
3017
3203
|
};
|
|
3018
|
-
const renderProviderItem = ({ item }) => /* @__PURE__ */
|
|
3019
|
-
|
|
3204
|
+
const renderProviderItem = ({ item }) => /* @__PURE__ */ import_react31.default.createElement(
|
|
3205
|
+
import_react_native16.TouchableOpacity,
|
|
3020
3206
|
{
|
|
3021
3207
|
style: [
|
|
3022
|
-
|
|
3208
|
+
styles15.providerItem,
|
|
3023
3209
|
{
|
|
3024
3210
|
backgroundColor: theme.colors.surface,
|
|
3025
3211
|
borderColor: theme.colors.border
|
|
@@ -3028,44 +3214,44 @@ var Integration = ({
|
|
|
3028
3214
|
onPress: () => setAddIntegrationMode(item),
|
|
3029
3215
|
activeOpacity: 0.7
|
|
3030
3216
|
},
|
|
3031
|
-
/* @__PURE__ */
|
|
3032
|
-
|
|
3217
|
+
/* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.providerInfo }, item?.logo ? /* @__PURE__ */ import_react31.default.createElement(
|
|
3218
|
+
import_react_native16.Image,
|
|
3033
3219
|
{
|
|
3034
3220
|
source: { uri: item?.logo },
|
|
3035
|
-
style:
|
|
3221
|
+
style: styles15.providerLogo,
|
|
3036
3222
|
resizeMode: "contain"
|
|
3037
3223
|
}
|
|
3038
|
-
) : /* @__PURE__ */
|
|
3039
|
-
|
|
3224
|
+
) : /* @__PURE__ */ import_react31.default.createElement(
|
|
3225
|
+
import_react_native16.View,
|
|
3040
3226
|
{
|
|
3041
3227
|
style: [
|
|
3042
|
-
|
|
3228
|
+
styles15.providerLogoPlaceholder,
|
|
3043
3229
|
{ backgroundColor: theme.colors.surfaceSecondary }
|
|
3044
3230
|
]
|
|
3045
3231
|
},
|
|
3046
|
-
/* @__PURE__ */
|
|
3047
|
-
), /* @__PURE__ */
|
|
3048
|
-
isIntegrationAdded(item?.public_name) && /* @__PURE__ */
|
|
3049
|
-
|
|
3232
|
+
/* @__PURE__ */ import_react31.default.createElement(import_react_native16.Text, { style: { color: theme.colors.text } }, item?.name?.charAt(0) || "?")
|
|
3233
|
+
), /* @__PURE__ */ import_react31.default.createElement(import_react_native16.Text, { style: [styles15.providerName, { color: theme.colors.text }] }, item?.name + "\u200B")),
|
|
3234
|
+
isIntegrationAdded(item?.public_name) && /* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.providerStatus }, /* @__PURE__ */ import_react31.default.createElement(CheckCircleIcon, { size: 18, color: theme.colors.success }), /* @__PURE__ */ import_react31.default.createElement(
|
|
3235
|
+
import_react_native16.Text,
|
|
3050
3236
|
{
|
|
3051
3237
|
style: [
|
|
3052
|
-
|
|
3238
|
+
styles15.providerCount,
|
|
3053
3239
|
{ color: theme.colors.textSecondary }
|
|
3054
3240
|
]
|
|
3055
3241
|
},
|
|
3056
3242
|
getIntegrationCount(item?.public_name)
|
|
3057
3243
|
))
|
|
3058
3244
|
);
|
|
3059
|
-
const renderSkeletonItem = () => /* @__PURE__ */
|
|
3060
|
-
return /* @__PURE__ */
|
|
3061
|
-
|
|
3245
|
+
const renderSkeletonItem = () => /* @__PURE__ */ import_react31.default.createElement(SkeletonItem_default, null);
|
|
3246
|
+
return /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, !addIntegrationMode ? /* @__PURE__ */ import_react31.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react31.default.createElement(ModalHeader, { onClose: handleClose }, /* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.headerContent }, addIntegrationMode && /* @__PURE__ */ import_react31.default.createElement(
|
|
3247
|
+
import_react_native16.TouchableOpacity,
|
|
3062
3248
|
{
|
|
3063
3249
|
onPress: () => setAddIntegrationMode(null),
|
|
3064
|
-
style:
|
|
3250
|
+
style: styles15.backButton
|
|
3065
3251
|
},
|
|
3066
|
-
/* @__PURE__ */
|
|
3067
|
-
), /* @__PURE__ */
|
|
3068
|
-
|
|
3252
|
+
/* @__PURE__ */ import_react31.default.createElement(ArrowLeftIcon, { size: 20, color: theme.colors.text })
|
|
3253
|
+
), /* @__PURE__ */ import_react31.default.createElement(import_react_native16.Text, { style: [styles15.headerTitle, { color: theme.colors.text }] }, "Integration"))), /* @__PURE__ */ import_react31.default.createElement(ModalBody, { scrollable: false, style: styles15.noPadding }, /* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.container }, /* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.headerSection }, /* @__PURE__ */ import_react31.default.createElement(ConnectLogo, null), /* @__PURE__ */ import_react31.default.createElement(import_react_native16.Text, { style: [styles15.title, { color: theme.colors.text }] }, "Select an account to link to ", appName)), /* @__PURE__ */ import_react31.default.createElement(
|
|
3254
|
+
import_react_native16.FlatList,
|
|
3069
3255
|
{
|
|
3070
3256
|
data: isLoading ? Array.from({ length: 8 }, (_, i) => ({
|
|
3071
3257
|
id: `skeleton-${i}`,
|
|
@@ -3075,14 +3261,14 @@ var Integration = ({
|
|
|
3075
3261
|
})) : filteredResults,
|
|
3076
3262
|
keyExtractor: (item, index) => isLoading ? item.id : `provider-${item.id}-${index}`,
|
|
3077
3263
|
renderItem: isLoading ? renderSkeletonItem : renderProviderItem,
|
|
3078
|
-
style:
|
|
3264
|
+
style: styles15.list,
|
|
3079
3265
|
contentContainerStyle: [
|
|
3080
|
-
|
|
3266
|
+
styles15.listContent,
|
|
3081
3267
|
{ paddingHorizontal: theme.spacing.xl }
|
|
3082
3268
|
],
|
|
3083
3269
|
showsVerticalScrollIndicator: false,
|
|
3084
|
-
ListHeaderComponent: /* @__PURE__ */
|
|
3085
|
-
|
|
3270
|
+
ListHeaderComponent: /* @__PURE__ */ import_react31.default.createElement(
|
|
3271
|
+
import_react_native16.View,
|
|
3086
3272
|
{
|
|
3087
3273
|
style: {
|
|
3088
3274
|
paddingVertical: theme.spacing.sm + 2,
|
|
@@ -3090,29 +3276,63 @@ var Integration = ({
|
|
|
3090
3276
|
zIndex: 10
|
|
3091
3277
|
}
|
|
3092
3278
|
},
|
|
3093
|
-
/* @__PURE__ */
|
|
3279
|
+
/* @__PURE__ */ import_react31.default.createElement(
|
|
3094
3280
|
Input,
|
|
3095
3281
|
{
|
|
3096
3282
|
value: query,
|
|
3097
3283
|
onChangeText: setQuery,
|
|
3098
3284
|
placeholder: "Search Integrations...",
|
|
3099
|
-
containerStyle:
|
|
3285
|
+
containerStyle: styles15.searchInput
|
|
3100
3286
|
}
|
|
3101
|
-
)
|
|
3287
|
+
),
|
|
3288
|
+
/* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.tabsContainer }, [
|
|
3289
|
+
{ label: "All", value: "all" },
|
|
3290
|
+
{ label: "Exchanges", value: "exchange" },
|
|
3291
|
+
{ label: "Blockchains", value: "blockchain" },
|
|
3292
|
+
{ label: "Wallets", value: "wallet" }
|
|
3293
|
+
].map((tab) => /* @__PURE__ */ import_react31.default.createElement(
|
|
3294
|
+
import_react_native16.TouchableOpacity,
|
|
3295
|
+
{
|
|
3296
|
+
key: tab.value,
|
|
3297
|
+
style: [
|
|
3298
|
+
styles15.tab,
|
|
3299
|
+
{
|
|
3300
|
+
backgroundColor: activeTab === tab.value ? theme.colors.primary : theme.colors.surface,
|
|
3301
|
+
borderColor: theme.colors.border
|
|
3302
|
+
}
|
|
3303
|
+
],
|
|
3304
|
+
onPress: () => setActiveTab(
|
|
3305
|
+
tab.value
|
|
3306
|
+
),
|
|
3307
|
+
activeOpacity: 0.7
|
|
3308
|
+
},
|
|
3309
|
+
/* @__PURE__ */ import_react31.default.createElement(
|
|
3310
|
+
import_react_native16.Text,
|
|
3311
|
+
{
|
|
3312
|
+
style: [
|
|
3313
|
+
styles15.tabText,
|
|
3314
|
+
{
|
|
3315
|
+
color: activeTab === tab.value ? theme.colors.white : theme.colors.text
|
|
3316
|
+
}
|
|
3317
|
+
]
|
|
3318
|
+
},
|
|
3319
|
+
tab.label
|
|
3320
|
+
)
|
|
3321
|
+
)))
|
|
3102
3322
|
),
|
|
3103
3323
|
stickyHeaderIndices: [0],
|
|
3104
|
-
ListEmptyComponent: /* @__PURE__ */
|
|
3105
|
-
|
|
3324
|
+
ListEmptyComponent: /* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.emptyContainer }, !isLoading && /* @__PURE__ */ import_react31.default.createElement(
|
|
3325
|
+
import_react_native16.Text,
|
|
3106
3326
|
{
|
|
3107
3327
|
style: [
|
|
3108
|
-
|
|
3328
|
+
styles15.emptyText,
|
|
3109
3329
|
{ color: theme.colors.textSecondary }
|
|
3110
3330
|
]
|
|
3111
3331
|
},
|
|
3112
3332
|
query ? "No search results found" : "No supported integrations found"
|
|
3113
3333
|
))
|
|
3114
3334
|
}
|
|
3115
|
-
), errorMessage && /* @__PURE__ */
|
|
3335
|
+
), errorMessage && /* @__PURE__ */ import_react31.default.createElement(import_react_native16.View, { style: styles15.errorContainer }, /* @__PURE__ */ import_react31.default.createElement(Alert, { variant: "destructive", style: styles15.errorAlert }, /* @__PURE__ */ import_react31.default.createElement(AlertDescription, null, errorMessage))))), /* @__PURE__ */ import_react31.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react31.default.createElement(
|
|
3116
3336
|
Button,
|
|
3117
3337
|
{
|
|
3118
3338
|
variant: "outline",
|
|
@@ -3120,10 +3340,10 @@ var Integration = ({
|
|
|
3120
3340
|
onPress: handleAddIntegration,
|
|
3121
3341
|
loading: isLoading,
|
|
3122
3342
|
disabled: isLoading,
|
|
3123
|
-
style:
|
|
3343
|
+
style: styles15.continueButton
|
|
3124
3344
|
},
|
|
3125
3345
|
"Continue"
|
|
3126
|
-
))) : /* @__PURE__ */
|
|
3346
|
+
), /* @__PURE__ */ import_react31.default.createElement(Footer, null))) : /* @__PURE__ */ import_react31.default.createElement(
|
|
3127
3347
|
IntegrationForm,
|
|
3128
3348
|
{
|
|
3129
3349
|
metadata: addIntegrationMode,
|
|
@@ -3137,7 +3357,7 @@ var Integration = ({
|
|
|
3137
3357
|
}
|
|
3138
3358
|
));
|
|
3139
3359
|
};
|
|
3140
|
-
var
|
|
3360
|
+
var styles15 = import_react_native16.StyleSheet.create({
|
|
3141
3361
|
headerContent: {
|
|
3142
3362
|
flexDirection: "row",
|
|
3143
3363
|
alignItems: "center"
|
|
@@ -3160,10 +3380,9 @@ var styles12 = import_react_native13.StyleSheet.create({
|
|
|
3160
3380
|
flex: 1
|
|
3161
3381
|
},
|
|
3162
3382
|
headerSection: {
|
|
3163
|
-
paddingHorizontal: 20
|
|
3164
|
-
// theme.spacing.xl
|
|
3165
|
-
paddingTop: 10
|
|
3383
|
+
paddingHorizontal: 20
|
|
3166
3384
|
// theme.spacing.xl
|
|
3385
|
+
// paddingTop: 10, // theme.spacing.xl
|
|
3167
3386
|
},
|
|
3168
3387
|
title: {
|
|
3169
3388
|
fontSize: 16,
|
|
@@ -3252,25 +3471,47 @@ var styles12 = import_react_native13.StyleSheet.create({
|
|
|
3252
3471
|
errorAlert: {
|
|
3253
3472
|
marginTop: 16
|
|
3254
3473
|
// theme.spacing.lg - consistent alert spacing
|
|
3474
|
+
},
|
|
3475
|
+
tabsContainer: {
|
|
3476
|
+
flexDirection: "row",
|
|
3477
|
+
gap: 4,
|
|
3478
|
+
// theme.spacing.sm
|
|
3479
|
+
flexWrap: "wrap"
|
|
3480
|
+
},
|
|
3481
|
+
tab: {
|
|
3482
|
+
paddingVertical: 8,
|
|
3483
|
+
// theme.spacing.sm
|
|
3484
|
+
paddingHorizontal: 16,
|
|
3485
|
+
// theme.spacing.lg
|
|
3486
|
+
borderRadius: 20,
|
|
3487
|
+
// theme.borderRadius.full / 2
|
|
3488
|
+
borderWidth: 1,
|
|
3489
|
+
alignItems: "center",
|
|
3490
|
+
justifyContent: "center"
|
|
3491
|
+
},
|
|
3492
|
+
tabText: {
|
|
3493
|
+
fontSize: 13,
|
|
3494
|
+
// theme.fontSize.sm
|
|
3495
|
+
fontWeight: "600"
|
|
3255
3496
|
}
|
|
3256
3497
|
});
|
|
3257
3498
|
|
|
3258
3499
|
// src/molecules/OTPVerify.tsx
|
|
3259
|
-
var
|
|
3260
|
-
var
|
|
3500
|
+
var import_react32 = __toESM(require("react"));
|
|
3501
|
+
var import_react_native17 = require("react-native");
|
|
3261
3502
|
var OTPVerify = ({
|
|
3262
3503
|
open,
|
|
3263
3504
|
onSuccess,
|
|
3264
3505
|
onClose
|
|
3265
3506
|
}) => {
|
|
3266
3507
|
const theme = useTheme();
|
|
3267
|
-
const [otp, setOtp] =
|
|
3508
|
+
const [otp, setOtp] = import_react32.default.useState("");
|
|
3268
3509
|
const { linkToken, clientId, email, setUser } = useKryptosConnect();
|
|
3269
|
-
const [isLoading, setIsLoading] =
|
|
3270
|
-
const [isResending, setIsResending] =
|
|
3271
|
-
const [resendCooldown, setResendCooldown] =
|
|
3272
|
-
const [errorMessage, setErrorMessage] =
|
|
3273
|
-
const [successMessage, setSuccessMessage] =
|
|
3510
|
+
const [isLoading, setIsLoading] = import_react32.default.useState(false);
|
|
3511
|
+
const [isResending, setIsResending] = import_react32.default.useState(false);
|
|
3512
|
+
const [resendCooldown, setResendCooldown] = import_react32.default.useState(0);
|
|
3513
|
+
const [errorMessage, setErrorMessage] = import_react32.default.useState("");
|
|
3514
|
+
const [successMessage, setSuccessMessage] = import_react32.default.useState("");
|
|
3274
3515
|
const handleSubmit = async () => {
|
|
3275
3516
|
if (otp.length !== 6) return;
|
|
3276
3517
|
setIsLoading(true);
|
|
@@ -3321,7 +3562,7 @@ var OTPVerify = ({
|
|
|
3321
3562
|
setSuccessMessage("");
|
|
3322
3563
|
setOtp("");
|
|
3323
3564
|
};
|
|
3324
|
-
|
|
3565
|
+
import_react32.default.useEffect(() => {
|
|
3325
3566
|
if (resendCooldown > 0) {
|
|
3326
3567
|
const timer = setTimeout(() => {
|
|
3327
3568
|
setResendCooldown(resendCooldown - 1);
|
|
@@ -3330,13 +3571,20 @@ var OTPVerify = ({
|
|
|
3330
3571
|
}
|
|
3331
3572
|
return void 0;
|
|
3332
3573
|
}, [resendCooldown]);
|
|
3333
|
-
return /* @__PURE__ */
|
|
3334
|
-
|
|
3574
|
+
return /* @__PURE__ */ import_react32.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "lg" }, /* @__PURE__ */ import_react32.default.createElement(ModalHeader, { onClose: handleClose }, /* @__PURE__ */ import_react32.default.createElement(import_react_native17.View, { style: styles16.headerContent }, /* @__PURE__ */ import_react32.default.createElement(import_react_native17.Text, { style: [styles16.headerTitle, { color: theme.colors.text }] }, "OTP Verification"))), /* @__PURE__ */ import_react32.default.createElement(ModalBody, null, /* @__PURE__ */ import_react32.default.createElement(import_react_native17.View, { style: styles16.container }, /* @__PURE__ */ import_react32.default.createElement(ConnectLogo, null), /* @__PURE__ */ import_react32.default.createElement(import_react_native17.View, { style: styles16.emailInfo }, /* @__PURE__ */ import_react32.default.createElement(
|
|
3575
|
+
import_react_native17.Text,
|
|
3335
3576
|
{
|
|
3336
|
-
style: [
|
|
3577
|
+
style: [styles16.infoText, { color: theme.colors.textSecondary }]
|
|
3337
3578
|
},
|
|
3338
3579
|
"We have sent a verification code to"
|
|
3339
|
-
), /* @__PURE__ */
|
|
3580
|
+
), /* @__PURE__ */ import_react32.default.createElement(import_react_native17.Text, { style: [styles16.emailText, { color: theme.colors.text }] }, email)), /* @__PURE__ */ import_react32.default.createElement(
|
|
3581
|
+
OTP,
|
|
3582
|
+
{
|
|
3583
|
+
onComplete: handleOtpComplete,
|
|
3584
|
+
length: 6,
|
|
3585
|
+
setErrorMessage
|
|
3586
|
+
}
|
|
3587
|
+
), errorMessage ? /* @__PURE__ */ import_react32.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react32.default.createElement(AlertDescription, null, errorMessage)) : null, successMessage ? /* @__PURE__ */ import_react32.default.createElement(Alert, { variant: "default" }, /* @__PURE__ */ import_react32.default.createElement(AlertDescription, null, successMessage)) : null, /* @__PURE__ */ import_react32.default.createElement(
|
|
3340
3588
|
Button,
|
|
3341
3589
|
{
|
|
3342
3590
|
variant: "outline",
|
|
@@ -3344,44 +3592,44 @@ var OTPVerify = ({
|
|
|
3344
3592
|
onPress: handleSubmit,
|
|
3345
3593
|
loading: isLoading,
|
|
3346
3594
|
disabled: otp.length !== 6 || isLoading,
|
|
3347
|
-
style:
|
|
3595
|
+
style: styles16.button
|
|
3348
3596
|
},
|
|
3349
3597
|
"Continue"
|
|
3350
|
-
), /* @__PURE__ */
|
|
3351
|
-
|
|
3598
|
+
), /* @__PURE__ */ import_react32.default.createElement(
|
|
3599
|
+
import_react_native17.TouchableOpacity,
|
|
3352
3600
|
{
|
|
3353
3601
|
onPress: handleResendOtp,
|
|
3354
3602
|
disabled: resendCooldown > 0 || isResending,
|
|
3355
|
-
style:
|
|
3603
|
+
style: styles16.resendContainer
|
|
3356
3604
|
},
|
|
3357
|
-
isResending ? /* @__PURE__ */
|
|
3358
|
-
|
|
3605
|
+
isResending ? /* @__PURE__ */ import_react32.default.createElement(import_react_native17.View, { style: styles16.resendLoading }, /* @__PURE__ */ import_react32.default.createElement(LoaderIcon, { size: 16, color: theme.colors.primary }), /* @__PURE__ */ import_react32.default.createElement(
|
|
3606
|
+
import_react_native17.Text,
|
|
3359
3607
|
{
|
|
3360
|
-
style: [
|
|
3608
|
+
style: [styles16.resendText, { color: theme.colors.primary }]
|
|
3361
3609
|
},
|
|
3362
3610
|
" ",
|
|
3363
3611
|
"Sending..."
|
|
3364
|
-
)) : resendCooldown > 0 ? /* @__PURE__ */
|
|
3365
|
-
|
|
3612
|
+
)) : resendCooldown > 0 ? /* @__PURE__ */ import_react32.default.createElement(
|
|
3613
|
+
import_react_native17.Text,
|
|
3366
3614
|
{
|
|
3367
3615
|
style: [
|
|
3368
|
-
|
|
3616
|
+
styles16.resendText,
|
|
3369
3617
|
{ color: theme.colors.textSecondary }
|
|
3370
3618
|
]
|
|
3371
3619
|
},
|
|
3372
3620
|
"Resend OTP in ",
|
|
3373
3621
|
resendCooldown,
|
|
3374
3622
|
"s"
|
|
3375
|
-
) : /* @__PURE__ */
|
|
3376
|
-
|
|
3623
|
+
) : /* @__PURE__ */ import_react32.default.createElement(
|
|
3624
|
+
import_react_native17.Text,
|
|
3377
3625
|
{
|
|
3378
|
-
style: [
|
|
3626
|
+
style: [styles16.resendText, { color: theme.colors.primary }]
|
|
3379
3627
|
},
|
|
3380
3628
|
"Resend OTP"
|
|
3381
3629
|
)
|
|
3382
|
-
))));
|
|
3630
|
+
))), /* @__PURE__ */ import_react32.default.createElement(ModalFooter, { style: { paddingVertical: 0 } }, /* @__PURE__ */ import_react32.default.createElement(Footer, null)));
|
|
3383
3631
|
};
|
|
3384
|
-
var
|
|
3632
|
+
var styles16 = import_react_native17.StyleSheet.create({
|
|
3385
3633
|
headerContent: {
|
|
3386
3634
|
flexDirection: "row",
|
|
3387
3635
|
alignItems: "center"
|
|
@@ -3440,8 +3688,8 @@ var styles13 = import_react_native14.StyleSheet.create({
|
|
|
3440
3688
|
});
|
|
3441
3689
|
|
|
3442
3690
|
// src/molecules/Permissions.tsx
|
|
3443
|
-
var
|
|
3444
|
-
var
|
|
3691
|
+
var import_react33 = __toESM(require("react"));
|
|
3692
|
+
var import_react_native18 = require("react-native");
|
|
3445
3693
|
var Permissions = ({
|
|
3446
3694
|
open,
|
|
3447
3695
|
onClose,
|
|
@@ -3449,8 +3697,8 @@ var Permissions = ({
|
|
|
3449
3697
|
}) => {
|
|
3450
3698
|
const { appName, linkToken, setUserConsent } = useKryptosConnect();
|
|
3451
3699
|
const theme = useTheme();
|
|
3452
|
-
const [isLoading, setIsLoading] =
|
|
3453
|
-
const [errorMessage, setErrorMessage] =
|
|
3700
|
+
const [isLoading, setIsLoading] = import_react33.default.useState(false);
|
|
3701
|
+
const [errorMessage, setErrorMessage] = import_react33.default.useState("");
|
|
3454
3702
|
const handleConsentClick = async () => {
|
|
3455
3703
|
try {
|
|
3456
3704
|
setIsLoading(true);
|
|
@@ -3473,42 +3721,42 @@ var Permissions = ({
|
|
|
3473
3721
|
"Access your transaction history and trading activity",
|
|
3474
3722
|
"Keep this data updated and accessible when you're offline"
|
|
3475
3723
|
];
|
|
3476
|
-
return /* @__PURE__ */
|
|
3477
|
-
|
|
3724
|
+
return /* @__PURE__ */ import_react33.default.createElement(Modal, { isOpen: open, onClose, size: "xl" }, /* @__PURE__ */ import_react33.default.createElement(ModalHeader, { onClose }, "Permissions"), /* @__PURE__ */ import_react33.default.createElement(ModalBody, null, /* @__PURE__ */ import_react33.default.createElement(import_react_native18.View, { style: styles17.container }, /* @__PURE__ */ import_react33.default.createElement(ConnectLogo, null), errorMessage ? /* @__PURE__ */ import_react33.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react33.default.createElement(AlertDescription, null, errorMessage)) : null, /* @__PURE__ */ import_react33.default.createElement(import_react_native18.View, { style: styles17.permissionsList }, /* @__PURE__ */ import_react33.default.createElement(
|
|
3725
|
+
import_react_native18.Text,
|
|
3478
3726
|
{
|
|
3479
|
-
style: [
|
|
3727
|
+
style: [styles17.subtitle, { color: theme.colors.textSecondary }]
|
|
3480
3728
|
},
|
|
3481
3729
|
"Allow ",
|
|
3482
3730
|
appName,
|
|
3483
3731
|
" to:"
|
|
3484
|
-
), permissionItems.map((item, index) => /* @__PURE__ */
|
|
3485
|
-
|
|
3732
|
+
), permissionItems.map((item, index) => /* @__PURE__ */ import_react33.default.createElement(import_react_native18.View, { key: `permission-${index}`, style: styles17.permissionItem }, /* @__PURE__ */ import_react33.default.createElement(import_react_native18.Text, { style: [styles17.bullet, { color: theme.colors.primary }] }, index + 1, "."), /* @__PURE__ */ import_react33.default.createElement(
|
|
3733
|
+
import_react_native18.Text,
|
|
3486
3734
|
{
|
|
3487
|
-
style: [
|
|
3735
|
+
style: [styles17.permissionText, { color: theme.colors.text }]
|
|
3488
3736
|
},
|
|
3489
3737
|
item
|
|
3490
|
-
)))), /* @__PURE__ */
|
|
3491
|
-
|
|
3738
|
+
)))), /* @__PURE__ */ import_react33.default.createElement(
|
|
3739
|
+
import_react_native18.View,
|
|
3492
3740
|
{
|
|
3493
3741
|
style: [
|
|
3494
|
-
|
|
3742
|
+
styles17.infoBox,
|
|
3495
3743
|
{
|
|
3496
3744
|
backgroundColor: theme.colors.surface,
|
|
3497
3745
|
borderColor: theme.colors.border
|
|
3498
3746
|
}
|
|
3499
3747
|
]
|
|
3500
3748
|
},
|
|
3501
|
-
/* @__PURE__ */
|
|
3502
|
-
|
|
3749
|
+
/* @__PURE__ */ import_react33.default.createElement(
|
|
3750
|
+
import_react_native18.Text,
|
|
3503
3751
|
{
|
|
3504
|
-
style: [
|
|
3752
|
+
style: [styles17.infoText, { color: theme.colors.textSecondary }]
|
|
3505
3753
|
},
|
|
3506
3754
|
"By selecting",
|
|
3507
3755
|
" ",
|
|
3508
|
-
/* @__PURE__ */
|
|
3756
|
+
/* @__PURE__ */ import_react33.default.createElement(import_react_native18.Text, { style: { fontWeight: "600", color: theme.colors.text } }, "'Allow'"),
|
|
3509
3757
|
", you agree to share this information and keep it updated."
|
|
3510
3758
|
)
|
|
3511
|
-
))), /* @__PURE__ */
|
|
3759
|
+
))), /* @__PURE__ */ import_react33.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react33.default.createElement(
|
|
3512
3760
|
Button,
|
|
3513
3761
|
{
|
|
3514
3762
|
variant: "outline",
|
|
@@ -3516,12 +3764,12 @@ var Permissions = ({
|
|
|
3516
3764
|
onPress: handleConsentClick,
|
|
3517
3765
|
loading: isLoading,
|
|
3518
3766
|
disabled: isLoading,
|
|
3519
|
-
style:
|
|
3767
|
+
style: styles17.button
|
|
3520
3768
|
},
|
|
3521
3769
|
"Allow"
|
|
3522
|
-
)));
|
|
3770
|
+
), /* @__PURE__ */ import_react33.default.createElement(Footer, null)));
|
|
3523
3771
|
};
|
|
3524
|
-
var
|
|
3772
|
+
var styles17 = import_react_native18.StyleSheet.create({
|
|
3525
3773
|
container: {
|
|
3526
3774
|
flex: 1
|
|
3527
3775
|
},
|
|
@@ -3579,8 +3827,8 @@ var styles14 = import_react_native15.StyleSheet.create({
|
|
|
3579
3827
|
});
|
|
3580
3828
|
|
|
3581
3829
|
// src/molecules/StatusModal.tsx
|
|
3582
|
-
var
|
|
3583
|
-
var
|
|
3830
|
+
var import_react34 = __toESM(require("react"));
|
|
3831
|
+
var import_react_native19 = require("react-native");
|
|
3584
3832
|
var StatusModal = ({
|
|
3585
3833
|
open,
|
|
3586
3834
|
onClose,
|
|
@@ -3597,18 +3845,18 @@ var StatusModal = ({
|
|
|
3597
3845
|
}
|
|
3598
3846
|
onClose();
|
|
3599
3847
|
};
|
|
3600
|
-
return /* @__PURE__ */
|
|
3848
|
+
return /* @__PURE__ */ import_react34.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "sm" }, /* @__PURE__ */ import_react34.default.createElement(ModalHeader, { showCloseButton: false, onClose: handleClose }, ""), /* @__PURE__ */ import_react34.default.createElement(ModalBody, null, /* @__PURE__ */ import_react34.default.createElement(import_react_native19.View, { style: styles18.container }, /* @__PURE__ */ import_react34.default.createElement(import_react_native19.View, { style: styles18.iconContainer }, status === "success" ? /* @__PURE__ */ import_react34.default.createElement(SuccessIcon, { size: 80 }) : /* @__PURE__ */ import_react34.default.createElement(ErrorIcon, { size: 80 })), /* @__PURE__ */ import_react34.default.createElement(import_react_native19.Text, { style: [styles18.message, { color: theme.colors.text }] }, status === "success" ? "Connection successful" : "Connection failed"))), /* @__PURE__ */ import_react34.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react34.default.createElement(
|
|
3601
3849
|
Button,
|
|
3602
3850
|
{
|
|
3603
3851
|
variant: "outline",
|
|
3604
3852
|
size: "lg",
|
|
3605
3853
|
onPress: status === "success" ? onSuccess : onError,
|
|
3606
|
-
style:
|
|
3854
|
+
style: styles18.button
|
|
3607
3855
|
},
|
|
3608
3856
|
status === "success" ? "Continue" : "Try again later"
|
|
3609
|
-
))));
|
|
3857
|
+
), /* @__PURE__ */ import_react34.default.createElement(Footer, null)));
|
|
3610
3858
|
};
|
|
3611
|
-
var
|
|
3859
|
+
var styles18 = import_react_native19.StyleSheet.create({
|
|
3612
3860
|
container: {
|
|
3613
3861
|
flex: 1,
|
|
3614
3862
|
alignItems: "center",
|
|
@@ -3632,6 +3880,64 @@ var styles15 = import_react_native16.StyleSheet.create({
|
|
|
3632
3880
|
}
|
|
3633
3881
|
});
|
|
3634
3882
|
|
|
3883
|
+
// src/molecules/EndModal.tsx
|
|
3884
|
+
var import_react35 = __toESM(require("react"));
|
|
3885
|
+
var import_react_native20 = require("react-native");
|
|
3886
|
+
var EndModal = ({ open, onClose }) => {
|
|
3887
|
+
const theme = useTheme();
|
|
3888
|
+
(0, import_react35.useEffect)(() => {
|
|
3889
|
+
if (!open) return;
|
|
3890
|
+
const timer = setTimeout(() => {
|
|
3891
|
+
onClose();
|
|
3892
|
+
}, 5e3);
|
|
3893
|
+
return () => clearTimeout(timer);
|
|
3894
|
+
}, []);
|
|
3895
|
+
return /* @__PURE__ */ import_react35.default.createElement(Modal, { isOpen: open, onClose, size: "md" }, /* @__PURE__ */ import_react35.default.createElement(ModalHeader, { onClose }, ""), /* @__PURE__ */ import_react35.default.createElement(ModalBody, null, /* @__PURE__ */ import_react35.default.createElement(import_react_native20.View, { style: styles19.container }, /* @__PURE__ */ import_react35.default.createElement(
|
|
3896
|
+
import_react_native20.View,
|
|
3897
|
+
{
|
|
3898
|
+
style: [
|
|
3899
|
+
styles19.iconContainer,
|
|
3900
|
+
{ backgroundColor: theme.colors.successLight }
|
|
3901
|
+
]
|
|
3902
|
+
},
|
|
3903
|
+
/* @__PURE__ */ import_react35.default.createElement(SuccessIcon, { size: 80 })
|
|
3904
|
+
), /* @__PURE__ */ import_react35.default.createElement(import_react_native20.Text, { style: [styles19.message, { color: theme.colors.text }] }, `All set! We're redirecting you back to the app. If it takes longer
|
|
3905
|
+
than expected, tap the button below to continue.`))), /* @__PURE__ */ import_react35.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react35.default.createElement(
|
|
3906
|
+
Button,
|
|
3907
|
+
{
|
|
3908
|
+
variant: "primary",
|
|
3909
|
+
size: "lg",
|
|
3910
|
+
onPress: onClose,
|
|
3911
|
+
style: styles19.button
|
|
3912
|
+
},
|
|
3913
|
+
"Continue to App"
|
|
3914
|
+
), /* @__PURE__ */ import_react35.default.createElement(Footer, null)));
|
|
3915
|
+
};
|
|
3916
|
+
var styles19 = import_react_native20.StyleSheet.create({
|
|
3917
|
+
container: {
|
|
3918
|
+
alignItems: "center",
|
|
3919
|
+
paddingVertical: 20
|
|
3920
|
+
},
|
|
3921
|
+
iconContainer: {
|
|
3922
|
+
width: 80,
|
|
3923
|
+
height: 80,
|
|
3924
|
+
borderRadius: 40,
|
|
3925
|
+
alignItems: "center",
|
|
3926
|
+
justifyContent: "center",
|
|
3927
|
+
marginBottom: 20
|
|
3928
|
+
},
|
|
3929
|
+
message: {
|
|
3930
|
+
fontSize: 14,
|
|
3931
|
+
textAlign: "center",
|
|
3932
|
+
lineHeight: 20,
|
|
3933
|
+
marginBottom: 24,
|
|
3934
|
+
paddingHorizontal: 20
|
|
3935
|
+
},
|
|
3936
|
+
button: {
|
|
3937
|
+
width: "100%"
|
|
3938
|
+
}
|
|
3939
|
+
});
|
|
3940
|
+
|
|
3635
3941
|
// src/KryptosConnectButton.tsx
|
|
3636
3942
|
var KryptosConnectButton = ({
|
|
3637
3943
|
children,
|
|
@@ -3642,14 +3948,14 @@ var KryptosConnectButton = ({
|
|
|
3642
3948
|
textStyle
|
|
3643
3949
|
}) => {
|
|
3644
3950
|
const { theme: themeName } = useKryptosConnect();
|
|
3645
|
-
const [open, setOpen] =
|
|
3951
|
+
const [open, setOpen] = import_react36.default.useState(false);
|
|
3646
3952
|
const theme = useTheme();
|
|
3647
|
-
return /* @__PURE__ */
|
|
3648
|
-
|
|
3953
|
+
return /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, children ? /* @__PURE__ */ import_react36.default.createElement(import_react_native21.TouchableOpacity, { onPress: () => setOpen(true), style }, children) : /* @__PURE__ */ import_react36.default.createElement(
|
|
3954
|
+
import_react_native21.TouchableOpacity,
|
|
3649
3955
|
{
|
|
3650
3956
|
onPress: () => setOpen(true),
|
|
3651
3957
|
style: [
|
|
3652
|
-
|
|
3958
|
+
styles20.defaultButton,
|
|
3653
3959
|
themeName === "light" ? {
|
|
3654
3960
|
backgroundColor: theme.colors.white,
|
|
3655
3961
|
borderRadius: theme.borderRadius.md,
|
|
@@ -3663,11 +3969,11 @@ var KryptosConnectButton = ({
|
|
|
3663
3969
|
],
|
|
3664
3970
|
activeOpacity: 0.8
|
|
3665
3971
|
},
|
|
3666
|
-
/* @__PURE__ */
|
|
3667
|
-
|
|
3972
|
+
/* @__PURE__ */ import_react36.default.createElement(
|
|
3973
|
+
import_react_native21.Text,
|
|
3668
3974
|
{
|
|
3669
3975
|
style: [
|
|
3670
|
-
|
|
3976
|
+
styles20.buttonText,
|
|
3671
3977
|
{
|
|
3672
3978
|
color: themeName === "light" ? theme.colors.primary : theme.colors.white,
|
|
3673
3979
|
fontSize: theme.fontSize.lg
|
|
@@ -3678,8 +3984,8 @@ var KryptosConnectButton = ({
|
|
|
3678
3984
|
"Connect with",
|
|
3679
3985
|
" "
|
|
3680
3986
|
),
|
|
3681
|
-
/* @__PURE__ */
|
|
3682
|
-
), /* @__PURE__ */
|
|
3987
|
+
/* @__PURE__ */ import_react36.default.createElement(LogoIcon, { size: 24 })
|
|
3988
|
+
), /* @__PURE__ */ import_react36.default.createElement(
|
|
3683
3989
|
KryptosConnectModal,
|
|
3684
3990
|
{
|
|
3685
3991
|
open,
|
|
@@ -3703,9 +4009,11 @@ var KryptosConnectModal = ({
|
|
|
3703
4009
|
setUserConsent,
|
|
3704
4010
|
setUser,
|
|
3705
4011
|
setEmail,
|
|
3706
|
-
setLinkToken
|
|
4012
|
+
setLinkToken,
|
|
4013
|
+
isAuthorized,
|
|
4014
|
+
linkToken
|
|
3707
4015
|
} = useKryptosConnect();
|
|
3708
|
-
const [step, setStep] =
|
|
4016
|
+
const [step, setStep] = import_react36.default.useState("INIT" /* INIT */);
|
|
3709
4017
|
const handleClose = () => {
|
|
3710
4018
|
setOpen(false);
|
|
3711
4019
|
setIsInitialized(false);
|
|
@@ -3723,12 +4031,25 @@ var KryptosConnectModal = ({
|
|
|
3723
4031
|
onError?.(userConsent);
|
|
3724
4032
|
handleClose();
|
|
3725
4033
|
};
|
|
4034
|
+
const handleConsentClick = async () => {
|
|
4035
|
+
try {
|
|
4036
|
+
if (isAuthorized) {
|
|
4037
|
+
setStep("END" /* END */);
|
|
4038
|
+
return;
|
|
4039
|
+
}
|
|
4040
|
+
const res = await giveUserConsent(linkToken);
|
|
4041
|
+
setUserConsent(res);
|
|
4042
|
+
setStep("STATUS" /* STATUS */);
|
|
4043
|
+
} catch (error) {
|
|
4044
|
+
console.error(error);
|
|
4045
|
+
}
|
|
4046
|
+
};
|
|
3726
4047
|
const handleAbort = () => {
|
|
3727
4048
|
onError?.(new Error("User closed the modal"));
|
|
3728
4049
|
handleClose();
|
|
3729
4050
|
};
|
|
3730
4051
|
if (!open) return null;
|
|
3731
|
-
return /* @__PURE__ */
|
|
4052
|
+
return /* @__PURE__ */ import_react36.default.createElement(import_react_native21.View, { style: styles20.container }, step === "INIT" /* INIT */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3732
4053
|
Init,
|
|
3733
4054
|
{
|
|
3734
4055
|
open,
|
|
@@ -3742,7 +4063,7 @@ var KryptosConnectModal = ({
|
|
|
3742
4063
|
},
|
|
3743
4064
|
onClose: handleAbort
|
|
3744
4065
|
}
|
|
3745
|
-
), step === "AUTH" /* AUTH */ && /* @__PURE__ */
|
|
4066
|
+
), step === "AUTH" /* AUTH */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3746
4067
|
Auth,
|
|
3747
4068
|
{
|
|
3748
4069
|
open,
|
|
@@ -3750,28 +4071,28 @@ var KryptosConnectModal = ({
|
|
|
3750
4071
|
onGuestSuccess: () => setStep("INTEGRATION" /* INTEGRATION */),
|
|
3751
4072
|
onClose: handleAbort
|
|
3752
4073
|
}
|
|
3753
|
-
), step === "OTP" /* OTP */ && /* @__PURE__ */
|
|
4074
|
+
), step === "OTP" /* OTP */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3754
4075
|
OTPVerify,
|
|
3755
4076
|
{
|
|
3756
4077
|
open,
|
|
3757
4078
|
onSuccess: () => setStep("INTEGRATION" /* INTEGRATION */),
|
|
3758
4079
|
onClose: handleAbort
|
|
3759
4080
|
}
|
|
3760
|
-
), step === "INTEGRATION" /* INTEGRATION */ && /* @__PURE__ */
|
|
4081
|
+
), step === "INTEGRATION" /* INTEGRATION */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3761
4082
|
Integration,
|
|
3762
4083
|
{
|
|
3763
4084
|
open,
|
|
3764
|
-
onSuccess:
|
|
4085
|
+
onSuccess: handleConsentClick,
|
|
3765
4086
|
onClose: handleAbort
|
|
3766
4087
|
}
|
|
3767
|
-
), step === "PERMISSIONS" /* PERMISSIONS */ && /* @__PURE__ */
|
|
4088
|
+
), step === "PERMISSIONS" /* PERMISSIONS */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3768
4089
|
Permissions,
|
|
3769
4090
|
{
|
|
3770
4091
|
open,
|
|
3771
4092
|
onClose: handleAbort,
|
|
3772
4093
|
onSuccess: () => setStep("STATUS" /* STATUS */)
|
|
3773
4094
|
}
|
|
3774
|
-
), step === "STATUS" /* STATUS */ && /* @__PURE__ */
|
|
4095
|
+
), step === "STATUS" /* STATUS */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3775
4096
|
StatusModal,
|
|
3776
4097
|
{
|
|
3777
4098
|
open,
|
|
@@ -3780,9 +4101,19 @@ var KryptosConnectModal = ({
|
|
|
3780
4101
|
onError: handleError,
|
|
3781
4102
|
status: userConsent?.public_token ? "success" : "error"
|
|
3782
4103
|
}
|
|
4104
|
+
), step === "END" /* END */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
4105
|
+
EndModal,
|
|
4106
|
+
{
|
|
4107
|
+
open,
|
|
4108
|
+
onClose: () => {
|
|
4109
|
+
onSuccess?.(userConsent);
|
|
4110
|
+
setStep("INIT" /* INIT */);
|
|
4111
|
+
setOpen(false);
|
|
4112
|
+
}
|
|
4113
|
+
}
|
|
3783
4114
|
));
|
|
3784
4115
|
};
|
|
3785
|
-
var
|
|
4116
|
+
var styles20 = import_react_native21.StyleSheet.create({
|
|
3786
4117
|
defaultButton: {
|
|
3787
4118
|
flexDirection: "row",
|
|
3788
4119
|
alignItems: "center",
|