@kryptos_connect/mobile-sdk 0.0.1 → 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 +342 -41
- package/dist/index.d.mts +24 -19
- package/dist/index.d.ts +24 -19
- package/dist/index.js +1239 -930
- package/dist/index.mjs +1261 -946
- 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,145 +431,9 @@ var useTheme = () => {
|
|
|
266
431
|
return currentTheme;
|
|
267
432
|
};
|
|
268
433
|
|
|
269
|
-
// src/
|
|
270
|
-
var import_react13 = __toESM(require("react"));
|
|
271
|
-
var import_react_native6 = 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 Alert = ({
|
|
333
|
-
variant = "default",
|
|
334
|
-
children,
|
|
335
|
-
style
|
|
336
|
-
}) => {
|
|
337
|
-
const theme = useTheme();
|
|
338
|
-
const getVariantStyles = () => {
|
|
339
|
-
switch (variant) {
|
|
340
|
-
case "destructive":
|
|
341
|
-
return {
|
|
342
|
-
backgroundColor: theme.colors.errorLight,
|
|
343
|
-
borderColor: theme.colors.error
|
|
344
|
-
};
|
|
345
|
-
default:
|
|
346
|
-
return {
|
|
347
|
-
backgroundColor: theme.colors.surface,
|
|
348
|
-
borderColor: theme.colors.border
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
};
|
|
352
|
-
return /* @__PURE__ */ import_react6.default.createElement(
|
|
353
|
-
import_react_native.View,
|
|
354
|
-
{
|
|
355
|
-
style: [
|
|
356
|
-
styles.alert,
|
|
357
|
-
{
|
|
358
|
-
borderRadius: theme.borderRadius.md,
|
|
359
|
-
padding: theme.spacing.md
|
|
360
|
-
},
|
|
361
|
-
getVariantStyles(),
|
|
362
|
-
style
|
|
363
|
-
]
|
|
364
|
-
},
|
|
365
|
-
children
|
|
366
|
-
);
|
|
367
|
-
};
|
|
368
|
-
var AlertDescription = ({
|
|
369
|
-
children,
|
|
370
|
-
style
|
|
371
|
-
}) => {
|
|
372
|
-
const theme = useTheme();
|
|
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
437
|
var Button = ({
|
|
409
438
|
variant = "primary",
|
|
410
439
|
size = "md",
|
|
@@ -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",
|
|
@@ -566,8 +595,8 @@ var styles2 = import_react_native2.StyleSheet.create({
|
|
|
566
595
|
});
|
|
567
596
|
|
|
568
597
|
// src/components/Input.tsx
|
|
569
|
-
var
|
|
570
|
-
var
|
|
598
|
+
var import_react5 = __toESM(require("react"));
|
|
599
|
+
var import_react_native2 = require("react-native");
|
|
571
600
|
var Input = ({
|
|
572
601
|
label,
|
|
573
602
|
error,
|
|
@@ -590,22 +619,22 @@ var Input = ({
|
|
|
590
619
|
return theme.colors.border;
|
|
591
620
|
}
|
|
592
621
|
};
|
|
593
|
-
return /* @__PURE__ */
|
|
594
|
-
|
|
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,
|
|
595
624
|
{
|
|
596
625
|
style: [
|
|
597
|
-
|
|
626
|
+
styles2.label,
|
|
598
627
|
{ color: theme.colors.text, fontSize: theme.fontSize.sm },
|
|
599
628
|
labelStyle
|
|
600
629
|
]
|
|
601
630
|
},
|
|
602
631
|
label
|
|
603
|
-
), /* @__PURE__ */
|
|
604
|
-
|
|
632
|
+
), /* @__PURE__ */ import_react5.default.createElement(
|
|
633
|
+
import_react_native2.TextInput,
|
|
605
634
|
{
|
|
606
635
|
placeholderTextColor: theme.colors.textTertiary,
|
|
607
636
|
style: [
|
|
608
|
-
|
|
637
|
+
styles2.input,
|
|
609
638
|
{
|
|
610
639
|
backgroundColor: theme.colors.surface,
|
|
611
640
|
borderColor: getBorderColor(),
|
|
@@ -619,20 +648,20 @@ var Input = ({
|
|
|
619
648
|
],
|
|
620
649
|
...props
|
|
621
650
|
}
|
|
622
|
-
), error && /* @__PURE__ */
|
|
623
|
-
|
|
651
|
+
), error && /* @__PURE__ */ import_react5.default.createElement(
|
|
652
|
+
import_react_native2.Text,
|
|
624
653
|
{
|
|
625
654
|
style: [
|
|
626
|
-
|
|
655
|
+
styles2.error,
|
|
627
656
|
{ color: theme.colors.error, fontSize: theme.fontSize.sm }
|
|
628
657
|
]
|
|
629
658
|
},
|
|
630
659
|
error
|
|
631
|
-
), helperText && !error && /* @__PURE__ */
|
|
632
|
-
|
|
660
|
+
), helperText && !error && /* @__PURE__ */ import_react5.default.createElement(
|
|
661
|
+
import_react_native2.Text,
|
|
633
662
|
{
|
|
634
663
|
style: [
|
|
635
|
-
|
|
664
|
+
styles2.helper,
|
|
636
665
|
{
|
|
637
666
|
color: theme.colors.textSecondary,
|
|
638
667
|
fontSize: theme.fontSize.sm
|
|
@@ -642,7 +671,7 @@ var Input = ({
|
|
|
642
671
|
helperText
|
|
643
672
|
));
|
|
644
673
|
};
|
|
645
|
-
var
|
|
674
|
+
var styles2 = import_react_native2.StyleSheet.create({
|
|
646
675
|
wrapper: {
|
|
647
676
|
marginBottom: 16
|
|
648
677
|
// theme.spacing.lg - consistent form spacing
|
|
@@ -666,19 +695,95 @@ var styles3 = import_react_native3.StyleSheet.create({
|
|
|
666
695
|
}
|
|
667
696
|
});
|
|
668
697
|
|
|
669
|
-
// src/components/
|
|
670
|
-
var
|
|
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"));
|
|
671
776
|
var import_react_native4 = require("react-native");
|
|
672
777
|
|
|
673
778
|
// src/assets/CloseIcon.tsx
|
|
674
|
-
var
|
|
675
|
-
var
|
|
779
|
+
var import_react7 = __toESM(require("react"));
|
|
780
|
+
var import_react_native_svg2 = __toESM(require("react-native-svg"));
|
|
676
781
|
var CloseIcon = ({
|
|
677
782
|
size = 20,
|
|
678
783
|
color = "#000"
|
|
679
784
|
}) => {
|
|
680
|
-
return /* @__PURE__ */
|
|
681
|
-
|
|
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,
|
|
682
787
|
{
|
|
683
788
|
d: "M15 5L5 15M5 5L15 15",
|
|
684
789
|
stroke: color,
|
|
@@ -722,13 +827,13 @@ var Modal = ({
|
|
|
722
827
|
const handleOverlayPress = () => {
|
|
723
828
|
if (!disableClose && closeOnOverlayClick) onClose();
|
|
724
829
|
};
|
|
725
|
-
return /* @__PURE__ */
|
|
830
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
726
831
|
import_react_native4.KeyboardAvoidingView,
|
|
727
832
|
{
|
|
728
833
|
behavior: import_react_native4.Platform.OS === "ios" ? "padding" : "height",
|
|
729
834
|
style: styles4.keyboardView
|
|
730
835
|
},
|
|
731
|
-
/* @__PURE__ */
|
|
836
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
732
837
|
import_react_native4.Modal,
|
|
733
838
|
{
|
|
734
839
|
visible: isOpen,
|
|
@@ -737,14 +842,14 @@ var Modal = ({
|
|
|
737
842
|
statusBarTranslucent: true,
|
|
738
843
|
onRequestClose: disableClose ? void 0 : onClose
|
|
739
844
|
},
|
|
740
|
-
/* @__PURE__ */
|
|
845
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
741
846
|
import_react_native4.TouchableOpacity,
|
|
742
847
|
{
|
|
743
848
|
activeOpacity: 1,
|
|
744
849
|
style: [styles4.overlay, { backgroundColor: theme.colors.overlay }],
|
|
745
850
|
onPress: handleOverlayPress
|
|
746
851
|
},
|
|
747
|
-
/* @__PURE__ */
|
|
852
|
+
/* @__PURE__ */ import_react8.default.createElement(
|
|
748
853
|
import_react_native4.View,
|
|
749
854
|
{
|
|
750
855
|
style: [
|
|
@@ -775,7 +880,7 @@ var ModalHeader = ({
|
|
|
775
880
|
style
|
|
776
881
|
}) => {
|
|
777
882
|
const theme = useTheme();
|
|
778
|
-
return /* @__PURE__ */
|
|
883
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
779
884
|
import_react_native4.View,
|
|
780
885
|
{
|
|
781
886
|
style: [
|
|
@@ -788,7 +893,7 @@ var ModalHeader = ({
|
|
|
788
893
|
style
|
|
789
894
|
]
|
|
790
895
|
},
|
|
791
|
-
/* @__PURE__ */
|
|
896
|
+
/* @__PURE__ */ import_react8.default.createElement(import_react_native4.View, { style: styles4.headerContent }, typeof children === "string" ? /* @__PURE__ */ import_react8.default.createElement(
|
|
792
897
|
import_react_native4.Text,
|
|
793
898
|
{
|
|
794
899
|
style: [
|
|
@@ -798,7 +903,7 @@ var ModalHeader = ({
|
|
|
798
903
|
},
|
|
799
904
|
children
|
|
800
905
|
) : children),
|
|
801
|
-
showCloseButton && onClose && /* @__PURE__ */
|
|
906
|
+
showCloseButton && onClose && /* @__PURE__ */ import_react8.default.createElement(
|
|
802
907
|
import_react_native4.TouchableOpacity,
|
|
803
908
|
{
|
|
804
909
|
onPress: onClose,
|
|
@@ -808,7 +913,7 @@ var ModalHeader = ({
|
|
|
808
913
|
{ backgroundColor: theme.colors.surface }
|
|
809
914
|
]
|
|
810
915
|
},
|
|
811
|
-
/* @__PURE__ */
|
|
916
|
+
/* @__PURE__ */ import_react8.default.createElement(CloseIcon, { color: theme.colors.text, size: 20 })
|
|
812
917
|
)
|
|
813
918
|
);
|
|
814
919
|
};
|
|
@@ -819,7 +924,7 @@ var ModalBody = ({
|
|
|
819
924
|
}) => {
|
|
820
925
|
const theme = useTheme();
|
|
821
926
|
if (scrollable) {
|
|
822
|
-
return /* @__PURE__ */
|
|
927
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
823
928
|
import_react_native4.ScrollView,
|
|
824
929
|
{
|
|
825
930
|
style: styles4.bodyScroll,
|
|
@@ -834,14 +939,14 @@ var ModalBody = ({
|
|
|
834
939
|
children
|
|
835
940
|
);
|
|
836
941
|
}
|
|
837
|
-
return /* @__PURE__ */
|
|
942
|
+
return /* @__PURE__ */ import_react8.default.createElement(import_react_native4.View, { style: [styles4.body, { padding: theme.spacing.lg }, style] }, children);
|
|
838
943
|
};
|
|
839
944
|
var ModalFooter = ({
|
|
840
945
|
children,
|
|
841
946
|
style
|
|
842
947
|
}) => {
|
|
843
948
|
const theme = useTheme();
|
|
844
|
-
return /* @__PURE__ */
|
|
949
|
+
return /* @__PURE__ */ import_react8.default.createElement(
|
|
845
950
|
import_react_native4.View,
|
|
846
951
|
{
|
|
847
952
|
style: [
|
|
@@ -914,141 +1019,370 @@ var styles4 = import_react_native4.StyleSheet.create({
|
|
|
914
1019
|
}
|
|
915
1020
|
});
|
|
916
1021
|
|
|
917
|
-
// src/
|
|
918
|
-
var
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
const
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
purpose: "login",
|
|
937
|
-
clientId
|
|
938
|
-
},
|
|
939
|
-
{
|
|
940
|
-
headers: {
|
|
941
|
-
"X-Link-Token": linkToken
|
|
942
|
-
}
|
|
943
|
-
}
|
|
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)
|
|
944
1041
|
);
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
clientId,
|
|
954
|
-
purpose: "login"
|
|
955
|
-
},
|
|
956
|
-
{
|
|
957
|
-
headers: {
|
|
958
|
-
"X-Link-Token": linkToken
|
|
959
|
-
}
|
|
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);
|
|
960
1050
|
}
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
}
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
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;
|
|
971
1068
|
}
|
|
972
|
-
|
|
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]
|
|
973
1082
|
);
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
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
|
+
}
|
|
983
1095
|
}
|
|
984
|
-
}
|
|
1096
|
+
},
|
|
1097
|
+
[otp, onChange, disabled]
|
|
985
1098
|
);
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
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,
|
|
991
1106
|
{
|
|
992
|
-
|
|
993
|
-
|
|
1107
|
+
style: [
|
|
1108
|
+
styles5.label,
|
|
1109
|
+
{ color: theme.colors.text, fontSize: theme.fontSize.sm }
|
|
1110
|
+
]
|
|
994
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,
|
|
995
1115
|
{
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
return res.data;
|
|
1018
|
-
}
|
|
1019
|
-
async function getUserIntegrations(linkToken) {
|
|
1020
|
-
const res = await api.get("/v1/userIntegrations", {
|
|
1021
|
-
headers: {
|
|
1022
|
-
"X-Link-Token": linkToken
|
|
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
|
|
1023
1137
|
}
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
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
|
+
]
|
|
1031
1145
|
},
|
|
1032
|
-
|
|
1033
|
-
|
|
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"
|
|
1034
1322
|
}
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
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"
|
|
1331
|
+
}
|
|
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"
|
|
1350
|
+
}
|
|
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"
|
|
1359
|
+
}
|
|
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
|
+
};
|
|
1038
1372
|
|
|
1039
1373
|
// src/molecules/ConnectLogo.tsx
|
|
1040
|
-
var
|
|
1041
|
-
var
|
|
1374
|
+
var import_react18 = __toESM(require("react"));
|
|
1375
|
+
var import_react_native10 = require("react-native");
|
|
1042
1376
|
|
|
1043
1377
|
// src/assets/UnplugIcon.tsx
|
|
1044
|
-
var
|
|
1045
|
-
var
|
|
1378
|
+
var import_react17 = __toESM(require("react"));
|
|
1379
|
+
var import_react_native_svg6 = __toESM(require("react-native-svg"));
|
|
1046
1380
|
var UnplugIcon = ({
|
|
1047
1381
|
size = 24,
|
|
1048
1382
|
color = "#6B7280"
|
|
1049
1383
|
}) => {
|
|
1050
|
-
return /* @__PURE__ */
|
|
1051
|
-
|
|
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,
|
|
1052
1386
|
{
|
|
1053
1387
|
d: "m19 5 3-3",
|
|
1054
1388
|
stroke: color,
|
|
@@ -1056,8 +1390,8 @@ var UnplugIcon = ({
|
|
|
1056
1390
|
strokeLinecap: "round",
|
|
1057
1391
|
strokeLinejoin: "round"
|
|
1058
1392
|
}
|
|
1059
|
-
), /* @__PURE__ */
|
|
1060
|
-
|
|
1393
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1394
|
+
import_react_native_svg6.Path,
|
|
1061
1395
|
{
|
|
1062
1396
|
d: "m2 22 3-3",
|
|
1063
1397
|
stroke: color,
|
|
@@ -1065,8 +1399,8 @@ var UnplugIcon = ({
|
|
|
1065
1399
|
strokeLinecap: "round",
|
|
1066
1400
|
strokeLinejoin: "round"
|
|
1067
1401
|
}
|
|
1068
|
-
), /* @__PURE__ */
|
|
1069
|
-
|
|
1402
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1403
|
+
import_react_native_svg6.Path,
|
|
1070
1404
|
{
|
|
1071
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",
|
|
1072
1406
|
stroke: color,
|
|
@@ -1074,8 +1408,8 @@ var UnplugIcon = ({
|
|
|
1074
1408
|
strokeLinecap: "round",
|
|
1075
1409
|
strokeLinejoin: "round"
|
|
1076
1410
|
}
|
|
1077
|
-
), /* @__PURE__ */
|
|
1078
|
-
|
|
1411
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1412
|
+
import_react_native_svg6.Path,
|
|
1079
1413
|
{
|
|
1080
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",
|
|
1081
1415
|
stroke: color,
|
|
@@ -1083,8 +1417,8 @@ var UnplugIcon = ({
|
|
|
1083
1417
|
strokeLinecap: "round",
|
|
1084
1418
|
strokeLinejoin: "round"
|
|
1085
1419
|
}
|
|
1086
|
-
), /* @__PURE__ */
|
|
1087
|
-
|
|
1420
|
+
), /* @__PURE__ */ import_react17.default.createElement(
|
|
1421
|
+
import_react_native_svg6.Line,
|
|
1088
1422
|
{
|
|
1089
1423
|
x1: 7.5,
|
|
1090
1424
|
y1: 13.5,
|
|
@@ -1100,12 +1434,12 @@ var UnplugIcon = ({
|
|
|
1100
1434
|
// src/molecules/ConnectLogo.tsx
|
|
1101
1435
|
var KryptosLogo = () => {
|
|
1102
1436
|
const theme = useTheme();
|
|
1103
|
-
return /* @__PURE__ */
|
|
1104
|
-
|
|
1437
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1438
|
+
import_react_native10.View,
|
|
1105
1439
|
{
|
|
1106
|
-
style: [
|
|
1440
|
+
style: [styles10.logoContainer, { backgroundColor: theme.colors.surface }]
|
|
1107
1441
|
},
|
|
1108
|
-
/* @__PURE__ */
|
|
1442
|
+
/* @__PURE__ */ import_react18.default.createElement(LogoIcon, { size: 36 })
|
|
1109
1443
|
);
|
|
1110
1444
|
};
|
|
1111
1445
|
var ConnectLogo = () => {
|
|
@@ -1120,49 +1454,47 @@ var ConnectLogo = () => {
|
|
|
1120
1454
|
}
|
|
1121
1455
|
};
|
|
1122
1456
|
const renderLogo = () => {
|
|
1123
|
-
if ((0,
|
|
1457
|
+
if ((0, import_react18.isValidElement)(appLogo)) {
|
|
1124
1458
|
return appLogo;
|
|
1125
1459
|
} else if (typeof appLogo === "string" && isValidUrl(appLogo)) {
|
|
1126
|
-
return /* @__PURE__ */
|
|
1127
|
-
|
|
1460
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1461
|
+
import_react_native10.Image,
|
|
1128
1462
|
{
|
|
1129
1463
|
source: { uri: appLogo },
|
|
1130
|
-
style:
|
|
1464
|
+
style: styles10.appLogoImage,
|
|
1131
1465
|
resizeMode: "contain"
|
|
1132
1466
|
}
|
|
1133
1467
|
);
|
|
1134
1468
|
} else if (typeof appLogo === "number" || typeof appLogo === "object" && appLogo !== null) {
|
|
1135
|
-
return /* @__PURE__ */
|
|
1136
|
-
|
|
1469
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1470
|
+
import_react_native10.Image,
|
|
1137
1471
|
{
|
|
1138
1472
|
source: appLogo,
|
|
1139
|
-
style:
|
|
1473
|
+
style: styles10.appLogoImage,
|
|
1140
1474
|
resizeMode: "contain"
|
|
1141
1475
|
}
|
|
1142
1476
|
);
|
|
1143
1477
|
} else if (appName) {
|
|
1144
|
-
return /* @__PURE__ */
|
|
1478
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native10.Text, { style: [styles10.appLogoText, { color: theme.colors.text }] }, appName.charAt(0).toUpperCase());
|
|
1145
1479
|
}
|
|
1146
|
-
return /* @__PURE__ */
|
|
1480
|
+
return /* @__PURE__ */ import_react18.default.createElement(import_react_native10.Text, { style: [styles10.appLogoText, { color: theme.colors.text }] }, "?");
|
|
1147
1481
|
};
|
|
1148
|
-
return /* @__PURE__ */
|
|
1149
|
-
|
|
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,
|
|
1150
1484
|
{
|
|
1151
1485
|
style: [
|
|
1152
|
-
|
|
1486
|
+
styles10.logoContainer,
|
|
1153
1487
|
{ backgroundColor: theme.colors.surface }
|
|
1154
1488
|
]
|
|
1155
1489
|
},
|
|
1156
1490
|
renderLogo()
|
|
1157
1491
|
));
|
|
1158
1492
|
};
|
|
1159
|
-
var
|
|
1493
|
+
var styles10 = import_react_native10.StyleSheet.create({
|
|
1160
1494
|
container: {
|
|
1161
1495
|
flexDirection: "row",
|
|
1162
1496
|
alignItems: "center",
|
|
1163
1497
|
justifyContent: "center",
|
|
1164
|
-
marginVertical: 24,
|
|
1165
|
-
// theme.spacing.xxl
|
|
1166
1498
|
gap: 12
|
|
1167
1499
|
// theme.spacing.md
|
|
1168
1500
|
},
|
|
@@ -1199,11 +1531,11 @@ var Auth = ({
|
|
|
1199
1531
|
}) => {
|
|
1200
1532
|
const { appName, linkToken, clientId, setUser, setEmail } = useKryptosConnect();
|
|
1201
1533
|
const theme = useTheme();
|
|
1202
|
-
const [isLoading, setIsLoading] =
|
|
1203
|
-
const [errorMessage, setErrorMessage] =
|
|
1204
|
-
const [emailValue, setEmailValue] =
|
|
1205
|
-
const [emailError, setEmailError] =
|
|
1206
|
-
const [loadingType, setLoadingType] =
|
|
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);
|
|
1207
1539
|
const validateEmail = (email) => {
|
|
1208
1540
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
1209
1541
|
if (!email) {
|
|
@@ -1265,313 +1597,183 @@ var Auth = ({
|
|
|
1265
1597
|
};
|
|
1266
1598
|
const infoSections = [
|
|
1267
1599
|
{
|
|
1268
|
-
icon: /* @__PURE__ */
|
|
1600
|
+
icon: /* @__PURE__ */ import_react19.default.createElement(LinkIcon, { size: 20, color: theme.colors.primary }),
|
|
1269
1601
|
title: "Simple and secure",
|
|
1270
|
-
text: "
|
|
1602
|
+
text: "Link your accounts in just a few clicks"
|
|
1271
1603
|
},
|
|
1272
1604
|
{
|
|
1273
|
-
icon: /* @__PURE__ */
|
|
1605
|
+
icon: /* @__PURE__ */ import_react19.default.createElement(ShieldIcon, { size: 20, color: theme.colors.primary }),
|
|
1274
1606
|
title: "Control what you share",
|
|
1275
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."
|
|
1276
1613
|
}
|
|
1277
1614
|
];
|
|
1278
|
-
return /* @__PURE__ */
|
|
1279
|
-
|
|
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,
|
|
1280
1623
|
{
|
|
1281
1624
|
style: [
|
|
1282
|
-
|
|
1625
|
+
styles11.infoDescription,
|
|
1283
1626
|
{ color: theme.colors.textSecondary }
|
|
1284
1627
|
]
|
|
1285
1628
|
},
|
|
1286
1629
|
section.text
|
|
1287
|
-
)))), errorMessage ? /* @__PURE__ */
|
|
1288
|
-
Input,
|
|
1289
|
-
{
|
|
1290
|
-
placeholder: "Enter email address",
|
|
1291
|
-
value: emailValue,
|
|
1292
|
-
onChangeText: (text) => {
|
|
1293
|
-
setEmailValue(text);
|
|
1294
|
-
if (emailError) validateEmail(text);
|
|
1295
|
-
},
|
|
1296
|
-
error: emailError,
|
|
1297
|
-
keyboardType: "email-address",
|
|
1298
|
-
autoCapitalize: "none",
|
|
1299
|
-
autoCorrect: false
|
|
1300
|
-
}
|
|
1301
|
-
), /* @__PURE__ */ import_react13.default.createElement(Alert, { variant: "default" }, /* @__PURE__ */ import_react13.default.createElement(AlertDescription, null, "Sign in or create your Kryptos account with your email for quicker access next time.")), /* @__PURE__ */ import_react13.default.createElement(
|
|
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(
|
|
1302
1631
|
Button,
|
|
1303
1632
|
{
|
|
1304
1633
|
variant: "outline",
|
|
1305
1634
|
size: "lg",
|
|
1306
|
-
onPress:
|
|
1307
|
-
loading: loadingType === "
|
|
1635
|
+
onPress: handleContinueAsGuest,
|
|
1636
|
+
loading: loadingType === "guest",
|
|
1308
1637
|
disabled: isLoading,
|
|
1309
|
-
style:
|
|
1638
|
+
style: styles11.button
|
|
1310
1639
|
},
|
|
1311
1640
|
"Continue"
|
|
1312
|
-
), /* @__PURE__ */
|
|
1313
|
-
|
|
1641
|
+
), /* @__PURE__ */ import_react19.default.createElement(
|
|
1642
|
+
import_react_native11.Text,
|
|
1314
1643
|
{
|
|
1315
|
-
style: {
|
|
1316
|
-
color: theme.colors.primary,
|
|
1317
|
-
textDecorationLine: "underline"
|
|
1318
|
-
}
|
|
1644
|
+
style: [styles11.footerText, { color: theme.colors.textSecondary }]
|
|
1319
1645
|
},
|
|
1320
|
-
"
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
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)));
|
|
1333
1674
|
};
|
|
1334
|
-
var
|
|
1675
|
+
var styles11 = import_react_native11.StyleSheet.create({
|
|
1335
1676
|
container: {
|
|
1336
|
-
flex: 1
|
|
1677
|
+
flex: 1,
|
|
1678
|
+
flexDirection: "column",
|
|
1679
|
+
justifyContent: "space-between"
|
|
1680
|
+
},
|
|
1681
|
+
header: {
|
|
1682
|
+
flex: 1,
|
|
1683
|
+
gap: 8
|
|
1684
|
+
},
|
|
1685
|
+
footer: {
|
|
1686
|
+
flex: 1,
|
|
1687
|
+
justifyContent: "flex-end",
|
|
1688
|
+
gap: 8
|
|
1337
1689
|
},
|
|
1338
1690
|
title: {
|
|
1339
1691
|
fontSize: 18,
|
|
1340
1692
|
// theme.fontSize.xl
|
|
1341
|
-
fontWeight: "
|
|
1342
|
-
textAlign: "center"
|
|
1343
|
-
marginBottom: 16
|
|
1344
|
-
// theme.spacing.lg - consistent section spacing
|
|
1693
|
+
fontWeight: "500",
|
|
1694
|
+
textAlign: "center"
|
|
1345
1695
|
},
|
|
1346
1696
|
infoSection: {
|
|
1347
1697
|
flexDirection: "row",
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1698
|
+
alignItems: "flex-start",
|
|
1699
|
+
padding: 8,
|
|
1700
|
+
gap: 12
|
|
1351
1701
|
},
|
|
1352
1702
|
infoIcon: {
|
|
1353
1703
|
width: 32,
|
|
1704
|
+
// theme.spacing.xxxl
|
|
1354
1705
|
height: 32,
|
|
1706
|
+
// theme.spacing.xxxl
|
|
1355
1707
|
borderRadius: 16,
|
|
1356
1708
|
// theme.borderRadius.lg
|
|
1357
1709
|
alignItems: "center",
|
|
1358
|
-
justifyContent: "center"
|
|
1359
|
-
marginRight: 12
|
|
1360
|
-
// theme.spacing.md
|
|
1710
|
+
justifyContent: "center"
|
|
1361
1711
|
},
|
|
1362
1712
|
infoContent: {
|
|
1363
|
-
flex: 1
|
|
1713
|
+
flex: 1,
|
|
1714
|
+
gap: 4
|
|
1364
1715
|
},
|
|
1365
1716
|
infoTitle: {
|
|
1366
1717
|
fontSize: 14,
|
|
1367
1718
|
// theme.fontSize.md
|
|
1368
|
-
fontWeight: "600"
|
|
1369
|
-
marginBottom: 4
|
|
1370
|
-
// theme.spacing.xs
|
|
1719
|
+
fontWeight: "600"
|
|
1371
1720
|
},
|
|
1372
1721
|
infoDescription: {
|
|
1373
1722
|
fontSize: 13,
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
button: {
|
|
1377
|
-
width: "100%",
|
|
1378
|
-
marginTop: 16
|
|
1379
|
-
// theme.spacing.lg - consistent button spacing
|
|
1380
|
-
},
|
|
1381
|
-
footer: {
|
|
1382
|
-
fontSize: 12,
|
|
1383
|
-
// theme.fontSize.sm
|
|
1384
|
-
textAlign: "center",
|
|
1385
|
-
marginTop: 16
|
|
1386
|
-
// theme.spacing.lg
|
|
1387
|
-
}
|
|
1388
|
-
});
|
|
1389
|
-
|
|
1390
|
-
// src/components/OTP.tsx
|
|
1391
|
-
var import_react14 = __toESM(require("react"));
|
|
1392
|
-
var import_react_native7 = require("react-native");
|
|
1393
|
-
var OTP = ({
|
|
1394
|
-
length = 6,
|
|
1395
|
-
value = "",
|
|
1396
|
-
onChange,
|
|
1397
|
-
onComplete,
|
|
1398
|
-
error,
|
|
1399
|
-
label,
|
|
1400
|
-
disabled = false,
|
|
1401
|
-
containerStyle,
|
|
1402
|
-
inputStyle,
|
|
1403
|
-
setErrorMessage
|
|
1404
|
-
}) => {
|
|
1405
|
-
const theme = useTheme();
|
|
1406
|
-
const AUTO_SUBMIT_DELAY = 500;
|
|
1407
|
-
const [otp, setOtp] = import_react14.default.useState(
|
|
1408
|
-
value.split("").concat(Array(length).fill("")).slice(0, length)
|
|
1409
|
-
);
|
|
1410
|
-
const inputRefs = import_react14.default.useRef([]);
|
|
1411
|
-
import_react14.default.useEffect(() => {
|
|
1412
|
-
const isComplete = otp.every((digit) => digit !== "");
|
|
1413
|
-
let timer;
|
|
1414
|
-
if (isComplete && onComplete) {
|
|
1415
|
-
timer = setTimeout(() => {
|
|
1416
|
-
onComplete(otp.join(""));
|
|
1417
|
-
}, AUTO_SUBMIT_DELAY);
|
|
1418
|
-
}
|
|
1419
|
-
return () => {
|
|
1420
|
-
if (timer) clearTimeout(timer);
|
|
1421
|
-
};
|
|
1422
|
-
}, [otp, onComplete]);
|
|
1423
|
-
import_react14.default.useEffect(() => {
|
|
1424
|
-
setTimeout(() => {
|
|
1425
|
-
inputRefs.current[0]?.focus();
|
|
1426
|
-
}, 100);
|
|
1427
|
-
}, []);
|
|
1428
|
-
const handleChange = import_react14.default.useCallback(
|
|
1429
|
-
(index, val) => {
|
|
1430
|
-
if (disabled) return;
|
|
1431
|
-
setErrorMessage("");
|
|
1432
|
-
const numericValue = val.replace(/[^0-9]/g, "");
|
|
1433
|
-
const newValue = numericValue.slice(-1);
|
|
1434
|
-
if (val && !numericValue) {
|
|
1435
|
-
return;
|
|
1436
|
-
}
|
|
1437
|
-
const newOtp = [...otp];
|
|
1438
|
-
newOtp[index] = newValue;
|
|
1439
|
-
setOtp(newOtp);
|
|
1440
|
-
const otpString = newOtp.join("");
|
|
1441
|
-
onChange?.(otpString);
|
|
1442
|
-
if (newValue && index < length - 1) {
|
|
1443
|
-
inputRefs.current[index + 1]?.focus();
|
|
1444
|
-
}
|
|
1445
|
-
if (otpString.length === length && !otpString.includes("")) {
|
|
1446
|
-
onComplete?.(otpString);
|
|
1447
|
-
}
|
|
1448
|
-
},
|
|
1449
|
-
[otp, length, onChange, onComplete, disabled]
|
|
1450
|
-
);
|
|
1451
|
-
const handleKeyPress = import_react14.default.useCallback(
|
|
1452
|
-
(index, e) => {
|
|
1453
|
-
if (disabled) return;
|
|
1454
|
-
if (e.nativeEvent.key === "Backspace") {
|
|
1455
|
-
if (!otp[index] && index > 0) {
|
|
1456
|
-
inputRefs.current[index - 1]?.focus();
|
|
1457
|
-
} else {
|
|
1458
|
-
const newOtp = [...otp];
|
|
1459
|
-
newOtp[index] = "";
|
|
1460
|
-
setOtp(newOtp);
|
|
1461
|
-
onChange?.(newOtp.join(""));
|
|
1462
|
-
}
|
|
1463
|
-
}
|
|
1464
|
-
},
|
|
1465
|
-
[otp, onChange, disabled]
|
|
1466
|
-
);
|
|
1467
|
-
const getBorderColor = (index) => {
|
|
1468
|
-
if (error) return theme.colors.error;
|
|
1469
|
-
if (otp[index]) return theme.colors.success;
|
|
1470
|
-
return theme.colors.border;
|
|
1471
|
-
};
|
|
1472
|
-
return /* @__PURE__ */ import_react14.default.createElement(import_react_native7.View, { style: [styles7.wrapper, containerStyle] }, label && /* @__PURE__ */ import_react14.default.createElement(
|
|
1473
|
-
import_react_native7.Text,
|
|
1474
|
-
{
|
|
1475
|
-
style: [
|
|
1476
|
-
styles7.label,
|
|
1477
|
-
{ color: theme.colors.text, fontSize: theme.fontSize.sm }
|
|
1478
|
-
]
|
|
1479
|
-
},
|
|
1480
|
-
label
|
|
1481
|
-
), /* @__PURE__ */ import_react14.default.createElement(import_react_native7.View, { style: styles7.container }, Array.from({ length }, (_, index) => /* @__PURE__ */ import_react14.default.createElement(
|
|
1482
|
-
import_react_native7.TextInput,
|
|
1483
|
-
{
|
|
1484
|
-
key: index,
|
|
1485
|
-
ref: (el) => inputRefs.current[index] = el,
|
|
1486
|
-
style: [
|
|
1487
|
-
styles7.input,
|
|
1488
|
-
{
|
|
1489
|
-
backgroundColor: theme.colors.surface,
|
|
1490
|
-
borderColor: getBorderColor(index),
|
|
1491
|
-
color: theme.colors.text,
|
|
1492
|
-
fontSize: theme.fontSize.xxl,
|
|
1493
|
-
borderRadius: theme.borderRadius.md
|
|
1494
|
-
},
|
|
1495
|
-
inputStyle
|
|
1496
|
-
],
|
|
1497
|
-
keyboardType: "numeric",
|
|
1498
|
-
maxLength: 1,
|
|
1499
|
-
value: otp[index] || "",
|
|
1500
|
-
onChangeText: (val) => handleChange(index, val),
|
|
1501
|
-
onKeyPress: (e) => handleKeyPress(index, e),
|
|
1502
|
-
editable: !disabled,
|
|
1503
|
-
selectTextOnFocus: true,
|
|
1504
|
-
caretHidden: true
|
|
1505
|
-
}
|
|
1506
|
-
))), error && /* @__PURE__ */ import_react14.default.createElement(
|
|
1507
|
-
import_react_native7.Text,
|
|
1508
|
-
{
|
|
1509
|
-
style: [
|
|
1510
|
-
styles7.error,
|
|
1511
|
-
{ color: theme.colors.error, fontSize: theme.fontSize.sm }
|
|
1512
|
-
]
|
|
1513
|
-
},
|
|
1514
|
-
error
|
|
1515
|
-
));
|
|
1516
|
-
};
|
|
1517
|
-
var styles7 = import_react_native7.StyleSheet.create({
|
|
1518
|
-
wrapper: {
|
|
1519
|
-
marginBottom: 16
|
|
1520
|
-
// theme.spacing.lg
|
|
1521
|
-
},
|
|
1522
|
-
label: {
|
|
1523
|
-
fontWeight: "500",
|
|
1524
|
-
marginBottom: 12,
|
|
1525
|
-
// theme.spacing.md - consistent label spacing
|
|
1526
|
-
textAlign: "center"
|
|
1527
|
-
},
|
|
1528
|
-
container: {
|
|
1529
|
-
flexDirection: "row",
|
|
1530
|
-
justifyContent: "center",
|
|
1531
|
-
gap: 8
|
|
1532
|
-
// theme.spacing.sm
|
|
1533
|
-
},
|
|
1534
|
-
input: {
|
|
1535
|
-
width: 48,
|
|
1536
|
-
height: 56,
|
|
1537
|
-
borderWidth: 1,
|
|
1538
|
-
textAlign: "center",
|
|
1539
|
-
fontWeight: "600"
|
|
1723
|
+
// theme.fontSize.sm + 1
|
|
1724
|
+
lineHeight: 18
|
|
1540
1725
|
},
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
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"
|
|
1545
1736
|
}
|
|
1546
1737
|
});
|
|
1547
1738
|
|
|
1548
1739
|
// src/molecules/Init.tsx
|
|
1549
|
-
var
|
|
1550
|
-
var
|
|
1740
|
+
var import_react20 = __toESM(require("react"));
|
|
1741
|
+
var import_react_native12 = require("react-native");
|
|
1551
1742
|
var Init = ({
|
|
1552
1743
|
open,
|
|
1553
1744
|
onSuccess,
|
|
1554
1745
|
onClose,
|
|
1555
1746
|
generateLinkToken
|
|
1556
1747
|
}) => {
|
|
1557
|
-
const {
|
|
1748
|
+
const {
|
|
1749
|
+
setIsInitialized,
|
|
1750
|
+
isInitialized,
|
|
1751
|
+
setLinkToken,
|
|
1752
|
+
setIsAuthorized,
|
|
1753
|
+
setUser
|
|
1754
|
+
} = useKryptosConnect();
|
|
1558
1755
|
const theme = useTheme();
|
|
1559
|
-
const [isFetching, setIsFetching] =
|
|
1560
|
-
const [error, setError] =
|
|
1561
|
-
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 () => {
|
|
1562
1759
|
if (!open) return;
|
|
1563
1760
|
setIsFetching(true);
|
|
1564
1761
|
setError(null);
|
|
1565
1762
|
try {
|
|
1566
1763
|
const linkToken = await generateLinkToken();
|
|
1567
|
-
if (!linkToken) {
|
|
1764
|
+
if (!linkToken || !linkToken?.link_token || linkToken.link_token === "" || linkToken.link_token === null || linkToken.link_token === void 0) {
|
|
1568
1765
|
setIsInitialized(false);
|
|
1569
1766
|
setError("Failed to fetch link token. Please try again.");
|
|
1570
1767
|
return;
|
|
1571
1768
|
}
|
|
1572
|
-
setLinkToken(linkToken);
|
|
1769
|
+
setLinkToken(linkToken.link_token);
|
|
1573
1770
|
setIsInitialized(true);
|
|
1574
|
-
|
|
1771
|
+
setIsAuthorized(linkToken.isAuthorized || false);
|
|
1772
|
+
if (linkToken.isAuthorized) {
|
|
1773
|
+
const userInfo = await getUserInfo(linkToken.link_token);
|
|
1774
|
+
setUser(userInfo);
|
|
1775
|
+
}
|
|
1776
|
+
onSuccess(linkToken.isAuthorized ? { isAuthorized: true } : null);
|
|
1575
1777
|
} catch (err) {
|
|
1576
1778
|
console.error("Failed to fetch link token:", err);
|
|
1577
1779
|
setIsInitialized(false);
|
|
@@ -1579,29 +1781,29 @@ var Init = ({
|
|
|
1579
1781
|
} finally {
|
|
1580
1782
|
setIsFetching(false);
|
|
1581
1783
|
}
|
|
1582
|
-
}, [
|
|
1583
|
-
|
|
1784
|
+
}, []);
|
|
1785
|
+
import_react20.default.useEffect(() => {
|
|
1584
1786
|
fetchLinkToken();
|
|
1585
1787
|
}, [fetchLinkToken]);
|
|
1586
|
-
return /* @__PURE__ */
|
|
1587
|
-
|
|
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,
|
|
1588
1790
|
{
|
|
1589
1791
|
size: "large",
|
|
1590
1792
|
color: theme.colors.primary,
|
|
1591
|
-
style:
|
|
1793
|
+
style: styles12.spinner
|
|
1592
1794
|
}
|
|
1593
|
-
), /* @__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(
|
|
1594
1796
|
Button,
|
|
1595
1797
|
{
|
|
1596
1798
|
variant: "primary",
|
|
1597
1799
|
size: "lg",
|
|
1598
1800
|
onPress: fetchLinkToken,
|
|
1599
|
-
style:
|
|
1801
|
+
style: styles12.retryButton
|
|
1600
1802
|
},
|
|
1601
1803
|
"Retry"
|
|
1602
|
-
)))));
|
|
1804
|
+
)))), /* @__PURE__ */ import_react20.default.createElement(ModalFooter, { style: { paddingVertical: 0 } }, /* @__PURE__ */ import_react20.default.createElement(Footer, null)));
|
|
1603
1805
|
};
|
|
1604
|
-
var
|
|
1806
|
+
var styles12 = import_react_native12.StyleSheet.create({
|
|
1605
1807
|
container: {
|
|
1606
1808
|
flex: 1,
|
|
1607
1809
|
alignItems: "center",
|
|
@@ -1628,18 +1830,18 @@ var styles8 = import_react_native8.StyleSheet.create({
|
|
|
1628
1830
|
});
|
|
1629
1831
|
|
|
1630
1832
|
// src/molecules/Integration.tsx
|
|
1631
|
-
var
|
|
1632
|
-
var
|
|
1833
|
+
var import_react31 = __toESM(require("react"));
|
|
1834
|
+
var import_react_native16 = require("react-native");
|
|
1633
1835
|
|
|
1634
1836
|
// src/assets/ArrowLeftIcon.tsx
|
|
1635
|
-
var
|
|
1636
|
-
var
|
|
1837
|
+
var import_react21 = __toESM(require("react"));
|
|
1838
|
+
var import_react_native_svg7 = __toESM(require("react-native-svg"));
|
|
1637
1839
|
var ArrowLeftIcon = ({
|
|
1638
1840
|
size = 20,
|
|
1639
1841
|
color = "#000"
|
|
1640
1842
|
}) => {
|
|
1641
|
-
return /* @__PURE__ */
|
|
1642
|
-
|
|
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,
|
|
1643
1845
|
{
|
|
1644
1846
|
d: "M19 12H5M12 19l-7-7 7-7",
|
|
1645
1847
|
stroke: color,
|
|
@@ -1651,14 +1853,14 @@ var ArrowLeftIcon = ({
|
|
|
1651
1853
|
};
|
|
1652
1854
|
|
|
1653
1855
|
// src/assets/CheckCircleIcon.tsx
|
|
1654
|
-
var
|
|
1655
|
-
var
|
|
1856
|
+
var import_react22 = __toESM(require("react"));
|
|
1857
|
+
var import_react_native_svg8 = __toESM(require("react-native-svg"));
|
|
1656
1858
|
var CheckCircleIcon = ({
|
|
1657
1859
|
size = 20,
|
|
1658
1860
|
color = "#10B981"
|
|
1659
1861
|
}) => {
|
|
1660
|
-
return /* @__PURE__ */
|
|
1661
|
-
|
|
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,
|
|
1662
1864
|
{
|
|
1663
1865
|
cx: 12,
|
|
1664
1866
|
cy: 12,
|
|
@@ -1666,8 +1868,8 @@ var CheckCircleIcon = ({
|
|
|
1666
1868
|
stroke: color,
|
|
1667
1869
|
strokeWidth: 2
|
|
1668
1870
|
}
|
|
1669
|
-
), /* @__PURE__ */
|
|
1670
|
-
|
|
1871
|
+
), /* @__PURE__ */ import_react22.default.createElement(
|
|
1872
|
+
import_react_native_svg8.Path,
|
|
1671
1873
|
{
|
|
1672
1874
|
d: "m9 12 2 2 4-4",
|
|
1673
1875
|
stroke: color,
|
|
@@ -1679,21 +1881,21 @@ var CheckCircleIcon = ({
|
|
|
1679
1881
|
};
|
|
1680
1882
|
|
|
1681
1883
|
// src/assets/LoaderIcon.tsx
|
|
1682
|
-
var
|
|
1683
|
-
var
|
|
1684
|
-
var
|
|
1685
|
-
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);
|
|
1686
1888
|
var LoaderIcon = ({
|
|
1687
1889
|
size = 20,
|
|
1688
1890
|
color = "#00C693"
|
|
1689
1891
|
}) => {
|
|
1690
|
-
const rotateAnim =
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
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, {
|
|
1694
1896
|
toValue: 1,
|
|
1695
1897
|
duration: 1e3,
|
|
1696
|
-
easing:
|
|
1898
|
+
easing: import_react_native13.Easing.linear,
|
|
1697
1899
|
useNativeDriver: true
|
|
1698
1900
|
})
|
|
1699
1901
|
).start();
|
|
@@ -1702,7 +1904,7 @@ var LoaderIcon = ({
|
|
|
1702
1904
|
inputRange: [0, 1],
|
|
1703
1905
|
outputRange: ["0deg", "360deg"]
|
|
1704
1906
|
});
|
|
1705
|
-
return /* @__PURE__ */
|
|
1907
|
+
return /* @__PURE__ */ import_react23.default.createElement(
|
|
1706
1908
|
AnimatedSvg,
|
|
1707
1909
|
{
|
|
1708
1910
|
width: size,
|
|
@@ -1711,8 +1913,8 @@ var LoaderIcon = ({
|
|
|
1711
1913
|
fill: "none",
|
|
1712
1914
|
style: { transform: [{ rotate: spin }] }
|
|
1713
1915
|
},
|
|
1714
|
-
/* @__PURE__ */
|
|
1715
|
-
|
|
1916
|
+
/* @__PURE__ */ import_react23.default.createElement(
|
|
1917
|
+
import_react_native_svg9.Path,
|
|
1716
1918
|
{
|
|
1717
1919
|
d: "M21 12a9 9 0 1 1-6.219-8.56",
|
|
1718
1920
|
stroke: color,
|
|
@@ -1725,11 +1927,11 @@ var LoaderIcon = ({
|
|
|
1725
1927
|
};
|
|
1726
1928
|
|
|
1727
1929
|
// src/assets/SuccessIcon.tsx
|
|
1728
|
-
var
|
|
1729
|
-
var
|
|
1930
|
+
var import_react24 = __toESM(require("react"));
|
|
1931
|
+
var import_react_native_svg10 = __toESM(require("react-native-svg"));
|
|
1730
1932
|
var SuccessIcon = ({ size = 64 }) => {
|
|
1731
|
-
return /* @__PURE__ */
|
|
1732
|
-
|
|
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,
|
|
1733
1935
|
{
|
|
1734
1936
|
cx: 32,
|
|
1735
1937
|
cy: 32,
|
|
@@ -1737,16 +1939,16 @@ var SuccessIcon = ({ size = 64 }) => {
|
|
|
1737
1939
|
fill: "#00C693",
|
|
1738
1940
|
opacity: 0.1
|
|
1739
1941
|
}
|
|
1740
|
-
), /* @__PURE__ */
|
|
1741
|
-
|
|
1942
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
1943
|
+
import_react_native_svg10.Circle,
|
|
1742
1944
|
{
|
|
1743
1945
|
cx: 32,
|
|
1744
1946
|
cy: 32,
|
|
1745
1947
|
r: 24,
|
|
1746
1948
|
fill: "#00C693"
|
|
1747
1949
|
}
|
|
1748
|
-
), /* @__PURE__ */
|
|
1749
|
-
|
|
1950
|
+
), /* @__PURE__ */ import_react24.default.createElement(
|
|
1951
|
+
import_react_native_svg10.Path,
|
|
1750
1952
|
{
|
|
1751
1953
|
d: "M24 32l6 6 12-12",
|
|
1752
1954
|
stroke: "white",
|
|
@@ -1758,11 +1960,11 @@ var SuccessIcon = ({ size = 64 }) => {
|
|
|
1758
1960
|
};
|
|
1759
1961
|
|
|
1760
1962
|
// src/assets/ErrorIcon.tsx
|
|
1761
|
-
var
|
|
1762
|
-
var
|
|
1963
|
+
var import_react25 = __toESM(require("react"));
|
|
1964
|
+
var import_react_native_svg11 = __toESM(require("react-native-svg"));
|
|
1763
1965
|
var ErrorIcon = ({ size = 64 }) => {
|
|
1764
|
-
return /* @__PURE__ */
|
|
1765
|
-
|
|
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,
|
|
1766
1968
|
{
|
|
1767
1969
|
cx: 32,
|
|
1768
1970
|
cy: 32,
|
|
@@ -1770,16 +1972,16 @@ var ErrorIcon = ({ size = 64 }) => {
|
|
|
1770
1972
|
fill: "#EF4444",
|
|
1771
1973
|
opacity: 0.1
|
|
1772
1974
|
}
|
|
1773
|
-
), /* @__PURE__ */
|
|
1774
|
-
|
|
1975
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
1976
|
+
import_react_native_svg11.Circle,
|
|
1775
1977
|
{
|
|
1776
1978
|
cx: 32,
|
|
1777
1979
|
cy: 32,
|
|
1778
1980
|
r: 24,
|
|
1779
1981
|
fill: "#EF4444"
|
|
1780
1982
|
}
|
|
1781
|
-
), /* @__PURE__ */
|
|
1782
|
-
|
|
1983
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
1984
|
+
import_react_native_svg11.Path,
|
|
1783
1985
|
{
|
|
1784
1986
|
d: "M24 24l16 16M40 24l-16 16",
|
|
1785
1987
|
stroke: "white",
|
|
@@ -1791,18 +1993,18 @@ var ErrorIcon = ({ size = 64 }) => {
|
|
|
1791
1993
|
};
|
|
1792
1994
|
|
|
1793
1995
|
// src/assets/SearchIcon.tsx
|
|
1794
|
-
var
|
|
1795
|
-
var
|
|
1996
|
+
var import_react26 = __toESM(require("react"));
|
|
1997
|
+
var import_react_native_svg12 = __toESM(require("react-native-svg"));
|
|
1796
1998
|
|
|
1797
1999
|
// src/assets/PlusIcon.tsx
|
|
1798
|
-
var
|
|
1799
|
-
var
|
|
2000
|
+
var import_react27 = __toESM(require("react"));
|
|
2001
|
+
var import_react_native_svg13 = __toESM(require("react-native-svg"));
|
|
1800
2002
|
var PlusIcon = ({
|
|
1801
2003
|
size = 14,
|
|
1802
2004
|
color = "#6B7280"
|
|
1803
2005
|
}) => {
|
|
1804
|
-
return /* @__PURE__ */
|
|
1805
|
-
|
|
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,
|
|
1806
2008
|
{
|
|
1807
2009
|
d: "M7 3.5v7M3.5 7h7",
|
|
1808
2010
|
stroke: color,
|
|
@@ -1814,8 +2016,8 @@ var PlusIcon = ({
|
|
|
1814
2016
|
|
|
1815
2017
|
// src/wallet-connect/index.tsx
|
|
1816
2018
|
var import_appkit_react_native3 = require("@reown/appkit-react-native");
|
|
1817
|
-
var
|
|
1818
|
-
var
|
|
2019
|
+
var import_react29 = __toESM(require("react"));
|
|
2020
|
+
var import_react_native14 = require("react-native");
|
|
1819
2021
|
|
|
1820
2022
|
// src/utils/uuid.ts
|
|
1821
2023
|
function generateUUID() {
|
|
@@ -1827,7 +2029,7 @@ function generateUUID() {
|
|
|
1827
2029
|
}
|
|
1828
2030
|
|
|
1829
2031
|
// src/wallet-connect/wallet-connect.tsx
|
|
1830
|
-
var
|
|
2032
|
+
var import_react28 = __toESM(require("react"));
|
|
1831
2033
|
var import_appkit_react_native2 = require("@reown/appkit-react-native");
|
|
1832
2034
|
|
|
1833
2035
|
// src/wallet-connect/AppKitConfig.ts
|
|
@@ -1926,7 +2128,7 @@ var createAppKitInstance = (projectId) => {
|
|
|
1926
2128
|
// src/wallet-connect/wallet-connect.tsx
|
|
1927
2129
|
var WalletConnectWrapper = ({ children }) => {
|
|
1928
2130
|
const { walletConnectProjectId } = useKryptosConnect();
|
|
1929
|
-
const appKit =
|
|
2131
|
+
const appKit = import_react28.default.useMemo(() => {
|
|
1930
2132
|
if (!walletConnectProjectId) {
|
|
1931
2133
|
console.warn(
|
|
1932
2134
|
"walletConnectProjectId is missing in KryptosConnectProvider config"
|
|
@@ -1936,9 +2138,9 @@ var WalletConnectWrapper = ({ children }) => {
|
|
|
1936
2138
|
return createAppKitInstance(walletConnectProjectId);
|
|
1937
2139
|
}, [walletConnectProjectId]);
|
|
1938
2140
|
if (!appKit) {
|
|
1939
|
-
return /* @__PURE__ */
|
|
2141
|
+
return /* @__PURE__ */ import_react28.default.createElement(import_react28.default.Fragment, null, children);
|
|
1940
2142
|
}
|
|
1941
|
-
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);
|
|
1942
2144
|
};
|
|
1943
2145
|
var wallet_connect_default = WalletConnectWrapper;
|
|
1944
2146
|
|
|
@@ -1954,42 +2156,42 @@ var WalletConnectComponent = ({
|
|
|
1954
2156
|
const { walletConnectProjectId } = useKryptosConnect();
|
|
1955
2157
|
const theme = useTheme();
|
|
1956
2158
|
if (!walletConnectProjectId) {
|
|
1957
|
-
return /* @__PURE__ */
|
|
1958
|
-
|
|
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,
|
|
1959
2161
|
{
|
|
1960
2162
|
onPress: () => {
|
|
1961
2163
|
setAddIntegrationMode(null);
|
|
1962
2164
|
},
|
|
1963
|
-
style:
|
|
2165
|
+
style: styles13.backButton
|
|
1964
2166
|
},
|
|
1965
|
-
/* @__PURE__ */
|
|
1966
|
-
), /* @__PURE__ */
|
|
1967
|
-
|
|
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,
|
|
1968
2170
|
{
|
|
1969
|
-
style: [
|
|
2171
|
+
style: [styles13.emptyStateTitle, { color: theme.colors.text }]
|
|
1970
2172
|
},
|
|
1971
2173
|
"WalletConnect is not configured"
|
|
1972
|
-
), /* @__PURE__ */
|
|
1973
|
-
|
|
2174
|
+
), /* @__PURE__ */ import_react29.default.createElement(
|
|
2175
|
+
import_react_native14.Text,
|
|
1974
2176
|
{
|
|
1975
2177
|
style: [
|
|
1976
|
-
|
|
2178
|
+
styles13.infoText,
|
|
1977
2179
|
{ color: theme.colors.textSecondary, textAlign: "center" }
|
|
1978
2180
|
]
|
|
1979
2181
|
},
|
|
1980
2182
|
"Please add a walletConnectProjectId to KryptosConnectProvider to enable wallet connections."
|
|
1981
|
-
), /* @__PURE__ */
|
|
2183
|
+
), /* @__PURE__ */ import_react29.default.createElement(
|
|
1982
2184
|
Button,
|
|
1983
2185
|
{
|
|
1984
2186
|
variant: "outline",
|
|
1985
2187
|
size: "sm",
|
|
1986
2188
|
onPress: () => setAddIntegrationMode(null),
|
|
1987
|
-
style:
|
|
2189
|
+
style: styles13.emptyStateButton
|
|
1988
2190
|
},
|
|
1989
2191
|
"Go back"
|
|
1990
2192
|
))));
|
|
1991
2193
|
}
|
|
1992
|
-
return /* @__PURE__ */
|
|
2194
|
+
return /* @__PURE__ */ import_react29.default.createElement(wallet_connect_default, null, /* @__PURE__ */ import_react29.default.createElement(
|
|
1993
2195
|
ConnectButton,
|
|
1994
2196
|
{
|
|
1995
2197
|
integration,
|
|
@@ -2012,10 +2214,10 @@ function ConnectButton({
|
|
|
2012
2214
|
const { open, disconnect } = (0, import_appkit_react_native3.useAppKit)();
|
|
2013
2215
|
const { address, isConnected, chainId } = (0, import_appkit_react_native3.useAccount)();
|
|
2014
2216
|
const { linkToken, user, clientId } = useKryptosConnect();
|
|
2015
|
-
const [selectedChains, setSelectedChains] = (0,
|
|
2016
|
-
const [errorMessage, setErrorMessage] = (0,
|
|
2017
|
-
const [chainErrors, setChainErrors] = (0,
|
|
2018
|
-
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);
|
|
2019
2221
|
const userUsedChains = integration?.walletSupportedChains || [];
|
|
2020
2222
|
const validateForm = () => {
|
|
2021
2223
|
if (!address) {
|
|
@@ -2051,7 +2253,7 @@ function ConnectButton({
|
|
|
2051
2253
|
source: integration.id,
|
|
2052
2254
|
credential: {
|
|
2053
2255
|
address,
|
|
2054
|
-
userId: user?.
|
|
2256
|
+
userId: user?.user_id || "0",
|
|
2055
2257
|
projectId: integration.projectId,
|
|
2056
2258
|
apiKey: "0",
|
|
2057
2259
|
secret: "0",
|
|
@@ -2070,7 +2272,7 @@ function ConnectButton({
|
|
|
2070
2272
|
);
|
|
2071
2273
|
results.forEach((result, index) => {
|
|
2072
2274
|
const { chain, walletId, alias } = walletTestsPayload[index];
|
|
2073
|
-
if (result.status === "fulfilled") {
|
|
2275
|
+
if (result.status === "fulfilled" && result.value?.valid) {
|
|
2074
2276
|
const data = {
|
|
2075
2277
|
alias,
|
|
2076
2278
|
exchange: integration.id.toLowerCase(),
|
|
@@ -2081,7 +2283,7 @@ function ConnectButton({
|
|
|
2081
2283
|
logo: integration.logo || null,
|
|
2082
2284
|
startTime: null,
|
|
2083
2285
|
endTime: null,
|
|
2084
|
-
uid: user?.
|
|
2286
|
+
uid: user?.user_id || "",
|
|
2085
2287
|
walletId,
|
|
2086
2288
|
clientMetadata: {
|
|
2087
2289
|
clientId,
|
|
@@ -2095,7 +2297,7 @@ function ConnectButton({
|
|
|
2095
2297
|
default_chain_logo: chain.logo || null,
|
|
2096
2298
|
type: integration.type,
|
|
2097
2299
|
isNftSupported: integration.isEvmWallet || integration.nftSupport || false,
|
|
2098
|
-
chainId: chain.chainId || chain.id,
|
|
2300
|
+
chainId: chain?.community_id || chain.chainId || chain.id,
|
|
2099
2301
|
address
|
|
2100
2302
|
};
|
|
2101
2303
|
integrationsToAdd.push(data);
|
|
@@ -2134,16 +2336,16 @@ function ConnectButton({
|
|
|
2134
2336
|
setChainErrors(newErrors);
|
|
2135
2337
|
}
|
|
2136
2338
|
};
|
|
2137
|
-
return /* @__PURE__ */
|
|
2138
|
-
|
|
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,
|
|
2139
2341
|
{
|
|
2140
2342
|
onPress: () => {
|
|
2141
2343
|
setAddIntegrationMode(null);
|
|
2142
2344
|
},
|
|
2143
|
-
style:
|
|
2345
|
+
style: styles13.backButton
|
|
2144
2346
|
},
|
|
2145
|
-
/* @__PURE__ */
|
|
2146
|
-
), /* @__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(
|
|
2147
2349
|
Button,
|
|
2148
2350
|
{
|
|
2149
2351
|
variant: "primary",
|
|
@@ -2151,32 +2353,32 @@ function ConnectButton({
|
|
|
2151
2353
|
onPress: () => open({ view: "Connect" })
|
|
2152
2354
|
},
|
|
2153
2355
|
"Connect Wallet"
|
|
2154
|
-
)) : /* @__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) => {
|
|
2155
2357
|
const isSelected = selectedChains.has(chain.id);
|
|
2156
2358
|
const hasError = chainErrors[chain.id];
|
|
2157
|
-
return /* @__PURE__ */
|
|
2158
|
-
|
|
2359
|
+
return /* @__PURE__ */ import_react29.default.createElement(
|
|
2360
|
+
import_react_native14.TouchableOpacity,
|
|
2159
2361
|
{
|
|
2160
2362
|
onPress: () => toggleChainSelection(chain.id),
|
|
2161
|
-
style:
|
|
2363
|
+
style: styles13.chainButton,
|
|
2162
2364
|
key: chain.id
|
|
2163
2365
|
},
|
|
2164
|
-
/* @__PURE__ */
|
|
2165
|
-
|
|
2366
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
2367
|
+
import_react_native14.View,
|
|
2166
2368
|
{
|
|
2167
2369
|
style: [
|
|
2168
|
-
|
|
2370
|
+
styles13.chainChip,
|
|
2169
2371
|
{
|
|
2170
2372
|
backgroundColor: hasError ? theme.colors.errorLight : isSelected ? theme.colors.primary + "20" : theme.colors.surface,
|
|
2171
2373
|
borderColor: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.border
|
|
2172
2374
|
}
|
|
2173
2375
|
]
|
|
2174
2376
|
},
|
|
2175
|
-
/* @__PURE__ */
|
|
2176
|
-
|
|
2377
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
2378
|
+
import_react_native14.Text,
|
|
2177
2379
|
{
|
|
2178
2380
|
style: [
|
|
2179
|
-
|
|
2381
|
+
styles13.chainName,
|
|
2180
2382
|
{
|
|
2181
2383
|
color: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.text
|
|
2182
2384
|
}
|
|
@@ -2184,13 +2386,13 @@ function ConnectButton({
|
|
|
2184
2386
|
},
|
|
2185
2387
|
chain.id
|
|
2186
2388
|
),
|
|
2187
|
-
isSelected ? /* @__PURE__ */
|
|
2389
|
+
isSelected ? /* @__PURE__ */ import_react29.default.createElement(
|
|
2188
2390
|
CloseIcon,
|
|
2189
2391
|
{
|
|
2190
2392
|
size: 12,
|
|
2191
2393
|
color: hasError ? theme.colors.error : theme.colors.primary
|
|
2192
2394
|
}
|
|
2193
|
-
) : /* @__PURE__ */
|
|
2395
|
+
) : /* @__PURE__ */ import_react29.default.createElement(
|
|
2194
2396
|
PlusIcon,
|
|
2195
2397
|
{
|
|
2196
2398
|
size: 12,
|
|
@@ -2199,11 +2401,11 @@ function ConnectButton({
|
|
|
2199
2401
|
)
|
|
2200
2402
|
)
|
|
2201
2403
|
);
|
|
2202
|
-
}))), Object.keys(chainErrors).length > 0 && /* @__PURE__ */
|
|
2203
|
-
|
|
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,
|
|
2204
2406
|
{
|
|
2205
2407
|
style: [
|
|
2206
|
-
|
|
2408
|
+
styles13.chainErrorsTitle,
|
|
2207
2409
|
{ color: theme.colors.error }
|
|
2208
2410
|
]
|
|
2209
2411
|
},
|
|
@@ -2212,12 +2414,12 @@ function ConnectButton({
|
|
|
2212
2414
|
const chain = userUsedChains.find(
|
|
2213
2415
|
(c) => c.id === chainId2
|
|
2214
2416
|
);
|
|
2215
|
-
return /* @__PURE__ */
|
|
2216
|
-
|
|
2417
|
+
return /* @__PURE__ */ import_react29.default.createElement(
|
|
2418
|
+
import_react_native14.Text,
|
|
2217
2419
|
{
|
|
2218
2420
|
key: chainId2,
|
|
2219
2421
|
style: [
|
|
2220
|
-
|
|
2422
|
+
styles13.chainErrorItem,
|
|
2221
2423
|
{ color: theme.colors.error }
|
|
2222
2424
|
]
|
|
2223
2425
|
},
|
|
@@ -2226,7 +2428,7 @@ function ConnectButton({
|
|
|
2226
2428
|
": ",
|
|
2227
2429
|
error
|
|
2228
2430
|
);
|
|
2229
|
-
}))), 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(
|
|
2230
2432
|
Button,
|
|
2231
2433
|
{
|
|
2232
2434
|
variant: "outline",
|
|
@@ -2234,12 +2436,12 @@ function ConnectButton({
|
|
|
2234
2436
|
onPress: onSubmitWalletConnect,
|
|
2235
2437
|
loading: isLoading,
|
|
2236
2438
|
disabled: isLoading || !!address && userUsedChains.length > 0 && selectedChains.size === 0,
|
|
2237
|
-
style:
|
|
2439
|
+
style: styles13.button
|
|
2238
2440
|
},
|
|
2239
2441
|
selectedChains.size > 0 ? `Add ${selectedChains.size} Chain${selectedChains.size > 1 ? "s" : ""}` : "Add Integration"
|
|
2240
|
-
)));
|
|
2442
|
+
), /* @__PURE__ */ import_react29.default.createElement(Footer, null)));
|
|
2241
2443
|
}
|
|
2242
|
-
var
|
|
2444
|
+
var styles13 = import_react_native14.StyleSheet.create({
|
|
2243
2445
|
connectedTitle: { fontSize: 18, fontWeight: "600", marginBottom: 4 },
|
|
2244
2446
|
connectedText: { fontSize: 14, marginBottom: 4 },
|
|
2245
2447
|
infoText: {
|
|
@@ -2352,8 +2554,8 @@ var styles9 = import_react_native10.StyleSheet.create({
|
|
|
2352
2554
|
});
|
|
2353
2555
|
|
|
2354
2556
|
// src/molecules/IntegrationForm.tsx
|
|
2355
|
-
var
|
|
2356
|
-
var
|
|
2557
|
+
var import_react30 = __toESM(require("react"));
|
|
2558
|
+
var import_react_native15 = require("react-native");
|
|
2357
2559
|
var IntegrationForm = ({
|
|
2358
2560
|
metadata,
|
|
2359
2561
|
onAddHandle,
|
|
@@ -2363,27 +2565,35 @@ var IntegrationForm = ({
|
|
|
2363
2565
|
}) => {
|
|
2364
2566
|
const { clientId, linkToken, user } = useKryptosConnect();
|
|
2365
2567
|
const theme = useTheme();
|
|
2366
|
-
const [isLoading, setIsLoading] =
|
|
2367
|
-
const [
|
|
2368
|
-
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(
|
|
2369
2572
|
/* @__PURE__ */ new Set()
|
|
2370
2573
|
);
|
|
2371
|
-
const [chainErrors, setChainErrors] =
|
|
2574
|
+
const [chainErrors, setChainErrors] = import_react30.default.useState(
|
|
2372
2575
|
{}
|
|
2373
2576
|
);
|
|
2374
|
-
const [errorMessage, setErrorMessage] =
|
|
2375
|
-
const [formValues, setFormValues] =
|
|
2577
|
+
const [errorMessage, setErrorMessage] = import_react30.default.useState("");
|
|
2578
|
+
const [formValues, setFormValues] = import_react30.default.useState({
|
|
2376
2579
|
address: "",
|
|
2377
2580
|
account_name: "",
|
|
2378
2581
|
api_key: "",
|
|
2379
2582
|
secret_key: "",
|
|
2380
2583
|
password: ""
|
|
2381
2584
|
});
|
|
2382
|
-
const [formErrors, setFormErrors] =
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
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) {
|
|
2386
2595
|
try {
|
|
2596
|
+
setIsFetchingChains(true);
|
|
2387
2597
|
const res = await getUserUsedChains(
|
|
2388
2598
|
linkToken,
|
|
2389
2599
|
formValues.address.trim()
|
|
@@ -2391,18 +2601,22 @@ var IntegrationForm = ({
|
|
|
2391
2601
|
if (res && Array.isArray(res)) {
|
|
2392
2602
|
setUserUsedChains(res);
|
|
2393
2603
|
setSelectedChains(new Set(res.map((chain) => chain.id)));
|
|
2604
|
+
} else {
|
|
2605
|
+
setUserUsedChains([]);
|
|
2606
|
+
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2394
2607
|
}
|
|
2395
2608
|
} catch (error) {
|
|
2396
2609
|
console.error("Failed to fetch user chains:", error);
|
|
2397
2610
|
setUserUsedChains([]);
|
|
2398
2611
|
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2612
|
+
} finally {
|
|
2613
|
+
setIsFetchingChains(false);
|
|
2399
2614
|
}
|
|
2400
|
-
} else {
|
|
2401
|
-
setUserUsedChains([]);
|
|
2402
|
-
setSelectedChains(/* @__PURE__ */ new Set());
|
|
2403
2615
|
}
|
|
2616
|
+
}, 500);
|
|
2617
|
+
return () => {
|
|
2618
|
+
clearTimeout(debounceTimer);
|
|
2404
2619
|
};
|
|
2405
|
-
fetchUserUsedChains();
|
|
2406
2620
|
}, [linkToken, formValues.address]);
|
|
2407
2621
|
const toggleChainSelection = (chainId) => {
|
|
2408
2622
|
const newSelected = new Set(selectedChains);
|
|
@@ -2461,7 +2675,7 @@ var IntegrationForm = ({
|
|
|
2461
2675
|
accountName: formValues.account_name?.trim() || "0",
|
|
2462
2676
|
address: formValues.address?.trim() || "0",
|
|
2463
2677
|
password: formValues.password?.trim() || "0",
|
|
2464
|
-
userId: user?.
|
|
2678
|
+
userId: user?.user_id || "0",
|
|
2465
2679
|
projectId: metadata?.projectId || "0",
|
|
2466
2680
|
privateKey: "0",
|
|
2467
2681
|
alias,
|
|
@@ -2478,7 +2692,7 @@ var IntegrationForm = ({
|
|
|
2478
2692
|
);
|
|
2479
2693
|
results.forEach((result, index) => {
|
|
2480
2694
|
const { chain, walletId, alias } = credentialTestsData[index];
|
|
2481
|
-
if (result.status === "fulfilled" && result.value?.
|
|
2695
|
+
if (result.status === "fulfilled" && result.value?.valid) {
|
|
2482
2696
|
const data = {
|
|
2483
2697
|
alias,
|
|
2484
2698
|
exchange: metadata.id.toLowerCase(),
|
|
@@ -2489,7 +2703,7 @@ var IntegrationForm = ({
|
|
|
2489
2703
|
logo: metadata.logo || null,
|
|
2490
2704
|
startTime: null,
|
|
2491
2705
|
endTime: null,
|
|
2492
|
-
uid: user?.
|
|
2706
|
+
uid: user?.user_id || "",
|
|
2493
2707
|
walletId,
|
|
2494
2708
|
clientMetadata: {
|
|
2495
2709
|
clientId,
|
|
@@ -2503,7 +2717,7 @@ var IntegrationForm = ({
|
|
|
2503
2717
|
default_chain_logo: chain.logo || null,
|
|
2504
2718
|
type: metadata.type,
|
|
2505
2719
|
isNftSupported: metadata.isEvmWallet || metadata.nftSupport || false,
|
|
2506
|
-
chainId: chain
|
|
2720
|
+
chainId: chain?.community_id || "",
|
|
2507
2721
|
address: formValues.address
|
|
2508
2722
|
};
|
|
2509
2723
|
if (formValues.account_name)
|
|
@@ -2540,7 +2754,7 @@ var IntegrationForm = ({
|
|
|
2540
2754
|
accountName: formValues.account_name?.trim() || "0",
|
|
2541
2755
|
address: formValues.address?.trim() || "0",
|
|
2542
2756
|
password: formValues.password?.trim() || "0",
|
|
2543
|
-
userId: user?.
|
|
2757
|
+
userId: user?.user_id || "0",
|
|
2544
2758
|
projectId: metadata?.projectId || "0",
|
|
2545
2759
|
privateKey: "0",
|
|
2546
2760
|
alias,
|
|
@@ -2549,7 +2763,7 @@ var IntegrationForm = ({
|
|
|
2549
2763
|
}
|
|
2550
2764
|
};
|
|
2551
2765
|
const testResult = await testCredentials(linkToken, { ...credential });
|
|
2552
|
-
if (!testResult?.
|
|
2766
|
+
if (!testResult?.valid) {
|
|
2553
2767
|
setErrorMessage(
|
|
2554
2768
|
testResult?.value?.message || "Credentials are invalid"
|
|
2555
2769
|
);
|
|
@@ -2565,7 +2779,7 @@ var IntegrationForm = ({
|
|
|
2565
2779
|
logo: metadata.logo || null,
|
|
2566
2780
|
startTime: null,
|
|
2567
2781
|
endTime: null,
|
|
2568
|
-
uid: user?.
|
|
2782
|
+
uid: user?.user_id || "",
|
|
2569
2783
|
walletId,
|
|
2570
2784
|
clientMetadata: {
|
|
2571
2785
|
clientId,
|
|
@@ -2616,24 +2830,24 @@ var IntegrationForm = ({
|
|
|
2616
2830
|
};
|
|
2617
2831
|
const hasNoFields = !metadata.password && !metadata.secret_key && !metadata.api_key && !metadata.address && !metadata.account_name;
|
|
2618
2832
|
const shouldShowFormFields = metadata.password || metadata.secret_key || metadata.api_key || metadata.address || metadata.account_name;
|
|
2619
|
-
const renderLogo = () => metadata.logo ? /* @__PURE__ */
|
|
2620
|
-
|
|
2833
|
+
const renderLogo = () => metadata.logo ? /* @__PURE__ */ import_react30.default.createElement(
|
|
2834
|
+
import_react_native15.Image,
|
|
2621
2835
|
{
|
|
2622
2836
|
source: { uri: metadata.logo },
|
|
2623
|
-
style:
|
|
2837
|
+
style: styles14.logo,
|
|
2624
2838
|
resizeMode: "contain"
|
|
2625
2839
|
}
|
|
2626
|
-
) : /* @__PURE__ */
|
|
2627
|
-
|
|
2840
|
+
) : /* @__PURE__ */ import_react30.default.createElement(
|
|
2841
|
+
import_react_native15.View,
|
|
2628
2842
|
{
|
|
2629
2843
|
style: [
|
|
2630
|
-
|
|
2844
|
+
styles14.logoPlaceholder,
|
|
2631
2845
|
{ backgroundColor: theme.colors.surface }
|
|
2632
2846
|
]
|
|
2633
2847
|
},
|
|
2634
|
-
/* @__PURE__ */
|
|
2848
|
+
/* @__PURE__ */ import_react30.default.createElement(import_react_native15.Text, { style: { color: theme.colors.text } }, metadata.name?.charAt(0) || "?")
|
|
2635
2849
|
);
|
|
2636
|
-
const renderInput = (key, props) => /* @__PURE__ */
|
|
2850
|
+
const renderInput = (key, props) => /* @__PURE__ */ import_react30.default.createElement(
|
|
2637
2851
|
Input,
|
|
2638
2852
|
{
|
|
2639
2853
|
placeholder: props.placeholder,
|
|
@@ -2645,33 +2859,33 @@ var IntegrationForm = ({
|
|
|
2645
2859
|
secureTextEntry: props.secureTextEntry
|
|
2646
2860
|
}
|
|
2647
2861
|
);
|
|
2648
|
-
const renderErrorAlert = () => errorMessage ? /* @__PURE__ */
|
|
2649
|
-
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) => {
|
|
2650
2864
|
const isSelected = selectedChains.has(chain.id);
|
|
2651
2865
|
const hasError = chainErrors[chain.id];
|
|
2652
|
-
return /* @__PURE__ */
|
|
2653
|
-
|
|
2866
|
+
return /* @__PURE__ */ import_react30.default.createElement(
|
|
2867
|
+
import_react_native15.TouchableOpacity,
|
|
2654
2868
|
{
|
|
2655
2869
|
onPress: () => toggleChainSelection(chain.id),
|
|
2656
|
-
style:
|
|
2870
|
+
style: styles14.chainButton,
|
|
2657
2871
|
key: chain.id
|
|
2658
2872
|
},
|
|
2659
|
-
/* @__PURE__ */
|
|
2660
|
-
|
|
2873
|
+
/* @__PURE__ */ import_react30.default.createElement(
|
|
2874
|
+
import_react_native15.View,
|
|
2661
2875
|
{
|
|
2662
2876
|
style: [
|
|
2663
|
-
|
|
2877
|
+
styles14.chainChip,
|
|
2664
2878
|
{
|
|
2665
2879
|
backgroundColor: hasError ? theme.colors.errorLight : isSelected ? theme.colors.primary + "20" : theme.colors.surface,
|
|
2666
2880
|
borderColor: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.border
|
|
2667
2881
|
}
|
|
2668
2882
|
]
|
|
2669
2883
|
},
|
|
2670
|
-
/* @__PURE__ */
|
|
2671
|
-
|
|
2884
|
+
/* @__PURE__ */ import_react30.default.createElement(
|
|
2885
|
+
import_react_native15.Text,
|
|
2672
2886
|
{
|
|
2673
2887
|
style: [
|
|
2674
|
-
|
|
2888
|
+
styles14.chainName,
|
|
2675
2889
|
{
|
|
2676
2890
|
color: hasError ? theme.colors.error : isSelected ? theme.colors.primary : theme.colors.text
|
|
2677
2891
|
}
|
|
@@ -2679,28 +2893,28 @@ var IntegrationForm = ({
|
|
|
2679
2893
|
},
|
|
2680
2894
|
chain.name
|
|
2681
2895
|
),
|
|
2682
|
-
isSelected ? /* @__PURE__ */
|
|
2896
|
+
isSelected ? /* @__PURE__ */ import_react30.default.createElement(
|
|
2683
2897
|
CloseIcon,
|
|
2684
2898
|
{
|
|
2685
2899
|
size: 12,
|
|
2686
2900
|
color: hasError ? theme.colors.error : theme.colors.primary
|
|
2687
2901
|
}
|
|
2688
|
-
) : /* @__PURE__ */
|
|
2902
|
+
) : /* @__PURE__ */ import_react30.default.createElement(PlusIcon, { size: 12, color: theme.colors.textSecondary })
|
|
2689
2903
|
)
|
|
2690
2904
|
);
|
|
2691
|
-
}))), Object.keys(chainErrors).length > 0 && /* @__PURE__ */
|
|
2692
|
-
|
|
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,
|
|
2693
2907
|
{
|
|
2694
|
-
style: [
|
|
2908
|
+
style: [styles14.chainErrorsTitle, { color: theme.colors.error }]
|
|
2695
2909
|
},
|
|
2696
2910
|
"Errors:"
|
|
2697
2911
|
), Object.entries(chainErrors).map(([chainId, error]) => {
|
|
2698
2912
|
const chain = userUsedChains.find((c) => c.id === chainId);
|
|
2699
|
-
return /* @__PURE__ */
|
|
2700
|
-
|
|
2913
|
+
return /* @__PURE__ */ import_react30.default.createElement(
|
|
2914
|
+
import_react_native15.Text,
|
|
2701
2915
|
{
|
|
2702
2916
|
key: chainId,
|
|
2703
|
-
style: [
|
|
2917
|
+
style: [styles14.chainErrorItem, { color: theme.colors.error }]
|
|
2704
2918
|
},
|
|
2705
2919
|
"\u2022 ",
|
|
2706
2920
|
chain?.name,
|
|
@@ -2708,7 +2922,7 @@ var IntegrationForm = ({
|
|
|
2708
2922
|
error
|
|
2709
2923
|
);
|
|
2710
2924
|
})));
|
|
2711
|
-
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", {
|
|
2712
2926
|
placeholder: "Enter address",
|
|
2713
2927
|
autoCapitalize: "none",
|
|
2714
2928
|
autoCorrect: false
|
|
@@ -2724,27 +2938,27 @@ var IntegrationForm = ({
|
|
|
2724
2938
|
}), metadata.password && renderInput("password", {
|
|
2725
2939
|
placeholder: "Enter Password",
|
|
2726
2940
|
secureTextEntry: true
|
|
2727
|
-
})), 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.")));
|
|
2728
2942
|
const addIntegrationLabel = formValues.address && userUsedChains.length > 0 && selectedChains.size > 0 ? `Add ${selectedChains.size} Chain${selectedChains.size !== 1 ? "s" : ""}` : "Add Integration";
|
|
2729
|
-
return /* @__PURE__ */
|
|
2730
|
-
|
|
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,
|
|
2731
2945
|
{
|
|
2732
2946
|
onPress: () => setAddIntegrationMode(null),
|
|
2733
|
-
style:
|
|
2947
|
+
style: styles14.backButton
|
|
2734
2948
|
},
|
|
2735
|
-
/* @__PURE__ */
|
|
2736
|
-
), /* @__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(
|
|
2737
2951
|
Button,
|
|
2738
2952
|
{
|
|
2739
2953
|
variant: "outline",
|
|
2740
2954
|
size: "lg",
|
|
2741
2955
|
onPress: handleSubmit,
|
|
2742
2956
|
loading: isLoading,
|
|
2743
|
-
disabled: isLoading || !!formValues.address && userUsedChains.length > 0 && selectedChains.size === 0,
|
|
2744
|
-
style:
|
|
2957
|
+
disabled: isLoading || isFetchingChains || !!formValues.address && userUsedChains.length > 0 && selectedChains.size === 0,
|
|
2958
|
+
style: styles14.button
|
|
2745
2959
|
},
|
|
2746
2960
|
addIntegrationLabel
|
|
2747
|
-
))) : /* @__PURE__ */
|
|
2961
|
+
), /* @__PURE__ */ import_react30.default.createElement(Footer, null))) : /* @__PURE__ */ import_react30.default.createElement(
|
|
2748
2962
|
WalletConnectComponent,
|
|
2749
2963
|
{
|
|
2750
2964
|
integration: metadata,
|
|
@@ -2756,7 +2970,7 @@ var IntegrationForm = ({
|
|
|
2756
2970
|
}
|
|
2757
2971
|
));
|
|
2758
2972
|
};
|
|
2759
|
-
var
|
|
2973
|
+
var styles14 = import_react_native15.StyleSheet.create({
|
|
2760
2974
|
scrollViewContent: {
|
|
2761
2975
|
flexGrow: 1,
|
|
2762
2976
|
paddingBottom: 100
|
|
@@ -2873,66 +3087,9 @@ var styles10 = import_react_native11.StyleSheet.create({
|
|
|
2873
3087
|
// theme.spacing.xs
|
|
2874
3088
|
},
|
|
2875
3089
|
button: {
|
|
2876
|
-
width: "100%"
|
|
2877
|
-
marginTop: 16
|
|
2878
|
-
// theme.spacing.lg - consistent button spacing
|
|
2879
|
-
}
|
|
2880
|
-
});
|
|
2881
|
-
|
|
2882
|
-
// src/components/SkeletonItem.tsx
|
|
2883
|
-
var import_react26 = __toESM(require("react"));
|
|
2884
|
-
var import_react_native12 = require("react-native");
|
|
2885
|
-
var SkeletonItem = () => {
|
|
2886
|
-
const opacity = (0, import_react26.useRef)(new import_react_native12.Animated.Value(0.3)).current;
|
|
2887
|
-
(0, import_react26.useEffect)(() => {
|
|
2888
|
-
import_react_native12.Animated.loop(
|
|
2889
|
-
import_react_native12.Animated.sequence([
|
|
2890
|
-
import_react_native12.Animated.timing(opacity, {
|
|
2891
|
-
toValue: 1,
|
|
2892
|
-
duration: 600,
|
|
2893
|
-
useNativeDriver: true
|
|
2894
|
-
}),
|
|
2895
|
-
import_react_native12.Animated.timing(opacity, {
|
|
2896
|
-
toValue: 0.3,
|
|
2897
|
-
duration: 600,
|
|
2898
|
-
useNativeDriver: true
|
|
2899
|
-
})
|
|
2900
|
-
])
|
|
2901
|
-
).start();
|
|
2902
|
-
}, []);
|
|
2903
|
-
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 })));
|
|
2904
|
-
};
|
|
2905
|
-
var styles11 = import_react_native12.StyleSheet.create({
|
|
2906
|
-
row: {
|
|
2907
|
-
flexDirection: "row",
|
|
2908
|
-
alignItems: "center",
|
|
2909
|
-
paddingVertical: 16
|
|
2910
|
-
},
|
|
2911
|
-
iconCircle: {
|
|
2912
|
-
width: 45,
|
|
2913
|
-
height: 45,
|
|
2914
|
-
borderRadius: 22.5,
|
|
2915
|
-
backgroundColor: "#E5E5E5"
|
|
2916
|
-
},
|
|
2917
|
-
textBlock: {
|
|
2918
|
-
marginLeft: 12,
|
|
2919
|
-
flex: 1
|
|
2920
|
-
},
|
|
2921
|
-
lineShort: {
|
|
2922
|
-
width: "50%",
|
|
2923
|
-
height: 14,
|
|
2924
|
-
borderRadius: 6,
|
|
2925
|
-
backgroundColor: "#E5E5E5"
|
|
2926
|
-
},
|
|
2927
|
-
lineLong: {
|
|
2928
|
-
marginBottom: 6,
|
|
2929
|
-
width: "100%",
|
|
2930
|
-
height: 14,
|
|
2931
|
-
borderRadius: 6,
|
|
2932
|
-
backgroundColor: "#E5E5E5"
|
|
3090
|
+
width: "100%"
|
|
2933
3091
|
}
|
|
2934
3092
|
});
|
|
2935
|
-
var SkeletonItem_default = SkeletonItem;
|
|
2936
3093
|
|
|
2937
3094
|
// src/molecules/Integration.tsx
|
|
2938
3095
|
var Integration = ({
|
|
@@ -2942,13 +3099,14 @@ var Integration = ({
|
|
|
2942
3099
|
}) => {
|
|
2943
3100
|
const { appName, linkToken } = useKryptosConnect();
|
|
2944
3101
|
const theme = useTheme();
|
|
2945
|
-
const [addIntegrationMode, setAddIntegrationMode] =
|
|
2946
|
-
const [query, setQuery] =
|
|
2947
|
-
const [
|
|
2948
|
-
const [
|
|
2949
|
-
const [
|
|
2950
|
-
const [
|
|
2951
|
-
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("");
|
|
2952
3110
|
const handleClose = () => {
|
|
2953
3111
|
onClose();
|
|
2954
3112
|
};
|
|
@@ -2979,13 +3137,13 @@ var Integration = ({
|
|
|
2979
3137
|
setIsLoading(false);
|
|
2980
3138
|
}
|
|
2981
3139
|
};
|
|
2982
|
-
|
|
3140
|
+
import_react31.default.useEffect(() => {
|
|
2983
3141
|
if (linkToken) {
|
|
2984
3142
|
fetchSupportedProviders();
|
|
2985
3143
|
fetchExistingIntegrations();
|
|
2986
3144
|
}
|
|
2987
3145
|
}, [linkToken]);
|
|
2988
|
-
const isIntegrationAdded =
|
|
3146
|
+
const isIntegrationAdded = import_react31.default.useCallback(
|
|
2989
3147
|
(publicName) => {
|
|
2990
3148
|
const integrations = [...addedIntegrations, ...existingIntegrations];
|
|
2991
3149
|
return integrations.some(
|
|
@@ -2994,7 +3152,7 @@ var Integration = ({
|
|
|
2994
3152
|
},
|
|
2995
3153
|
[addedIntegrations, existingIntegrations]
|
|
2996
3154
|
);
|
|
2997
|
-
const getIntegrationCount =
|
|
3155
|
+
const getIntegrationCount = import_react31.default.useCallback(
|
|
2998
3156
|
(publicName) => {
|
|
2999
3157
|
const integrations = [...addedIntegrations, ...existingIntegrations];
|
|
3000
3158
|
return integrations.filter(
|
|
@@ -3003,22 +3161,24 @@ var Integration = ({
|
|
|
3003
3161
|
},
|
|
3004
3162
|
[addedIntegrations, existingIntegrations]
|
|
3005
3163
|
);
|
|
3006
|
-
const filteredResults =
|
|
3007
|
-
|
|
3008
|
-
|
|
3009
|
-
|
|
3010
|
-
(provider) => provider.name?.toLowerCase().includes(lowerQuery) || provider.public_name?.toLowerCase().includes(lowerQuery) || provider.id?.toLowerCase().includes(lowerQuery)
|
|
3011
|
-
);
|
|
3164
|
+
const filteredResults = import_react31.default.useMemo(() => {
|
|
3165
|
+
let filtered = supportedProviders;
|
|
3166
|
+
if (activeTab !== "all") {
|
|
3167
|
+
filtered = filtered.filter((provider) => provider.type === activeTab);
|
|
3012
3168
|
}
|
|
3013
|
-
|
|
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
|
+
});
|
|
3174
|
+
}
|
|
3175
|
+
return [...filtered].sort((a, b) => {
|
|
3014
3176
|
const countA = getIntegrationCount(a.public_name);
|
|
3015
3177
|
const countB = getIntegrationCount(b.public_name);
|
|
3016
|
-
if (countB !== countA)
|
|
3017
|
-
|
|
3018
|
-
}
|
|
3019
|
-
return a.name.localeCompare(b.name);
|
|
3178
|
+
if (countB !== countA) return countB - countA;
|
|
3179
|
+
return (a.name ?? "").localeCompare(b.name ?? "");
|
|
3020
3180
|
});
|
|
3021
|
-
}, [query, supportedProviders, getIntegrationCount]);
|
|
3181
|
+
}, [query, supportedProviders, getIntegrationCount, activeTab]);
|
|
3022
3182
|
const handleAddIntegration = async () => {
|
|
3023
3183
|
try {
|
|
3024
3184
|
setIsLoading(true);
|
|
@@ -3041,11 +3201,11 @@ var Integration = ({
|
|
|
3041
3201
|
setIsLoading(false);
|
|
3042
3202
|
}
|
|
3043
3203
|
};
|
|
3044
|
-
const renderProviderItem = ({ item }) => /* @__PURE__ */
|
|
3045
|
-
|
|
3204
|
+
const renderProviderItem = ({ item }) => /* @__PURE__ */ import_react31.default.createElement(
|
|
3205
|
+
import_react_native16.TouchableOpacity,
|
|
3046
3206
|
{
|
|
3047
3207
|
style: [
|
|
3048
|
-
|
|
3208
|
+
styles15.providerItem,
|
|
3049
3209
|
{
|
|
3050
3210
|
backgroundColor: theme.colors.surface,
|
|
3051
3211
|
borderColor: theme.colors.border
|
|
@@ -3054,44 +3214,44 @@ var Integration = ({
|
|
|
3054
3214
|
onPress: () => setAddIntegrationMode(item),
|
|
3055
3215
|
activeOpacity: 0.7
|
|
3056
3216
|
},
|
|
3057
|
-
/* @__PURE__ */
|
|
3058
|
-
|
|
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,
|
|
3059
3219
|
{
|
|
3060
3220
|
source: { uri: item?.logo },
|
|
3061
|
-
style:
|
|
3221
|
+
style: styles15.providerLogo,
|
|
3062
3222
|
resizeMode: "contain"
|
|
3063
3223
|
}
|
|
3064
|
-
) : /* @__PURE__ */
|
|
3065
|
-
|
|
3224
|
+
) : /* @__PURE__ */ import_react31.default.createElement(
|
|
3225
|
+
import_react_native16.View,
|
|
3066
3226
|
{
|
|
3067
3227
|
style: [
|
|
3068
|
-
|
|
3228
|
+
styles15.providerLogoPlaceholder,
|
|
3069
3229
|
{ backgroundColor: theme.colors.surfaceSecondary }
|
|
3070
3230
|
]
|
|
3071
3231
|
},
|
|
3072
|
-
/* @__PURE__ */
|
|
3073
|
-
), /* @__PURE__ */
|
|
3074
|
-
isIntegrationAdded(item?.public_name) && /* @__PURE__ */
|
|
3075
|
-
|
|
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,
|
|
3076
3236
|
{
|
|
3077
3237
|
style: [
|
|
3078
|
-
|
|
3238
|
+
styles15.providerCount,
|
|
3079
3239
|
{ color: theme.colors.textSecondary }
|
|
3080
3240
|
]
|
|
3081
3241
|
},
|
|
3082
3242
|
getIntegrationCount(item?.public_name)
|
|
3083
3243
|
))
|
|
3084
3244
|
);
|
|
3085
|
-
const renderSkeletonItem = () => /* @__PURE__ */
|
|
3086
|
-
return /* @__PURE__ */
|
|
3087
|
-
|
|
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,
|
|
3088
3248
|
{
|
|
3089
3249
|
onPress: () => setAddIntegrationMode(null),
|
|
3090
|
-
style:
|
|
3250
|
+
style: styles15.backButton
|
|
3091
3251
|
},
|
|
3092
|
-
/* @__PURE__ */
|
|
3093
|
-
), /* @__PURE__ */
|
|
3094
|
-
|
|
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,
|
|
3095
3255
|
{
|
|
3096
3256
|
data: isLoading ? Array.from({ length: 8 }, (_, i) => ({
|
|
3097
3257
|
id: `skeleton-${i}`,
|
|
@@ -3101,14 +3261,14 @@ var Integration = ({
|
|
|
3101
3261
|
})) : filteredResults,
|
|
3102
3262
|
keyExtractor: (item, index) => isLoading ? item.id : `provider-${item.id}-${index}`,
|
|
3103
3263
|
renderItem: isLoading ? renderSkeletonItem : renderProviderItem,
|
|
3104
|
-
style:
|
|
3264
|
+
style: styles15.list,
|
|
3105
3265
|
contentContainerStyle: [
|
|
3106
|
-
|
|
3266
|
+
styles15.listContent,
|
|
3107
3267
|
{ paddingHorizontal: theme.spacing.xl }
|
|
3108
3268
|
],
|
|
3109
3269
|
showsVerticalScrollIndicator: false,
|
|
3110
|
-
ListHeaderComponent: /* @__PURE__ */
|
|
3111
|
-
|
|
3270
|
+
ListHeaderComponent: /* @__PURE__ */ import_react31.default.createElement(
|
|
3271
|
+
import_react_native16.View,
|
|
3112
3272
|
{
|
|
3113
3273
|
style: {
|
|
3114
3274
|
paddingVertical: theme.spacing.sm + 2,
|
|
@@ -3116,29 +3276,63 @@ var Integration = ({
|
|
|
3116
3276
|
zIndex: 10
|
|
3117
3277
|
}
|
|
3118
3278
|
},
|
|
3119
|
-
/* @__PURE__ */
|
|
3279
|
+
/* @__PURE__ */ import_react31.default.createElement(
|
|
3120
3280
|
Input,
|
|
3121
3281
|
{
|
|
3122
3282
|
value: query,
|
|
3123
3283
|
onChangeText: setQuery,
|
|
3124
3284
|
placeholder: "Search Integrations...",
|
|
3125
|
-
containerStyle:
|
|
3285
|
+
containerStyle: styles15.searchInput
|
|
3126
3286
|
}
|
|
3127
|
-
)
|
|
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
|
+
)))
|
|
3128
3322
|
),
|
|
3129
3323
|
stickyHeaderIndices: [0],
|
|
3130
|
-
ListEmptyComponent: /* @__PURE__ */
|
|
3131
|
-
|
|
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,
|
|
3132
3326
|
{
|
|
3133
3327
|
style: [
|
|
3134
|
-
|
|
3328
|
+
styles15.emptyText,
|
|
3135
3329
|
{ color: theme.colors.textSecondary }
|
|
3136
3330
|
]
|
|
3137
3331
|
},
|
|
3138
3332
|
query ? "No search results found" : "No supported integrations found"
|
|
3139
3333
|
))
|
|
3140
3334
|
}
|
|
3141
|
-
), 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(
|
|
3142
3336
|
Button,
|
|
3143
3337
|
{
|
|
3144
3338
|
variant: "outline",
|
|
@@ -3146,10 +3340,10 @@ var Integration = ({
|
|
|
3146
3340
|
onPress: handleAddIntegration,
|
|
3147
3341
|
loading: isLoading,
|
|
3148
3342
|
disabled: isLoading,
|
|
3149
|
-
style:
|
|
3343
|
+
style: styles15.continueButton
|
|
3150
3344
|
},
|
|
3151
3345
|
"Continue"
|
|
3152
|
-
))) : /* @__PURE__ */
|
|
3346
|
+
), /* @__PURE__ */ import_react31.default.createElement(Footer, null))) : /* @__PURE__ */ import_react31.default.createElement(
|
|
3153
3347
|
IntegrationForm,
|
|
3154
3348
|
{
|
|
3155
3349
|
metadata: addIntegrationMode,
|
|
@@ -3163,7 +3357,7 @@ var Integration = ({
|
|
|
3163
3357
|
}
|
|
3164
3358
|
));
|
|
3165
3359
|
};
|
|
3166
|
-
var
|
|
3360
|
+
var styles15 = import_react_native16.StyleSheet.create({
|
|
3167
3361
|
headerContent: {
|
|
3168
3362
|
flexDirection: "row",
|
|
3169
3363
|
alignItems: "center"
|
|
@@ -3186,10 +3380,9 @@ var styles12 = import_react_native13.StyleSheet.create({
|
|
|
3186
3380
|
flex: 1
|
|
3187
3381
|
},
|
|
3188
3382
|
headerSection: {
|
|
3189
|
-
paddingHorizontal: 20
|
|
3190
|
-
// theme.spacing.xl
|
|
3191
|
-
paddingTop: 10
|
|
3383
|
+
paddingHorizontal: 20
|
|
3192
3384
|
// theme.spacing.xl
|
|
3385
|
+
// paddingTop: 10, // theme.spacing.xl
|
|
3193
3386
|
},
|
|
3194
3387
|
title: {
|
|
3195
3388
|
fontSize: 16,
|
|
@@ -3278,25 +3471,47 @@ var styles12 = import_react_native13.StyleSheet.create({
|
|
|
3278
3471
|
errorAlert: {
|
|
3279
3472
|
marginTop: 16
|
|
3280
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"
|
|
3281
3496
|
}
|
|
3282
3497
|
});
|
|
3283
3498
|
|
|
3284
3499
|
// src/molecules/OTPVerify.tsx
|
|
3285
|
-
var
|
|
3286
|
-
var
|
|
3500
|
+
var import_react32 = __toESM(require("react"));
|
|
3501
|
+
var import_react_native17 = require("react-native");
|
|
3287
3502
|
var OTPVerify = ({
|
|
3288
3503
|
open,
|
|
3289
3504
|
onSuccess,
|
|
3290
3505
|
onClose
|
|
3291
3506
|
}) => {
|
|
3292
3507
|
const theme = useTheme();
|
|
3293
|
-
const [otp, setOtp] =
|
|
3508
|
+
const [otp, setOtp] = import_react32.default.useState("");
|
|
3294
3509
|
const { linkToken, clientId, email, setUser } = useKryptosConnect();
|
|
3295
|
-
const [isLoading, setIsLoading] =
|
|
3296
|
-
const [isResending, setIsResending] =
|
|
3297
|
-
const [resendCooldown, setResendCooldown] =
|
|
3298
|
-
const [errorMessage, setErrorMessage] =
|
|
3299
|
-
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("");
|
|
3300
3515
|
const handleSubmit = async () => {
|
|
3301
3516
|
if (otp.length !== 6) return;
|
|
3302
3517
|
setIsLoading(true);
|
|
@@ -3347,7 +3562,7 @@ var OTPVerify = ({
|
|
|
3347
3562
|
setSuccessMessage("");
|
|
3348
3563
|
setOtp("");
|
|
3349
3564
|
};
|
|
3350
|
-
|
|
3565
|
+
import_react32.default.useEffect(() => {
|
|
3351
3566
|
if (resendCooldown > 0) {
|
|
3352
3567
|
const timer = setTimeout(() => {
|
|
3353
3568
|
setResendCooldown(resendCooldown - 1);
|
|
@@ -3356,13 +3571,20 @@ var OTPVerify = ({
|
|
|
3356
3571
|
}
|
|
3357
3572
|
return void 0;
|
|
3358
3573
|
}, [resendCooldown]);
|
|
3359
|
-
return /* @__PURE__ */
|
|
3360
|
-
|
|
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,
|
|
3361
3576
|
{
|
|
3362
|
-
style: [
|
|
3577
|
+
style: [styles16.infoText, { color: theme.colors.textSecondary }]
|
|
3363
3578
|
},
|
|
3364
3579
|
"We have sent a verification code to"
|
|
3365
|
-
), /* @__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(
|
|
3366
3588
|
Button,
|
|
3367
3589
|
{
|
|
3368
3590
|
variant: "outline",
|
|
@@ -3370,44 +3592,44 @@ var OTPVerify = ({
|
|
|
3370
3592
|
onPress: handleSubmit,
|
|
3371
3593
|
loading: isLoading,
|
|
3372
3594
|
disabled: otp.length !== 6 || isLoading,
|
|
3373
|
-
style:
|
|
3595
|
+
style: styles16.button
|
|
3374
3596
|
},
|
|
3375
3597
|
"Continue"
|
|
3376
|
-
), /* @__PURE__ */
|
|
3377
|
-
|
|
3598
|
+
), /* @__PURE__ */ import_react32.default.createElement(
|
|
3599
|
+
import_react_native17.TouchableOpacity,
|
|
3378
3600
|
{
|
|
3379
3601
|
onPress: handleResendOtp,
|
|
3380
3602
|
disabled: resendCooldown > 0 || isResending,
|
|
3381
|
-
style:
|
|
3603
|
+
style: styles16.resendContainer
|
|
3382
3604
|
},
|
|
3383
|
-
isResending ? /* @__PURE__ */
|
|
3384
|
-
|
|
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,
|
|
3385
3607
|
{
|
|
3386
|
-
style: [
|
|
3608
|
+
style: [styles16.resendText, { color: theme.colors.primary }]
|
|
3387
3609
|
},
|
|
3388
3610
|
" ",
|
|
3389
3611
|
"Sending..."
|
|
3390
|
-
)) : resendCooldown > 0 ? /* @__PURE__ */
|
|
3391
|
-
|
|
3612
|
+
)) : resendCooldown > 0 ? /* @__PURE__ */ import_react32.default.createElement(
|
|
3613
|
+
import_react_native17.Text,
|
|
3392
3614
|
{
|
|
3393
3615
|
style: [
|
|
3394
|
-
|
|
3616
|
+
styles16.resendText,
|
|
3395
3617
|
{ color: theme.colors.textSecondary }
|
|
3396
3618
|
]
|
|
3397
3619
|
},
|
|
3398
3620
|
"Resend OTP in ",
|
|
3399
3621
|
resendCooldown,
|
|
3400
3622
|
"s"
|
|
3401
|
-
) : /* @__PURE__ */
|
|
3402
|
-
|
|
3623
|
+
) : /* @__PURE__ */ import_react32.default.createElement(
|
|
3624
|
+
import_react_native17.Text,
|
|
3403
3625
|
{
|
|
3404
|
-
style: [
|
|
3626
|
+
style: [styles16.resendText, { color: theme.colors.primary }]
|
|
3405
3627
|
},
|
|
3406
3628
|
"Resend OTP"
|
|
3407
3629
|
)
|
|
3408
|
-
))));
|
|
3630
|
+
))), /* @__PURE__ */ import_react32.default.createElement(ModalFooter, { style: { paddingVertical: 0 } }, /* @__PURE__ */ import_react32.default.createElement(Footer, null)));
|
|
3409
3631
|
};
|
|
3410
|
-
var
|
|
3632
|
+
var styles16 = import_react_native17.StyleSheet.create({
|
|
3411
3633
|
headerContent: {
|
|
3412
3634
|
flexDirection: "row",
|
|
3413
3635
|
alignItems: "center"
|
|
@@ -3466,8 +3688,8 @@ var styles13 = import_react_native14.StyleSheet.create({
|
|
|
3466
3688
|
});
|
|
3467
3689
|
|
|
3468
3690
|
// src/molecules/Permissions.tsx
|
|
3469
|
-
var
|
|
3470
|
-
var
|
|
3691
|
+
var import_react33 = __toESM(require("react"));
|
|
3692
|
+
var import_react_native18 = require("react-native");
|
|
3471
3693
|
var Permissions = ({
|
|
3472
3694
|
open,
|
|
3473
3695
|
onClose,
|
|
@@ -3475,8 +3697,8 @@ var Permissions = ({
|
|
|
3475
3697
|
}) => {
|
|
3476
3698
|
const { appName, linkToken, setUserConsent } = useKryptosConnect();
|
|
3477
3699
|
const theme = useTheme();
|
|
3478
|
-
const [isLoading, setIsLoading] =
|
|
3479
|
-
const [errorMessage, setErrorMessage] =
|
|
3700
|
+
const [isLoading, setIsLoading] = import_react33.default.useState(false);
|
|
3701
|
+
const [errorMessage, setErrorMessage] = import_react33.default.useState("");
|
|
3480
3702
|
const handleConsentClick = async () => {
|
|
3481
3703
|
try {
|
|
3482
3704
|
setIsLoading(true);
|
|
@@ -3499,42 +3721,42 @@ var Permissions = ({
|
|
|
3499
3721
|
"Access your transaction history and trading activity",
|
|
3500
3722
|
"Keep this data updated and accessible when you're offline"
|
|
3501
3723
|
];
|
|
3502
|
-
return /* @__PURE__ */
|
|
3503
|
-
|
|
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,
|
|
3504
3726
|
{
|
|
3505
|
-
style: [
|
|
3727
|
+
style: [styles17.subtitle, { color: theme.colors.textSecondary }]
|
|
3506
3728
|
},
|
|
3507
3729
|
"Allow ",
|
|
3508
3730
|
appName,
|
|
3509
3731
|
" to:"
|
|
3510
|
-
), permissionItems.map((item, index) => /* @__PURE__ */
|
|
3511
|
-
|
|
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,
|
|
3512
3734
|
{
|
|
3513
|
-
style: [
|
|
3735
|
+
style: [styles17.permissionText, { color: theme.colors.text }]
|
|
3514
3736
|
},
|
|
3515
3737
|
item
|
|
3516
|
-
)))), /* @__PURE__ */
|
|
3517
|
-
|
|
3738
|
+
)))), /* @__PURE__ */ import_react33.default.createElement(
|
|
3739
|
+
import_react_native18.View,
|
|
3518
3740
|
{
|
|
3519
3741
|
style: [
|
|
3520
|
-
|
|
3742
|
+
styles17.infoBox,
|
|
3521
3743
|
{
|
|
3522
3744
|
backgroundColor: theme.colors.surface,
|
|
3523
3745
|
borderColor: theme.colors.border
|
|
3524
3746
|
}
|
|
3525
3747
|
]
|
|
3526
3748
|
},
|
|
3527
|
-
/* @__PURE__ */
|
|
3528
|
-
|
|
3749
|
+
/* @__PURE__ */ import_react33.default.createElement(
|
|
3750
|
+
import_react_native18.Text,
|
|
3529
3751
|
{
|
|
3530
|
-
style: [
|
|
3752
|
+
style: [styles17.infoText, { color: theme.colors.textSecondary }]
|
|
3531
3753
|
},
|
|
3532
3754
|
"By selecting",
|
|
3533
3755
|
" ",
|
|
3534
|
-
/* @__PURE__ */
|
|
3756
|
+
/* @__PURE__ */ import_react33.default.createElement(import_react_native18.Text, { style: { fontWeight: "600", color: theme.colors.text } }, "'Allow'"),
|
|
3535
3757
|
", you agree to share this information and keep it updated."
|
|
3536
3758
|
)
|
|
3537
|
-
))), /* @__PURE__ */
|
|
3759
|
+
))), /* @__PURE__ */ import_react33.default.createElement(ModalFooter, { style: { paddingVertical: 8 } }, /* @__PURE__ */ import_react33.default.createElement(
|
|
3538
3760
|
Button,
|
|
3539
3761
|
{
|
|
3540
3762
|
variant: "outline",
|
|
@@ -3542,12 +3764,12 @@ var Permissions = ({
|
|
|
3542
3764
|
onPress: handleConsentClick,
|
|
3543
3765
|
loading: isLoading,
|
|
3544
3766
|
disabled: isLoading,
|
|
3545
|
-
style:
|
|
3767
|
+
style: styles17.button
|
|
3546
3768
|
},
|
|
3547
3769
|
"Allow"
|
|
3548
|
-
)));
|
|
3770
|
+
), /* @__PURE__ */ import_react33.default.createElement(Footer, null)));
|
|
3549
3771
|
};
|
|
3550
|
-
var
|
|
3772
|
+
var styles17 = import_react_native18.StyleSheet.create({
|
|
3551
3773
|
container: {
|
|
3552
3774
|
flex: 1
|
|
3553
3775
|
},
|
|
@@ -3605,8 +3827,8 @@ var styles14 = import_react_native15.StyleSheet.create({
|
|
|
3605
3827
|
});
|
|
3606
3828
|
|
|
3607
3829
|
// src/molecules/StatusModal.tsx
|
|
3608
|
-
var
|
|
3609
|
-
var
|
|
3830
|
+
var import_react34 = __toESM(require("react"));
|
|
3831
|
+
var import_react_native19 = require("react-native");
|
|
3610
3832
|
var StatusModal = ({
|
|
3611
3833
|
open,
|
|
3612
3834
|
onClose,
|
|
@@ -3623,18 +3845,18 @@ var StatusModal = ({
|
|
|
3623
3845
|
}
|
|
3624
3846
|
onClose();
|
|
3625
3847
|
};
|
|
3626
|
-
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(
|
|
3627
3849
|
Button,
|
|
3628
3850
|
{
|
|
3629
3851
|
variant: "outline",
|
|
3630
3852
|
size: "lg",
|
|
3631
3853
|
onPress: status === "success" ? onSuccess : onError,
|
|
3632
|
-
style:
|
|
3854
|
+
style: styles18.button
|
|
3633
3855
|
},
|
|
3634
3856
|
status === "success" ? "Continue" : "Try again later"
|
|
3635
|
-
))));
|
|
3857
|
+
), /* @__PURE__ */ import_react34.default.createElement(Footer, null)));
|
|
3636
3858
|
};
|
|
3637
|
-
var
|
|
3859
|
+
var styles18 = import_react_native19.StyleSheet.create({
|
|
3638
3860
|
container: {
|
|
3639
3861
|
flex: 1,
|
|
3640
3862
|
alignItems: "center",
|
|
@@ -3658,6 +3880,64 @@ var styles15 = import_react_native16.StyleSheet.create({
|
|
|
3658
3880
|
}
|
|
3659
3881
|
});
|
|
3660
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
|
+
|
|
3661
3941
|
// src/KryptosConnectButton.tsx
|
|
3662
3942
|
var KryptosConnectButton = ({
|
|
3663
3943
|
children,
|
|
@@ -3668,14 +3948,14 @@ var KryptosConnectButton = ({
|
|
|
3668
3948
|
textStyle
|
|
3669
3949
|
}) => {
|
|
3670
3950
|
const { theme: themeName } = useKryptosConnect();
|
|
3671
|
-
const [open, setOpen] =
|
|
3951
|
+
const [open, setOpen] = import_react36.default.useState(false);
|
|
3672
3952
|
const theme = useTheme();
|
|
3673
|
-
return /* @__PURE__ */
|
|
3674
|
-
|
|
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,
|
|
3675
3955
|
{
|
|
3676
3956
|
onPress: () => setOpen(true),
|
|
3677
3957
|
style: [
|
|
3678
|
-
|
|
3958
|
+
styles20.defaultButton,
|
|
3679
3959
|
themeName === "light" ? {
|
|
3680
3960
|
backgroundColor: theme.colors.white,
|
|
3681
3961
|
borderRadius: theme.borderRadius.md,
|
|
@@ -3689,11 +3969,11 @@ var KryptosConnectButton = ({
|
|
|
3689
3969
|
],
|
|
3690
3970
|
activeOpacity: 0.8
|
|
3691
3971
|
},
|
|
3692
|
-
/* @__PURE__ */
|
|
3693
|
-
|
|
3972
|
+
/* @__PURE__ */ import_react36.default.createElement(
|
|
3973
|
+
import_react_native21.Text,
|
|
3694
3974
|
{
|
|
3695
3975
|
style: [
|
|
3696
|
-
|
|
3976
|
+
styles20.buttonText,
|
|
3697
3977
|
{
|
|
3698
3978
|
color: themeName === "light" ? theme.colors.primary : theme.colors.white,
|
|
3699
3979
|
fontSize: theme.fontSize.lg
|
|
@@ -3704,8 +3984,8 @@ var KryptosConnectButton = ({
|
|
|
3704
3984
|
"Connect with",
|
|
3705
3985
|
" "
|
|
3706
3986
|
),
|
|
3707
|
-
/* @__PURE__ */
|
|
3708
|
-
), /* @__PURE__ */
|
|
3987
|
+
/* @__PURE__ */ import_react36.default.createElement(LogoIcon, { size: 24 })
|
|
3988
|
+
), /* @__PURE__ */ import_react36.default.createElement(
|
|
3709
3989
|
KryptosConnectModal,
|
|
3710
3990
|
{
|
|
3711
3991
|
open,
|
|
@@ -3729,9 +4009,11 @@ var KryptosConnectModal = ({
|
|
|
3729
4009
|
setUserConsent,
|
|
3730
4010
|
setUser,
|
|
3731
4011
|
setEmail,
|
|
3732
|
-
setLinkToken
|
|
4012
|
+
setLinkToken,
|
|
4013
|
+
isAuthorized,
|
|
4014
|
+
linkToken
|
|
3733
4015
|
} = useKryptosConnect();
|
|
3734
|
-
const [step, setStep] =
|
|
4016
|
+
const [step, setStep] = import_react36.default.useState("INIT" /* INIT */);
|
|
3735
4017
|
const handleClose = () => {
|
|
3736
4018
|
setOpen(false);
|
|
3737
4019
|
setIsInitialized(false);
|
|
@@ -3749,22 +4031,39 @@ var KryptosConnectModal = ({
|
|
|
3749
4031
|
onError?.(userConsent);
|
|
3750
4032
|
handleClose();
|
|
3751
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
|
+
};
|
|
3752
4047
|
const handleAbort = () => {
|
|
3753
4048
|
onError?.(new Error("User closed the modal"));
|
|
3754
4049
|
handleClose();
|
|
3755
4050
|
};
|
|
3756
4051
|
if (!open) return null;
|
|
3757
|
-
return /* @__PURE__ */
|
|
4052
|
+
return /* @__PURE__ */ import_react36.default.createElement(import_react_native21.View, { style: styles20.container }, step === "INIT" /* INIT */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3758
4053
|
Init,
|
|
3759
4054
|
{
|
|
3760
4055
|
open,
|
|
3761
4056
|
generateLinkToken,
|
|
3762
|
-
onSuccess: () => {
|
|
3763
|
-
|
|
4057
|
+
onSuccess: (data) => {
|
|
4058
|
+
if (data?.isAuthorized) {
|
|
4059
|
+
setStep("INTEGRATION" /* INTEGRATION */);
|
|
4060
|
+
} else {
|
|
4061
|
+
setStep("AUTH" /* AUTH */);
|
|
4062
|
+
}
|
|
3764
4063
|
},
|
|
3765
4064
|
onClose: handleAbort
|
|
3766
4065
|
}
|
|
3767
|
-
), step === "AUTH" /* AUTH */ && /* @__PURE__ */
|
|
4066
|
+
), step === "AUTH" /* AUTH */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3768
4067
|
Auth,
|
|
3769
4068
|
{
|
|
3770
4069
|
open,
|
|
@@ -3772,28 +4071,28 @@ var KryptosConnectModal = ({
|
|
|
3772
4071
|
onGuestSuccess: () => setStep("INTEGRATION" /* INTEGRATION */),
|
|
3773
4072
|
onClose: handleAbort
|
|
3774
4073
|
}
|
|
3775
|
-
), step === "OTP" /* OTP */ && /* @__PURE__ */
|
|
4074
|
+
), step === "OTP" /* OTP */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3776
4075
|
OTPVerify,
|
|
3777
4076
|
{
|
|
3778
4077
|
open,
|
|
3779
4078
|
onSuccess: () => setStep("INTEGRATION" /* INTEGRATION */),
|
|
3780
4079
|
onClose: handleAbort
|
|
3781
4080
|
}
|
|
3782
|
-
), step === "INTEGRATION" /* INTEGRATION */ && /* @__PURE__ */
|
|
4081
|
+
), step === "INTEGRATION" /* INTEGRATION */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3783
4082
|
Integration,
|
|
3784
4083
|
{
|
|
3785
4084
|
open,
|
|
3786
|
-
onSuccess:
|
|
4085
|
+
onSuccess: handleConsentClick,
|
|
3787
4086
|
onClose: handleAbort
|
|
3788
4087
|
}
|
|
3789
|
-
), step === "PERMISSIONS" /* PERMISSIONS */ && /* @__PURE__ */
|
|
4088
|
+
), step === "PERMISSIONS" /* PERMISSIONS */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3790
4089
|
Permissions,
|
|
3791
4090
|
{
|
|
3792
4091
|
open,
|
|
3793
4092
|
onClose: handleAbort,
|
|
3794
4093
|
onSuccess: () => setStep("STATUS" /* STATUS */)
|
|
3795
4094
|
}
|
|
3796
|
-
), step === "STATUS" /* STATUS */ && /* @__PURE__ */
|
|
4095
|
+
), step === "STATUS" /* STATUS */ && /* @__PURE__ */ import_react36.default.createElement(
|
|
3797
4096
|
StatusModal,
|
|
3798
4097
|
{
|
|
3799
4098
|
open,
|
|
@@ -3802,9 +4101,19 @@ var KryptosConnectModal = ({
|
|
|
3802
4101
|
onError: handleError,
|
|
3803
4102
|
status: userConsent?.public_token ? "success" : "error"
|
|
3804
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
|
+
}
|
|
3805
4114
|
));
|
|
3806
4115
|
};
|
|
3807
|
-
var
|
|
4116
|
+
var styles20 = import_react_native21.StyleSheet.create({
|
|
3808
4117
|
defaultButton: {
|
|
3809
4118
|
flexDirection: "row",
|
|
3810
4119
|
alignItems: "center",
|