@kryptos_connect/mobile-sdk 0.0.1 → 1.0.0

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
@@ -267,8 +267,8 @@ var useTheme = () => {
267
267
  };
268
268
 
269
269
  // src/molecules/Auth.tsx
270
- var import_react13 = __toESM(require("react"));
271
- var import_react_native6 = require("react-native");
270
+ var import_react12 = __toESM(require("react"));
271
+ var import_react_native5 = require("react-native");
272
272
 
273
273
  // src/assets/LinkIcon.tsx
274
274
  var import_react4 = __toESM(require("react"));
@@ -565,119 +565,18 @@ var styles2 = import_react_native2.StyleSheet.create({
565
565
  }
566
566
  });
567
567
 
568
- // src/components/Input.tsx
569
- var import_react8 = __toESM(require("react"));
570
- var import_react_native3 = require("react-native");
571
- var Input = ({
572
- label,
573
- error,
574
- helperText,
575
- status = "default",
576
- containerStyle,
577
- inputStyle,
578
- labelStyle,
579
- ...props
580
- }) => {
581
- const theme = useTheme();
582
- const inputStatus = error ? "error" : status;
583
- const getBorderColor = () => {
584
- switch (inputStatus) {
585
- case "error":
586
- return theme.colors.error;
587
- case "success":
588
- return theme.colors.success;
589
- default:
590
- return theme.colors.border;
591
- }
592
- };
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,
595
- {
596
- style: [
597
- styles3.label,
598
- { color: theme.colors.text, fontSize: theme.fontSize.sm },
599
- labelStyle
600
- ]
601
- },
602
- label
603
- ), /* @__PURE__ */ import_react8.default.createElement(
604
- import_react_native3.TextInput,
605
- {
606
- placeholderTextColor: theme.colors.textTertiary,
607
- style: [
608
- styles3.input,
609
- {
610
- backgroundColor: theme.colors.surface,
611
- borderColor: getBorderColor(),
612
- color: theme.colors.text,
613
- fontSize: theme.fontSize.md,
614
- borderRadius: theme.borderRadius.md,
615
- paddingHorizontal: theme.spacing.lg,
616
- paddingVertical: theme.spacing.md
617
- },
618
- inputStyle
619
- ],
620
- ...props
621
- }
622
- ), error && /* @__PURE__ */ import_react8.default.createElement(
623
- import_react_native3.Text,
624
- {
625
- style: [
626
- styles3.error,
627
- { color: theme.colors.error, fontSize: theme.fontSize.sm }
628
- ]
629
- },
630
- error
631
- ), helperText && !error && /* @__PURE__ */ import_react8.default.createElement(
632
- import_react_native3.Text,
633
- {
634
- style: [
635
- styles3.helper,
636
- {
637
- color: theme.colors.textSecondary,
638
- fontSize: theme.fontSize.sm
639
- }
640
- ]
641
- },
642
- helperText
643
- ));
644
- };
645
- var styles3 = import_react_native3.StyleSheet.create({
646
- wrapper: {
647
- marginBottom: 16
648
- // theme.spacing.lg - consistent form spacing
649
- },
650
- label: {
651
- fontWeight: "500",
652
- marginBottom: 8
653
- // theme.spacing.sm
654
- },
655
- input: {
656
- borderWidth: 1,
657
- minHeight: 48
658
- },
659
- error: {
660
- marginTop: 4
661
- // theme.spacing.xs
662
- },
663
- helper: {
664
- marginTop: 4
665
- // theme.spacing.xs
666
- }
667
- });
668
-
669
568
  // src/components/Modal.tsx
670
- var import_react10 = __toESM(require("react"));
671
- var import_react_native4 = require("react-native");
569
+ var import_react9 = __toESM(require("react"));
570
+ var import_react_native3 = require("react-native");
672
571
 
673
572
  // src/assets/CloseIcon.tsx
674
- var import_react9 = __toESM(require("react"));
573
+ var import_react8 = __toESM(require("react"));
675
574
  var import_react_native_svg4 = __toESM(require("react-native-svg"));
676
575
  var CloseIcon = ({
677
576
  size = 20,
678
577
  color = "#000"
679
578
  }) => {
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(
579
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_native_svg4.default, { width: size, height: size, viewBox: "0 0 20 20", fill: "none" }, /* @__PURE__ */ import_react8.default.createElement(
681
580
  import_react_native_svg4.Path,
682
581
  {
683
582
  d: "M15 5L5 15M5 5L15 15",
@@ -690,7 +589,7 @@ var CloseIcon = ({
690
589
  };
691
590
 
692
591
  // src/components/Modal.tsx
693
- var { height: SCREEN_HEIGHT } = import_react_native4.Dimensions.get("window");
592
+ var { height: SCREEN_HEIGHT } = import_react_native3.Dimensions.get("window");
694
593
  var Modal = ({
695
594
  isOpen,
696
595
  onClose,
@@ -722,14 +621,14 @@ var Modal = ({
722
621
  const handleOverlayPress = () => {
723
622
  if (!disableClose && closeOnOverlayClick) onClose();
724
623
  };
725
- return /* @__PURE__ */ import_react10.default.createElement(
726
- import_react_native4.KeyboardAvoidingView,
624
+ return /* @__PURE__ */ import_react9.default.createElement(
625
+ import_react_native3.KeyboardAvoidingView,
727
626
  {
728
- behavior: import_react_native4.Platform.OS === "ios" ? "padding" : "height",
729
- style: styles4.keyboardView
627
+ behavior: import_react_native3.Platform.OS === "ios" ? "padding" : "height",
628
+ style: styles3.keyboardView
730
629
  },
731
- /* @__PURE__ */ import_react10.default.createElement(
732
- import_react_native4.Modal,
630
+ /* @__PURE__ */ import_react9.default.createElement(
631
+ import_react_native3.Modal,
733
632
  {
734
633
  visible: isOpen,
735
634
  transparent: true,
@@ -737,18 +636,18 @@ var Modal = ({
737
636
  statusBarTranslucent: true,
738
637
  onRequestClose: disableClose ? void 0 : onClose
739
638
  },
740
- /* @__PURE__ */ import_react10.default.createElement(
741
- import_react_native4.TouchableOpacity,
639
+ /* @__PURE__ */ import_react9.default.createElement(
640
+ import_react_native3.TouchableOpacity,
742
641
  {
743
642
  activeOpacity: 1,
744
- style: [styles4.overlay, { backgroundColor: theme.colors.overlay }],
643
+ style: [styles3.overlay, { backgroundColor: theme.colors.overlay }],
745
644
  onPress: handleOverlayPress
746
645
  },
747
- /* @__PURE__ */ import_react10.default.createElement(
748
- import_react_native4.View,
646
+ /* @__PURE__ */ import_react9.default.createElement(
647
+ import_react_native3.View,
749
648
  {
750
649
  style: [
751
- styles4.container,
650
+ styles3.container,
752
651
  {
753
652
  backgroundColor: theme.colors.background,
754
653
  borderTopLeftRadius: theme.borderRadius.xl,
@@ -775,11 +674,11 @@ var ModalHeader = ({
775
674
  style
776
675
  }) => {
777
676
  const theme = useTheme();
778
- return /* @__PURE__ */ import_react10.default.createElement(
779
- import_react_native4.View,
677
+ return /* @__PURE__ */ import_react9.default.createElement(
678
+ import_react_native3.View,
780
679
  {
781
680
  style: [
782
- styles4.header,
681
+ styles3.header,
783
682
  {
784
683
  borderBottomColor: theme.colors.border,
785
684
  paddingHorizontal: theme.spacing.lg,
@@ -788,27 +687,27 @@ var ModalHeader = ({
788
687
  style
789
688
  ]
790
689
  },
791
- /* @__PURE__ */ import_react10.default.createElement(import_react_native4.View, { style: styles4.headerContent }, typeof children === "string" ? /* @__PURE__ */ import_react10.default.createElement(
792
- import_react_native4.Text,
690
+ /* @__PURE__ */ import_react9.default.createElement(import_react_native3.View, { style: styles3.headerContent }, typeof children === "string" ? /* @__PURE__ */ import_react9.default.createElement(
691
+ import_react_native3.Text,
793
692
  {
794
693
  style: [
795
- styles4.title,
694
+ styles3.title,
796
695
  { color: theme.colors.text, fontSize: theme.fontSize.lg }
797
696
  ]
798
697
  },
799
698
  children
800
699
  ) : children),
801
- showCloseButton && onClose && /* @__PURE__ */ import_react10.default.createElement(
802
- import_react_native4.TouchableOpacity,
700
+ showCloseButton && onClose && /* @__PURE__ */ import_react9.default.createElement(
701
+ import_react_native3.TouchableOpacity,
803
702
  {
804
703
  onPress: onClose,
805
704
  hitSlop: { top: 10, bottom: 10, left: 10, right: 10 },
806
705
  style: [
807
- styles4.closeButton,
706
+ styles3.closeButton,
808
707
  { backgroundColor: theme.colors.surface }
809
708
  ]
810
709
  },
811
- /* @__PURE__ */ import_react10.default.createElement(CloseIcon, { color: theme.colors.text, size: 20 })
710
+ /* @__PURE__ */ import_react9.default.createElement(CloseIcon, { color: theme.colors.text, size: 20 })
812
711
  )
813
712
  );
814
713
  };
@@ -819,12 +718,12 @@ var ModalBody = ({
819
718
  }) => {
820
719
  const theme = useTheme();
821
720
  if (scrollable) {
822
- return /* @__PURE__ */ import_react10.default.createElement(
823
- import_react_native4.ScrollView,
721
+ return /* @__PURE__ */ import_react9.default.createElement(
722
+ import_react_native3.ScrollView,
824
723
  {
825
- style: styles4.bodyScroll,
724
+ style: styles3.bodyScroll,
826
725
  contentContainerStyle: [
827
- styles4.bodyContent,
726
+ styles3.bodyContent,
828
727
  { padding: theme.spacing.lg },
829
728
  style
830
729
  ],
@@ -834,18 +733,18 @@ var ModalBody = ({
834
733
  children
835
734
  );
836
735
  }
837
- return /* @__PURE__ */ import_react10.default.createElement(import_react_native4.View, { style: [styles4.body, { padding: theme.spacing.lg }, style] }, children);
736
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_native3.View, { style: [styles3.body, { padding: theme.spacing.lg }, style] }, children);
838
737
  };
839
738
  var ModalFooter = ({
840
739
  children,
841
740
  style
842
741
  }) => {
843
742
  const theme = useTheme();
844
- return /* @__PURE__ */ import_react10.default.createElement(
845
- import_react_native4.View,
743
+ return /* @__PURE__ */ import_react9.default.createElement(
744
+ import_react_native3.View,
846
745
  {
847
746
  style: [
848
- styles4.footer,
747
+ styles3.footer,
849
748
  {
850
749
  borderTopColor: theme.colors.border,
851
750
  paddingHorizontal: theme.spacing.lg,
@@ -857,7 +756,7 @@ var ModalFooter = ({
857
756
  children
858
757
  );
859
758
  };
860
- var styles4 = import_react_native4.StyleSheet.create({
759
+ var styles3 = import_react_native3.StyleSheet.create({
861
760
  keyboardView: {
862
761
  flex: 1
863
762
  },
@@ -918,7 +817,7 @@ var styles4 = import_react_native4.StyleSheet.create({
918
817
  var import_axios = __toESM(require("axios"));
919
818
 
920
819
  // src/config/index.ts
921
- var BASE_URL = "https://connect-dev.kryptos.io/connect/";
820
+ var BASE_URL = "https://connect-api-dev.kryptos.io/";
922
821
 
923
822
  // src/services/api.ts
924
823
  var api = import_axios.default.create({
@@ -927,7 +826,7 @@ var api = import_axios.default.create({
927
826
  "Content-Type": "application/json"
928
827
  }
929
828
  });
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";
829
+ var SCOPES = "openid profile offline_access email portfolios:read transactions:read integrations:read tax:read accounting:read reports:read workspace:read users:read";
931
830
  async function sendEmailOtp(linkToken, email, clientId) {
932
831
  const res = await api.post(
933
832
  "/v1/sendEmailOTP",
@@ -938,7 +837,7 @@ async function sendEmailOtp(linkToken, email, clientId) {
938
837
  },
939
838
  {
940
839
  headers: {
941
- "X-Link-Token": linkToken
840
+ "X-LINK-TOKEN": linkToken
942
841
  }
943
842
  }
944
843
  );
@@ -955,7 +854,7 @@ async function loginWithOtp(linkToken, email, code, clientId) {
955
854
  },
956
855
  {
957
856
  headers: {
958
- "X-Link-Token": linkToken
857
+ "X-LINK-TOKEN": linkToken
959
858
  }
960
859
  }
961
860
  );
@@ -963,11 +862,11 @@ async function loginWithOtp(linkToken, email, code, clientId) {
963
862
  }
964
863
  async function createAnonymousUser(linkToken, clientId) {
965
864
  const res = await api.post(
966
- "/v1/anonymousAccountCreation",
865
+ "/link-token/login",
967
866
  { clientId },
968
867
  {
969
868
  headers: {
970
- "X-Link-Token": linkToken
869
+ "X-LINK-TOKEN": linkToken
971
870
  }
972
871
  }
973
872
  );
@@ -975,79 +874,78 @@ async function createAnonymousUser(linkToken, clientId) {
975
874
  }
976
875
  async function addUserIntegration(linkToken, integration) {
977
876
  const res = await api.post(
978
- "/v1/addUserIntegration",
979
- { providers: [...integration] },
877
+ "/integrations/keys",
878
+ { keys: [...integration] },
980
879
  {
981
880
  headers: {
982
- "X-Link-Token": linkToken
881
+ "X-LINK-TOKEN": linkToken
983
882
  }
984
883
  }
985
884
  );
986
- return res.data;
885
+ return res.data?.data;
987
886
  }
988
887
  async function giveUserConsent(linkToken) {
989
888
  const res = await api.post(
990
- "/v1/consent",
889
+ "/consent",
991
890
  {
992
- granted_scopes: SCOPES,
993
- user_consent: true
891
+ granted_scopes: SCOPES
994
892
  },
995
893
  {
996
894
  headers: {
997
- "X-Link-Token": linkToken
895
+ "X-LINK-TOKEN": linkToken
998
896
  }
999
897
  }
1000
898
  );
1001
- return res.data;
899
+ return res.data?.data;
1002
900
  }
1003
901
  async function testCredentials(linkToken, data) {
1004
- const res = await api.post("/v1/api/testCredentials", data, {
902
+ const res = await api.post("/integrations/credentials/test", data, {
1005
903
  headers: {
1006
- "X-Link-Token": linkToken
904
+ "X-LINK-TOKEN": linkToken
1007
905
  }
1008
906
  });
1009
- return res.data;
907
+ return res.data?.data;
1010
908
  }
1011
909
  async function getSupportedProviders(linkToken) {
1012
- const res = await api.get("/v1/integrations", {
910
+ const res = await api.get("/integrations/providers", {
1013
911
  headers: {
1014
- "X-Link-Token": linkToken
912
+ "X-LINK-TOKEN": linkToken
1015
913
  }
1016
914
  });
1017
- return res.data;
915
+ return res.data?.data;
1018
916
  }
1019
917
  async function getUserIntegrations(linkToken) {
1020
- const res = await api.get("/v1/userIntegrations", {
918
+ const res = await api.get("/integrations", {
1021
919
  headers: {
1022
- "X-Link-Token": linkToken
920
+ "X-LINK-TOKEN": linkToken
1023
921
  }
1024
922
  });
1025
- return res.data;
923
+ return res.data?.data;
1026
924
  }
1027
925
  async function getUserUsedChains(linkToken, address) {
1028
- const res = await api.get("/v1/api/getUserUsedChainV2", {
926
+ const res = await api.get("/integrations/user-used-chain", {
1029
927
  headers: {
1030
- "X-Link-Token": linkToken
928
+ "X-LINK-TOKEN": linkToken
1031
929
  },
1032
930
  params: {
1033
931
  id: address
1034
932
  }
1035
933
  });
1036
- return res.data;
934
+ return res.data?.data?.chains || [];
1037
935
  }
1038
936
 
1039
937
  // src/molecules/ConnectLogo.tsx
1040
- var import_react12 = __toESM(require("react"));
1041
- var import_react_native5 = require("react-native");
938
+ var import_react11 = __toESM(require("react"));
939
+ var import_react_native4 = require("react-native");
1042
940
 
1043
941
  // src/assets/UnplugIcon.tsx
1044
- var import_react11 = __toESM(require("react"));
942
+ var import_react10 = __toESM(require("react"));
1045
943
  var import_react_native_svg5 = __toESM(require("react-native-svg"));
1046
944
  var UnplugIcon = ({
1047
945
  size = 24,
1048
946
  color = "#6B7280"
1049
947
  }) => {
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(
948
+ return /* @__PURE__ */ import_react10.default.createElement(import_react_native_svg5.default, { width: size, height: size, viewBox: "0 0 24 24", fill: "none" }, /* @__PURE__ */ import_react10.default.createElement(
1051
949
  import_react_native_svg5.Path,
1052
950
  {
1053
951
  d: "m19 5 3-3",
@@ -1056,7 +954,7 @@ var UnplugIcon = ({
1056
954
  strokeLinecap: "round",
1057
955
  strokeLinejoin: "round"
1058
956
  }
1059
- ), /* @__PURE__ */ import_react11.default.createElement(
957
+ ), /* @__PURE__ */ import_react10.default.createElement(
1060
958
  import_react_native_svg5.Path,
1061
959
  {
1062
960
  d: "m2 22 3-3",
@@ -1065,7 +963,7 @@ var UnplugIcon = ({
1065
963
  strokeLinecap: "round",
1066
964
  strokeLinejoin: "round"
1067
965
  }
1068
- ), /* @__PURE__ */ import_react11.default.createElement(
966
+ ), /* @__PURE__ */ import_react10.default.createElement(
1069
967
  import_react_native_svg5.Path,
1070
968
  {
1071
969
  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",
@@ -1074,7 +972,7 @@ var UnplugIcon = ({
1074
972
  strokeLinecap: "round",
1075
973
  strokeLinejoin: "round"
1076
974
  }
1077
- ), /* @__PURE__ */ import_react11.default.createElement(
975
+ ), /* @__PURE__ */ import_react10.default.createElement(
1078
976
  import_react_native_svg5.Path,
1079
977
  {
1080
978
  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",
@@ -1083,7 +981,7 @@ var UnplugIcon = ({
1083
981
  strokeLinecap: "round",
1084
982
  strokeLinejoin: "round"
1085
983
  }
1086
- ), /* @__PURE__ */ import_react11.default.createElement(
984
+ ), /* @__PURE__ */ import_react10.default.createElement(
1087
985
  import_react_native_svg5.Line,
1088
986
  {
1089
987
  x1: 7.5,
@@ -1100,12 +998,12 @@ var UnplugIcon = ({
1100
998
  // src/molecules/ConnectLogo.tsx
1101
999
  var KryptosLogo = () => {
1102
1000
  const theme = useTheme();
1103
- return /* @__PURE__ */ import_react12.default.createElement(
1104
- import_react_native5.View,
1001
+ return /* @__PURE__ */ import_react11.default.createElement(
1002
+ import_react_native4.View,
1105
1003
  {
1106
- style: [styles5.logoContainer, { backgroundColor: theme.colors.surface }]
1004
+ style: [styles4.logoContainer, { backgroundColor: theme.colors.surface }]
1107
1005
  },
1108
- /* @__PURE__ */ import_react12.default.createElement(LogoIcon, { size: 36 })
1006
+ /* @__PURE__ */ import_react11.default.createElement(LogoIcon, { size: 36 })
1109
1007
  );
1110
1008
  };
1111
1009
  var ConnectLogo = () => {
@@ -1120,43 +1018,43 @@ var ConnectLogo = () => {
1120
1018
  }
1121
1019
  };
1122
1020
  const renderLogo = () => {
1123
- if ((0, import_react12.isValidElement)(appLogo)) {
1021
+ if ((0, import_react11.isValidElement)(appLogo)) {
1124
1022
  return appLogo;
1125
1023
  } else if (typeof appLogo === "string" && isValidUrl(appLogo)) {
1126
- return /* @__PURE__ */ import_react12.default.createElement(
1127
- import_react_native5.Image,
1024
+ return /* @__PURE__ */ import_react11.default.createElement(
1025
+ import_react_native4.Image,
1128
1026
  {
1129
1027
  source: { uri: appLogo },
1130
- style: styles5.appLogoImage,
1028
+ style: styles4.appLogoImage,
1131
1029
  resizeMode: "contain"
1132
1030
  }
1133
1031
  );
1134
1032
  } else if (typeof appLogo === "number" || typeof appLogo === "object" && appLogo !== null) {
1135
- return /* @__PURE__ */ import_react12.default.createElement(
1136
- import_react_native5.Image,
1033
+ return /* @__PURE__ */ import_react11.default.createElement(
1034
+ import_react_native4.Image,
1137
1035
  {
1138
1036
  source: appLogo,
1139
- style: styles5.appLogoImage,
1037
+ style: styles4.appLogoImage,
1140
1038
  resizeMode: "contain"
1141
1039
  }
1142
1040
  );
1143
1041
  } 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());
1042
+ return /* @__PURE__ */ import_react11.default.createElement(import_react_native4.Text, { style: [styles4.appLogoText, { color: theme.colors.text }] }, appName.charAt(0).toUpperCase());
1145
1043
  }
1146
- return /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.appLogoText, { color: theme.colors.text }] }, "?");
1044
+ return /* @__PURE__ */ import_react11.default.createElement(import_react_native4.Text, { style: [styles4.appLogoText, { color: theme.colors.text }] }, "?");
1147
1045
  };
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,
1046
+ return /* @__PURE__ */ import_react11.default.createElement(import_react_native4.View, { style: styles4.container }, /* @__PURE__ */ import_react11.default.createElement(KryptosLogo, null), /* @__PURE__ */ import_react11.default.createElement(import_react_native4.View, { style: styles4.iconContainer }, /* @__PURE__ */ import_react11.default.createElement(UnplugIcon, { size: 24, color: theme.colors.textSecondary })), /* @__PURE__ */ import_react11.default.createElement(
1047
+ import_react_native4.View,
1150
1048
  {
1151
1049
  style: [
1152
- styles5.logoContainer,
1050
+ styles4.logoContainer,
1153
1051
  { backgroundColor: theme.colors.surface }
1154
1052
  ]
1155
1053
  },
1156
1054
  renderLogo()
1157
1055
  ));
1158
1056
  };
1159
- var styles5 = import_react_native5.StyleSheet.create({
1057
+ var styles4 = import_react_native4.StyleSheet.create({
1160
1058
  container: {
1161
1059
  flexDirection: "row",
1162
1060
  alignItems: "center",
@@ -1199,11 +1097,11 @@ var Auth = ({
1199
1097
  }) => {
1200
1098
  const { appName, linkToken, clientId, setUser, setEmail } = useKryptosConnect();
1201
1099
  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);
1100
+ const [isLoading, setIsLoading] = import_react12.default.useState(false);
1101
+ const [errorMessage, setErrorMessage] = import_react12.default.useState("");
1102
+ const [emailValue, setEmailValue] = import_react12.default.useState("");
1103
+ const [emailError, setEmailError] = import_react12.default.useState("");
1104
+ const [loadingType, setLoadingType] = import_react12.default.useState(null);
1207
1105
  const validateEmail = (email) => {
1208
1106
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
1209
1107
  if (!email) {
@@ -1265,52 +1163,27 @@ var Auth = ({
1265
1163
  };
1266
1164
  const infoSections = [
1267
1165
  {
1268
- icon: /* @__PURE__ */ import_react13.default.createElement(LinkIcon, { size: 20, color: theme.colors.primary }),
1166
+ icon: /* @__PURE__ */ import_react12.default.createElement(LinkIcon, { size: 20, color: theme.colors.primary }),
1269
1167
  title: "Simple and secure",
1270
1168
  text: "Connect your Web3 accounts with Kryptos in just a few clicks"
1271
1169
  },
1272
1170
  {
1273
- icon: /* @__PURE__ */ import_react13.default.createElement(ShieldIcon, { size: 20, color: theme.colors.primary }),
1171
+ icon: /* @__PURE__ */ import_react12.default.createElement(ShieldIcon, { size: 20, color: theme.colors.primary }),
1274
1172
  title: "Control what you share",
1275
1173
  text: "We never share your data without your permission"
1276
1174
  }
1277
1175
  ];
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,
1176
+ return /* @__PURE__ */ import_react12.default.createElement(Modal, { isOpen: open, onClose: handleClose, size: "full" }, /* @__PURE__ */ import_react12.default.createElement(ModalHeader, { onClose: handleClose }, ""), /* @__PURE__ */ import_react12.default.createElement(ModalBody, null, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { style: styles5.container }, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.title, { color: theme.colors.text }] }, "Connect ", appName, " to your Kryptos account"), /* @__PURE__ */ import_react12.default.createElement(ConnectLogo, null), infoSections.map((section, index) => /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { key: `info-${index}`, style: styles5.infoSection }, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { style: styles5.infoIcon }, section.icon), /* @__PURE__ */ import_react12.default.createElement(import_react_native5.View, { style: styles5.infoContent }, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.infoTitle, { color: theme.colors.text }] }, section.title), /* @__PURE__ */ import_react12.default.createElement(
1177
+ import_react_native5.Text,
1280
1178
  {
1281
1179
  style: [
1282
- styles6.infoDescription,
1180
+ styles5.infoDescription,
1283
1181
  { color: theme.colors.textSecondary }
1284
1182
  ]
1285
1183
  },
1286
1184
  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(
1302
- Button,
1303
- {
1304
- variant: "outline",
1305
- size: "lg",
1306
- onPress: handleEmailSubmit,
1307
- loading: loadingType === "email",
1308
- disabled: isLoading,
1309
- style: styles6.button
1310
- },
1311
- "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,
1185
+ )))), errorMessage ? /* @__PURE__ */ import_react12.default.createElement(Alert, { variant: "destructive" }, /* @__PURE__ */ import_react12.default.createElement(AlertDescription, null, errorMessage)) : null, /* @__PURE__ */ import_react12.default.createElement(import_react_native5.Text, { style: [styles5.footer, { color: theme.colors.textSecondary }] }, "By continuing, you agree to Kryptos", " ", /* @__PURE__ */ import_react12.default.createElement(
1186
+ import_react_native5.Text,
1314
1187
  {
1315
1188
  style: {
1316
1189
  color: theme.colors.primary,
@@ -1318,20 +1191,20 @@ var Auth = ({
1318
1191
  }
1319
1192
  },
1320
1193
  "Privacy Policy"
1321
- )), /* @__PURE__ */ import_react13.default.createElement(
1194
+ )), /* @__PURE__ */ import_react12.default.createElement(
1322
1195
  Button,
1323
1196
  {
1324
- variant: "ghost",
1197
+ variant: "outline",
1325
1198
  size: "lg",
1326
1199
  onPress: handleContinueAsGuest,
1327
1200
  loading: loadingType === "guest",
1328
1201
  disabled: isLoading,
1329
- style: styles6.button
1202
+ style: styles5.button
1330
1203
  },
1331
1204
  "Continue as guest"
1332
1205
  ))));
1333
1206
  };
1334
- var styles6 = import_react_native6.StyleSheet.create({
1207
+ var styles5 = import_react_native5.StyleSheet.create({
1335
1208
  container: {
1336
1209
  flex: 1
1337
1210
  },
@@ -1387,6 +1260,107 @@ var styles6 = import_react_native6.StyleSheet.create({
1387
1260
  }
1388
1261
  });
1389
1262
 
1263
+ // src/components/Input.tsx
1264
+ var import_react13 = __toESM(require("react"));
1265
+ var import_react_native6 = require("react-native");
1266
+ var Input = ({
1267
+ label,
1268
+ error,
1269
+ helperText,
1270
+ status = "default",
1271
+ containerStyle,
1272
+ inputStyle,
1273
+ labelStyle,
1274
+ ...props
1275
+ }) => {
1276
+ const theme = useTheme();
1277
+ const inputStatus = error ? "error" : status;
1278
+ const getBorderColor = () => {
1279
+ switch (inputStatus) {
1280
+ case "error":
1281
+ return theme.colors.error;
1282
+ case "success":
1283
+ return theme.colors.success;
1284
+ default:
1285
+ return theme.colors.border;
1286
+ }
1287
+ };
1288
+ return /* @__PURE__ */ import_react13.default.createElement(import_react_native6.View, { style: [styles6.wrapper, containerStyle] }, label && /* @__PURE__ */ import_react13.default.createElement(
1289
+ import_react_native6.Text,
1290
+ {
1291
+ style: [
1292
+ styles6.label,
1293
+ { color: theme.colors.text, fontSize: theme.fontSize.sm },
1294
+ labelStyle
1295
+ ]
1296
+ },
1297
+ label
1298
+ ), /* @__PURE__ */ import_react13.default.createElement(
1299
+ import_react_native6.TextInput,
1300
+ {
1301
+ placeholderTextColor: theme.colors.textTertiary,
1302
+ style: [
1303
+ styles6.input,
1304
+ {
1305
+ backgroundColor: theme.colors.surface,
1306
+ borderColor: getBorderColor(),
1307
+ color: theme.colors.text,
1308
+ fontSize: theme.fontSize.md,
1309
+ borderRadius: theme.borderRadius.md,
1310
+ paddingHorizontal: theme.spacing.lg,
1311
+ paddingVertical: theme.spacing.md
1312
+ },
1313
+ inputStyle
1314
+ ],
1315
+ ...props
1316
+ }
1317
+ ), error && /* @__PURE__ */ import_react13.default.createElement(
1318
+ import_react_native6.Text,
1319
+ {
1320
+ style: [
1321
+ styles6.error,
1322
+ { color: theme.colors.error, fontSize: theme.fontSize.sm }
1323
+ ]
1324
+ },
1325
+ error
1326
+ ), helperText && !error && /* @__PURE__ */ import_react13.default.createElement(
1327
+ import_react_native6.Text,
1328
+ {
1329
+ style: [
1330
+ styles6.helper,
1331
+ {
1332
+ color: theme.colors.textSecondary,
1333
+ fontSize: theme.fontSize.sm
1334
+ }
1335
+ ]
1336
+ },
1337
+ helperText
1338
+ ));
1339
+ };
1340
+ var styles6 = import_react_native6.StyleSheet.create({
1341
+ wrapper: {
1342
+ marginBottom: 16
1343
+ // theme.spacing.lg - consistent form spacing
1344
+ },
1345
+ label: {
1346
+ fontWeight: "500",
1347
+ marginBottom: 8
1348
+ // theme.spacing.sm
1349
+ },
1350
+ input: {
1351
+ borderWidth: 1,
1352
+ minHeight: 48
1353
+ },
1354
+ error: {
1355
+ marginTop: 4
1356
+ // theme.spacing.xs
1357
+ },
1358
+ helper: {
1359
+ marginTop: 4
1360
+ // theme.spacing.xs
1361
+ }
1362
+ });
1363
+
1390
1364
  // src/components/OTP.tsx
1391
1365
  var import_react14 = __toESM(require("react"));
1392
1366
  var import_react_native7 = require("react-native");
@@ -1564,14 +1538,14 @@ var Init = ({
1564
1538
  setError(null);
1565
1539
  try {
1566
1540
  const linkToken = await generateLinkToken();
1567
- if (!linkToken) {
1541
+ if (!linkToken || !linkToken?.link_token || linkToken.link_token === "" || linkToken.link_token === null || linkToken.link_token === void 0) {
1568
1542
  setIsInitialized(false);
1569
1543
  setError("Failed to fetch link token. Please try again.");
1570
1544
  return;
1571
1545
  }
1572
- setLinkToken(linkToken);
1546
+ setLinkToken(linkToken.link_token);
1573
1547
  setIsInitialized(true);
1574
- onSuccess();
1548
+ onSuccess(linkToken.isAuthorized ? { isAuthorized: true } : null);
1575
1549
  } catch (err) {
1576
1550
  console.error("Failed to fetch link token:", err);
1577
1551
  setIsInitialized(false);
@@ -2070,7 +2044,7 @@ function ConnectButton({
2070
2044
  );
2071
2045
  results.forEach((result, index) => {
2072
2046
  const { chain, walletId, alias } = walletTestsPayload[index];
2073
- if (result.status === "fulfilled") {
2047
+ if (result.status === "fulfilled" && result.value?.valid) {
2074
2048
  const data = {
2075
2049
  alias,
2076
2050
  exchange: integration.id.toLowerCase(),
@@ -2478,7 +2452,7 @@ var IntegrationForm = ({
2478
2452
  );
2479
2453
  results.forEach((result, index) => {
2480
2454
  const { chain, walletId, alias } = credentialTestsData[index];
2481
- if (result.status === "fulfilled" && result.value?.value?.status) {
2455
+ if (result.status === "fulfilled" && result.value?.valid) {
2482
2456
  const data = {
2483
2457
  alias,
2484
2458
  exchange: metadata.id.toLowerCase(),
@@ -2549,7 +2523,7 @@ var IntegrationForm = ({
2549
2523
  }
2550
2524
  };
2551
2525
  const testResult = await testCredentials(linkToken, { ...credential });
2552
- if (!testResult?.value?.status) {
2526
+ if (!testResult?.value?.valid) {
2553
2527
  setErrorMessage(
2554
2528
  testResult?.value?.message || "Credentials are invalid"
2555
2529
  );
@@ -3759,8 +3733,12 @@ var KryptosConnectModal = ({
3759
3733
  {
3760
3734
  open,
3761
3735
  generateLinkToken,
3762
- onSuccess: () => {
3763
- setStep("AUTH" /* AUTH */);
3736
+ onSuccess: (data) => {
3737
+ if (data?.isAuthorized) {
3738
+ setStep("INTEGRATION" /* INTEGRATION */);
3739
+ } else {
3740
+ setStep("AUTH" /* AUTH */);
3741
+ }
3764
3742
  },
3765
3743
  onClose: handleAbort
3766
3744
  }