@kryptos_connect/mobile-sdk 0.0.1 → 1.0.2

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