@kryptos_connect/mobile-sdk 1.0.0 → 1.0.2

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