@matchain/matchid-sdk-react 0.1.18 → 0.1.20

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.mjs CHANGED
@@ -370,8 +370,8 @@ function GithubIcon({
370
370
  /* @__PURE__ */ jsx21(
371
371
  "path",
372
372
  {
373
- "fill-rule": "evenodd",
374
- "clip-rule": "evenodd",
373
+ fillRule: "evenodd",
374
+ clipRule: "evenodd",
375
375
  d: "M19.6836 7C16.434 7.00169 13.2909 8.15263 10.8165 10.247C8.34197 12.3414 6.69741 15.2427 6.17684 18.4321C5.65627 21.6215 6.29363 24.8911 7.97496 27.6561C9.6563 30.4211 12.272 32.5013 15.3542 33.5248C16.0343 33.651 16.2904 33.2295 16.2904 32.8712C16.2904 32.5128 16.2768 31.4738 16.2723 30.3379C12.4642 31.1606 11.6596 28.731 11.6596 28.731C11.0385 27.1533 10.1409 26.7386 10.1409 26.7386C8.89876 25.8957 10.2338 25.9115 10.2338 25.9115C11.6097 26.0084 12.3328 27.3156 12.3328 27.3156C13.5523 29.3958 15.5356 28.7941 16.3153 28.4425C16.4377 27.5613 16.7936 26.9618 17.1857 26.6214C14.1438 26.2789 10.9478 25.1114 10.9478 19.8961C10.929 18.5436 11.4338 17.2356 12.3577 16.2428C12.2172 15.9002 11.748 14.5164 12.4914 12.6367C12.4914 12.6367 13.6407 12.2716 16.2564 14.0318C18.5 13.4217 20.8672 13.4217 23.1108 14.0318C25.7243 12.2716 26.8712 12.6367 26.8712 12.6367C27.617 14.5119 27.1478 15.8957 27.0072 16.2428C27.9341 17.2358 28.4399 18.546 28.4194 19.9007C28.4194 25.1272 25.2166 26.2789 22.1701 26.6147C22.6597 27.0384 23.0972 27.8655 23.0972 29.1367C23.0972 30.9577 23.0814 32.4227 23.0814 32.8712C23.0814 33.234 23.3284 33.6577 24.022 33.5248C27.1047 32.5012 29.7206 30.4206 31.4019 27.6551C33.0832 24.8896 33.7202 21.6196 33.1991 18.4299C32.6779 15.2402 31.0325 12.3389 28.5572 10.2449C26.0819 8.15081 22.9381 7.00062 19.6881 7H19.6836Z",
376
376
  fill: "white"
377
377
  }
@@ -478,23 +478,45 @@ function CopyIcon({ size = 20, color = "black", ...props }) {
478
478
  ) });
479
479
  }
480
480
 
481
+ // src/assets/icon/LinkedinIcon.tsx
482
+ import { jsx as jsx25, jsxs as jsxs15 } from "react/jsx-runtime";
483
+ function LinkedinIcon({
484
+ size = 40,
485
+ ...props
486
+ }) {
487
+ return /* @__PURE__ */ jsxs15("svg", { width: size, height: size, ...props, viewBox: "0 0 40 40", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
488
+ /* @__PURE__ */ jsx25("rect", { width: "40", height: "40", rx: "8", fill: "#0A66C2" }),
489
+ /* @__PURE__ */ jsx25(
490
+ "path",
491
+ {
492
+ d: "M29.376 9H10.624C10.1933 9 9.78023 9.1711 9.47567 9.47567C9.1711 9.78023 9 10.1933 9 10.624V29.376C9 29.8067 9.1711 30.2198 9.47567 30.5243C9.78023 30.8289 10.1933 31 10.624 31H29.376C29.8067 31 30.2198 30.8289 30.5243 30.5243C30.8289 30.2198 31 29.8067 31 29.376V10.624C31 10.1933 30.8289 9.78023 30.5243 9.47567C30.2198 9.1711 29.8067 9 29.376 9ZM15.5572 27.7413H12.2496V17.2347H15.5572V27.7413ZM13.9011 15.7788C13.5259 15.7766 13.1598 15.6634 12.8488 15.4534C12.5379 15.2434 12.2962 14.946 12.1541 14.5987C12.0121 14.2514 11.9761 13.8699 12.0507 13.5022C12.1253 13.1345 12.3072 12.7971 12.5733 12.5326C12.8395 12.2682 13.178 12.0885 13.5462 12.0163C13.9144 11.944 14.2957 11.9825 14.642 12.1267C14.9884 12.271 15.2842 12.5147 15.4923 12.8269C15.7003 13.1392 15.8111 13.5061 15.8108 13.8813C15.8144 14.1324 15.7673 14.3818 15.6724 14.6144C15.5776 14.847 15.4368 15.0582 15.2586 15.2352C15.0804 15.4123 14.8684 15.5517 14.6351 15.6451C14.4019 15.7384 14.1523 15.7839 13.9011 15.7788ZM27.7489 27.7504H24.4428V22.0106C24.4428 20.3178 23.7232 19.7953 22.7943 19.7953C21.8135 19.7953 20.851 20.5347 20.851 22.0533V27.7504H17.5433V17.2424H20.7242V18.6983H20.7669C21.0863 18.0521 22.2046 16.9475 23.9111 16.9475C25.7567 16.9475 27.7504 18.0429 27.7504 21.2513L27.7489 27.7504Z",
493
+ fill: "white"
494
+ }
495
+ )
496
+ ] });
497
+ }
498
+
481
499
  // src/components/Modal/index.tsx
482
- import { Fragment, jsx as jsx25, jsxs as jsxs15 } from "react/jsx-runtime";
500
+ import { Fragment, jsx as jsx26, jsxs as jsxs16 } from "react/jsx-runtime";
483
501
  function Modal({
484
502
  children,
485
503
  isOpen,
486
504
  width = 480,
505
+ zIndex = 100,
487
506
  className = ""
488
507
  }) {
489
- return isOpen ? /* @__PURE__ */ jsx25(
508
+ return isOpen ? /* @__PURE__ */ jsx26(
490
509
  "div",
491
510
  {
492
511
  className: "matchid-overlay",
493
- children: /* @__PURE__ */ jsx25("div", { className: `matchid-modal ${className}`, style: {
512
+ style: {
513
+ zIndex
514
+ },
515
+ children: /* @__PURE__ */ jsx26("div", { className: `matchid-modal ${className}`, style: {
494
516
  width
495
517
  }, children })
496
518
  }
497
- ) : /* @__PURE__ */ jsx25(Fragment, {});
519
+ ) : /* @__PURE__ */ jsx26(Fragment, {});
498
520
  }
499
521
  function ModalWithHeader({
500
522
  children,
@@ -505,13 +527,13 @@ function ModalWithHeader({
505
527
  showClose = true,
506
528
  ...props
507
529
  }) {
508
- return /* @__PURE__ */ jsxs15(Modal, { ...props, children: [
509
- /* @__PURE__ */ jsxs15("div", { className: `matchid-modal-header ${showBorder ? "matchid-modal-header-border" : ""}`, children: [
510
- /* @__PURE__ */ jsxs15("div", { className: "matchid-modal-header-content", children: [
511
- onBack && /* @__PURE__ */ jsx25(ArrowLeftIcon, { className: "matchid-modal-header-back", onClick: onBack }),
512
- /* @__PURE__ */ jsx25("span", { className: "matchid-modal-header-title", children: title })
530
+ return /* @__PURE__ */ jsxs16(Modal, { ...props, children: [
531
+ /* @__PURE__ */ jsxs16("div", { className: `matchid-modal-header ${showBorder ? "matchid-modal-header-border" : ""}`, children: [
532
+ /* @__PURE__ */ jsxs16("div", { className: "matchid-modal-header-content", children: [
533
+ onBack && /* @__PURE__ */ jsx26(ArrowLeftIcon, { className: "matchid-modal-header-back", onClick: onBack }),
534
+ /* @__PURE__ */ jsx26("span", { className: "matchid-modal-header-title", children: title })
513
535
  ] }),
514
- onClose && /* @__PURE__ */ jsx25(CloseRoundIcon, { className: "matchid-modal-header-close", onClick: onClose })
536
+ onClose && /* @__PURE__ */ jsx26(CloseRoundIcon, { className: "matchid-modal-header-close", onClick: onClose })
515
537
  ] }),
516
538
  children
517
539
  ] });
@@ -522,7 +544,7 @@ import { useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } f
522
544
 
523
545
  // src/components/Input/index.tsx
524
546
  import { useState } from "react";
525
- import { jsx as jsx26, jsxs as jsxs16 } from "react/jsx-runtime";
547
+ import { jsx as jsx27, jsxs as jsxs17 } from "react/jsx-runtime";
526
548
  function Input({
527
549
  onChange,
528
550
  type,
@@ -531,22 +553,22 @@ function Input({
531
553
  ...props
532
554
  }) {
533
555
  const [inputType, setInputType] = useState(type);
534
- return /* @__PURE__ */ jsxs16("div", { className: `matchid-input-box ${props.value.length > 0 ? "matchid-input-has-content" : ""} ${className}`, children: [
535
- /* @__PURE__ */ jsx26("input", { type: inputType, onChange, ...props, className: "matchid-input-field" }),
536
- props.value.length > 0 && /* @__PURE__ */ jsx26(DeleteRoundIcon, { onClick: (e) => {
556
+ return /* @__PURE__ */ jsxs17("div", { className: `matchid-input-box ${props.value.length > 0 ? "matchid-input-has-content" : ""} ${className}`, children: [
557
+ /* @__PURE__ */ jsx27("input", { type: inputType, onChange, ...props, className: "matchid-input-field" }),
558
+ props.value.length > 0 && /* @__PURE__ */ jsx27(DeleteRoundIcon, { onClick: (e) => {
537
559
  if (onChange) {
538
560
  onChange({ target: { value: "" } });
539
561
  }
540
562
  }, className: "matchid-input-delete-icon", color: "var(--matchid-input-delete-icon-color)" }),
541
- type === "password" && /* @__PURE__ */ jsx26("div", { className: "matchid-input-eye-icon", onClick: () => {
563
+ type === "password" && /* @__PURE__ */ jsx27("div", { className: "matchid-input-eye-icon", onClick: () => {
542
564
  setInputType(inputType === "password" ? "text" : "password");
543
- }, children: inputType === "password" ? /* @__PURE__ */ jsx26(CloseEyeIcon, {}) : /* @__PURE__ */ jsx26(OpenEyeIcon, {}) }),
565
+ }, children: inputType === "password" ? /* @__PURE__ */ jsx27(CloseEyeIcon, {}) : /* @__PURE__ */ jsx27(OpenEyeIcon, {}) }),
544
566
  after
545
567
  ] });
546
568
  }
547
569
 
548
570
  // src/components/Field/index.tsx
549
- import { jsx as jsx27, jsxs as jsxs17 } from "react/jsx-runtime";
571
+ import { jsx as jsx28, jsxs as jsxs18 } from "react/jsx-runtime";
550
572
  function Field({
551
573
  label,
552
574
  children,
@@ -554,18 +576,18 @@ function Field({
554
576
  required,
555
577
  className = ""
556
578
  }) {
557
- return /* @__PURE__ */ jsxs17("div", { className: `matchid-field-box ${className}`, children: [
558
- /* @__PURE__ */ jsxs17("div", { className: "matchid-field-label", children: [
559
- required && /* @__PURE__ */ jsx27("span", { className: "matchid-field-required", children: "*" }),
579
+ return /* @__PURE__ */ jsxs18("div", { className: `matchid-field-box ${className}`, children: [
580
+ /* @__PURE__ */ jsxs18("div", { className: "matchid-field-label", children: [
581
+ required && /* @__PURE__ */ jsx28("span", { className: "matchid-field-required", children: "*" }),
560
582
  label
561
583
  ] }),
562
584
  children,
563
- error && /* @__PURE__ */ jsx27("div", { className: "matchid-field-error", children: error })
585
+ error && /* @__PURE__ */ jsx28("div", { className: "matchid-field-error", children: error })
564
586
  ] });
565
587
  }
566
588
 
567
589
  // src/components/Button/index.tsx
568
- import { jsx as jsx28 } from "react/jsx-runtime";
590
+ import { jsx as jsx29 } from "react/jsx-runtime";
569
591
  function Button({
570
592
  size = "df",
571
593
  disabled = false,
@@ -584,7 +606,7 @@ function Button({
584
606
  onClick && onClick();
585
607
  }
586
608
  };
587
- return /* @__PURE__ */ jsx28(
609
+ return /* @__PURE__ */ jsx29(
588
610
  "button",
589
611
  {
590
612
  type,
@@ -594,7 +616,7 @@ function Button({
594
616
  ...style
595
617
  },
596
618
  onClick: onAction,
597
- children: loading ? /* @__PURE__ */ jsx28(LoadingIcon_default, { className: "matchid-btn-loading-icon", color: "var(--matchid-btn-loading-color)" }) : children
619
+ children: loading ? /* @__PURE__ */ jsx29(LoadingIcon_default, { className: "matchid-btn-loading-icon", color: "var(--matchid-btn-loading-color)" }) : children
598
620
  }
599
621
  );
600
622
  }
@@ -876,6 +898,34 @@ var getAuthInfoApi = () => {
876
898
  method: "GET"
877
899
  });
878
900
  };
901
+ var getWalletNonceApi = ({ address }) => {
902
+ return request_default({
903
+ url: `/api/v1/login/wallet/init`,
904
+ method: "POST",
905
+ data: { address }
906
+ });
907
+ };
908
+ var loginByWalletApi = ({ type, address, signature, message, connector_type, wallet_client_type }) => {
909
+ return request_default({
910
+ url: `/api/v1/login/wallet`,
911
+ method: "POST",
912
+ data: { type, address, signature, message, connector_type, wallet_client_type }
913
+ });
914
+ };
915
+ var getWalletInitApi = ({ address }) => {
916
+ return request_default({
917
+ url: `/api/v1/wallet/init`,
918
+ method: "POST",
919
+ data: { address }
920
+ });
921
+ };
922
+ var toBindWalletApi = ({ type, address, signature, message, connector_type, wallet_client_type }) => {
923
+ return request_default({
924
+ url: `/api/v1/wallet/bind`,
925
+ method: "POST",
926
+ data: { type, address, signature, message, connector_type, wallet_client_type }
927
+ });
928
+ };
879
929
 
880
930
  // src/hooks/eventManager.ts
881
931
  var EventManager = class {
@@ -926,6 +976,24 @@ function truncateAddress(address) {
926
976
  const end = address.slice(-2);
927
977
  return `${start}...${end}`;
928
978
  }
979
+ function firstUpperCase(str) {
980
+ return str.toString()[0].toUpperCase() + str.toString().slice(1);
981
+ }
982
+
983
+ // src/store/useModalStore.ts
984
+ import { create as create2 } from "zustand";
985
+ var useEVMModalStore = create2((set) => ({
986
+ isOpen: false,
987
+ type: "",
988
+ open: (type) => set({ isOpen: true, type }),
989
+ close: () => set({ isOpen: false })
990
+ }));
991
+ var useSOLModalStore = create2((set) => ({
992
+ isOpen: false,
993
+ type: "",
994
+ open: (type) => set({ isOpen: true, type }),
995
+ close: () => set({ isOpen: false })
996
+ }));
929
997
 
930
998
  // src/hooks/useUserInfo.tsx
931
999
  function useUserInfo() {
@@ -941,6 +1009,8 @@ function useUserInfo() {
941
1009
  endpoints
942
1010
  } = useLocalStore_default();
943
1011
  const { events, login } = useMatch();
1012
+ const { open: EVMOpen } = useEVMModalStore();
1013
+ const { open: SOLOpen } = useSOLModalStore();
944
1014
  const isLogin = useMemo(() => !!token, [token]);
945
1015
  const logout = async () => {
946
1016
  try {
@@ -969,12 +1039,7 @@ function useUserInfo() {
969
1039
  return loginByMethod("google");
970
1040
  };
971
1041
  const loginByWallet = async () => {
972
- return window.open(
973
- `${endpoints.auth}login/wallet?appid=${appid}`,
974
- // Replace with the actual authorization URL
975
- "_blank"
976
- // 'width=800,height=600'
977
- );
1042
+ return EVMOpen("login");
978
1043
  };
979
1044
  const loginByTelegram = async () => {
980
1045
  return window.open(
@@ -986,8 +1051,10 @@ function useUserInfo() {
986
1051
  };
987
1052
  const loginMethod = async (method) => {
988
1053
  switch (method) {
989
- case "wallet":
990
- return await loginByWallet();
1054
+ case "evm":
1055
+ return EVMOpen("login");
1056
+ case "sol":
1057
+ return SOLOpen("login");
991
1058
  case "telegram":
992
1059
  return await loginByTelegram();
993
1060
  case "twitter":
@@ -995,6 +1062,7 @@ function useUserInfo() {
995
1062
  case "discord":
996
1063
  case "github":
997
1064
  case "linkedin":
1065
+ case "facebook":
998
1066
  return await loginByMethod(method);
999
1067
  default:
1000
1068
  throw new Error("unsupported method");
@@ -1044,11 +1112,7 @@ function useUserInfo() {
1044
1112
  if (!token) {
1045
1113
  throw new Error("You must login first");
1046
1114
  }
1047
- const authWindow = window.open(
1048
- `${endpoints.auth}bind/wallet?appid=${appid}&st=` + encodeURIComponent(encodeBase64(token)),
1049
- // Replace with the actual authorization URL
1050
- "_blank"
1051
- );
1115
+ return EVMOpen("bind");
1052
1116
  };
1053
1117
  const bindTelegram = async () => {
1054
1118
  if (!token) {
@@ -1069,9 +1133,14 @@ function useUserInfo() {
1069
1133
  throw new Error(res.message);
1070
1134
  };
1071
1135
  const bind = async (method) => {
1136
+ if (!token) {
1137
+ throw new Error("You must login first");
1138
+ }
1072
1139
  switch (method) {
1073
- case "wallet":
1074
- return await bindWallet();
1140
+ case "evm":
1141
+ return EVMOpen("bind");
1142
+ case "sol":
1143
+ return SOLOpen("bind");
1075
1144
  case "telegram":
1076
1145
  return await bindTelegram();
1077
1146
  case "twitter":
@@ -1135,8 +1204,8 @@ function useMatchEvents(handlers) {
1135
1204
  }
1136
1205
 
1137
1206
  // src/store/useStore.ts
1138
- import { create as create2 } from "zustand";
1139
- var useStore = create2((set) => ({
1207
+ import { create as create3 } from "zustand";
1208
+ var useStore = create3((set) => ({
1140
1209
  walletIframeInited: false,
1141
1210
  setWalletIframeInited: (inited) => set({ walletIframeInited: inited }),
1142
1211
  recoveryModal: {
@@ -1304,7 +1373,7 @@ function useCopyClipboard(timeout = 500) {
1304
1373
  }
1305
1374
 
1306
1375
  // src/components/PasswordModal/index.tsx
1307
- import { jsx as jsx29, jsxs as jsxs18 } from "react/jsx-runtime";
1376
+ import { jsx as jsx30, jsxs as jsxs19 } from "react/jsx-runtime";
1308
1377
  function PasswordModal({
1309
1378
  title,
1310
1379
  isOpen,
@@ -1350,13 +1419,13 @@ function PasswordModal({
1350
1419
  setIsSubmitting(false);
1351
1420
  }
1352
1421
  };
1353
- return /* @__PURE__ */ jsx29(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || "Set Password", children: /* @__PURE__ */ jsxs18("div", { className: "matchid-password-box", children: [
1354
- /* @__PURE__ */ jsxs18("div", { className: "matchid-password-header", children: [
1355
- /* @__PURE__ */ jsx29("div", { className: "matchid-password-header-icon", children: /* @__PURE__ */ jsx29(PasswordRoundIcon, {}) }),
1356
- /* @__PURE__ */ jsx29("div", { className: "matchid-password-header-content", children: "Please set the wallet password that will be used to recover the wallet" })
1422
+ return /* @__PURE__ */ jsx30(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || "Set Password", children: /* @__PURE__ */ jsxs19("div", { className: "matchid-password-box", children: [
1423
+ /* @__PURE__ */ jsxs19("div", { className: "matchid-password-header", children: [
1424
+ /* @__PURE__ */ jsx30("div", { className: "matchid-password-header-icon", children: /* @__PURE__ */ jsx30(PasswordRoundIcon, {}) }),
1425
+ /* @__PURE__ */ jsx30("div", { className: "matchid-password-header-content", children: "Please set the wallet password that will be used to recover the wallet" })
1357
1426
  ] }),
1358
- /* @__PURE__ */ jsxs18("div", { className: "matchid-password-content", children: [
1359
- /* @__PURE__ */ jsx29(Field, { label: "Password", error: password.length > 0 && passwordError, children: /* @__PURE__ */ jsx29(
1427
+ /* @__PURE__ */ jsxs19("div", { className: "matchid-password-content", children: [
1428
+ /* @__PURE__ */ jsx30(Field, { label: "Password", error: password.length > 0 && passwordError, children: /* @__PURE__ */ jsx30(
1360
1429
  Input,
1361
1430
  {
1362
1431
  placeholder: "Enter the Password",
@@ -1366,7 +1435,7 @@ function PasswordModal({
1366
1435
  value: password
1367
1436
  }
1368
1437
  ) }),
1369
- /* @__PURE__ */ jsx29(Field, { label: "Re Password", error: rePassword.length > 0 ? rePasswordError || error : error, children: /* @__PURE__ */ jsx29(
1438
+ /* @__PURE__ */ jsx30(Field, { label: "Re Password", error: rePassword.length > 0 ? rePasswordError || error : error, children: /* @__PURE__ */ jsx30(
1370
1439
  Input,
1371
1440
  {
1372
1441
  placeholder: "Re Enter the Password",
@@ -1377,7 +1446,7 @@ function PasswordModal({
1377
1446
  }
1378
1447
  ) })
1379
1448
  ] }),
1380
- /* @__PURE__ */ jsx29(
1449
+ /* @__PURE__ */ jsx30(
1381
1450
  Button,
1382
1451
  {
1383
1452
  disabled: password.length == 0 || !!passwordError || !!rePasswordError,
@@ -1394,7 +1463,7 @@ function PasswordModal({
1394
1463
 
1395
1464
  // src/components/RecoveryModal/index.tsx
1396
1465
  import { useEffect as useEffect4, useMemo as useMemo3, useState as useState4 } from "react";
1397
- import { jsx as jsx30, jsxs as jsxs19 } from "react/jsx-runtime";
1466
+ import { jsx as jsx31, jsxs as jsxs20 } from "react/jsx-runtime";
1398
1467
  function RecoveryModal({
1399
1468
  title,
1400
1469
  isOpen,
@@ -1430,12 +1499,12 @@ function RecoveryModal({
1430
1499
  setIsSubmitting(false);
1431
1500
  }
1432
1501
  };
1433
- return /* @__PURE__ */ jsx30(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || "Recover Wallet", children: /* @__PURE__ */ jsxs19("div", { className: "matchid-password-box", children: [
1434
- /* @__PURE__ */ jsxs19("div", { className: "matchid-password-header", children: [
1435
- /* @__PURE__ */ jsx30("div", { className: "matchid-password-header-icon", children: /* @__PURE__ */ jsx30(PasswordRoundIcon, {}) }),
1436
- /* @__PURE__ */ jsx30("div", { className: "matchid-password-header-content", children: "Please enter your password to recover your wallet" })
1502
+ return /* @__PURE__ */ jsx31(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || "Recover Wallet", children: /* @__PURE__ */ jsxs20("div", { className: "matchid-password-box", children: [
1503
+ /* @__PURE__ */ jsxs20("div", { className: "matchid-password-header", children: [
1504
+ /* @__PURE__ */ jsx31("div", { className: "matchid-password-header-icon", children: /* @__PURE__ */ jsx31(PasswordRoundIcon, {}) }),
1505
+ /* @__PURE__ */ jsx31("div", { className: "matchid-password-header-content", children: "Please enter your password to recover your wallet" })
1437
1506
  ] }),
1438
- /* @__PURE__ */ jsx30("div", { className: "matchid-password-content", children: /* @__PURE__ */ jsx30(Field, { label: "Password", error: password.length > 0 ? passwordError || error : error, children: /* @__PURE__ */ jsx30(
1507
+ /* @__PURE__ */ jsx31("div", { className: "matchid-password-content", children: /* @__PURE__ */ jsx31(Field, { label: "Password", error: password.length > 0 ? passwordError || error : error, children: /* @__PURE__ */ jsx31(
1439
1508
  Input,
1440
1509
  {
1441
1510
  placeholder: "Enter the Password",
@@ -1445,7 +1514,7 @@ function RecoveryModal({
1445
1514
  value: password
1446
1515
  }
1447
1516
  ) }) }),
1448
- /* @__PURE__ */ jsx30(
1517
+ /* @__PURE__ */ jsx31(
1449
1518
  Button,
1450
1519
  {
1451
1520
  disabled: password.length == 0 || !!passwordError,
@@ -1460,906 +1529,1630 @@ function RecoveryModal({
1460
1529
  ] }) });
1461
1530
  }
1462
1531
 
1463
- // src/context/BusinessProvider.tsx
1464
- import { Fragment as Fragment2, jsx as jsx31, jsxs as jsxs20 } from "react/jsx-runtime";
1465
- function BusinessProvider({ children }) {
1466
- const { overview, token } = useUserInfo();
1467
- const { recoveryModal } = useStore_default();
1468
- return /* @__PURE__ */ jsxs20(Fragment2, { children: [
1469
- /* @__PURE__ */ jsx31(PasswordModal, { isOpen: !!token && !!overview && !overview.address && !!overview.did, showClose: false }),
1470
- /* @__PURE__ */ jsx31(
1471
- RecoveryModal,
1532
+ // src/components/EVMModal/index.tsx
1533
+ import { getDefaultConfig, RainbowKitProvider, useConnectModal } from "@rainbow-me/rainbowkit";
1534
+ import { useAccount, useAccountEffect, useChainId, useConfig, useDisconnect, WagmiProvider } from "wagmi";
1535
+ import {
1536
+ bitgetWallet,
1537
+ injectedWallet,
1538
+ metaMaskWallet,
1539
+ okxWallet,
1540
+ walletConnectWallet
1541
+ } from "@rainbow-me/rainbowkit/wallets";
1542
+ import { bsc } from "wagmi/chains";
1543
+
1544
+ // src/hooks/useEthersSigner.ts
1545
+ import * as React from "react";
1546
+ import { useWalletClient } from "wagmi";
1547
+ import { providers } from "ethers";
1548
+
1549
+ // node_modules/@wagmi/core/dist/esm/version.js
1550
+ var version = "2.16.3";
1551
+
1552
+ // node_modules/@wagmi/core/dist/esm/utils/getVersion.js
1553
+ var getVersion2 = () => `@wagmi/core@${version}`;
1554
+
1555
+ // node_modules/@wagmi/core/dist/esm/errors/base.js
1556
+ var __classPrivateFieldGet = function(receiver, state, kind, f) {
1557
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
1558
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
1559
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
1560
+ };
1561
+ var _BaseError_instances;
1562
+ var _BaseError_walk;
1563
+ var BaseError = class _BaseError extends Error {
1564
+ get docsBaseUrl() {
1565
+ return "https://wagmi.sh/core";
1566
+ }
1567
+ get version() {
1568
+ return getVersion2();
1569
+ }
1570
+ constructor(shortMessage, options = {}) {
1571
+ super();
1572
+ _BaseError_instances.add(this);
1573
+ Object.defineProperty(this, "details", {
1574
+ enumerable: true,
1575
+ configurable: true,
1576
+ writable: true,
1577
+ value: void 0
1578
+ });
1579
+ Object.defineProperty(this, "docsPath", {
1580
+ enumerable: true,
1581
+ configurable: true,
1582
+ writable: true,
1583
+ value: void 0
1584
+ });
1585
+ Object.defineProperty(this, "metaMessages", {
1586
+ enumerable: true,
1587
+ configurable: true,
1588
+ writable: true,
1589
+ value: void 0
1590
+ });
1591
+ Object.defineProperty(this, "shortMessage", {
1592
+ enumerable: true,
1593
+ configurable: true,
1594
+ writable: true,
1595
+ value: void 0
1596
+ });
1597
+ Object.defineProperty(this, "name", {
1598
+ enumerable: true,
1599
+ configurable: true,
1600
+ writable: true,
1601
+ value: "WagmiCoreError"
1602
+ });
1603
+ const details = options.cause instanceof _BaseError ? options.cause.details : options.cause?.message ? options.cause.message : options.details;
1604
+ const docsPath = options.cause instanceof _BaseError ? options.cause.docsPath || options.docsPath : options.docsPath;
1605
+ this.message = [
1606
+ shortMessage || "An error occurred.",
1607
+ "",
1608
+ ...options.metaMessages ? [...options.metaMessages, ""] : [],
1609
+ ...docsPath ? [
1610
+ `Docs: ${this.docsBaseUrl}${docsPath}.html${options.docsSlug ? `#${options.docsSlug}` : ""}`
1611
+ ] : [],
1612
+ ...details ? [`Details: ${details}`] : [],
1613
+ `Version: ${this.version}`
1614
+ ].join("\n");
1615
+ if (options.cause)
1616
+ this.cause = options.cause;
1617
+ this.details = details;
1618
+ this.docsPath = docsPath;
1619
+ this.metaMessages = options.metaMessages;
1620
+ this.shortMessage = shortMessage;
1621
+ }
1622
+ walk(fn) {
1623
+ return __classPrivateFieldGet(this, _BaseError_instances, "m", _BaseError_walk).call(this, this, fn);
1624
+ }
1625
+ };
1626
+ _BaseError_instances = /* @__PURE__ */ new WeakSet(), _BaseError_walk = function _BaseError_walk2(err, fn) {
1627
+ if (fn?.(err))
1628
+ return err;
1629
+ if (err.cause)
1630
+ return __classPrivateFieldGet(this, _BaseError_instances, "m", _BaseError_walk2).call(this, err.cause, fn);
1631
+ return err;
1632
+ };
1633
+
1634
+ // node_modules/@wagmi/core/dist/esm/errors/config.js
1635
+ var ConnectorNotConnectedError = class extends BaseError {
1636
+ constructor() {
1637
+ super("Connector not connected.");
1638
+ Object.defineProperty(this, "name", {
1639
+ enumerable: true,
1640
+ configurable: true,
1641
+ writable: true,
1642
+ value: "ConnectorNotConnectedError"
1643
+ });
1644
+ }
1645
+ };
1646
+ var ConnectorAccountNotFoundError = class extends BaseError {
1647
+ constructor({ address, connector }) {
1648
+ super(`Account "${address}" not found for connector "${connector.name}".`);
1649
+ Object.defineProperty(this, "name", {
1650
+ enumerable: true,
1651
+ configurable: true,
1652
+ writable: true,
1653
+ value: "ConnectorAccountNotFoundError"
1654
+ });
1655
+ }
1656
+ };
1657
+ var ConnectorChainMismatchError = class extends BaseError {
1658
+ constructor({ connectionChainId, connectorChainId }) {
1659
+ super(`The current chain of the connector (id: ${connectorChainId}) does not match the connection's chain (id: ${connectionChainId}).`, {
1660
+ metaMessages: [
1661
+ `Current Chain ID: ${connectorChainId}`,
1662
+ `Expected Chain ID: ${connectionChainId}`
1663
+ ]
1664
+ });
1665
+ Object.defineProperty(this, "name", {
1666
+ enumerable: true,
1667
+ configurable: true,
1668
+ writable: true,
1669
+ value: "ConnectorChainMismatchError"
1670
+ });
1671
+ }
1672
+ };
1673
+ var ConnectorUnavailableReconnectingError = class extends BaseError {
1674
+ constructor({ connector }) {
1675
+ super(`Connector "${connector.name}" unavailable while reconnecting.`, {
1676
+ details: [
1677
+ "During the reconnection step, the only connector methods guaranteed to be available are: `id`, `name`, `type`, `uid`.",
1678
+ "All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored.",
1679
+ "This error commonly occurs for connectors that asynchronously inject after reconnection has already started."
1680
+ ].join(" ")
1681
+ });
1682
+ Object.defineProperty(this, "name", {
1683
+ enumerable: true,
1684
+ configurable: true,
1685
+ writable: true,
1686
+ value: "ConnectorUnavailableReconnectingError"
1687
+ });
1688
+ }
1689
+ };
1690
+
1691
+ // node_modules/@wagmi/core/dist/esm/actions/getConnectorClient.js
1692
+ import { createClient, custom } from "viem";
1693
+ import { getAddress, parseAccount } from "viem/utils";
1694
+ async function getConnectorClient(config, parameters = {}) {
1695
+ let connection;
1696
+ if (parameters.connector) {
1697
+ const { connector: connector2 } = parameters;
1698
+ if (config.state.status === "reconnecting" && !connector2.getAccounts && !connector2.getChainId)
1699
+ throw new ConnectorUnavailableReconnectingError({ connector: connector2 });
1700
+ const [accounts, chainId2] = await Promise.all([
1701
+ connector2.getAccounts(),
1702
+ connector2.getChainId()
1703
+ ]);
1704
+ connection = {
1705
+ accounts,
1706
+ chainId: chainId2,
1707
+ connector: connector2
1708
+ };
1709
+ } else
1710
+ connection = config.state.connections.get(config.state.current);
1711
+ if (!connection)
1712
+ throw new ConnectorNotConnectedError();
1713
+ const chainId = parameters.chainId ?? connection.chainId;
1714
+ const connectorChainId = await connection.connector.getChainId();
1715
+ if (connectorChainId !== connection.chainId)
1716
+ throw new ConnectorChainMismatchError({
1717
+ connectionChainId: connection.chainId,
1718
+ connectorChainId
1719
+ });
1720
+ const connector = connection.connector;
1721
+ if (connector.getClient)
1722
+ return connector.getClient({ chainId });
1723
+ const account = parseAccount(parameters.account ?? connection.accounts[0]);
1724
+ account.address = getAddress(account.address);
1725
+ if (parameters.account && !connection.accounts.some((x) => x.toLowerCase() === account.address.toLowerCase()))
1726
+ throw new ConnectorAccountNotFoundError({
1727
+ address: account.address,
1728
+ connector
1729
+ });
1730
+ const chain = config.chains.find((chain2) => chain2.id === chainId);
1731
+ const provider = await connection.connector.getProvider({ chainId });
1732
+ return createClient({
1733
+ account,
1734
+ chain,
1735
+ name: "Connector Client",
1736
+ transport: (opts) => custom(provider)({ ...opts, retryCount: 0 })
1737
+ });
1738
+ }
1739
+
1740
+ // node_modules/@wagmi/core/dist/esm/exports/index.js
1741
+ import { custom as custom2, http, webSocket } from "viem";
1742
+
1743
+ // src/hooks/useEthersSigner.ts
1744
+ function clientToSigner(client) {
1745
+ const { account, chain, transport } = client;
1746
+ const network = {
1747
+ chainId: chain.id,
1748
+ name: chain.name,
1749
+ ensAddress: chain.contracts?.ensRegistry?.address
1750
+ };
1751
+ const provider = new providers.Web3Provider(transport, network);
1752
+ const signer = provider.getSigner(account.address);
1753
+ return signer;
1754
+ }
1755
+ async function getEthersSigner(config, { chainId } = {}) {
1756
+ const client = await getConnectorClient(config, { chainId });
1757
+ return clientToSigner(client);
1758
+ }
1759
+
1760
+ // src/components/EVMModal/index.tsx
1761
+ import React3, { useEffect as useEffect9, useMemo as useMemo9, useState as useState13 } from "react";
1762
+ import { SiweMessage } from "siwe";
1763
+
1764
+ // src/components/index.tsx
1765
+ var components_exports = {};
1766
+ __export(components_exports, {
1767
+ Button: () => Button,
1768
+ EVMModal: () => EVMModal,
1769
+ EmailModal: () => EmailModal,
1770
+ Field: () => Field,
1771
+ Input: () => Input,
1772
+ LoginBox: () => LoginBox,
1773
+ LoginButton: () => LoginButton,
1774
+ LoginModal: () => LoginModal,
1775
+ LoginPanel: () => LoginPanel,
1776
+ Modal: () => Modal,
1777
+ ModalWithHeader: () => ModalWithHeader,
1778
+ PasswordModal: () => PasswordModal,
1779
+ Popover: () => Popover,
1780
+ UsernameModal: () => UsernameModal
1781
+ });
1782
+
1783
+ // src/components/EmailModal/index.tsx
1784
+ import { useEffect as useEffect7, useState as useState7 } from "react";
1785
+
1786
+ // src/components/EmailModal/StepEmail.tsx
1787
+ import { useEffect as useEffect5, useMemo as useMemo5, useState as useState5 } from "react";
1788
+ import { jsx as jsx32, jsxs as jsxs21 } from "react/jsx-runtime";
1789
+ function StepEmail(props) {
1790
+ const [emailVal, setEmailVal] = useState5("");
1791
+ useEffect5(() => {
1792
+ if (props.email) {
1793
+ setEmailVal(props.email);
1794
+ }
1795
+ }, []);
1796
+ const canContinue = useMemo5(() => {
1797
+ return isValidEmail(emailVal);
1798
+ }, [emailVal]);
1799
+ const onContinue = async () => {
1800
+ props.onContinue(emailVal);
1801
+ };
1802
+ return /* @__PURE__ */ jsxs21("div", { className: "matchid-email-email-box", children: [
1803
+ /* @__PURE__ */ jsx32(Field, { label: "Email Address", children: /* @__PURE__ */ jsx32(
1804
+ Input,
1472
1805
  {
1473
- isOpen: !!token && !!overview && !!overview.address && recoveryModal.open,
1474
- onClose: recoveryModal.close,
1475
- onSuccess: recoveryModal.success
1806
+ placeholder: "Enter Your Email Address",
1807
+ onChange: (e) => setEmailVal(e.target.value),
1808
+ value: emailVal
1476
1809
  }
1477
- ),
1478
- children
1810
+ ) }),
1811
+ /* @__PURE__ */ jsx32(Button, { disabled: !canContinue, style: {
1812
+ marginTop: "64px"
1813
+ }, onClick: onContinue, size: "lg", block: true, highlight: true, children: "Continue" })
1479
1814
  ] });
1480
1815
  }
1481
1816
 
1482
- // src/context/index.tsx
1483
- import { jsx as jsx32 } from "react/jsx-runtime";
1484
- var Providers = ({ children }) => {
1485
- return (
1486
- // <MpcWalletProvider>
1487
- /* @__PURE__ */ jsx32(BusinessProvider, { children })
1488
- );
1489
- };
1490
- var context_default = Providers;
1817
+ // src/components/EmailModal/StepVerify.tsx
1818
+ import { useEffect as useEffect6, useMemo as useMemo6, useRef, useState as useState6 } from "react";
1491
1819
 
1492
- // src/hooks/useWalletInit.ts
1493
- import { useEffect as useEffect5, useState as useState5 } from "react";
1494
- var AppClientId2 = "react-sdk-" + getVersion();
1495
- function useWalletInit({
1496
- refreshOverview
1497
- }) {
1498
- const { endpoints } = useLocalStore_default();
1499
- const getWalletIframe = () => {
1500
- return document.getElementById("match-wallet");
1820
+ // src/config/index.tsx
1821
+ var EMAIL_INTERVAL = 60;
1822
+ var EMAIL_CODE_LENGTH = 6;
1823
+
1824
+ // src/components/EmailModal/StepVerify.tsx
1825
+ import { jsx as jsx33, jsxs as jsxs22 } from "react/jsx-runtime";
1826
+ function StepVerify(props) {
1827
+ const { getLoginEmailCode, loginByEmail } = useUserInfo();
1828
+ const [error, setError] = useState6("");
1829
+ const [code, setCode] = useState6("");
1830
+ const [sending, setSending] = useState6(false);
1831
+ const [submitting, setSubmitting] = useState6(false);
1832
+ const sendTimeRef = useRef(0);
1833
+ const [sendBtnText, setSendBtnText] = useState6("Send");
1834
+ const intervalTime = EMAIL_INTERVAL;
1835
+ const codeLength = EMAIL_CODE_LENGTH;
1836
+ const intervalRef = useRef(null);
1837
+ const onSend = async () => {
1838
+ if (sendTimeRef.current > 0) {
1839
+ return;
1840
+ }
1841
+ try {
1842
+ setError("");
1843
+ setSending(true);
1844
+ sendTimeRef.current = intervalTime;
1845
+ await getLoginEmailCode(props.email);
1846
+ setSendBtnText(`${sendTimeRef.current}s`);
1847
+ intervalRef.current = setInterval(() => {
1848
+ sendTimeRef.current--;
1849
+ setSendBtnText(`${sendTimeRef.current}s`);
1850
+ if (sendTimeRef.current <= 0) {
1851
+ setSendBtnText("Resend");
1852
+ clearInterval(intervalRef.current);
1853
+ setSending(false);
1854
+ }
1855
+ }, 1e3);
1856
+ } catch (err) {
1857
+ console.error("Send email error", err);
1858
+ setError("Failed to send code:" + err.message);
1859
+ setSending(false);
1860
+ }
1501
1861
  };
1502
- const [walletInited, setWalletInited] = useState5(false);
1503
- const { appid, token, overview } = useLocalStore_default();
1504
- const { initWallet, generateWallet } = useWallet();
1505
- useEffect5(() => {
1506
- if (endpoints.auth) {
1507
- if (!window.matchWalletMessageIdMap) {
1508
- window.matchWalletMessageIdMap = {};
1862
+ useEffect6(() => {
1863
+ onSend();
1864
+ return () => {
1865
+ if (intervalRef.current) {
1866
+ clearInterval(intervalRef.current);
1509
1867
  }
1510
- const existingIframe = getWalletIframe();
1511
- if (!existingIframe) {
1512
- const iframe = document.createElement("iframe");
1513
- iframe.id = "match-wallet";
1514
- iframe.src = endpoints.auth + "wallet";
1515
- iframe.style.display = "none";
1516
- iframe.style.width = "0";
1517
- iframe.style.height = "0";
1518
- document.body.insertBefore(iframe, document.body.firstChild);
1519
- window.sendMatchWalletMessage = (method, data) => {
1520
- const messageId = Date.now().toString() + Math.random().toString().slice(6);
1521
- const message = {
1522
- method,
1523
- data,
1524
- messageId,
1525
- source: "matchid"
1526
- };
1527
- if (document.getElementById("match-wallet")) {
1528
- matchlog_default.log("matchid.sdk.sendMatchWalletMessage", message, endpoints.auth);
1529
- getWalletIframe()?.contentWindow?.postMessage(message, endpoints.auth);
1530
- return messageId;
1531
- }
1532
- console.error("not found iframe");
1533
- return false;
1534
- };
1535
- window.waitMatchUntilWalletMessage = async (method, data, timeout = 3e4) => {
1536
- return new Promise((resolve, reject) => {
1537
- const messageId = window.sendMatchWalletMessage(method, data);
1538
- if (!messageId) {
1539
- console.error("Can't find wallet message");
1540
- reject(new Error("Can't find wallet message"));
1541
- return;
1542
- }
1543
- window.matchWalletMessageIdMap[messageId] = { resolve, reject };
1544
- window.matchWalletMessageIdMap[messageId].timeout = setTimeout(() => {
1545
- console.error("Get wallet result timeout", {
1546
- messageId,
1547
- method,
1548
- data
1549
- });
1550
- delete window.matchWalletMessageIdMap[messageId];
1551
- reject(new Error("Get wallet result timeout"));
1552
- }, timeout);
1553
- });
1554
- };
1555
- } else {
1556
- if (existingIframe.src !== endpoints.auth + "wallet") {
1557
- setWalletInited(false);
1558
- existingIframe.src = endpoints.auth + "wallet";
1559
- }
1560
- }
1561
- }
1562
- }, [endpoints.auth]);
1563
- useEffect5(() => {
1564
- const messageHandle = async (e) => {
1565
- if (e.origin !== endpoints.auth.substring(0, endpoints.auth.length - 1)) {
1566
- return;
1567
- }
1568
- const res = e.data;
1569
- if (res.source != "match-wallet") {
1570
- return;
1571
- }
1572
- matchlog_default.log("sdk.wallet.receive", e);
1573
- const messageId = res.messageId;
1574
- if (messageId == "init") {
1575
- matchlog_default.log("wallet init");
1576
- setWalletInited(true);
1577
- return;
1578
- }
1579
- if (messageId && window.matchWalletMessageIdMap[messageId]) {
1580
- const { resolve, reject, timeout } = window.matchWalletMessageIdMap[messageId];
1581
- delete window.matchWalletMessageIdMap[messageId];
1582
- clearTimeout(timeout);
1583
- if (res.status == "success") {
1584
- resolve(res.data);
1585
- } else {
1586
- console.error("qwe-waller-error", res);
1587
- reject(new Error(res.data.message));
1588
- }
1589
- }
1590
- };
1591
- window.addEventListener("message", messageHandle);
1592
- return () => {
1593
- window.removeEventListener("message", messageHandle);
1594
1868
  };
1595
1869
  }, []);
1596
- useEffect5(() => {
1597
- if (token && overview && overview.did && walletInited) {
1598
- const did = overview.did.split(":")[2];
1599
- const newUserInit = async () => {
1600
- await window.waitMatchUntilWalletMessage(
1601
- "initCore",
1870
+ const canContinue = useMemo6(() => {
1871
+ return code.length === codeLength;
1872
+ }, [code]);
1873
+ const onContinue = async () => {
1874
+ if (submitting) {
1875
+ return;
1876
+ }
1877
+ try {
1878
+ setError("");
1879
+ setSubmitting(true);
1880
+ const res = await loginByEmail({
1881
+ email: props.email,
1882
+ code
1883
+ });
1884
+ if (res) {
1885
+ props.onSuccess && props.onSuccess();
1886
+ }
1887
+ setSubmitting(false);
1888
+ } catch (err) {
1889
+ console.error("Verify email code error", err);
1890
+ setError(err.message);
1891
+ setSubmitting(false);
1892
+ }
1893
+ };
1894
+ return /* @__PURE__ */ jsxs22("div", { className: "matchid-email-verify-box", children: [
1895
+ /* @__PURE__ */ jsxs22("div", { className: "matchid-email-verify-header", children: [
1896
+ /* @__PURE__ */ jsx33("div", { className: "matchid-email-verify-header-icon", children: /* @__PURE__ */ jsx33(EmailLineIcon, {}) }),
1897
+ /* @__PURE__ */ jsxs22("div", { className: "matchid-email-verify-header-content", children: [
1898
+ /* @__PURE__ */ jsx33("div", { className: "matchid-email-verify-header-value", children: props.email }),
1899
+ /* @__PURE__ */ jsx33("div", { className: "matchid-email-verify-header-tips", children: "We have sent a verification code to your email" })
1900
+ ] })
1901
+ ] }),
1902
+ /* @__PURE__ */ jsx33(Field, { label: "Verification Code", error, children: /* @__PURE__ */ jsx33(
1903
+ Input,
1904
+ {
1905
+ placeholder: "Enter the code",
1906
+ maxLength: codeLength,
1907
+ onChange: (e) => setCode(e.target.value),
1908
+ value: code,
1909
+ after: /* @__PURE__ */ jsx33(
1910
+ Button,
1602
1911
  {
1603
- AppId: appid,
1604
- AppClientId: AppClientId2,
1605
- UserId: did,
1606
- AccessToken: token,
1607
- Address: ""
1912
+ highlight: true,
1913
+ disabled: sending,
1914
+ style: {
1915
+ height: "100%",
1916
+ borderTopLeftRadius: 0,
1917
+ borderBottomLeftRadius: 0,
1918
+ borderTopRightRadius: "inherit",
1919
+ borderBottomRightRadius: "inherit",
1920
+ width: "80px"
1921
+ },
1922
+ onClick: onSend,
1923
+ children: sendBtnText
1608
1924
  }
1609
- );
1610
- };
1611
- if (!overview.address) {
1612
- newUserInit();
1613
- } else {
1614
- initWallet({
1615
- address: overview.address,
1616
- did
1617
- });
1925
+ )
1618
1926
  }
1927
+ ) }),
1928
+ /* @__PURE__ */ jsx33(Button, { disabled: !canContinue, highlight: true, block: true, size: "lg", onClick: onContinue, children: "Continue" })
1929
+ ] });
1930
+ }
1931
+
1932
+ // src/components/EmailModal/index.tsx
1933
+ import { jsx as jsx34 } from "react/jsx-runtime";
1934
+ function EmailModal({
1935
+ isOpen = false,
1936
+ width = 480,
1937
+ onClose,
1938
+ onBack,
1939
+ onLogin
1940
+ }) {
1941
+ const [step, setStep] = useState7("input");
1942
+ const [emailVal, setEmailVal] = useState7("");
1943
+ useEffect7(() => {
1944
+ if (!isOpen) {
1945
+ setStep("input");
1946
+ setEmailVal("");
1947
+ }
1948
+ }, [isOpen]);
1949
+ return /* @__PURE__ */ jsx34(
1950
+ ModalWithHeader,
1951
+ {
1952
+ isOpen,
1953
+ width,
1954
+ onClose,
1955
+ title: "Email",
1956
+ onBack: step == "verify" ? () => setStep("input") : onBack,
1957
+ children: step === "input" ? /* @__PURE__ */ jsx34(StepEmail, { email: emailVal, onContinue: (email) => {
1958
+ setEmailVal(email);
1959
+ setStep("verify");
1960
+ } }) : /* @__PURE__ */ jsx34(StepVerify, { email: emailVal, onSuccess: onLogin })
1961
+ }
1962
+ );
1963
+ }
1964
+
1965
+ // src/components/Popover/index.tsx
1966
+ import { useState as useState8 } from "react";
1967
+ import { jsx as jsx35, jsxs as jsxs23 } from "react/jsx-runtime";
1968
+ function Popover({
1969
+ children,
1970
+ content,
1971
+ position = "right",
1972
+ type = "hover",
1973
+ className = "",
1974
+ gap = "20px"
1975
+ }) {
1976
+ const [active, setActive] = useState8(false);
1977
+ return /* @__PURE__ */ jsxs23(
1978
+ "div",
1979
+ {
1980
+ onClick: () => {
1981
+ if (type == "click") {
1982
+ setActive(!active);
1983
+ }
1984
+ },
1985
+ className: `matchid-popover-box matchid-popover-${position} matchid-popover-${type} ${className} ${type == "click" && active ? "matchid-popover-click-active" : ""}`,
1986
+ children: [
1987
+ children,
1988
+ /* @__PURE__ */ jsx35("div", { style: {
1989
+ paddingTop: gap
1990
+ }, children: /* @__PURE__ */ jsx35("div", { className: `matchid-popover-content`, children: content }) })
1991
+ ]
1992
+ }
1993
+ );
1994
+ }
1995
+
1996
+ // src/components/LoginBox/index.tsx
1997
+ import { useMemo as useMemo7, useState as useState9 } from "react";
1998
+ import { Fragment as Fragment2, jsx as jsx36, jsxs as jsxs24 } from "react/jsx-runtime";
1999
+ function LoginBox({
2000
+ methods,
2001
+ inModal = false
2002
+ }) {
2003
+ const [emailOpen, setEmailOpen] = useState9(false);
2004
+ const { login } = useUserInfo();
2005
+ const defaultMethods = [
2006
+ "evm",
2007
+ "google",
2008
+ "email",
2009
+ "telegram",
2010
+ "twitter"
2011
+ ];
2012
+ const methodList = useMemo7(() => {
2013
+ return methods || defaultMethods;
2014
+ }, [methods]);
2015
+ const LoginItem = ({
2016
+ icon,
2017
+ name,
2018
+ onClick
2019
+ }) => {
2020
+ return /* @__PURE__ */ jsxs24("div", { className: "matchid-login-method", onClick, children: [
2021
+ /* @__PURE__ */ jsxs24("div", { className: "matchid-login-method-content", children: [
2022
+ /* @__PURE__ */ jsx36("div", { className: "matchid-login-method-icon", children: icon }),
2023
+ /* @__PURE__ */ jsx36("span", { className: "matchid-login-method-name", children: name })
2024
+ ] }),
2025
+ /* @__PURE__ */ jsx36(ArrowRightIcon, { className: "matchid-login-method-arrow", size: 20, color: "var(--matchid-arrow-color)" })
2026
+ ] });
2027
+ };
2028
+ const methodMap = {
2029
+ evm: {
2030
+ icon: /* @__PURE__ */ jsx36(WalletIcon, {}),
2031
+ name: "EVM",
2032
+ onClick: () => login("evm")
2033
+ },
2034
+ email: {
2035
+ icon: /* @__PURE__ */ jsx36(EmailIcon, {}),
2036
+ name: "Email",
2037
+ onClick: () => {
2038
+ setEmailOpen(true);
2039
+ }
2040
+ },
2041
+ google: {
2042
+ icon: /* @__PURE__ */ jsx36(GoogleIcon, {}),
2043
+ name: "Google",
2044
+ onClick: () => login("google")
2045
+ },
2046
+ twitter: {
2047
+ icon: /* @__PURE__ */ jsx36(XIcon, {}),
2048
+ name: "X",
2049
+ onClick: () => login("twitter")
2050
+ },
2051
+ telegram: {
2052
+ icon: /* @__PURE__ */ jsx36(TelegramIcon, {}),
2053
+ name: "Telegram",
2054
+ onClick: () => login("telegram")
2055
+ },
2056
+ github: {
2057
+ icon: /* @__PURE__ */ jsx36(GithubIcon, {}),
2058
+ name: "Github",
2059
+ onClick: () => login("github")
2060
+ },
2061
+ discord: {
2062
+ icon: /* @__PURE__ */ jsx36(DiscordIcon, {}),
2063
+ name: "Discord",
2064
+ onClick: () => login("discord")
2065
+ },
2066
+ linkedin: {
2067
+ icon: /* @__PURE__ */ jsx36(LinkedinIcon, {}),
2068
+ name: "Linkedin",
2069
+ onClick: () => login("linkedin")
1619
2070
  }
1620
- }, [overview, token, walletInited]);
1621
- return {
1622
- walletInited
1623
2071
  };
2072
+ return /* @__PURE__ */ jsxs24(Fragment2, { children: [
2073
+ (!inModal || !emailOpen) && /* @__PURE__ */ jsx36("div", { className: "matchid-login-box", children: methodList.map((m) => {
2074
+ return /* @__PURE__ */ jsx36(
2075
+ LoginItem,
2076
+ {
2077
+ icon: methodMap[m]?.icon,
2078
+ name: methodMap[m]?.name,
2079
+ onClick: methodMap[m]?.onClick
2080
+ },
2081
+ m
2082
+ );
2083
+ }) }),
2084
+ /* @__PURE__ */ jsx36(
2085
+ EmailModal,
2086
+ {
2087
+ isOpen: emailOpen,
2088
+ onClose: () => {
2089
+ setEmailOpen(false);
2090
+ },
2091
+ onBack: inModal ? () => {
2092
+ setEmailOpen(false);
2093
+ } : void 0
2094
+ }
2095
+ )
2096
+ ] });
1624
2097
  }
1625
2098
 
1626
- // src/hooks/useInit.tsx
1627
- import { useEffect as useEffect6, useRef } from "react";
1628
- function useInit({
1629
- theme,
1630
- appid,
1631
- events,
1632
- endpoints
2099
+ // src/components/LoginButton/index.tsx
2100
+ import { useState as useState11 } from "react";
2101
+
2102
+ // src/components/LoginPanel/index.tsx
2103
+ import { jsx as jsx37, jsxs as jsxs25 } from "react/jsx-runtime";
2104
+ function LoginPanel({
2105
+ header,
2106
+ onClose,
2107
+ ...props
1633
2108
  }) {
1634
- const {
1635
- setAppid,
1636
- setEndpoints,
1637
- setToken,
1638
- setMid,
1639
- token,
1640
- setOverview,
1641
- setTheme
1642
- } = useLocalStore_default();
1643
- const overviewLoadingRef = useRef(false);
1644
- const searchParams = new URLSearchParams(window.location.search);
1645
- const matchToken = searchParams.get("matchToken");
1646
- const realEndpoints = endpoints || env_default.endpoints;
1647
- useEffect6(() => {
1648
- setTheme(theme);
1649
- }, [theme]);
1650
- useEffect6(() => {
1651
- setAppid(appid);
1652
- }, [appid]);
1653
- useEffect6(() => {
1654
- setEndpoints(realEndpoints);
1655
- }, [realEndpoints]);
1656
- useEffect6(() => {
1657
- if (matchToken) {
1658
- const tokenData = JSON.parse(atob(matchToken));
1659
- if (tokenData && tokenData.mid && tokenData.token) {
1660
- login({
1661
- mid: tokenData.mid,
1662
- token: "Bearer " + tokenData.token
1663
- });
2109
+ return /* @__PURE__ */ jsxs25("div", { className: "matchid-login-panel", children: [
2110
+ header ? header : /* @__PURE__ */ jsxs25("div", { className: "matchid-login-panel-header", children: [
2111
+ /* @__PURE__ */ jsxs25("div", { className: "matchid-login-panel-header-content", children: [
2112
+ /* @__PURE__ */ jsx37("div", { className: "matchid-login-panel-header-title", children: "Log in / Sign up" }),
2113
+ /* @__PURE__ */ jsx37("div", { className: "matchid-login-panel-header-subtilte", children: "You can use the following methods" })
2114
+ ] }),
2115
+ onClose && /* @__PURE__ */ jsx37("div", { className: "matchid-login-panel-header-close", onClick: onClose, children: /* @__PURE__ */ jsx37(CloseRoundIcon, {}) })
2116
+ ] }),
2117
+ /* @__PURE__ */ jsx37("div", { className: "matchid-login-panel-divide" }),
2118
+ /* @__PURE__ */ jsx37(LoginBox, { ...props })
2119
+ ] });
2120
+ }
2121
+
2122
+ // src/components/LoginModal/index.tsx
2123
+ import { jsx as jsx38 } from "react/jsx-runtime";
2124
+ function LoginModal({
2125
+ isOpen = false,
2126
+ width = 480,
2127
+ ...props
2128
+ }) {
2129
+ const { isLogin } = useUserInfo();
2130
+ return /* @__PURE__ */ jsx38(
2131
+ Modal,
2132
+ {
2133
+ isOpen: isOpen && !isLogin,
2134
+ width,
2135
+ children: /* @__PURE__ */ jsx38(LoginPanel, { ...props, inModal: true })
2136
+ }
2137
+ );
2138
+ }
2139
+
2140
+ // src/components/UserPopover/index.tsx
2141
+ import { useState as useState10 } from "react";
2142
+
2143
+ // src/assets/icon/ProfileIcon.tsx
2144
+ import { jsx as jsx39, jsxs as jsxs26 } from "react/jsx-runtime";
2145
+ function ProfileIcon({ size = 24, color = "black", ...props }) {
2146
+ return /* @__PURE__ */ jsxs26("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
2147
+ /* @__PURE__ */ jsx39(
2148
+ "path",
2149
+ {
2150
+ fillRule: "evenodd",
2151
+ clipRule: "evenodd",
2152
+ d: "M7.5 6.75C7.5 4.95507 8.95507 3.5 10.75 3.5C12.5449 3.5 14 4.95507 14 6.75C14 8.54493 12.5449 10 10.75 10C8.95507 10 7.5 8.54493 7.5 6.75ZM10.75 2C8.12665 2 6 4.12665 6 6.75C6 9.37335 8.12665 11.5 10.75 11.5C13.3734 11.5 15.5 9.37335 15.5 6.75C15.5 4.12665 13.3734 2 10.75 2ZM8.75 13C5.57436 13 3 15.5744 3 18.75V19.75C3 20.7165 3.7835 21.5 4.75 21.5H13.6646L13.0292 20.8646C12.7764 20.6118 12.5733 20.3185 12.4263 20H4.75C4.61193 20 4.5 19.8881 4.5 19.75V18.75C4.5 16.4028 6.40279 14.5 8.75 14.5H12.6452C13.0508 13.8858 13.676 13.4295 14.4091 13.243C13.8838 13.0849 13.3268 13 12.75 13H8.75Z",
2153
+ fill: color
1664
2154
  }
1665
- }
1666
- }, [matchToken]);
1667
- useEffect6(() => {
1668
- const onLoginMessage = (event) => {
1669
- const res = event.data;
1670
- if (res.event === "login" && res.data && (res.data.token || res.data.token_type && res.data.access_token)) {
1671
- login({
1672
- mid: res.data.mid,
1673
- token: res.data.token || `${res.data.token_type} ${res.data.access_token}`
1674
- });
1675
- } else if (res.event == "bind") {
1676
- eventManager_default.emit("onBind", res.data);
1677
- if (events && events.onBind) {
1678
- events.onBind(res.data);
1679
- }
2155
+ ),
2156
+ /* @__PURE__ */ jsx39(
2157
+ "path",
2158
+ {
2159
+ fillRule: "evenodd",
2160
+ clipRule: "evenodd",
2161
+ d: "M19.0677 22.4771L21.4771 20.0677C21.841 19.7038 21.841 19.1139 21.4771 18.75L17.75 15.0229C17.5753 14.8482 17.3383 14.75 17.0911 14.75H14.6818C14.1672 14.75 13.75 15.1672 13.75 15.6818V18.0911C13.75 18.3383 13.8482 18.5753 14.0229 18.75L17.75 22.4771C18.1139 22.841 18.7038 22.841 19.0677 22.4771ZM15.6135 17.3124C15.9995 17.3124 16.3124 16.9995 16.3124 16.6135C16.3124 16.2276 15.9995 15.9147 15.6135 15.9147C15.2276 15.9147 14.9147 16.2276 14.9147 16.6135C14.9147 16.9995 15.2276 17.3124 15.6135 17.3124Z",
2162
+ fill: color
1680
2163
  }
1681
- };
1682
- window.addEventListener("message", onLoginMessage);
1683
- return () => {
1684
- window.removeEventListener("message", onLoginMessage);
1685
- };
1686
- }, []);
1687
- const loadOverview = async () => {
1688
- matchlog_default.log("loadOverview");
1689
- if (overviewLoadingRef.current) {
1690
- return;
1691
- }
1692
- overviewLoadingRef.current = true;
2164
+ )
2165
+ ] });
2166
+ }
2167
+
2168
+ // src/components/UserPopover/index.tsx
2169
+ import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
2170
+ function UserContent() {
2171
+ const { logout, address, username } = useUserInfo();
2172
+ const [logouting, setLogouting] = useState10(false);
2173
+ const onLogout = async () => {
2174
+ if (logouting) return;
1693
2175
  try {
1694
- const res = await getOverviewInfoApi();
1695
- setOverview(res.data);
1696
- return res.data;
1697
- } catch (err) {
1698
- console.error("overview error", err);
2176
+ setLogouting(true);
2177
+ await logout();
2178
+ } catch (error) {
2179
+ console.error(error);
1699
2180
  } finally {
1700
- overviewLoadingRef.current = false;
2181
+ setLogouting(false);
1701
2182
  }
1702
2183
  };
1703
- useEffect6(() => {
1704
- if (token) {
1705
- loadOverview();
1706
- }
1707
- }, [token]);
1708
- const login = async ({ mid, token: token2 }) => {
1709
- setMid(mid);
1710
- setToken(token2);
1711
- const overview = await loadOverview();
1712
- eventManager_default.emit("onLogin", {
1713
- mid,
1714
- token: token2,
1715
- did: overview?.did
1716
- });
1717
- if (events && events?.onLogin) {
1718
- events.onLogin({
1719
- mid,
1720
- token: token2,
1721
- did: overview?.did
1722
- });
1723
- }
2184
+ const UserItem = ({
2185
+ children,
2186
+ icon,
2187
+ rightIcon,
2188
+ onClick
2189
+ }) => {
2190
+ return /* @__PURE__ */ jsxs27("div", { className: "matchid-user-popover-item", onClick, children: [
2191
+ /* @__PURE__ */ jsxs27("div", { className: `matchid-user-popover-item-content`, children: [
2192
+ icon,
2193
+ /* @__PURE__ */ jsx40("div", { className: "matchid-user-popover-item-text", children })
2194
+ ] }),
2195
+ rightIcon
2196
+ ] });
1724
2197
  };
1725
- return {
1726
- loadOverview,
1727
- login,
1728
- endpoints: realEndpoints
2198
+ const UserDivider = () => {
2199
+ return /* @__PURE__ */ jsx40("div", { className: `matchid-user-popover-divider` });
1729
2200
  };
2201
+ const [usernameOpen, setUsernameOpen] = useState10(false);
2202
+ const [copied, setCopied] = useCopyClipboard();
2203
+ return /* @__PURE__ */ jsxs27("div", { className: "matchid-user-popover-content", children: [
2204
+ /* @__PURE__ */ jsxs27("div", { className: "matchid-user-popover-list", children: [
2205
+ /* @__PURE__ */ jsx40(UserItem, { onClick: () => {
2206
+ setCopied(address);
2207
+ }, icon: copied ? /* @__PURE__ */ jsx40(CheckIcon, { size: 20, color: "#0ecb81" }) : /* @__PURE__ */ jsx40(CopyIcon, { size: 20, color: "var(--icon-color)" }), rightIcon: /* @__PURE__ */ jsx40(CheckIcon, { size: 20, color: "var(--icon-color)" }), children: truncateAddress(address) }),
2208
+ /* @__PURE__ */ jsx40(UserDivider, {}),
2209
+ /* @__PURE__ */ jsx40(UserItem, { onClick: () => {
2210
+ setUsernameOpen(true);
2211
+ }, icon: /* @__PURE__ */ jsx40(ProfileIcon, { size: 20, color: "var(--icon-color)" }), rightIcon: /* @__PURE__ */ jsx40(ArrowRightIcon, { size: 20, color: "var(--icon-color)" }), children: username || "Set a username" })
2212
+ ] }),
2213
+ /* @__PURE__ */ jsx40(Button, { onClick: onLogout, loading: logouting, children: "Disconnect" }),
2214
+ /* @__PURE__ */ jsx40(UsernameModal, { isOpen: usernameOpen, onClose: () => {
2215
+ setUsernameOpen(false);
2216
+ }, onSuccess: () => {
2217
+ setUsernameOpen(false);
2218
+ } })
2219
+ ] });
2220
+ }
2221
+ function UserPopover({
2222
+ children,
2223
+ ...props
2224
+ }) {
2225
+ return /* @__PURE__ */ jsx40(Popover, { ...props, content: /* @__PURE__ */ jsx40(UserContent, {}), children });
1730
2226
  }
1731
2227
 
1732
- // src/MatchContext.tsx
1733
- import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
1734
- import { jsx as jsx33 } from "react/jsx-runtime";
1735
- var queryClient = new QueryClient();
1736
- var MatchContext = createContext(void 0);
1737
- var MatchProvider = ({ children, appid, events, theme = "light", endpoints }) => {
1738
- const { loadOverview, login, endpoints: realEndPoints } = useInit({
1739
- theme,
1740
- appid,
1741
- events,
1742
- endpoints
1743
- });
1744
- useWalletInit({
1745
- refreshOverview: loadOverview
1746
- });
1747
- return /* @__PURE__ */ jsx33(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx33(
1748
- MatchContext.Provider,
1749
- {
1750
- value: {
1751
- appid,
1752
- endpoints: realEndPoints,
1753
- events,
1754
- login,
1755
- theme
1756
- },
1757
- children: /* @__PURE__ */ jsx33(context_default, { children })
1758
- }
1759
- ) });
1760
- };
1761
- var useMatch = () => {
1762
- const context = useContext(MatchContext);
1763
- if (context === void 0) {
1764
- throw new Error("useMatch must be used within a MatchProvider");
2228
+ // src/components/LoginButton/index.tsx
2229
+ import { Fragment as Fragment3, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
2230
+ function LoginButton({
2231
+ loginRender,
2232
+ methods,
2233
+ onLoginClick,
2234
+ popoverPosition = "right",
2235
+ popoverType = "hover",
2236
+ popoverGap = 20,
2237
+ ...props
2238
+ }) {
2239
+ const { isLogin, username } = useUserInfo();
2240
+ const [loginOpen, setLoginOpen] = useState11(false);
2241
+ if (!isLogin) {
2242
+ return /* @__PURE__ */ jsxs28(Fragment3, { children: [
2243
+ /* @__PURE__ */ jsx41(LoginModal, { methods, isOpen: loginOpen, onClose: () => setLoginOpen(false) }),
2244
+ /* @__PURE__ */ jsxs28(Button, { className: "matchid-unlogin-btn", ...props, highlight: true, onClick: () => setLoginOpen(true), children: [
2245
+ /* @__PURE__ */ jsx41(UnLoginIcon_default, {}),
2246
+ /* @__PURE__ */ jsx41("span", { children: "Login" })
2247
+ ] })
2248
+ ] });
1765
2249
  }
1766
- return context;
1767
- };
2250
+ return loginRender ? { loginRender } : /* @__PURE__ */ jsx41(UserPopover, { position: popoverPosition, type: popoverType, gap: popoverGap, children: /* @__PURE__ */ jsxs28(Button, { onClick: onLoginClick, className: "matchid-login-btn", ...props, children: [
2251
+ /* @__PURE__ */ jsx41(LoginIcon_default, {}),
2252
+ /* @__PURE__ */ jsx41("span", { children: username ? truncateAddress(username) : "MatchID User" })
2253
+ ] }) });
2254
+ }
1768
2255
 
1769
- // src/components/index.tsx
1770
- var components_exports = {};
1771
- __export(components_exports, {
1772
- Button: () => Button,
1773
- EmailModal: () => EmailModal,
1774
- Field: () => Field,
1775
- Input: () => Input,
1776
- LoginBox: () => LoginBox,
1777
- LoginButton: () => LoginButton,
1778
- LoginModal: () => LoginModal,
1779
- LoginPanel: () => LoginPanel,
1780
- Modal: () => Modal,
1781
- ModalWithHeader: () => ModalWithHeader,
1782
- PasswordModal: () => PasswordModal,
1783
- Popover: () => Popover,
1784
- UsernameModal: () => UsernameModal
1785
- });
2256
+ // src/components/UsernameModal/index.tsx
2257
+ import { useEffect as useEffect8, useMemo as useMemo8, useState as useState12 } from "react";
1786
2258
 
1787
- // src/components/EmailModal/index.tsx
1788
- import { useEffect as useEffect10, useState as useState9 } from "react";
2259
+ // src/assets/icon/InfoRoundIcon.tsx
2260
+ import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
2261
+ function InfoRoundIcon({
2262
+ size,
2263
+ color = "#6E6E6E",
2264
+ ...props
2265
+ }) {
2266
+ return /* @__PURE__ */ jsxs29("svg", { width: size, height: size, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: [
2267
+ /* @__PURE__ */ jsx42("g", { clipPath: "url(#clip0_418_7746)", children: /* @__PURE__ */ jsx42(
2268
+ "path",
2269
+ {
2270
+ fillRule: "evenodd",
2271
+ clipRule: "evenodd",
2272
+ d: "M7.99984 0.666504C3.94975 0.666504 0.666504 3.94975 0.666504 7.99984C0.666504 12.0499 3.94975 15.3332 7.99984 15.3332C12.0499 15.3332 15.3332 12.0499 15.3332 7.99984C15.3332 3.94975 12.0499 0.666504 7.99984 0.666504ZM1.99984 7.99984C1.99984 4.68613 4.68613 1.99984 7.99984 1.99984C11.3135 1.99984 13.9998 4.68613 13.9998 7.99984C13.9998 11.3135 11.3135 13.9998 7.99984 13.9998C4.68613 13.9998 1.99984 11.3135 1.99984 7.99984ZM8.6665 7.33317C8.6665 6.96498 8.36803 6.6665 7.99984 6.6665C7.63165 6.6665 7.33317 6.96498 7.33317 7.33317V11.3332C7.33317 11.7014 7.63165 11.9998 7.99984 11.9998C8.36803 11.9998 8.6665 11.7014 8.6665 11.3332V7.33317ZM7.99984 5.33317C8.36803 5.33317 8.6665 5.03469 8.6665 4.6665C8.6665 4.29831 8.36803 3.99984 7.99984 3.99984C7.63165 3.99984 7.33317 4.29831 7.33317 4.6665C7.33317 5.03469 7.63165 5.33317 7.99984 5.33317Z",
2273
+ fill: color
2274
+ }
2275
+ ) }),
2276
+ /* @__PURE__ */ jsx42("defs", { children: /* @__PURE__ */ jsx42("clipPath", { id: "clip0_418_7746", children: /* @__PURE__ */ jsx42("rect", { width: "16", height: "16", fill: "white" }) }) })
2277
+ ] });
2278
+ }
1789
2279
 
1790
- // src/components/EmailModal/StepEmail.tsx
1791
- import { useEffect as useEffect8, useMemo as useMemo4, useState as useState7 } from "react";
1792
- import { jsx as jsx34, jsxs as jsxs21 } from "react/jsx-runtime";
1793
- function StepEmail(props) {
1794
- const [emailVal, setEmailVal] = useState7("");
2280
+ // src/components/UsernameModal/index.tsx
2281
+ import { jsx as jsx43, jsxs as jsxs30 } from "react/jsx-runtime";
2282
+ var ValidItem = ({
2283
+ success = false,
2284
+ text
2285
+ }) => {
2286
+ return /* @__PURE__ */ jsxs30("div", { className: `matchid-valid-status-item matchid-valid-status-${success ? "success" : "error"}`, children: [
2287
+ success ? /* @__PURE__ */ jsx43(CheckRoundIcon, { size: 16 }) : /* @__PURE__ */ jsx43(InfoRoundIcon, { size: 16 }),
2288
+ /* @__PURE__ */ jsx43("span", { children: text })
2289
+ ] });
2290
+ };
2291
+ function UsernameModal({
2292
+ title,
2293
+ isOpen,
2294
+ onSuccess,
2295
+ ...props
2296
+ }) {
2297
+ const { username, refreshOverview } = useUserInfo();
2298
+ const { isLogin } = useUserInfo();
2299
+ const [val, setVal] = useState12(username);
2300
+ const [error, setError] = useState12("");
1795
2301
  useEffect8(() => {
1796
- if (props.email) {
1797
- setEmailVal(props.email);
2302
+ if (isOpen) {
2303
+ setVal(username);
2304
+ setError("");
2305
+ }
2306
+ }, [isOpen]);
2307
+ const isValid = useMemo8(() => {
2308
+ return isValidUsername(val);
2309
+ }, [val]);
2310
+ const isLength = useMemo8(() => {
2311
+ return val.length >= 2 && val.length <= 32;
2312
+ }, [val]);
2313
+ const isSafe = isValid && isLength;
2314
+ const [isSubmitting, setIsSubmitting] = useState12(false);
2315
+ const onSubmit = async () => {
2316
+ if (isSubmitting) return;
2317
+ try {
2318
+ setIsSubmitting(true);
2319
+ const res = await setUserNameApi({
2320
+ username: val
2321
+ });
2322
+ if (isSuccess(res)) {
2323
+ await refreshOverview();
2324
+ onSuccess && onSuccess();
2325
+ } else {
2326
+ setError(res.message);
2327
+ }
2328
+ } catch (error2) {
2329
+ setError(error2.message);
2330
+ } finally {
2331
+ setIsSubmitting(false);
1798
2332
  }
1799
- }, []);
1800
- const canContinue = useMemo4(() => {
1801
- return isValidEmail(emailVal);
1802
- }, [emailVal]);
1803
- const onContinue = async () => {
1804
- props.onContinue(emailVal);
1805
2333
  };
1806
- return /* @__PURE__ */ jsxs21("div", { className: "matchid-email-email-box", children: [
1807
- /* @__PURE__ */ jsx34(Field, { label: "Email Address", children: /* @__PURE__ */ jsx34(
2334
+ return /* @__PURE__ */ jsx43(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || (username ? "Edit User Name" : "Set User Name"), children: /* @__PURE__ */ jsxs30("div", { className: "matchid-username-box", children: [
2335
+ /* @__PURE__ */ jsx43(Field, { label: "User Name", error, children: /* @__PURE__ */ jsx43(
1808
2336
  Input,
1809
2337
  {
1810
- placeholder: "Enter Your Email Address",
1811
- onChange: (e) => setEmailVal(e.target.value),
1812
- value: emailVal
2338
+ placeholder: "Enter Your User Name",
2339
+ onChange: (e) => {
2340
+ setVal(e.target.value);
2341
+ setError("");
2342
+ },
2343
+ value: val
1813
2344
  }
1814
2345
  ) }),
1815
- /* @__PURE__ */ jsx34(Button, { disabled: !canContinue, style: {
2346
+ /* @__PURE__ */ jsxs30("div", { className: "matchid-valid", children: [
2347
+ /* @__PURE__ */ jsx43(
2348
+ ValidItem,
2349
+ {
2350
+ success: isValid,
2351
+ text: "Name can be composed of numbers and letters as well as characters"
2352
+ }
2353
+ ),
2354
+ /* @__PURE__ */ jsx43(ValidItem, { success: isLength, text: "No less than 2 characters" })
2355
+ ] }),
2356
+ /* @__PURE__ */ jsx43(Button, { disabled: !isSafe, loading: isSubmitting, style: {
1816
2357
  marginTop: "64px"
1817
- }, onClick: onContinue, size: "lg", block: true, highlight: true, children: "Continue" })
1818
- ] });
2358
+ }, onClick: onSubmit, size: "lg", block: true, highlight: true, children: "Confirm" }),
2359
+ /* @__PURE__ */ jsx43(Button, { style: {
2360
+ marginTop: "24px"
2361
+ }, onClick: props.onClose, size: "lg", block: true, children: "Next Time" })
2362
+ ] }) });
1819
2363
  }
1820
2364
 
1821
- // src/components/EmailModal/StepVerify.tsx
1822
- import { useEffect as useEffect9, useMemo as useMemo5, useRef as useRef3, useState as useState8 } from "react";
1823
-
1824
- // src/config/index.tsx
1825
- var EMAIL_INTERVAL = 60;
1826
- var EMAIL_CODE_LENGTH = 6;
1827
-
1828
- // src/components/EmailModal/StepVerify.tsx
1829
- import { jsx as jsx35, jsxs as jsxs22 } from "react/jsx-runtime";
1830
- function StepVerify(props) {
1831
- const { getLoginEmailCode, loginByEmail } = useUserInfo();
1832
- const [error, setError] = useState8("");
1833
- const [code, setCode] = useState8("");
1834
- const [sending, setSending] = useState8(false);
1835
- const [submitting, setSubmitting] = useState8(false);
1836
- const sendTimeRef = useRef3(0);
1837
- const [sendBtnText, setSendBtnText] = useState8("Send");
1838
- const intervalTime = EMAIL_INTERVAL;
1839
- const codeLength = EMAIL_CODE_LENGTH;
1840
- const intervalRef = useRef3(null);
1841
- const onSend = async () => {
1842
- if (sendTimeRef.current > 0) {
1843
- return;
1844
- }
1845
- try {
1846
- setError("");
1847
- setSending(true);
1848
- sendTimeRef.current = intervalTime;
1849
- await getLoginEmailCode(props.email);
1850
- setSendBtnText(`${sendTimeRef.current}s`);
1851
- intervalRef.current = setInterval(() => {
1852
- sendTimeRef.current--;
1853
- setSendBtnText(`${sendTimeRef.current}s`);
1854
- if (sendTimeRef.current <= 0) {
1855
- setSendBtnText("Resend");
1856
- clearInterval(intervalRef.current);
1857
- setSending(false);
1858
- }
1859
- }, 1e3);
1860
- } catch (err) {
1861
- console.error("Send email error", err);
1862
- setError("Failed to send code:" + err.message);
1863
- setSending(false);
2365
+ // src/components/EVMModal/index.tsx
2366
+ import "@rainbow-me/rainbowkit/styles.css";
2367
+
2368
+ // src/assets/wallet.ts
2369
+ var walletErrorImage = "data:image/png;base64,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";
2370
+ var walletConnectedImage = "data:image/png;base64,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";
2371
+ var walletConnectingImage = "data:image/png;base64,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";
2372
+ var walletConnectImage = "data:image/png;base64,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";
2373
+ var walletSigningImage = "data:image/png;base64,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";
2374
+
2375
+ // src/components/EVMModal/index.tsx
2376
+ import { jsx as jsx44, jsxs as jsxs31 } from "react/jsx-runtime";
2377
+ var wagmiConfig = getDefaultConfig({
2378
+ appName: "MatchID",
2379
+ projectId: "9ac6ea7e07860f04616fb311b447dee9",
2380
+ wallets: [
2381
+ {
2382
+ groupName: "Recommended",
2383
+ wallets: [
2384
+ metaMaskWallet,
2385
+ walletConnectWallet,
2386
+ okxWallet,
2387
+ bitgetWallet,
2388
+ injectedWallet
2389
+ ]
1864
2390
  }
1865
- };
2391
+ ],
2392
+ chains: [bsc]
2393
+ });
2394
+ function WalletContent({
2395
+ onSuccess,
2396
+ type
2397
+ }) {
2398
+ const config = useConfig();
2399
+ const { openConnectModal, connectModalOpen } = useConnectModal();
2400
+ const { address } = useAccount();
2401
+ const { disconnect } = useDisconnect({ config });
2402
+ const chainId = useChainId();
2403
+ const { events, login } = useMatch();
2404
+ const [status, setStatus] = useState13("");
2405
+ const statusRef = React3.useRef(status);
2406
+ const [error, setError] = useState13("");
1866
2407
  useEffect9(() => {
1867
- onSend();
2408
+ if (openConnectModal) {
2409
+ disconnect();
2410
+ openConnectModal && openConnectModal();
2411
+ }
1868
2412
  return () => {
1869
- if (intervalRef.current) {
1870
- clearInterval(intervalRef.current);
1871
- }
2413
+ address && disconnect();
1872
2414
  };
1873
- }, []);
1874
- const canContinue = useMemo5(() => {
1875
- return code.length === codeLength;
1876
- }, [code]);
1877
- const onContinue = async () => {
1878
- if (submitting) {
1879
- return;
2415
+ }, [openConnectModal]);
2416
+ useAccountEffect({
2417
+ onDisconnect() {
2418
+ matchlog_default.log("onDisconnect");
2419
+ setStatus("");
2420
+ statusRef.current = "";
2421
+ },
2422
+ onConnect(data) {
2423
+ matchlog_default.log("onConnect", data, status);
2424
+ setStatus("");
2425
+ statusRef.current = "";
2426
+ toLoginInWallet(data);
1880
2427
  }
2428
+ });
2429
+ const toLoginInWallet = async (data) => {
2430
+ if (statusRef.current) return;
1881
2431
  try {
1882
- setError("");
1883
- setSubmitting(true);
1884
- const res = await loginByEmail({
1885
- email: props.email,
1886
- code
1887
- });
1888
- if (res) {
1889
- props.onSuccess && props.onSuccess();
2432
+ const signer = await getEthersSigner(config);
2433
+ if (!signer || !chainId || !data.address) return;
2434
+ setStatus("nonce");
2435
+ statusRef.current = "nonce";
2436
+ const res = type == "bind" ? await getWalletInitApi({ address: data.address }) : await getWalletNonceApi({ address: data.address });
2437
+ if (!isSuccess(res)) {
2438
+ throw new Error(res.message);
1890
2439
  }
1891
- setSubmitting(false);
1892
- } catch (err) {
1893
- console.error("Verify email code error", err);
1894
- setError(err.message);
1895
- setSubmitting(false);
2440
+ const domain = window.location.host;
2441
+ const origin = window.location.origin;
2442
+ const nonce = res.code >= 0 ? res.data.nonce : null;
2443
+ if (nonce) {
2444
+ setStatus("signer");
2445
+ statusRef.current = "signer";
2446
+ const params = {
2447
+ domain,
2448
+ address: data.address,
2449
+ statement: "By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.",
2450
+ uri: origin,
2451
+ nonce,
2452
+ version: "1",
2453
+ chainId
2454
+ };
2455
+ const message = new SiweMessage({ ...params });
2456
+ const signature = await signer.signMessage(message.prepareMessage());
2457
+ let obj = {
2458
+ type: "EVM",
2459
+ address: data.address,
2460
+ signature,
2461
+ message: `${message.prepareMessage()}`,
2462
+ connector_type: data.connector.type || "",
2463
+ wallet_client_type: data.connector.name || ""
2464
+ };
2465
+ const res2 = type == "bind" ? await toBindWalletApi(obj) : await loginByWalletApi(obj);
2466
+ if (res2) {
2467
+ if (!isSuccess(res2)) {
2468
+ throw new Error(res2.message);
2469
+ }
2470
+ matchlog_default.log(res2);
2471
+ setStatus("success");
2472
+ statusRef.current = "success";
2473
+ if (type == "bind") {
2474
+ events.onBind && events.onBind({
2475
+ type: "evm"
2476
+ });
2477
+ eventManager_default.emit("onBind", {
2478
+ type: "evm"
2479
+ });
2480
+ } else {
2481
+ await login({
2482
+ mid: res2.data.mid,
2483
+ token: `${res2.data.token_type} ${res2.data.access_token}`
2484
+ });
2485
+ }
2486
+ onSuccess && onSuccess();
2487
+ }
2488
+ }
2489
+ } catch (error2) {
2490
+ setStatus("error");
2491
+ setError(error2.message);
2492
+ statusRef.current = "";
1896
2493
  }
1897
2494
  };
1898
- return /* @__PURE__ */ jsxs22("div", { className: "matchid-email-verify-box", children: [
1899
- /* @__PURE__ */ jsxs22("div", { className: "matchid-email-verify-header", children: [
1900
- /* @__PURE__ */ jsx35("div", { className: "matchid-email-verify-header-icon", children: /* @__PURE__ */ jsx35(EmailLineIcon, {}) }),
1901
- /* @__PURE__ */ jsxs22("div", { className: "matchid-email-verify-header-content", children: [
1902
- /* @__PURE__ */ jsx35("div", { className: "matchid-email-verify-header-value", children: props.email }),
1903
- /* @__PURE__ */ jsx35("div", { className: "matchid-email-verify-header-tips", children: "We have sent a verification code to your email" })
1904
- ] })
2495
+ const pageData = useMemo9(() => {
2496
+ if (status == "success") {
2497
+ return {
2498
+ btnText: "Disconnect Wallet",
2499
+ btnClick: () => {
2500
+ disconnect();
2501
+ },
2502
+ text: "Wallet connection successful!",
2503
+ statusImage: walletConnectedImage
2504
+ };
2505
+ }
2506
+ if (status == "error") {
2507
+ return {
2508
+ text: error,
2509
+ btnText: "Reconnect Wallet",
2510
+ btnClick: async () => {
2511
+ setError("");
2512
+ disconnect();
2513
+ openConnectModal && openConnectModal();
2514
+ },
2515
+ statusImage: walletErrorImage,
2516
+ isError: true
2517
+ };
2518
+ }
2519
+ if (status == "nonce") {
2520
+ return {
2521
+ btnLoading: true,
2522
+ text: "Connecting",
2523
+ statusImage: walletConnectingImage
2524
+ };
2525
+ }
2526
+ if (status == "signer") {
2527
+ return {
2528
+ btnLoading: true,
2529
+ text: "Signing",
2530
+ statusImage: walletSigningImage
2531
+ };
2532
+ }
2533
+ if (connectModalOpen) {
2534
+ return {
2535
+ btnLoading: true,
2536
+ text: "Connecting",
2537
+ statusImage: walletConnectingImage
2538
+ };
2539
+ }
2540
+ return {
2541
+ btnText: "Connect Wallet",
2542
+ btnClick: () => {
2543
+ openConnectModal && openConnectModal();
2544
+ },
2545
+ text: "Please Connect your wallet",
2546
+ statusImage: walletConnectImage
2547
+ };
2548
+ }, [connectModalOpen, status, error, address]);
2549
+ return /* @__PURE__ */ jsx44("div", { className: "matchid-wallet-container", children: /* @__PURE__ */ jsxs31("div", { className: `matchid-wallet-box`, children: [
2550
+ /* @__PURE__ */ jsxs31("div", { className: `matchid-wallet-content`, children: [
2551
+ /* @__PURE__ */ jsx44("img", { src: pageData.statusImage }),
2552
+ /* @__PURE__ */ jsx44("div", { className: pageData.isError ? "text-[#F7585E]" : "", children: pageData.text })
1905
2553
  ] }),
1906
- /* @__PURE__ */ jsx35(Field, { label: "Verification Code", error, children: /* @__PURE__ */ jsx35(
1907
- Input,
2554
+ /* @__PURE__ */ jsx44(
2555
+ Button,
1908
2556
  {
1909
- placeholder: "Enter the code",
1910
- maxLength: codeLength,
1911
- onChange: (e) => setCode(e.target.value),
1912
- value: code,
1913
- after: /* @__PURE__ */ jsx35(
1914
- Button,
1915
- {
1916
- highlight: true,
1917
- disabled: sending,
1918
- style: {
1919
- height: "100%",
1920
- borderTopLeftRadius: 0,
1921
- borderBottomLeftRadius: 0,
1922
- borderTopRightRadius: "inherit",
1923
- borderBottomRightRadius: "inherit",
1924
- width: "80px"
1925
- },
1926
- onClick: onSend,
1927
- children: sendBtnText
1928
- }
1929
- )
2557
+ block: true,
2558
+ size: "lg",
2559
+ onClick: pageData.btnClick,
2560
+ loading: pageData.btnLoading,
2561
+ disabled: pageData.btnDisabled,
2562
+ children: pageData.btnText
1930
2563
  }
1931
- ) }),
1932
- /* @__PURE__ */ jsx35(Button, { disabled: !canContinue, highlight: true, block: true, size: "lg", onClick: onContinue, children: "Continue" })
1933
- ] });
1934
- }
1935
-
1936
- // src/components/EmailModal/index.tsx
1937
- import { jsx as jsx36 } from "react/jsx-runtime";
1938
- function EmailModal({
1939
- isOpen = false,
1940
- width = 480,
1941
- onClose,
1942
- onBack,
1943
- onLogin
1944
- }) {
1945
- const [step, setStep] = useState9("input");
1946
- const [emailVal, setEmailVal] = useState9("");
1947
- useEffect10(() => {
1948
- if (!isOpen) {
1949
- setStep("input");
1950
- setEmailVal("");
1951
- }
1952
- }, [isOpen]);
1953
- return /* @__PURE__ */ jsx36(
1954
- ModalWithHeader,
1955
- {
1956
- isOpen,
1957
- width,
1958
- onClose,
1959
- title: "Email",
1960
- onBack: step == "verify" ? () => setStep("input") : onBack,
1961
- children: step === "input" ? /* @__PURE__ */ jsx36(StepEmail, { email: emailVal, onContinue: (email) => {
1962
- setEmailVal(email);
1963
- setStep("verify");
1964
- } }) : /* @__PURE__ */ jsx36(StepVerify, { email: emailVal, onSuccess: onLogin })
1965
- }
1966
- );
2564
+ )
2565
+ ] }) });
1967
2566
  }
1968
-
1969
- // src/components/Popover/index.tsx
1970
- import { useState as useState10 } from "react";
1971
- import { jsx as jsx37, jsxs as jsxs23 } from "react/jsx-runtime";
1972
- function Popover({
1973
- children,
1974
- content,
1975
- position = "right",
1976
- type = "hover",
1977
- className = "",
1978
- gap = "20px"
2567
+ function EVMModal({
2568
+ type = "login",
2569
+ onSuccess,
2570
+ ...props
1979
2571
  }) {
1980
- const [active, setActive] = useState10(false);
1981
- return /* @__PURE__ */ jsxs23(
1982
- "div",
1983
- {
1984
- onClick: () => {
1985
- if (type == "click") {
1986
- setActive(!active);
1987
- }
1988
- },
1989
- className: `matchid-popover-box matchid-popover-${position} matchid-popover-${type} ${className} ${type == "click" && active ? "matchid-popover-click-active" : ""}`,
1990
- children: [
1991
- children,
1992
- /* @__PURE__ */ jsx37("div", { style: {
1993
- paddingTop: gap
1994
- }, children: /* @__PURE__ */ jsx37("div", { className: `matchid-popover-content`, children: content }) })
1995
- ]
1996
- }
1997
- );
2572
+ return /* @__PURE__ */ jsx44(ModalWithHeader, { ...props, title: props.title || firstUpperCase(type + " EVM Wallet"), children: /* @__PURE__ */ jsx44(WagmiProvider, { config: wagmiConfig, children: /* @__PURE__ */ jsx44(RainbowKitProvider, { children: /* @__PURE__ */ jsx44(WalletContent, { onSuccess, type }) }) }) });
1998
2573
  }
1999
2574
 
2000
- // src/components/LoginBox/index.tsx
2001
- import { useMemo as useMemo6, useState as useState11 } from "react";
2002
- import { Fragment as Fragment3, jsx as jsx38, jsxs as jsxs24 } from "react/jsx-runtime";
2003
- function LoginBox({
2004
- methods,
2005
- inModal = false
2575
+ // src/components/SOLModal/index.tsx
2576
+ import React4, { useEffect as useEffect10, useMemo as useMemo10, useState as useState14 } from "react";
2577
+ import { clusterApiUrl } from "@solana/web3.js";
2578
+ import { useWallet as useWallet2, WalletProvider, ConnectionProvider } from "@solana/wallet-adapter-react";
2579
+ import { WalletModalProvider, useWalletModal } from "@solana/wallet-adapter-react-ui";
2580
+
2581
+ // node_modules/@solana/wallet-adapter-base/lib/esm/types.js
2582
+ var WalletAdapterNetwork;
2583
+ (function(WalletAdapterNetwork2) {
2584
+ WalletAdapterNetwork2["Mainnet"] = "mainnet-beta";
2585
+ WalletAdapterNetwork2["Testnet"] = "testnet";
2586
+ WalletAdapterNetwork2["Devnet"] = "devnet";
2587
+ })(WalletAdapterNetwork || (WalletAdapterNetwork = {}));
2588
+
2589
+ // src/components/SOLModal/index.tsx
2590
+ import {
2591
+ PhantomWalletAdapter,
2592
+ SolflareWalletAdapter,
2593
+ WalletConnectWalletAdapter,
2594
+ AlphaWalletAdapter,
2595
+ AvanaWalletAdapter,
2596
+ BitgetWalletAdapter,
2597
+ BitpieWalletAdapter,
2598
+ CloverWalletAdapter,
2599
+ Coin98WalletAdapter,
2600
+ CoinbaseWalletAdapter,
2601
+ CoinhubWalletAdapter,
2602
+ FractalWalletAdapter,
2603
+ HuobiWalletAdapter,
2604
+ HyperPayWalletAdapter,
2605
+ KeystoneWalletAdapter,
2606
+ KrystalWalletAdapter,
2607
+ LedgerWalletAdapter,
2608
+ MathWalletAdapter,
2609
+ NekoWalletAdapter,
2610
+ NightlyWalletAdapter,
2611
+ NufiWalletAdapter,
2612
+ OntoWalletAdapter,
2613
+ ParticleAdapter,
2614
+ SafePalWalletAdapter,
2615
+ SaifuWalletAdapter,
2616
+ SalmonWalletAdapter,
2617
+ SkyWalletAdapter,
2618
+ SolongWalletAdapter,
2619
+ SpotWalletAdapter,
2620
+ TokenaryWalletAdapter,
2621
+ TokenPocketWalletAdapter,
2622
+ TorusWalletAdapter,
2623
+ TrezorWalletAdapter,
2624
+ TrustWalletAdapter,
2625
+ XDEFIWalletAdapter
2626
+ } from "@solana/wallet-adapter-wallets";
2627
+ import "@solana/wallet-adapter-react-ui/styles.css";
2628
+ import { jsx as jsx45, jsxs as jsxs32 } from "react/jsx-runtime";
2629
+ function WalletContent2({
2630
+ onSuccess,
2631
+ type
2006
2632
  }) {
2007
- const [emailOpen, setEmailOpen] = useState11(false);
2008
- const { login } = useUserInfo();
2009
- const defaultMethods = [
2010
- "wallet",
2011
- "google",
2012
- "email",
2013
- "telegram",
2014
- "twitter"
2015
- ];
2016
- const methodList = useMemo6(() => {
2017
- return methods || defaultMethods;
2018
- }, [methods]);
2019
- const LoginItem = ({
2020
- icon,
2021
- name,
2022
- onClick
2023
- }) => {
2024
- return /* @__PURE__ */ jsxs24("div", { className: "matchid-login-method", onClick, children: [
2025
- /* @__PURE__ */ jsxs24("div", { className: "matchid-login-method-content", children: [
2026
- /* @__PURE__ */ jsx38("div", { className: "matchid-login-method-icon", children: icon }),
2027
- /* @__PURE__ */ jsx38("span", { className: "matchid-login-method-name", children: name })
2028
- ] }),
2029
- /* @__PURE__ */ jsx38(ArrowRightIcon, { className: "matchid-login-method-arrow", size: 20, color: "var(--matchid-arrow-color)" })
2030
- ] });
2031
- };
2032
- const methodMap = {
2033
- wallet: {
2034
- icon: /* @__PURE__ */ jsx38(WalletIcon, {}),
2035
- name: "Wallet",
2036
- onClick: () => login("wallet")
2037
- },
2038
- email: {
2039
- icon: /* @__PURE__ */ jsx38(EmailIcon, {}),
2040
- name: "Email",
2041
- onClick: () => {
2042
- setEmailOpen(true);
2633
+ const { setVisible, visible } = useWalletModal();
2634
+ const wallet = useWallet2();
2635
+ const { events, login } = useMatch();
2636
+ const [status, setStatus] = useState14("");
2637
+ const statusRef = React4.useRef(status);
2638
+ const [error, setError] = useState14("");
2639
+ useEffect10(() => {
2640
+ const init = async () => {
2641
+ await wallet.disconnect();
2642
+ setVisible(true);
2643
+ };
2644
+ init();
2645
+ }, []);
2646
+ useEffect10(() => {
2647
+ if (wallet.connected) {
2648
+ console.log("wallet.connected", wallet.connected);
2649
+ toLoginInWallet();
2650
+ }
2651
+ }, [wallet.connected]);
2652
+ const toLoginInWallet = async () => {
2653
+ if (statusRef.current) return;
2654
+ const address = wallet.publicKey?.toBase58() || "";
2655
+ try {
2656
+ setStatus("nonce");
2657
+ statusRef.current = "nonce";
2658
+ const res = type == "bind" ? await getWalletInitApi({ address }) : await getWalletNonceApi({ address });
2659
+ if (!isSuccess(res)) {
2660
+ throw new Error(res.message);
2043
2661
  }
2044
- },
2045
- google: {
2046
- icon: /* @__PURE__ */ jsx38(GoogleIcon, {}),
2047
- name: "Google",
2048
- onClick: () => login("google")
2049
- },
2050
- twitter: {
2051
- icon: /* @__PURE__ */ jsx38(XIcon, {}),
2052
- name: "X",
2053
- onClick: () => login("twitter")
2054
- },
2055
- telegram: {
2056
- icon: /* @__PURE__ */ jsx38(TelegramIcon, {}),
2057
- name: "Telegram",
2058
- onClick: () => login("telegram")
2059
- },
2060
- github: {
2061
- icon: /* @__PURE__ */ jsx38(GithubIcon, {}),
2062
- name: "Github",
2063
- onClick: () => login("github")
2064
- },
2065
- discord: {
2066
- icon: /* @__PURE__ */ jsx38(DiscordIcon, {}),
2067
- name: "Discord",
2068
- onClick: () => login("discord")
2662
+ const nonce = res.code >= 0 ? res.data.nonce : null;
2663
+ if (nonce) {
2664
+ setStatus("signer");
2665
+ statusRef.current = "signer";
2666
+ const message = "By signing, you are proving you own this wallet and logging in. This does not initiate a transaction or cost any fees.Nonce:" + res.data.nonce;
2667
+ const encodedMessage = new TextEncoder().encode(message);
2668
+ const signedMessage = await wallet.signMessage(encodedMessage);
2669
+ let obj = {
2670
+ type: "SOL",
2671
+ address,
2672
+ signature: Buffer.from(signedMessage).toString("base64"),
2673
+ message,
2674
+ connector_type: "SOL",
2675
+ wallet_client_type: wallet.wallet?.adapter.name || ""
2676
+ };
2677
+ const res1 = type == "bind" ? await toBindWalletApi(obj) : await loginByWalletApi(obj);
2678
+ if (res1) {
2679
+ if (!isSuccess(res1)) {
2680
+ throw new Error(res1.message);
2681
+ }
2682
+ matchlog_default.log(res1);
2683
+ setStatus("success");
2684
+ statusRef.current = "success";
2685
+ if (type == "bind") {
2686
+ events.onBind && events.onBind({
2687
+ type: "sol"
2688
+ });
2689
+ eventManager_default.emit("onBind", {
2690
+ type: "sol"
2691
+ });
2692
+ } else {
2693
+ await login({
2694
+ mid: res1.data.mid,
2695
+ token: `${res1.data.token_type} ${res1.data.access_token}`
2696
+ });
2697
+ }
2698
+ onSuccess && onSuccess();
2699
+ }
2700
+ }
2701
+ } catch (error2) {
2702
+ setStatus("error");
2703
+ setError(error2.message);
2704
+ statusRef.current = "";
2069
2705
  }
2070
2706
  };
2071
- return /* @__PURE__ */ jsxs24(Fragment3, { children: [
2072
- (!inModal || !emailOpen) && /* @__PURE__ */ jsx38("div", { className: "matchid-login-box", children: methodList.map((m) => {
2073
- return /* @__PURE__ */ jsx38(
2074
- LoginItem,
2075
- {
2076
- icon: methodMap[m].icon,
2077
- name: methodMap[m].name,
2078
- onClick: methodMap[m].onClick
2707
+ const pageData = useMemo10(() => {
2708
+ if (status == "success") {
2709
+ return {
2710
+ btnText: "Disconnect Wallet",
2711
+ btnClick: async () => {
2712
+ await wallet.disconnect();
2079
2713
  },
2080
- m
2081
- );
2082
- }) }),
2083
- /* @__PURE__ */ jsx38(
2084
- EmailModal,
2085
- {
2086
- isOpen: emailOpen,
2087
- onClose: () => {
2088
- setEmailOpen(false);
2714
+ text: "Wallet connection successful!",
2715
+ statusImage: walletConnectedImage
2716
+ };
2717
+ }
2718
+ if (status == "error") {
2719
+ return {
2720
+ text: error,
2721
+ btnText: "Reconnect Wallet",
2722
+ btnClick: async () => {
2723
+ setError("");
2724
+ await wallet.disconnect();
2725
+ setVisible(true);
2089
2726
  },
2090
- onBack: inModal ? () => {
2091
- setEmailOpen(false);
2092
- } : void 0
2727
+ statusImage: walletErrorImage,
2728
+ isError: true
2729
+ };
2730
+ }
2731
+ if (status == "nonce") {
2732
+ return {
2733
+ btnLoading: true,
2734
+ text: "Connecting",
2735
+ statusImage: walletConnectingImage
2736
+ };
2737
+ }
2738
+ if (status == "signer") {
2739
+ return {
2740
+ btnLoading: true,
2741
+ text: "Signing",
2742
+ statusImage: walletSigningImage
2743
+ };
2744
+ }
2745
+ if (visible) {
2746
+ return {
2747
+ btnLoading: true,
2748
+ text: "Connecting",
2749
+ statusImage: walletConnectingImage
2750
+ };
2751
+ }
2752
+ return {
2753
+ btnText: "Connect Wallet",
2754
+ btnClick: () => {
2755
+ setVisible(true);
2756
+ },
2757
+ text: "Please Connect your wallet",
2758
+ statusImage: walletConnectImage
2759
+ };
2760
+ }, [visible, wallet.connected, status, error, wallet.publicKey]);
2761
+ return /* @__PURE__ */ jsx45("div", { className: "matchid-wallet-container", children: /* @__PURE__ */ jsxs32("div", { className: `matchid-wallet-box`, children: [
2762
+ /* @__PURE__ */ jsxs32("div", { className: `matchid-wallet-content`, children: [
2763
+ /* @__PURE__ */ jsx45("img", { src: pageData.statusImage }),
2764
+ /* @__PURE__ */ jsx45("div", { className: pageData.isError ? "text-[#F7585E]" : "", children: pageData.text })
2765
+ ] }),
2766
+ /* @__PURE__ */ jsx45(
2767
+ Button,
2768
+ {
2769
+ block: true,
2770
+ size: "lg",
2771
+ onClick: pageData.btnClick,
2772
+ loading: pageData.btnLoading,
2773
+ disabled: pageData.btnDisabled,
2774
+ children: pageData.btnText
2093
2775
  }
2094
2776
  )
2095
- ] });
2777
+ ] }) });
2096
2778
  }
2097
-
2098
- // src/components/LoginButton/index.tsx
2099
- import { useState as useState13 } from "react";
2100
-
2101
- // src/components/LoginPanel/index.tsx
2102
- import { jsx as jsx39, jsxs as jsxs25 } from "react/jsx-runtime";
2103
- function LoginPanel({
2104
- header,
2105
- onClose,
2779
+ var wallets = [
2780
+ new PhantomWalletAdapter(),
2781
+ new SolflareWalletAdapter(),
2782
+ new WalletConnectWalletAdapter({
2783
+ network: WalletAdapterNetwork.Mainnet,
2784
+ options: {
2785
+ relayUrl: "wss://relay.walletconnect.com"
2786
+ }
2787
+ }),
2788
+ new AlphaWalletAdapter(),
2789
+ new AvanaWalletAdapter(),
2790
+ new BitgetWalletAdapter(),
2791
+ new BitpieWalletAdapter(),
2792
+ new CloverWalletAdapter(),
2793
+ new Coin98WalletAdapter(),
2794
+ new CoinbaseWalletAdapter(),
2795
+ new CoinhubWalletAdapter(),
2796
+ new FractalWalletAdapter(),
2797
+ new HuobiWalletAdapter(),
2798
+ new HyperPayWalletAdapter(),
2799
+ new KeystoneWalletAdapter(),
2800
+ new KrystalWalletAdapter(),
2801
+ new LedgerWalletAdapter(),
2802
+ new MathWalletAdapter(),
2803
+ new NekoWalletAdapter(),
2804
+ new NightlyWalletAdapter(),
2805
+ new NufiWalletAdapter(),
2806
+ new OntoWalletAdapter(),
2807
+ new ParticleAdapter(),
2808
+ new SafePalWalletAdapter(),
2809
+ new SaifuWalletAdapter(),
2810
+ new SalmonWalletAdapter(),
2811
+ new SkyWalletAdapter(),
2812
+ new SolongWalletAdapter(),
2813
+ new SpotWalletAdapter(),
2814
+ new TokenaryWalletAdapter(),
2815
+ new TokenPocketWalletAdapter(),
2816
+ new TorusWalletAdapter(),
2817
+ new TrezorWalletAdapter(),
2818
+ new TrustWalletAdapter(),
2819
+ new XDEFIWalletAdapter()
2820
+ ];
2821
+ function SOLModal({
2822
+ type = "login",
2823
+ onSuccess,
2106
2824
  ...props
2107
2825
  }) {
2108
- return /* @__PURE__ */ jsxs25("div", { className: "matchid-login-panel", children: [
2109
- header ? header : /* @__PURE__ */ jsxs25("div", { className: "matchid-login-panel-header", children: [
2110
- /* @__PURE__ */ jsxs25("div", { className: "matchid-login-panel-header-content", children: [
2111
- /* @__PURE__ */ jsx39("div", { className: "matchid-login-panel-header-title", children: "Log in / Sign up" }),
2112
- /* @__PURE__ */ jsx39("div", { className: "matchid-login-panel-header-subtilte", children: "You can use the following methods" })
2113
- ] }),
2114
- onClose && /* @__PURE__ */ jsx39("div", { className: "matchid-login-panel-header-close", onClick: onClose, children: /* @__PURE__ */ jsx39(CloseRoundIcon, {}) })
2115
- ] }),
2116
- /* @__PURE__ */ jsx39("div", { className: "matchid-login-panel-divide" }),
2117
- /* @__PURE__ */ jsx39(LoginBox, { ...props })
2826
+ return /* @__PURE__ */ jsx45(ModalWithHeader, { ...props, title: props.title || firstUpperCase(type + " SOL Wallet"), children: /* @__PURE__ */ jsx45(ConnectionProvider, { endpoint: clusterApiUrl("devnet"), children: /* @__PURE__ */ jsx45(WalletProvider, { wallets, autoConnect: true, children: /* @__PURE__ */ jsx45(WalletModalProvider, { children: /* @__PURE__ */ jsx45(WalletContent2, { onSuccess, type }) }) }) }) });
2827
+ }
2828
+
2829
+ // src/context/BusinessProvider.tsx
2830
+ import { Fragment as Fragment4, jsx as jsx46, jsxs as jsxs33 } from "react/jsx-runtime";
2831
+ function BusinessProvider({ children }) {
2832
+ const { overview, token } = useUserInfo();
2833
+ const { recoveryModal } = useStore_default();
2834
+ const { type: EVMType, isOpen: EVMIsOpen, close: EVMClose } = useEVMModalStore();
2835
+ const { type: SOLType, isOpen: SOLIsOpen, close: SOLClose } = useSOLModalStore();
2836
+ return /* @__PURE__ */ jsxs33(Fragment4, { children: [
2837
+ /* @__PURE__ */ jsx46(PasswordModal, { isOpen: !!token && !!overview && !overview.address && !!overview.did, showClose: false }),
2838
+ /* @__PURE__ */ jsx46(
2839
+ RecoveryModal,
2840
+ {
2841
+ isOpen: !!token && !!overview && !!overview.address && recoveryModal.open,
2842
+ onClose: recoveryModal.close,
2843
+ onSuccess: recoveryModal.success
2844
+ }
2845
+ ),
2846
+ /* @__PURE__ */ jsx46(
2847
+ EVMModal,
2848
+ {
2849
+ isOpen: EVMIsOpen && (EVMType == "login" && !overview && !token || EVMType == "bind" && !!token && !!overview),
2850
+ onClose: EVMClose,
2851
+ type: EVMType,
2852
+ onSuccess: EVMClose,
2853
+ zIndex: 199
2854
+ }
2855
+ ),
2856
+ /* @__PURE__ */ jsx46(
2857
+ SOLModal,
2858
+ {
2859
+ isOpen: SOLIsOpen && (SOLType == "login" && !overview && !token || SOLType == "bind" && !!token && !!overview),
2860
+ onClose: SOLClose,
2861
+ type: SOLType,
2862
+ onSuccess: SOLClose,
2863
+ zIndex: 199
2864
+ }
2865
+ ),
2866
+ children
2118
2867
  ] });
2119
2868
  }
2120
2869
 
2121
- // src/components/LoginModal/index.tsx
2122
- import { jsx as jsx40 } from "react/jsx-runtime";
2123
- function LoginModal({
2124
- isOpen = false,
2125
- width = 480,
2126
- ...props
2870
+ // src/context/index.tsx
2871
+ import { jsx as jsx47 } from "react/jsx-runtime";
2872
+ var Providers = ({ children }) => {
2873
+ return (
2874
+ // <MpcWalletProvider>
2875
+ /* @__PURE__ */ jsx47(BusinessProvider, { children })
2876
+ );
2877
+ };
2878
+ var context_default = Providers;
2879
+
2880
+ // src/hooks/useWalletInit.ts
2881
+ import { useEffect as useEffect11, useState as useState15 } from "react";
2882
+ var AppClientId2 = "react-sdk-" + getVersion();
2883
+ function useWalletInit({
2884
+ refreshOverview
2127
2885
  }) {
2128
- const { isLogin } = useUserInfo();
2129
- return /* @__PURE__ */ jsx40(
2130
- Modal,
2131
- {
2132
- isOpen: isOpen && !isLogin,
2133
- width,
2134
- children: /* @__PURE__ */ jsx40(LoginPanel, { ...props, inModal: true })
2886
+ const { endpoints } = useLocalStore_default();
2887
+ const getWalletIframe = () => {
2888
+ return document.getElementById("match-wallet");
2889
+ };
2890
+ const [walletInited, setWalletInited] = useState15(false);
2891
+ const { appid, token, overview } = useLocalStore_default();
2892
+ const { initWallet, generateWallet } = useWallet();
2893
+ useEffect11(() => {
2894
+ if (endpoints.auth) {
2895
+ if (!window.matchWalletMessageIdMap) {
2896
+ window.matchWalletMessageIdMap = {};
2897
+ }
2898
+ const existingIframe = getWalletIframe();
2899
+ if (!existingIframe) {
2900
+ const iframe = document.createElement("iframe");
2901
+ iframe.id = "match-wallet";
2902
+ iframe.src = endpoints.auth + "wallet";
2903
+ iframe.style.display = "none";
2904
+ iframe.style.width = "0";
2905
+ iframe.style.height = "0";
2906
+ document.body.insertBefore(iframe, document.body.firstChild);
2907
+ window.sendMatchWalletMessage = (method, data) => {
2908
+ const messageId = Date.now().toString() + Math.random().toString().slice(6);
2909
+ const message = {
2910
+ method,
2911
+ data,
2912
+ messageId,
2913
+ source: "matchid"
2914
+ };
2915
+ if (document.getElementById("match-wallet")) {
2916
+ matchlog_default.log("matchid.sdk.sendMatchWalletMessage", message, endpoints.auth);
2917
+ getWalletIframe()?.contentWindow?.postMessage(message, endpoints.auth);
2918
+ return messageId;
2919
+ }
2920
+ console.error("not found iframe");
2921
+ return false;
2922
+ };
2923
+ window.waitMatchUntilWalletMessage = async (method, data, timeout = 3e4) => {
2924
+ return new Promise((resolve, reject) => {
2925
+ const messageId = window.sendMatchWalletMessage(method, data);
2926
+ if (!messageId) {
2927
+ console.error("Can't find wallet message");
2928
+ reject(new Error("Can't find wallet message"));
2929
+ return;
2930
+ }
2931
+ window.matchWalletMessageIdMap[messageId] = { resolve, reject };
2932
+ window.matchWalletMessageIdMap[messageId].timeout = setTimeout(() => {
2933
+ console.error("Get wallet result timeout", {
2934
+ messageId,
2935
+ method,
2936
+ data
2937
+ });
2938
+ delete window.matchWalletMessageIdMap[messageId];
2939
+ reject(new Error("Get wallet result timeout"));
2940
+ }, timeout);
2941
+ });
2942
+ };
2943
+ } else {
2944
+ if (existingIframe.src !== endpoints.auth + "wallet") {
2945
+ setWalletInited(false);
2946
+ existingIframe.src = endpoints.auth + "wallet";
2947
+ }
2948
+ }
2135
2949
  }
2136
- );
2950
+ }, [endpoints.auth]);
2951
+ useEffect11(() => {
2952
+ const messageHandle = async (e) => {
2953
+ if (e.origin !== endpoints.auth.substring(0, endpoints.auth.length - 1)) {
2954
+ return;
2955
+ }
2956
+ const res = e.data;
2957
+ if (res.source != "match-wallet") {
2958
+ return;
2959
+ }
2960
+ matchlog_default.log("sdk.wallet.receive", e);
2961
+ const messageId = res.messageId;
2962
+ if (messageId == "init") {
2963
+ matchlog_default.log("wallet init");
2964
+ setWalletInited(true);
2965
+ return;
2966
+ }
2967
+ if (messageId && window.matchWalletMessageIdMap[messageId]) {
2968
+ const { resolve, reject, timeout } = window.matchWalletMessageIdMap[messageId];
2969
+ delete window.matchWalletMessageIdMap[messageId];
2970
+ clearTimeout(timeout);
2971
+ if (res.status == "success") {
2972
+ resolve(res.data);
2973
+ } else {
2974
+ console.error("qwe-waller-error", res);
2975
+ reject(new Error(res.data.message));
2976
+ }
2977
+ }
2978
+ };
2979
+ window.addEventListener("message", messageHandle);
2980
+ return () => {
2981
+ window.removeEventListener("message", messageHandle);
2982
+ };
2983
+ }, []);
2984
+ useEffect11(() => {
2985
+ if (token && overview && overview.did && walletInited) {
2986
+ const did = overview.did.split(":")[2];
2987
+ const newUserInit = async () => {
2988
+ await window.waitMatchUntilWalletMessage(
2989
+ "initCore",
2990
+ {
2991
+ AppId: appid,
2992
+ AppClientId: AppClientId2,
2993
+ UserId: did,
2994
+ AccessToken: token,
2995
+ Address: ""
2996
+ }
2997
+ );
2998
+ };
2999
+ if (!overview.address) {
3000
+ newUserInit();
3001
+ } else {
3002
+ initWallet({
3003
+ address: overview.address,
3004
+ did
3005
+ });
3006
+ }
3007
+ }
3008
+ }, [overview, token, walletInited]);
3009
+ return {
3010
+ walletInited
3011
+ };
2137
3012
  }
2138
3013
 
2139
- // src/components/UserPopover/index.tsx
2140
- import { useState as useState12 } from "react";
2141
-
2142
- // src/assets/icon/ProfileIcon.tsx
2143
- import { jsx as jsx41, jsxs as jsxs26 } from "react/jsx-runtime";
2144
- function ProfileIcon({ size = 24, color = "black", ...props }) {
2145
- return /* @__PURE__ */ jsxs26("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
2146
- /* @__PURE__ */ jsx41(
2147
- "path",
2148
- {
2149
- fillRule: "evenodd",
2150
- clipRule: "evenodd",
2151
- d: "M7.5 6.75C7.5 4.95507 8.95507 3.5 10.75 3.5C12.5449 3.5 14 4.95507 14 6.75C14 8.54493 12.5449 10 10.75 10C8.95507 10 7.5 8.54493 7.5 6.75ZM10.75 2C8.12665 2 6 4.12665 6 6.75C6 9.37335 8.12665 11.5 10.75 11.5C13.3734 11.5 15.5 9.37335 15.5 6.75C15.5 4.12665 13.3734 2 10.75 2ZM8.75 13C5.57436 13 3 15.5744 3 18.75V19.75C3 20.7165 3.7835 21.5 4.75 21.5H13.6646L13.0292 20.8646C12.7764 20.6118 12.5733 20.3185 12.4263 20H4.75C4.61193 20 4.5 19.8881 4.5 19.75V18.75C4.5 16.4028 6.40279 14.5 8.75 14.5H12.6452C13.0508 13.8858 13.676 13.4295 14.4091 13.243C13.8838 13.0849 13.3268 13 12.75 13H8.75Z",
2152
- fill: color
3014
+ // src/hooks/useInit.tsx
3015
+ import { useEffect as useEffect12, useRef as useRef2 } from "react";
3016
+ function useInit({
3017
+ theme,
3018
+ appid,
3019
+ events,
3020
+ endpoints
3021
+ }) {
3022
+ const {
3023
+ setAppid,
3024
+ setEndpoints,
3025
+ setToken,
3026
+ setMid,
3027
+ token,
3028
+ setOverview,
3029
+ setTheme
3030
+ } = useLocalStore_default();
3031
+ const overviewLoadingRef = useRef2(false);
3032
+ const searchParams = new URLSearchParams(window.location.search);
3033
+ const matchToken = searchParams.get("matchToken");
3034
+ const realEndpoints = endpoints || env_default.endpoints;
3035
+ useEffect12(() => {
3036
+ setTheme(theme);
3037
+ }, [theme]);
3038
+ useEffect12(() => {
3039
+ setAppid(appid);
3040
+ }, [appid]);
3041
+ useEffect12(() => {
3042
+ setEndpoints(realEndpoints);
3043
+ }, [realEndpoints]);
3044
+ useEffect12(() => {
3045
+ if (matchToken) {
3046
+ const tokenData = JSON.parse(atob(matchToken));
3047
+ if (tokenData && tokenData.mid && tokenData.token) {
3048
+ login({
3049
+ mid: tokenData.mid,
3050
+ token: "Bearer " + tokenData.token
3051
+ });
2153
3052
  }
2154
- ),
2155
- /* @__PURE__ */ jsx41(
2156
- "path",
2157
- {
2158
- fillRule: "evenodd",
2159
- clipRule: "evenodd",
2160
- d: "M19.0677 22.4771L21.4771 20.0677C21.841 19.7038 21.841 19.1139 21.4771 18.75L17.75 15.0229C17.5753 14.8482 17.3383 14.75 17.0911 14.75H14.6818C14.1672 14.75 13.75 15.1672 13.75 15.6818V18.0911C13.75 18.3383 13.8482 18.5753 14.0229 18.75L17.75 22.4771C18.1139 22.841 18.7038 22.841 19.0677 22.4771ZM15.6135 17.3124C15.9995 17.3124 16.3124 16.9995 16.3124 16.6135C16.3124 16.2276 15.9995 15.9147 15.6135 15.9147C15.2276 15.9147 14.9147 16.2276 14.9147 16.6135C14.9147 16.9995 15.2276 17.3124 15.6135 17.3124Z",
2161
- fill: color
3053
+ }
3054
+ }, [matchToken]);
3055
+ useEffect12(() => {
3056
+ const onLoginMessage = (event) => {
3057
+ const res = event.data;
3058
+ if (res.event === "login" && res.data && (res.data.token || res.data.token_type && res.data.access_token)) {
3059
+ login({
3060
+ mid: res.data.mid,
3061
+ token: res.data.token || `${res.data.token_type} ${res.data.access_token}`
3062
+ });
3063
+ } else if (res.event == "bind") {
3064
+ eventManager_default.emit("onBind", res.data);
3065
+ if (events && events.onBind) {
3066
+ events.onBind(res.data);
3067
+ }
2162
3068
  }
2163
- )
2164
- ] });
2165
- }
2166
-
2167
- // src/components/UserPopover/index.tsx
2168
- import { jsx as jsx42, jsxs as jsxs27 } from "react/jsx-runtime";
2169
- function UserContent() {
2170
- const { logout, address, username } = useUserInfo();
2171
- const [logouting, setLogouting] = useState12(false);
2172
- const onLogout = async () => {
2173
- if (logouting) return;
3069
+ };
3070
+ window.addEventListener("message", onLoginMessage);
3071
+ return () => {
3072
+ window.removeEventListener("message", onLoginMessage);
3073
+ };
3074
+ }, []);
3075
+ const loadOverview = async () => {
3076
+ matchlog_default.log("loadOverview");
3077
+ if (overviewLoadingRef.current) {
3078
+ return;
3079
+ }
3080
+ overviewLoadingRef.current = true;
2174
3081
  try {
2175
- setLogouting(true);
2176
- await logout();
2177
- } catch (error) {
2178
- console.error(error);
3082
+ const res = await getOverviewInfoApi();
3083
+ setOverview(res.data);
3084
+ return res.data;
3085
+ } catch (err) {
3086
+ console.error("overview error", err);
2179
3087
  } finally {
2180
- setLogouting(false);
3088
+ overviewLoadingRef.current = false;
2181
3089
  }
2182
3090
  };
2183
- const UserItem = ({
2184
- children,
2185
- icon,
2186
- rightIcon,
2187
- onClick
2188
- }) => {
2189
- return /* @__PURE__ */ jsxs27("div", { className: "matchid-user-popover-item", onClick, children: [
2190
- /* @__PURE__ */ jsxs27("div", { className: `matchid-user-popover-item-content`, children: [
2191
- icon,
2192
- /* @__PURE__ */ jsx42("div", { className: "matchid-user-popover-item-text", children })
2193
- ] }),
2194
- rightIcon
2195
- ] });
3091
+ useEffect12(() => {
3092
+ if (token) {
3093
+ loadOverview();
3094
+ }
3095
+ }, [token]);
3096
+ const login = async ({ mid, token: token2 }) => {
3097
+ setMid(mid);
3098
+ setToken(token2);
3099
+ const overview = await loadOverview();
3100
+ eventManager_default.emit("onLogin", {
3101
+ mid,
3102
+ token: token2,
3103
+ did: overview?.did
3104
+ });
3105
+ if (events && events?.onLogin) {
3106
+ events.onLogin({
3107
+ mid,
3108
+ token: token2,
3109
+ did: overview?.did
3110
+ });
3111
+ }
2196
3112
  };
2197
- const UserDivider = () => {
2198
- return /* @__PURE__ */ jsx42("div", { className: `matchid-user-popover-divider` });
3113
+ return {
3114
+ loadOverview,
3115
+ login,
3116
+ endpoints: realEndpoints
2199
3117
  };
2200
- const [usernameOpen, setUsernameOpen] = useState12(false);
2201
- const [copied, setCopied] = useCopyClipboard();
2202
- return /* @__PURE__ */ jsxs27("div", { className: "matchid-user-popover-content", children: [
2203
- /* @__PURE__ */ jsxs27("div", { className: "matchid-user-popover-list", children: [
2204
- /* @__PURE__ */ jsx42(UserItem, { onClick: () => {
2205
- setCopied(address);
2206
- }, icon: copied ? /* @__PURE__ */ jsx42(CheckIcon, { size: 20, color: "#0ecb81" }) : /* @__PURE__ */ jsx42(CopyIcon, { size: 20, color: "var(--icon-color)" }), rightIcon: /* @__PURE__ */ jsx42(CheckIcon, { size: 20, color: "var(--icon-color)" }), children: truncateAddress(address) }),
2207
- /* @__PURE__ */ jsx42(UserDivider, {}),
2208
- /* @__PURE__ */ jsx42(UserItem, { onClick: () => {
2209
- setUsernameOpen(true);
2210
- }, icon: /* @__PURE__ */ jsx42(ProfileIcon, { size: 20, color: "var(--icon-color)" }), rightIcon: /* @__PURE__ */ jsx42(ArrowRightIcon, { size: 20, color: "var(--icon-color)" }), children: username || "Set a username" })
2211
- ] }),
2212
- /* @__PURE__ */ jsx42(Button, { onClick: onLogout, loading: logouting, children: "Disconnect" }),
2213
- /* @__PURE__ */ jsx42(UsernameModal, { isOpen: usernameOpen, onClose: () => {
2214
- setUsernameOpen(false);
2215
- }, onSuccess: () => {
2216
- setUsernameOpen(false);
2217
- } })
2218
- ] });
2219
- }
2220
- function UserPopover({
2221
- children,
2222
- ...props
2223
- }) {
2224
- return /* @__PURE__ */ jsx42(Popover, { ...props, content: /* @__PURE__ */ jsx42(UserContent, {}), children });
2225
3118
  }
2226
3119
 
2227
- // src/components/LoginButton/index.tsx
2228
- import { Fragment as Fragment4, jsx as jsx43, jsxs as jsxs28 } from "react/jsx-runtime";
2229
- function LoginButton({
2230
- loginRender,
2231
- methods,
2232
- onLoginClick,
2233
- popoverPosition = "right",
2234
- popoverType = "hover",
2235
- popoverGap = 20,
2236
- ...props
2237
- }) {
2238
- const { isLogin, username } = useUserInfo();
2239
- const [loginOpen, setLoginOpen] = useState13(false);
2240
- if (!isLogin) {
2241
- return /* @__PURE__ */ jsxs28(Fragment4, { children: [
2242
- /* @__PURE__ */ jsx43(LoginModal, { methods, isOpen: loginOpen, onClose: () => setLoginOpen(false) }),
2243
- /* @__PURE__ */ jsxs28(Button, { className: "matchid-unlogin-btn", ...props, highlight: true, onClick: () => setLoginOpen(true), children: [
2244
- /* @__PURE__ */ jsx43(UnLoginIcon_default, {}),
2245
- /* @__PURE__ */ jsx43("span", { children: "Login" })
2246
- ] })
2247
- ] });
3120
+ // src/MatchContext.tsx
3121
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3122
+ import { jsx as jsx48 } from "react/jsx-runtime";
3123
+ var queryClient = new QueryClient();
3124
+ var MatchContext = createContext(void 0);
3125
+ var MatchProvider = ({ children, appid, events, theme = "light", endpoints }) => {
3126
+ const { loadOverview, login, endpoints: realEndPoints } = useInit({
3127
+ theme,
3128
+ appid,
3129
+ events,
3130
+ endpoints
3131
+ });
3132
+ useWalletInit({
3133
+ refreshOverview: loadOverview
3134
+ });
3135
+ return /* @__PURE__ */ jsx48(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx48(
3136
+ MatchContext.Provider,
3137
+ {
3138
+ value: {
3139
+ appid,
3140
+ endpoints: realEndPoints,
3141
+ events,
3142
+ login,
3143
+ theme
3144
+ },
3145
+ children: /* @__PURE__ */ jsx48(context_default, { children })
3146
+ }
3147
+ ) });
3148
+ };
3149
+ var useMatch = () => {
3150
+ const context = useContext(MatchContext);
3151
+ if (context === void 0) {
3152
+ throw new Error("useMatch must be used within a MatchProvider");
2248
3153
  }
2249
- return loginRender ? { loginRender } : /* @__PURE__ */ jsx43(UserPopover, { position: popoverPosition, type: popoverType, gap: popoverGap, children: /* @__PURE__ */ jsxs28(Button, { onClick: onLoginClick, className: "matchid-login-btn", ...props, children: [
2250
- /* @__PURE__ */ jsx43(LoginIcon_default, {}),
2251
- /* @__PURE__ */ jsx43("span", { children: username ? truncateAddress(username) : "MatchID User" })
2252
- ] }) });
2253
- }
2254
-
2255
- // src/components/UsernameModal/index.tsx
2256
- import { useEffect as useEffect11, useMemo as useMemo7, useState as useState14 } from "react";
2257
-
2258
- // src/assets/icon/InfoRoundIcon.tsx
2259
- import { jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
2260
- function InfoRoundIcon({
2261
- size,
2262
- color = "#6E6E6E",
2263
- ...props
2264
- }) {
2265
- return /* @__PURE__ */ jsxs29("svg", { width: size, height: size, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: [
2266
- /* @__PURE__ */ jsx44("g", { clipPath: "url(#clip0_418_7746)", children: /* @__PURE__ */ jsx44(
2267
- "path",
2268
- {
2269
- fillRule: "evenodd",
2270
- clipRule: "evenodd",
2271
- d: "M7.99984 0.666504C3.94975 0.666504 0.666504 3.94975 0.666504 7.99984C0.666504 12.0499 3.94975 15.3332 7.99984 15.3332C12.0499 15.3332 15.3332 12.0499 15.3332 7.99984C15.3332 3.94975 12.0499 0.666504 7.99984 0.666504ZM1.99984 7.99984C1.99984 4.68613 4.68613 1.99984 7.99984 1.99984C11.3135 1.99984 13.9998 4.68613 13.9998 7.99984C13.9998 11.3135 11.3135 13.9998 7.99984 13.9998C4.68613 13.9998 1.99984 11.3135 1.99984 7.99984ZM8.6665 7.33317C8.6665 6.96498 8.36803 6.6665 7.99984 6.6665C7.63165 6.6665 7.33317 6.96498 7.33317 7.33317V11.3332C7.33317 11.7014 7.63165 11.9998 7.99984 11.9998C8.36803 11.9998 8.6665 11.7014 8.6665 11.3332V7.33317ZM7.99984 5.33317C8.36803 5.33317 8.6665 5.03469 8.6665 4.6665C8.6665 4.29831 8.36803 3.99984 7.99984 3.99984C7.63165 3.99984 7.33317 4.29831 7.33317 4.6665C7.33317 5.03469 7.63165 5.33317 7.99984 5.33317Z",
2272
- fill: color
2273
- }
2274
- ) }),
2275
- /* @__PURE__ */ jsx44("defs", { children: /* @__PURE__ */ jsx44("clipPath", { id: "clip0_418_7746", children: /* @__PURE__ */ jsx44("rect", { width: "16", height: "16", fill: "white" }) }) })
2276
- ] });
2277
- }
2278
-
2279
- // src/components/UsernameModal/index.tsx
2280
- import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
2281
- var ValidItem = ({
2282
- success = false,
2283
- text
2284
- }) => {
2285
- return /* @__PURE__ */ jsxs30("div", { className: `matchid-valid-status-item matchid-valid-status-${success ? "success" : "error"}`, children: [
2286
- success ? /* @__PURE__ */ jsx45(CheckRoundIcon, { size: 16 }) : /* @__PURE__ */ jsx45(InfoRoundIcon, { size: 16 }),
2287
- /* @__PURE__ */ jsx45("span", { children: text })
2288
- ] });
3154
+ return context;
2289
3155
  };
2290
- function UsernameModal({
2291
- title,
2292
- isOpen,
2293
- onSuccess,
2294
- ...props
2295
- }) {
2296
- const { username, refreshOverview } = useUserInfo();
2297
- const { isLogin } = useUserInfo();
2298
- const [val, setVal] = useState14(username);
2299
- const [error, setError] = useState14("");
2300
- useEffect11(() => {
2301
- if (isOpen) {
2302
- setVal(username);
2303
- setError("");
2304
- }
2305
- }, [isOpen]);
2306
- const isValid = useMemo7(() => {
2307
- return isValidUsername(val);
2308
- }, [val]);
2309
- const isLength = useMemo7(() => {
2310
- return val.length >= 2 && val.length <= 32;
2311
- }, [val]);
2312
- const isSafe = isValid && isLength;
2313
- const [isSubmitting, setIsSubmitting] = useState14(false);
2314
- const onSubmit = async () => {
2315
- if (isSubmitting) return;
2316
- try {
2317
- setIsSubmitting(true);
2318
- const res = await setUserNameApi({
2319
- username: val
2320
- });
2321
- if (isSuccess(res)) {
2322
- await refreshOverview();
2323
- onSuccess && onSuccess();
2324
- } else {
2325
- setError(res.message);
2326
- }
2327
- } catch (error2) {
2328
- setError(error2.message);
2329
- } finally {
2330
- setIsSubmitting(false);
2331
- }
2332
- };
2333
- return /* @__PURE__ */ jsx45(ModalWithHeader, { isOpen: isOpen && isLogin, ...props, title: title || (username ? "Edit User Name" : "Set User Name"), children: /* @__PURE__ */ jsxs30("div", { className: "matchid-username-box", children: [
2334
- /* @__PURE__ */ jsx45(Field, { label: "User Name", error, children: /* @__PURE__ */ jsx45(
2335
- Input,
2336
- {
2337
- placeholder: "Enter Your User Name",
2338
- onChange: (e) => {
2339
- setVal(e.target.value);
2340
- setError("");
2341
- },
2342
- value: val
2343
- }
2344
- ) }),
2345
- /* @__PURE__ */ jsxs30("div", { className: "matchid-valid", children: [
2346
- /* @__PURE__ */ jsx45(
2347
- ValidItem,
2348
- {
2349
- success: isValid,
2350
- text: "Name can be composed of numbers and letters as well as characters"
2351
- }
2352
- ),
2353
- /* @__PURE__ */ jsx45(ValidItem, { success: isLength, text: "No less than 2 characters" })
2354
- ] }),
2355
- /* @__PURE__ */ jsx45(Button, { disabled: !isSafe, loading: isSubmitting, style: {
2356
- marginTop: "64px"
2357
- }, onClick: onSubmit, size: "lg", block: true, highlight: true, children: "Confirm" }),
2358
- /* @__PURE__ */ jsx45(Button, { style: {
2359
- marginTop: "24px"
2360
- }, onClick: props.onClose, size: "lg", block: true, children: "Next Time" })
2361
- ] }) });
2362
- }
2363
3156
 
2364
3157
  // src/hooks/api/index.ts
2365
3158
  var api_exports = {};