@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.css +35 -0
- package/dist/index.d.mts +13 -6
- package/dist/index.d.ts +13 -6
- package/dist/index.js +1627 -876
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1664 -871
- package/dist/index.mjs.map +1 -1
- package/example/src/config/index.ts +2 -1
- package/example/src/pages/User.tsx +1 -1
- package/package.json +8 -2
package/dist/index.mjs
CHANGED
|
@@ -370,8 +370,8 @@ function GithubIcon({
|
|
|
370
370
|
/* @__PURE__ */ jsx21(
|
|
371
371
|
"path",
|
|
372
372
|
{
|
|
373
|
-
|
|
374
|
-
|
|
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
|
|
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__ */
|
|
508
|
+
return isOpen ? /* @__PURE__ */ jsx26(
|
|
490
509
|
"div",
|
|
491
510
|
{
|
|
492
511
|
className: "matchid-overlay",
|
|
493
|
-
|
|
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__ */
|
|
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__ */
|
|
509
|
-
/* @__PURE__ */
|
|
510
|
-
/* @__PURE__ */
|
|
511
|
-
onBack && /* @__PURE__ */
|
|
512
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
535
|
-
/* @__PURE__ */
|
|
536
|
-
props.value.length > 0 && /* @__PURE__ */
|
|
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__ */
|
|
563
|
+
type === "password" && /* @__PURE__ */ jsx27("div", { className: "matchid-input-eye-icon", onClick: () => {
|
|
542
564
|
setInputType(inputType === "password" ? "text" : "password");
|
|
543
|
-
}, children: inputType === "password" ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
558
|
-
/* @__PURE__ */
|
|
559
|
-
required && /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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 "
|
|
990
|
-
return
|
|
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
|
-
|
|
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 "
|
|
1074
|
-
return
|
|
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
|
|
1139
|
-
var useStore =
|
|
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
|
|
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__ */
|
|
1354
|
-
/* @__PURE__ */
|
|
1355
|
-
/* @__PURE__ */
|
|
1356
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1359
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1434
|
-
/* @__PURE__ */
|
|
1435
|
-
/* @__PURE__ */
|
|
1436
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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/
|
|
1464
|
-
import {
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
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
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1806
|
+
placeholder: "Enter Your Email Address",
|
|
1807
|
+
onChange: (e) => setEmailVal(e.target.value),
|
|
1808
|
+
value: emailVal
|
|
1476
1809
|
}
|
|
1477
|
-
),
|
|
1478
|
-
|
|
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/
|
|
1483
|
-
import {
|
|
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/
|
|
1493
|
-
|
|
1494
|
-
var
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
}
|
|
1498
|
-
|
|
1499
|
-
const
|
|
1500
|
-
|
|
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
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
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
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
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
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
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/
|
|
1627
|
-
import {
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
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
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
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
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
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
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
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
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
console.error("overview error", err);
|
|
2176
|
+
setLogouting(true);
|
|
2177
|
+
await logout();
|
|
2178
|
+
} catch (error) {
|
|
2179
|
+
console.error(error);
|
|
1699
2180
|
} finally {
|
|
1700
|
-
|
|
2181
|
+
setLogouting(false);
|
|
1701
2182
|
}
|
|
1702
2183
|
};
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
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
|
-
|
|
1726
|
-
|
|
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/
|
|
1733
|
-
import {
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
});
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
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
|
|
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
|
-
|
|
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/
|
|
1788
|
-
import {
|
|
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/
|
|
1791
|
-
import {
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
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 (
|
|
1797
|
-
|
|
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__ */
|
|
1807
|
-
/* @__PURE__ */
|
|
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
|
|
1811
|
-
onChange: (e) =>
|
|
1812
|
-
|
|
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__ */
|
|
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:
|
|
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/
|
|
1822
|
-
import
|
|
1823
|
-
|
|
1824
|
-
// src/
|
|
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
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
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,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAABHlUlEQVR4Xu19i3NUVbb3mYc6M3pHxhkHEZAAioIIAcQHz+adhARDeMn7GAnPhDR5P+mGJCSGRwLyEFA7gshVx0p9OOotxqljOeVY937fra6acQYFsXkaHcfqP2F/+3fIijub053unA4grF/Vqu50n7P37pO91l6vvbZhMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMG4oNDU1Jaenp3uKioqaCgoKxMqVK8WsWbOEx+PpoKlTpwp5jcjLyxN1dXVi+vTpnrVr13rkvUl6ewwG4waHZVlJR44cMSVjmwsXLgyOGjVK9OnTR/zyl78UP//5z4W85Cr66U9/an//61//WjzyyCMiJSVFzJ49O5CdnW1+8MEHHrV9BoNxA0Myfeszzzwj7r//fpupwdw/+clP7FeQ4SAAiHAdvd55553i0UcfFevXrw83NjYG3n33XU9HJwwG48bC3r17vZmZmdbvf/97cfvtt9tMHIkMB+Z3ImgM0B7GjRsnNmzYEJSCIJn6YzAYNwCOHj3qmZM5p2nw4MGOKr7O/KoQ0IWB/jcR2oV5MH7CeCGFDAsBBuNGwPvvv59ZXl4uBg0aJH72s585MrDO8LGQ3gYRBMHTTz8dWrJkidna2pp0ZRQMBuOaQzKgKdXy0G9/+1tx2223XcWsRDpzd8Xk0QhCplevXmLs2LGioaHBYiHAYFwHwCFXUVERTkpKisjM6uc684ORf/WrX3U4CeEz6MpBSEQRgylTpoj9+/cHDQaDce3wyiuveFetWmWvxJGYH4TvwKy/+MUvxO9+9zuo7nDmBRcvXmzl5eVZfr/fqq6utkzTtFJTU60xY8aERo4cKe6++25bo4gmQOg7mB4QAu+99x77BRiMngZs/o0bN4revXvbq7jhwPREYP777rtPTJ48GTZ74MiRI4FojHr8+HGzqakpMGvWLOvxxx8Xd911V0cI0YnkLbZPAMlEjY2N1gcffJCkt8lgMBKEEydOmJL5Q/fcc48j84PAsGBKqOhYzeWK73/55ZczOzXUBaQQ6FVcXGympKRYgwcPuorxVQEAgoYhtQdRX1/PQoDB6AlYlmXb/A8++OBVDKgTGBIr+Pr165u9Xm8vtZ14IO9NlqZG8N57f3cV86v94z0EDjSBffv2sU+AwUgkAoGAd926dbbaf8cdd1zFhFj1SSOA2i7V/TCSgvR2uouampogBIqeXGQoAoD+hk9g9+7dwdbW1oimBoPBiBHvvvtuZm5urp2NB8ecbpMbysoP5p85c6aQAsOnNeMKx48fT6qqqrJGjBjRSQAZ7f3SmPAe3z/xxBNi27ZtbA4wGG5w8uRJU6rxIaT2UpKPTkb7Cvwf//EfYu7cuWLLli1+vZ1EQAqVpPLycguRBN3/oI8JPghsQGLHIIPRTSDOX1lZGX744Yc7rfqGxnD4Gzb/tGnTRFNTU7Nk1G7b/F3h0KFDybW1tcF77723kwAA6UIAOQaTJ09mnwCDES9g82/YsEEgwy9Scg6YDN+B0RYsWBBGbkCnRnoQUsuwtxhD8BgRBAB9jkSlvXv3cp4AgxEr8vPzbZtfV7VVApNB7cfKf/ToUZ96f0/jwIEDSaWlpbZPAI5Bw0EAEOE3wIHI5gCD0QVg82dmZgaQvBNp5afPsVcfe/6rqqr8ShPXDKgWVFRUZD322GNXMb2uCcAxCN/Brl27WAgwGE6AzV9dXR1+6KGHIjI/MRVW3QkTJvS4zd8V4BPw+XwdPgE4/3RnJT7HKyIUnCfAYDjgjTfe8CK99ze/+U1E5icC8y9atCgMP4HSxHWF1EI6fAI686uEMOYDDzxgCwH2CTAYEm+++Wam1+sVffv2tZnfSQAQQ8Hhh1XUrc2PuL604828vDxTah2m/NujXxMP4BPIz8+3kKXoNH6VoCWgutD27dvZHGDc2pAMYO/nhwqt777TCTZ/RkZGQmz+lStXtqIyMOx3OOjmz58fRvFP/bp4ACEgBZk1ZMiQqL8DBC0G9QR27NjBQoBxa+Ltt9/2lJeXhwcOHNglw0C1njhxIjzprm3+xYsXNw0YMMB2zIEgeFDqKzk5OTRv3ry4Ng3pgE+gsrIy2L9//6i/ibQZ5AlwPQHGLYf//M//9G7atMneo++kMpPKT3F+yZjhPXv2uLL5MzMze2HPP/qEGq6m74LwmRQCQl7jqh+gtLTU3jvgVKWIfhde8T32Dhw8eDB48uRJ9gkwbn4gt5/i/JRXb0RgEnjOcWiHVK99nVuJD88++2ySVPkD0DZUR52h9QuGHDp0KEwCT6cG4gT5BJDFSFEBEnT0noQAaPz48aK5uZnNAcbNjffee6+jhp/Tyk9EKjJO66moqPArTXQLUoi0wslIK7/h0CcRGHb06NFhqTGYP7QQP7B3AEJg6NBHOq36OslLO3wCnCfAuGmBOD9sfpTujsSExBBgVDBEImx+uZo3QduIFGFwIgifYcOGufYJ4FgymAMwO4z236cTPidTBzUGX331VfYJMG4uvP76697169cLVPLRmZCYAITvUFhjzpw5Yck8rmxxsvmRi6/u4zccGF4lug6aAI4Imz59uqtxAEVFRUFEHKjwqC4EiGASIb0YjkH2CTBuCqCGHxx+KOahMn+kVRBx/t27d/u0ZuICbP4ZM2YEoPZHOisgEqljwr3wCcj2PFda7h6QNrxu3bqOPAGd8dXxUZbj3r17rU8//TRJa4rB+PEAcX6v1xuCCq5Ocv09mAJxfsTm5Wrp79RINwCbv1+/fhEZP9rnOrXv7Q9nZWWZ7c13C/X19UnLly+3hgx56Cqm1wlCAIIQdQmVJhiMHw9oPz9WPTAR1Fs1T95QJjy+g81fV1fXjIKcWlNxYeHChU1Q+3VTQyX0j7Gg0AgiDernTgTNRKrwIdm2K5+AZOhkrzc/iF2MhsO4iNAn0qKnTJkSXLJkCZsCjB8XEOdHbj95+2klVdVfo32yg7kyMjISYvPLdqxYVn4w4Pjx48OvvvqqJYWUhVOE6UxBnfmJECJEvr/sx9U4gcLCwiAyBiOFQYkgnJ577jlhWRYLAYZ7nDla5rlwrMLUP08k/vrXv2aWlJTY9fgNjfl0AvNjP/8LL7zg05qJC7D509LSAsjwAyNHYioIIDAyDgCR6rhJ9y9atMhCjgDVH1DHSEILn+N7OPPc+gRgDsAnMGzYMMdkIZXwHF9//XVLuZ3BiA+XWzYE/uafHPhn7ezQPxqyxBc7FwQuHFlv6te5BfbzSzU3hEnblfMNzA+b3+v1+pUmuoXU1NRWhBcjFRAhRgazoWDnsmXLOqnypmn2kit7CwSIk5NONSfwXgoQ13kCEAI5OTkWdgcaDmMmwpil6RF+6623zB/uZjBixPfvVDZ9tT1FnC4bKc6WDBOni4aKs/6x4txLz4b+/W6VK5tWxaeffuppaGgIQ7V1UvVB+BsrNJxcYESfz+fa5l+5cmUTVPjbbo++ktrOvNGjsJXYUYWXQgBaRCvaMrQxq4TPILweffRR1z6Burq65Oeffz4YLTsR30G4FRQUBDrfzWDEgKA/1TpTOkKEyoaI86WDxfmKwSJUMkR8VvW0+N+6DFO/vjs4fPiwR07Qjv38+mRWGQh2b0ZGeliq/Y6MGCtg80uyc/udGIcIjA9bGja/XPk9ShOOkIKg2akcmS4E8D32DmRkZLj6HUD6nPQgtCYSBIY2fgicrKwscejQIbPznQxGFzhVPsU6X/KwuFg+SFysGCAuVw0Q31QOFmcqR4izexYEwq0+VyuwZVmZjz/+uJ/280fy9ONvTOSnnnrKtc1vrjWTUDoM3n4nRqX3kWz+rjB79mwL5oDatioAVCEgNQHXPoGioiKPNGNs56RT9AKCAf3E8xsYDBunK8daF0oGi7bNSeIbf5J8HSjaKh8QoYqh4vIhU3z3dpVHvydW/PnPfzbLyspCtgrevp9fJ6OdEbHyJ8rmT89IbyUvuqExiyoA8D022uTm5salqsMnMGfOnBbs1IsmBED4XgrA8JIlS0ytmZjR2traS46xpX//fo4CgEKWmzZt4r0CjPhweuuT1sXqB8V3dQ+I72pBUgPYmiS+8o1wJQD+9Kc/eWpra8PwZOtMoQsArPxgxIqKCtc2f3Z2dhNt7FGZnYg+g0DCltylS5d2S0WHTwDORWgCRhQBgM8pT0B3LsaDrVu3mqh5oGs0IPSDPlavXo2dkZ5ONzIY0fCZ32NdqBwiV/8B4t/1A8T32weKb2sGSgGQLD6r9pj69bEgEAh45GRtwqqEFYuYkUj1A8DhN2PGjLCc4N1iRAJWZYTrsCobGoOoRAU+YPOvWrXK80ML3cPixYub9fCiLgBAYFycEBzJyRgLxo4d24LcCcPhd6F/CDRp+njUexiMqPi8aop1ruQRcbFSMn/DQFsAXN48SJyuelz8rTrF1K/vCrD5S0tLBRJu9NWKmIL8AHf84g7x9Lin3dv85hWbH5tzsBIaDgxCBHt5xIgRIXmP+UML7gBnY6Q8AVUoIJ0Z9f66K3ikedQSLSyIiskTJkzwKLcwGNERan7OOls6WpwvGiLa/EniX1v6i/MVD4rPN08Qn9UvMPXro+GTTz5BEU07zu9kqxJhtQIzYHvrxo0b/UoT3QKp4rrAISJGxE7CJ598EhWEuq2KO4HyBCjFWBcAKsHvMH369HB9fb2pt9MV3njjjRaERw2H3wiCr2X48OEe5RYGIzouHfImf751tviicJQ4KzWBMxVDxanKsVL9n/lRyJcZlz2OFWrkyJE2I0ZiRhCYAOowbH6fz12UAXF+rIq6wFFXX3wHUwMqslTZu62CRwO0EMnYdp6AzvQqyUtth11KSkpAb6MrfPjhhy3yvqueJxHCrLt27eJ6ATcrQsfLkv7etMzzf2vSPcH6TE8okOsJuQzTARACX+1aaf2tNtP6f7UZ1qXD+U36NdHQ2trqLS4utlcg1d43HCYpGFGu/OHa2lpXjCiFjW3zQ+3XmV8ljAPhM+yeq6urM5UmegRz5861dKbXBQA0kaVLlyKH39Tv7wqjRo2yDIffCYJvY//+/XjPuNnQFjCTQodWWv94YY74e/Vk8Y+tM0ToRVNcfNnbrF97LYHc/rKyso66/UY70zkJADA/VHDJiL5OjcSJtWvXJknmt2v40SadSARtY/To0aGdO3cGkI34QyuJh9QCPJMmTQpGMwPkZbafYs6cOSEpADx6G9GA66XmhBX+qt8JggA4cOAA3jNuJvzrrZzktlfnW6GGp8XZ0qHiYvEgcb5wsAhVjJHqeoq4dDDP1WrqBpIZLdj8+kRXJzxewYhYhQsKCvx6G/HimWeeaQXzUyUfQ2MEfAYTBH0isej5559PqM3vBDj2JPPb9QxpF59KahIUHKQQYHobXeHkyZMt2BxlODA/CALg4MGDLABuNoQOz/ec3zNTtNUMFZfKB4ivC/uKy5v6iIsFA8XZjY+Js9uywhePuz8QI15kZWZ6hwwZEtYnu8r8IDAqfANbtmxxHeeXjNaxn59WWkNjBDAaNAOk4s6fP7/HhSP25EuzJgTHJjG7/iwoHAqaPn16EFqM3k5XOHr0aAsOETUcmB+EFOUNGzb0+O9lXGOcakr3nGmcJC5XDxJtZfeLy+X9xeXiPuLr4vvF1wX9xLnSEeLs9rniy1cSv4PPCXDcrVmzuumBpP7iJz+9mvFVAQDmnzlrpus4P2z+Z599NuruOOoTuf1jx44Nuy3fHQvA/PDMw65XhZH+LCAAoB3IlR/fdwuSuVv0zUgqIR04JSXFo9zCuBlw5sCzni93pYpQ+cOS8R8Ql0sklT4gvq7oL9qK+onLRVITqEgW/2jICISaTFcrbCyAGj9+wvhOxTRVpqcVEDF3qOCJsvnB/E6pt/Q3+u1Obn93gHp88jmYTz75ZBDMr2ce6szfq1cvxOitY8eOBfS2YgFSfKX6b0WrFgQTq7s5BowbGKGA2etU09yWU5VjxLmCJHFZrvqX5erfVtFXagT9RFuJNAfKB4pTdR7x9+09nwmWnj7bXmVVVddQJiKF3aRNLNavX+/vfHf8yMrKaoXaHy3bjt4j1Ocm5TYWoALPSy+9ZIHh8BzUsejjgsCCai6v/QiFSfS2YgXyBiBM9YgH9YVnY5omjkT3dL6TcVPgVFNK0uf+ia2h0sek7d9fqv99pACQQkCaA20lfcU3lf3E6W1PSQEw3aPfm0hs3epruvf394rb77jNntyqEMAkJFsX6mhpaanrOP+6deuakN6rRxhUJgNhLI+NeEy8uPdF/N2jeO2114IzZsywk5nIsedEGDMcc+np6UHkCejtxAocFS5NqBDyB9TfDCItDDkAUvA1Y+OQdjvjZkJoR6Z1pnK4uFA+SFzePFhcKh4gLhYlia+3PCzO7ZklQgd6zu4tKytLGjlyZPBnP7+S6EMCAETv20N9Ycn4rm3+pUuX2ttuDYcVTxUAYETk9iMM16mRBANq+KFDh+x6fU6OPpVo5Z81a5brxJxVq1d5k0clX7X6E+FzOFkrKnq2nBvjBsD371R6T9V4rLObx4hQxaPiXPFD4lz5MPFl3Vjx1UsLrEvH1ifr9yQKkiHtslg/+/kVhlcFAFZ92N8IcUk71KffGw9g80t1OYCz8/SaeDqj4bOhw4ZiG3GgcyuJBZgfx3XDrDGUsTgJAjwXHGkutQRLCiVX/4+DBw9mzpkzJ2ItAPSH75BXcPToUU+nmxk3J0JNmb1O78hsOVMzXZzdOkmcaUgVXzYt/Ahmgn5tovDiiy96Jk+eHCJvtz7hwaiovoONQPq98WLevHmtKBdONQSMCMxP3yEPQa60oZycnMB//dd/JVwQSLU6uba21kL6MhybRhcCCSW65s+f/5EUSkmdGooTqPO3YsUKO7xoaIxPhGePLddSO0v472bcwAgdWJt0pj7dc2Z7uudU03xP2wF3k60rwOONY6n0FY9WfyrosXPnTleqf15eXsd+fkOb7MRgOtNhDHfedad9lDYODJVCKK5U5q7Q2NgYRKhPF0ggdRxgxrvvvlusXLkyCHOpcyvxQQodT3Fxcbir7c3od9q0aUGcLvTD3QxGAgHHklT/m+Bo0hkPkx7MD9V/omeiqd8bK7CjDnF+2lsfyblmKExH70kI4T1eoRLj+CzZph/t6n3FCpzgu23btmD//v07GJwEoKEwIPWPZ4Ainno78eLw4cNeaUbZGpWT2k+E7yAgjhw5klCBx2B0AqrMSLvcTnZRNQC8pwIbs2enIQRl6vfGAtj8WVlZHTX8qG2d8Yl0AeBEGBciEdIObz5+/LinU4cxQP7mJLkCWzjsg8aCV3VcRvt4wPxITX7uuecsVPLV24oHf/jDHzKlFmSflRgp1RnPCK+ICiBE2qkBBiPRyM3NtYtS0mqkMho+g8Nr5syZH0lNIUm/NxZkZGTYdfujrXYq6QyoMz8RGBNay8aNG8NylTSv9NY19u3bl5yfn2+hwAaYkLQLJ4KgwQGhcsX+yK0aLp+fuWbNmhCeJzG52hf+BmFM0HKys7NROt3TuRUGI8FAVVvYwJiEVJqa1H9SfaWqHdDviwXYzw8Vm3IIjAhMTZ/R9yrp1+oMg/FJZgm9+eabMSUIVVZWBqE93H77bR2/k9rUNRMwa2lpaRAHeejtxAPUUKyurg7TASZORVSN9t8Dp+D06dPFq6++ynF/Rs8DZaawGuoTkgh2qJy8cQkAxPkXL15sYcIbEZiabGu9P1LF6Tr1eieGAd1zzz12hCJaqAwrOM7l088vcPJH4DOEKauqqlzb/IFAwLtu3TpbmDgJQRK0+A5biefNmxd+5ZVXXDlbGYyYEUkAECNCBW5sbIxZAFCcn04GNhwEABEmP7QOMDAYDqE4VBDGrjis0ggB0vZblWmd2kECT05OTnP7MDpBqtL2UVxUxdiJ6YmggqMQSVFRkXXo0CFXNv+7776biYNSnQ4bAan9wgeDysAHDhzwdW6FwehBRBIAxCjIQpOMENDvi4TMzMxWsq+dmJUIDA1PuFzxRHFx8UdScJgojy1tdBMOR4QmU1JSTGlGCAgTfXOS3h6EDfLpaRwEqY0ko7oQmSL6b9QJQkiu/B/BUai3FQ8++OADc/369XaKL0U+DAfGx3PAngOkHyeihiKDERck03igquuMQIT8gObm5pgEwJo1a5qokg+tsoYD8+NzMLW0x7HSeizLSlLbUbF9+3aPtPH9sIsRkTAc2iOC80zPE1i6dGkQ22zVVZ+uJwaETY5XXIe6e8ePH09S24gXcuX3yN8WVgWrk/qP99BwUEkJ9RTc7q1gMOIG9phjlVftbpXA0F2l4mLiypXa0usGqmS0tw07d9SoUXHv55f2vV/2Ef7FL66cCKQyMhE+Gz58eBCqOzL1wPwQCvpYVMLvBhOipLfUPhJi8+fm5trajZOpYSjPGM8iNTU1LDUetvkZ1wfYYz516tQOe12fsCh0kZGREVEAgNEkY9o2v+6o0wkMMXTo0NCCBfGVJCfAOTZ27FjHrD0iaDOI8aenp3cUGNHHoRKdWdjQ0GAhLVjtL158+OGHmfJ52DUUIz1PfAaC0EHp9N27d/u0ZhiMa4eamhqPXI2vmrDEzHBOSbs+JG1aj34vsHjx4lZoEGSj66uevKRDzYY5IYVJTOG6SMC2WKeDSYjAWMg4hLkQSSCRgxO/GcJPqv0fuT137+TJk6YUPPZZiRib3jf9jT6hlaD+XyJqKDJucJx5aZH1z8Yp1pkGj02f14y3/tkwwwq9vLJHd/fFirffftuDEBoYRlXfiUngoEK9+urqalO/V9rvdt1+ePJpgusTX15mMwQ88FLdda3qwmeAHXSqwMJrJNKZX/1tiBxI0yLolvkR55c2fBjRg0gmEAkFPCuYG9Jscl1DkXEDAxt6/lE7M3im9GFxoXiAuFz5gLhU/aC4vHmg+KrsYfF50XDxRb1HnN635LoLAXjbsWrqkxaECY3YOY4BJycVXtetW2fX7dev1wmJLdhm6yRAugNU7EEyD0KHRrtwwWtXhLHQezAhNjcdO3bMtc1/+PBhj1zJ7Th/JOan54h+pWkSfuGFF1wLQsYNji9efLbl9JanxOWSfnaBz7byPuJbX1/xbdX94uvSvuJCQT9xtnyYOLUr09LvvdaQDG1ig43TBCZVGbH5+vr6ZuyEW7NmTQBxeqeMNn3Sy+tCW7duTWjd/hkzZpiwsw0HRo9EGA9eoX5PnjxZSMa1PvnkE1fC9/3338+EYESIEYJIf36G0i+YHza/27MSGT8S/HPbxJZzvmHim9I+4nLZA6Ktqp/4rra/+Lb6fvFN+X2irfD34nJRP/E331PXXQAg7IUCF0418EhdxkqOPQMTJ05sdSrmQUQTHvc89thjCT+rDzAl4HSUbztMgWik/hYU+pRCzIwWeowFJ06cMKXpZOf2YwxoW/d/gOBDwbNCkg/b/LcQvqh5quX85kfE10W9xaXCK3X+vtvaT7RtluZA+QPi6019xaVN/cXfq8ZfdwEAlJSUtCDtV5/AxDiY3BAQ5FwzHBiNCNfCPJBqdo+oujk5OSaEkHwbURDpBOcgioouWLDA1aoPwCEqtZowfAjyz07PSX1u+A5RBuy12Lx5M8f5byX8fXu6/4vKJ8KXNiaJyxsk4xdAE+gvTYIB4nzhIBEqfEicLk8W/7t19g2z31syh0VJMeokjoeg6o4cOTLuOH88yMjIMKF2G+3Mh1cnot8AJpw2bVoIdf6VZrqFd955xyuFpR0elX/awk71+quagH1uwsyZHOe/VfFZ5SxvqGCMOLd+kDi/STJ9yYMi5B0oviwaKr7wTRD/aJh5Q+333r59uxf79jFxDQeG6oow+RHnz8rKMtFeTwCq+9q1awNwTBoOY1AJ4wGjgvnlPZ6ORroJ2XcmHH7Yo0CmB5lIRPgcQhSCEPsadu7c6dPbYdxCOO1LMU95k81TBZLKks3TeY+YnxWPNk83PWsiUqBff72Rn59vF6MwHBgqGmHSDx8+vEdsfhWojS9NgA7VP5oGgJUfZbu9Xq/nhxa6h48//ti2+ZHhp5tH6nsylZDbL/v16+0wGDc0EKJC7T0wT1e2Poi838jAmz59eo+ruijdDfufGD/aGOF1x2Yg5fZuY926dS3IZcDvhfDBb9adfvIyKp2ODUVs8zMSj2Aw2AuJJy/KlRDVfDIzMz2SYTto2bJlHiTLoNRXIBDo1gTMy8sz1f0B0QiqLpxrr7/+eshtWK0roCQXTuwhxpMfXaUBkNq/dOnSUEVFhevxwOYvLy+3NwrRag/mVwUAPodQAE2dOjUMU0pvh8FwhbePH/ds9fnM+ZmZ/vLSUmGuWCFmzZwpxowaJUYlJ9uEE3Ox+qSlpaGAJV6bcY4ettjGGvZCbv/ylcsDsZTxAgOgvz179oQSGed3AlR/0zSDUK8p3m44CADY588880xIrsCeTg10A7D5pRCxN0RRzgOp+arjj8p4IVdiy5YtPr0dBqPbaGxsTPbm5weysrJCE8aPF/fec4/4lVx178CK086gP2knvAdhYiL+jEkJpx5i0BkZGVZtbW1Aa/4qSCZrhaobKb6u2r2w+bGPv6eZH9l2clwhMCIxoM74RKmpqYjze9T7uwOpzZiVlZUhCBRD+e30+4nwOYQD5/YzEo7A4cNNk8aNCyb17y9+feed4nasPHLCqfRTjWiCYlUiRgEzw3mFKrjSRLCkiurX+wKkzdoEdR72v6ExFq14pPqiUlBPxflVYGuvVMFD2HNA1YGIDG2M0FpycnJcq/1y5fc0NDSEoVEZ7c9UZX68qs8Dm5xg83NuP8M1YLdLe7pp9erVYhBUT0w0MDEmncL4kUhfpfTJi4w+MK9kdkG15+CsQqVcfN6V2k8JNcXFxSaNuacA5ofHn+r46b/HaB8TPkdqcFFRkevcftj8UoOwBabR/jxJ61BXfqz60LJmpc7i3H5G4pCbm+uHFx6n0EDF/1k7Q2J1v4rZNea0tQBlkuoMowoCMNWiRQvhJTezs7MDjw5/1GZutT2dwAQPP/xwwnP7nYDTc+TYgnDo6eM3lDHhb/wWqfpb69e7311ZXV1tF0JVnxW9knDE3/BFYE8B5/YzEgapnvugTlIIrpNdDwbUSBcAIJ3RIzEOCCsY8vWxE5CuVb/X02wRfnO7nz8WwObfuHFjCOnERvtvIubTCX6OrKwsFNM0lSbiBmx+CEI8C9XUUEN99DzwGZJ8cjfm+vV2GIxuwTRNL1JoVaY12ic5GF1n/kgCwL6+nWGc4tQ6RfocREyHdmBfT5w4scdVXWkCJctVOIRVuKtCoLTD7rXXXsPBJd22v2Hz79ixIwwTSN/RR8+AfB9kApWWlnKcn+EeON9u4cKFdmENTDY1xdSehGBSMKFCP5ff/VJO/t/16iXuv6+37enH9lysXohXQ22GiorJqgoBtBsvoR054cPINzB6GGD+DRs22PZ3NMYHQTggunHixAlXeyn++Mc/eqH263069Y/nKTWgsGT8HheEjFsEaWlpfqjhpF7SikObcmy7/idXnIBg/D69e4vHR49GCM56csyYwKIFCwLFhYUBhPgKvd4A6vdJYRCYOnVqCF5/KoqJNuMl3DdkyJCQZH7T6GHgjL/8/PwgOd/I5lbHDmGGVzwbrPw7d+50tZfi448/zvT7/bYANdp/r242EUHgTJgwnuP8jMQBNj/ZnIbCdPorJj6896Ml4+O0GhTwwOm2nRrTAIZCFR4cTIF4PdRlw4HJnYj6xHbX1NTUHrf5caIPbH46OstoH4MuuMCceA5wvqFUuZvy3X/+85/NzZs3h3BoByX56ALAaO8Xzw59rl+/3q81w2B0D9nZ2d4RI0aE1YmmTzz6DKsijpQuKirynjx5Mi5PtxQUHkxcRBZoC2skov5hhqDgxrWw+Y8dO5YsV2E7zq86+iI9C6j9L774oiub/y9/+YunsbHRtvmpH1UAqJoHhAM0qeLiYrb5Ge4Bm3/p0qVNYDCsdmrGnToJyeEkrwvLldxyE3ZDggoSgMBk6mQ3NAGAftHnsGHDwokomdUVYPOvWbNG3HPPb+zxqCuxzoyIWCDtGDkSejvxAJqRNI+asOMR7VJ8X+2THIHtGX5s8zMShzlz5viRYQZVlhx0hiYA8DlsToTdYCbobcQDnGxbWFgYQD19teSXoa2seEWfAwcODKHgRqdGegDQTGDzo6SWmmevCgA8BxKEqFkoGdG1zb9161aBE3vI50K+FuqTNvqgTxwTVldX5+r5MxgdWLFihQ+TD5NLn+zqBAQjwqufkpLi19uIF1L9b6X0XrKvVaIVD4wAZ+SOHTuszi0kHrD58/Ly7FCfGnYztLGB6NBMyYiBrvwe0YA4/5YtW0LIGMTzpedP2haZH3iPsmeoZLx69Wq/3g6D0S0gzj969OiwHmdWJz4JAHilFyxY0AxzQW8nHkjbuokcgKp9rRJpG2DGhoYGgbLbnRpJMN56663k2tpae2OPvvoa7c8AryCMDaf2SOb/qLtbmwkbN25sgVDVn70qAPA3hDOSsbxeL9v8DPeQE8mO8yOrDYyoT0BDYUZMQjlJwxAWWjNxARMXx2OBebCC6v2A6DNMeGxjfe2110LXgvmp4hAEna4FGe1Mj88xrrFjHxeS8V3b/LNmzbLzLCKZGvibNKG0tDS2+RmJA2x+9cQYo5351EmPV0x4rIpLlizx6W3EA9j8BQUFAXiuofY7MT8In4PZULEW+/mRDae2k2iAEcvLy4NUbkx9BuoY8ZyUw0Rc2fwAbH7aRqwyvC4AICjxzDjOz0gYpA3pox12ToxIExCMCPUUSUGdGugGcnNzW5EvoAocnahf+CNwIm5PMz+OHyssLAzpZbTxXicILWgk0hxxFecH0tPTfageTKu7bn4Z7X1eSfKZgFCrv3MLDEY3ATX+ySef7LD5DYfJTl5u2Pzz5s1rzszMdGVz7t+/vwmhMtrMYjj0SYQEJKkt9LjNT3F++Bj0MJ/hMC4kA5WVlbmy+d99912PbMOSAqdjbwU9a/qbXsH88PZzbj8jIYDNjzg/bE4nrzuIGADCIRE2P+L8Ur224PBDm4ZDn0RQdREVOHDgQOi9997rceZHbj+q6oDhDOX303ud4KVHOTMpnDrOIowV//M//5O8IW+DF6cdIwXaUJ61LnjwnNojDLyfn5E4SLXTD7XfcJjcIFp9IByQDOTW5peMnFRRURFAEc+uVn70iXwAyVw9bvOj/ZKSkqBaTDPa2IhwDWohIPV2zpw5ze31DD0dDTugtbUVzwBhviAcn3ras878IGgjuFZqCr5OjTEY3QVsfqzCTis/TT684nvY39OnT/crt3cLxcXFrXCYYdI7mRuqwEFi0e7du4NIwuncSmIBm18ypG3z07PQxxWN6BkhBRq2+eLFi0NSKwhA0EltJyCFXmDv3r2BysrKgBSgASksLGg1cDB2dagJngUSopBbIDUvv8FgJAJS1bXj/LffEX0CYnJjAwpWN7c2/86dO5tGJo+01V0wjBOTkQMMJsnTTz/t7WmbH6E+aBjQbroyR6IRCQEQfh+ceWgTyUrIpESsHkIUJkMsZxiQBgDtAit/YWEh2/wM94DNn52d3ZHbbzhMPiJMUjmBw8uXL3dlc5LND2YgRjEc+sN3sHPBLLD5491IFC/A/JKx7JXYSRh1Reo96nsSYjqT45quhAwxPu6FoEhNTeU4PyNxmD9/vh8MFo0JaaLC8+42tx82f3V1deDxsY+L227/watuOPSNSY84/wsvvNDjdftRw6+0tLSTzW84jAkE+xvmCB0zTtdG+y1uCG0ivVeaXDil12cwGIlAbm6uD5NYX5lANJlp9Wk/Osuv3t8dFJcUtz497ml7ZTccJjsEEZXSQp+NjY3XJM4Pmx+5DNHKeOFvfA+hBCGGgqSzZ88WvXr1cnyGiSA8D2yDXrx4MZJ8/AaDkQjA5kepLH2SExEDYMIjzo9Tetza/FL1b8KhHeqqqRMYCQ5BOOAQ5+/pUJ9c+ZN37NhhO/zUTTZO48N3sL+3bdvWEeeX773r16+39yLQDr1oFKltJ7qyqWqYePbZZz/avn27x00NAQbDBtn8SO9VK/nohMneruqGpZngyuaEzS8ZxYLzy8nmJS0D79EnQoIvv/xyj9v8YP7i4mLRu3fvDiekSuqqDmbEuCLl9svf6MfpRfClIBVY1wj0tlVSr8E4cD/MrQkTJgTffPNNx/4YjG5BruIdNfyirURg1ETE+SVjJFVUlCHUZXuwDa0fYjTaWYd8dtj8OEC0U0MJBnL7pT0dBPOru/oMhVkpL4Fi7qWlpV3m9peVlQUk41r4HQgDgpnJAagzPj6j3w4bH85HChuiRiIKjujtMxjdhlz97f38kUJuIHyOCQvfQCJs/oKCgtYnnhjbUUPAcOgThDEh487n8wV72uEHm18yql2332klJsJzoMIaiOHDgdmpoQjAvn/ZvunxeMyioiKBzD4wNpytSLICwd8AjQiCcdmyZUilRtETU5o9JhySepsMhitI5rdz+/UJr7/HatSvXz8xd+7chNj8WAlvu+1qtV8nhLiWL18uEIr7oYXEA2XC9u/fb+f2q2q/4TAmEJyVqOALxlSaiRnQNKRQ80g73j7+HJCC1Sb8bZqmBycHu9k7wGBEBGz+VatW2TY/2d/qpNeZAPX0Fi1a5Mrmx2Suqa2xcPpMNOYCkdBJSUlBEQvPD60kHhAumzZtEvfcc09UbUQlXIfr8/LykIvgobZuNLQd9yVdPF7laWut8XzX6vN897bPE2rlRKFbHnLl8SPNVC/drWsAYML2DD+f1kRcgJosVzy7hl9Xaa1ESG2Vq7+FwzQ7GkowoPZXVlYGod2oQqkrDQAEIQCTKCcnp7mjwRsEoUPrzdO+GWZozyLr3D5TnD+cIy4czBYXX8oRZ198/oYbL+MaAnF+2JkU2zYcJj1eMcERc580aZK/cwvxA46yeJgfBHVcCgCzvYkewdKlS1siHZ2lOgAjETQlxP/ff/99V9pRInH5eJXvc/8cca5klDhf/JA4X/igOFf0kAgVSMofKs6UPynObs+4YcbLuIZYvXq1V07YsNMedvU9Jj9W/tTUVNc2P/bzw6n1i1/GfogHGAs1AOrq6sz2ZhIKqP01NTVW//797WdhKL9fFwL4LhrBoy9NAauj8euM0IuLrS8KhkuGHygub+orLnv7ia8L+trvL3oHiHOFg8UZ/+TwFy8u8ev3Mm5SwOZft25dE612hsNEJgLzyZUf5+a5WiVsm18yWbwrPwhjxM62nTt3mldaSxzA/IjzQ8AZDn2DSADA2YcwHDbuRNIK8DfGum/fvkBHJ9cJ//pjVcvphhnifFFfcaGgj7hYcJ/4uvgKtZX0EZdL+0nqL85tfkJcaF5w3cfLuEaAzY+SWpEq6aorH2rNyet9nVuID2Tzjxs3znEfu/q3E/WUAEBVHRxDhl2EhkO/IHoO0AwwfikIW2fMmGFHJJw275BD8LnnnrMkkqiv64Hzr5e3/MM/RVzw9hWXiiTjF90rvintLb4tb6eqPuLb6vtFqO4JEdqTFdDvZ9yEKCoq8sHbrya26ExIW1TBGB6Px9+5hfixdevWVtmOY1ahzkBOhPHBTyFXatNuMAFoL6kVcjo6SyV5qT1uCEzk9iNpCeW0qQ6A/uwgFPBsMzIyEK40O3V6jXHmaJnnVP3c0OkNg8WF/Pul6t9bCoHfi7bie69Q+f3iUkWSOLNtkjj/ihnQ72fcZCgoKPA+/fTTHTXk1Emuvsf3yH6bNm2aa5v/8OHDTSiASSf2GBpjRxJCKrWbIUKuvCa16wbYO7Br1y6b+fWNPUTok/wBcOxJDaYjtx8596ZpXqXNgOj3IJMyJyfH/KHX64PTjQuS/1kyTny16UGpCfSXZkB/8XXhA/brudLB4ovKEeJ007xgKLA2Sb+XcZMARSHy8vLsTTZYoZw2tNCkByGfPT8/P6C3Ew/ALPX19XYVGyc/AzE/+gMjYYstsvyI6XTCNatXr3YdZwfzy5XcLrKhC0KVMA70iQy/5ubmq3LtpVlk4nli/IbDePFbYGpJM8CVAE0EQnWZyWf8s6zTZY9bZ2unhE+XPWWdrnrS+mfVBCt0yLT06xk3GVAWCqswVZUBqULAaGdIyvDLzs4OfPrpp6beTqyAzS+Z387tx8pvaMxB/ZK63H5KTWjWrJmhaHsBhg4bap9m80NP8QFx/pqamiB2LkZa+akvfA+1f926dY65/YcOHTJxGnEkhyaEB5yLMDXU+643vn+n0pUzl/EjA4pDYEUnh58+2Q2FyWDzT5gwwa81ETdwwCUcZvCaO9n4JIRgW2PlhyPugw8+8CxbtqwFK7N+PQkLhNjgSzhx4kTck7g9ycfezx/pWdDzoNx+ycABHEKitwVIAZmUmppqOQk4EAQDKv+61VgYjG5Dqrre8ePH27FtVQ3XJzyYAWEwqMbIS+/cSnw4cuRIE0J90ar3oj8wIXYSSqbE9lk7u0++tkBw6NfTWKFuY0ec1ALCf/rTn/xXeuwa2NK7c+dOe2OPnuqsEgmFYY8OE5s2bfqoq3p6GRkZLdjNZzj8RjzzrKwsCDePeg+D0ePAxJVM0oTVjrLaDI2hyP7G97BlJYOE3VTVgc3f0NBgwWFG4TFiKOqLxgHmh9qPIhv6xp5Vq1ZZWOlxXST6zW9+g3CcyM3N9UdbYXHqjrzGs2LFClvTMJTfrxPGCI0FBUhx4KjelhPkCt8SKX8A7U2bNk2sXbvWo97DYPQ4cPwT7G8qOqELABBNekzgNWvWuLL5sbUVx1xBPUefaBtCAExPgkDNsENZcZyk47Sf/5133vHCg+7kOFQJ7SE9OCcnBz4LE1mCUvswJdPb7+GBl/a7NWvWLDtxR3UuqoxPgun222+zsw1RgrxjMF2gKwGA5yH/Fx71HgajRwGbH9trSQUnMpTJj1dMfJShhgquNRE3qqurWrGX3amGn9o/mBBVbFBkI9p+9m3bttleeifBpRNsbaj2KMaB3YJpaWn2oZsQMqiTB0GihutoPCQY8Zwozl9aWmrH+duH0SWiCQC0DSHMAoBxzQCbf8qUKfZZfYYy2YmR1L+RrVZeXi4kI8btUFMBm58iDLTiGw7MAEKEQdrE6LOT2q/jjTfe8CLO7pQ4pBPahRCgiALuoSw9CtHRq/r7SQDgOuziy8vL69Lm18ECgHFDAPZ37bbapgkTJzgm3GCyU7gK77HpJTU11RXjo/hkc3OzhdVWZXq9b4rzwx/hZPNHwsGDBzMXLJgXuvfe33V5BHg0crqG7H0IDGT0SfMlJptfx5gxY1ru+g/nKAB+95IlSwSShtR7GIyEY9++fX44xSIxivoZViypKvvU++MFnGuNjY12nB99Gg59qQyIjDuk3cYbE0eFncVLFodhwzs5M0E6c+ukXkPvSQDA1yBX8ZhtfhUIDz740IMWzi0wtDGBoIl4vV5x9OhRj3ofg5FwZGdn244uffKrDNO+8tuhPv3+eFFTU9MK5o/mZyDnH2x5v98f7C4joBQW4uloRzdt8F79uyuia6ENIUMRxTkjxfm7ApyM0B4MB+YHIaFJXhO43huCGDc5ELKi5Bl9wquTHttY4fD74x//6Er1f+eddzri/GRHq/0Q4+P9vffea2fDdWXzd4VXXnnFi7HDsUebmMDETra9TvheJ2gkam5/vIAZU1paGsJhH4ZD++gXzk5pApjqfQxGQvGHP/yhBVtTyb53mvxgFnjJpZ0bdlNJF8yya9cuC972SP0R80O9RohO9hmzzR8LpOnhR2gPWXqI64MBIRD0cegEQYHrQPD2d9fmJ6CQCh2VRs8ZhPapr6lTp4aj5Si4BWr5hQ57PWfqMz1/93k8p16c72k77k3Sr2PcpIBqmZubiyo2V014InmZ7e0vKCgIyetNvY1YgbPpcWQ1Qn1w6FH7lPBDf+M9edWR2x8t1OcGODZ7wYIFgYkTJ4bw+/TfrRNpDKNHj8K4umXzEz7++ONMHMEFZ6uuAdHvR3agFAAB/d5EIhTwmmeanhVnfVPE59VPiDO7UsXZA0sCoSazW1oN40eGffv22ZtRKPauT3p8BmZ97rnnhNQUMvX740FdXV0rEmrQl9oHhdpUJoOTsbCwMCg1Bo/eTiLxl7/8BQd1hqiAZzTCc0A9ASkIu23zE6RJYyETURd+hmICQEORz6zHBMDpfZnJXzXPsi42jBWX/I+IS5WDxfmqR8TpqqfFmfrZln494yaEXAFNVOtRJ6FKUEOxYkvb2ZXNjzg/1H5ifqNd2JC6T/1DEGALLDzflNvfk8jLyzPhyFM1EieSl9refsm4ccf5dWRnZ3tRHk19Dmo/eIUQlII5iEiJdnvC8P3/2Ri8tH20+H7nEPHvxsHiX1v7i7bi+8WF/AHiXNlIcaF5oSsTh3GDAx511KCnsJ8+EcGU2NkHIaHfGyvI5kd6rKGsbiD0gz5oLwGYEH6GLVu2hK4F80sb3i5Vpv92lTA+CEHkH8Sa2x8JqKFommYTHHto11Cegy4AHnnkYQGhqTWRUHx/fJk4t3WY+K7mAfHvugfEd75+om1TH/GNt7d8vV+aBWNFaEd6a+gAF/m4KYGTYuD8U/Pr1YkIwTBp0qSQVHc92q0xAatXc3NzAKfdOFW9AamrP44Sy8/PDx0+fNijttMTmDlzZiZ8DJEckSAIJkrvXbNmjSubH1i2bJkfm5woAmEoQlB9DjAN5Phc99cVzgWetz7zPSUu++Tqv6W/Xdfv29Le4psCKQAkXSpPEmdqxokLL+cEwnzwx80HqZJ7wATqZFRp8IODxaJFiwL6fbFi27ZtrVOnTnXMKgQRk4EQXpTM3+04fzzIyMgwpaYRIqGk/24aKzYkwTxIhM0vV/+r6ikYWt/4/M677hRzs+Zih6JHbyPRCAW8ns93LhRfbh4l2vyDpBDoJ76tul+0lfURXxdLTaCyrwhVPyLO7lkkLh7t2ZOUGNcBjY2NQYTBnJgTBNt/x44d3RIAOGqaNvbo7dOEh9qPFRbe7g0bNqAEdo+r/TgjD0eSkc1vRBEACNHFsp+/K0jm90ot4qqzAvBe/RvPA36Gurq65u7mFsSDUMDX68yBZf4z2yaLi1seEd9u7ivaKqUZUCSFQP59UhDcL86VDxan69LEmaZlHv1+xo8c0tbuOEZbn5SgtLQ07O2P2/knmb9l+vTpV7WnE1Y8eN+R3tuTR3UBOKhTaiNeJO84FRmh3w9tBCs/vP2JsPmzs7PtcxP0bEddAOBZjBkzJlxSUhL383aLb99c6w/tTg9fkKv95cIB4utN/cRlUHF/8WXxo+Lz+rTQ6X1LevT/w7gOQHad09ZborFjx1rq9bHggw8+SFqwYIGFasD6RNcJFXrXrl3b4zY/CpRI7SKI1ZX2A5Aaro6PHH4Iv+Xl5bm2wefPn+9Hn2pfOsnLbD8E/B+rVq3y6W1cK1w6ssH7VWOKOF84TFyQQuBS0QBxoWSI+HzzJPFZXYapX8+4CYBQm1O9PZqcU6ZMiVsAoMgl9tOrxTINB+YHrVmzJtiTWW4A4vzNzc0hRCF0xndiRFQ1kszv2ubHWYmIaDgV+6Q+SeDANzBnzhx/pwauAy4GcptDOxeIL33jxJflY0RoW6oI7V7xUVuAMwNvSshJepVTCoS/oQrPnh1/MohkaHPmzJkdqbW6cFEJR3yp9/YECgoKTDC/HoVQmRC/FYwKjWTjxo2ubX65knsff/xxu56C+lzVXAP0iz4RZl28eHEzzAW9nUj47kS191zLBuvzPfOtU82zrbY/eK3wSZ9rFR0+gdCBVZ4z9dM9p6o8nlDTs562A8z8Ny1QyEMVADoNHz48bgZFiuvy5cvtDS400fV2iRBbh6rtdrWNhOnTp3vRR7RQH8YHLcjNfn4CmHj16tVNSBXWtzerRP3CGSmZPy6bv+1EsXl+/0JxdvPj4vyWR8Xl7SPF+V1Pii93z0fbDEbskCuwXR2XVmmdOZAjjzLb+n1dQdr1OOyi08lBhkP7WCGTRyUj5RcltGJeAWPBwoULM2F/qyaO3j+FICEkcnJyXNv8sk8/1Hna4Wg4MD8IAgmbnJYsWeJT7+8Kba3epPOvLAl8VfuEuFg2UHztHyS+axgo2hqGijO+8eKiXLH1exiMiJBMZ4fgIjHI+PHjxbFjxwL6fbEAVX4oxBiNIARQexC58Xob3UVWVpYpmTpEKjjI0FZgEFZpMD+KmZaVlSV1biU+IM4Pb7++s08nPGtcl5KS4ldujwkXj+Z6zr+0WHxVOVxcKEmyY/ff1j9k07mqUSLUmJmwZ8i4BbBu3TovbYIxHAQAVimc7qPfFwtOnjyZvHnzZjvVluxsvX0irIhwmEmB5EoFB+bPn+8ZN25cWN/dZ7T/PryCMCZ43rtTw08H4vx0VqLhwPREeAZ4pgsWLOjWWYmhgOkJ7Z0jzvkeFRcrBou2uofE99sHi+9eeERcrEsW/2xMZwHAiB3INsPuPKeJC2aBHS9Xq1Y5v5M63RgjcH6etKuDSKiJVGlIJajP8AnEU1FXxe7du+1EGkq11dsnAQBGBPNLxnclcGDzr1q1qgltoU1DeXb0HoTxwNcyfPjwsJltxmXzqwgFlnm+ejFNnK0aKi6VDxBtNQ+K7xsG2ELgYv0IKQBSWAAwYgdO70EkwKlqLiYxrZK1tbUoSRX3igXAh4Da/Qiv6cyoEhiIYvAVFRWBeDPhYPPDlFDVfifC91DBly9f7trmx6GdEFokbIz250aEv0H4HqZG9qpsn9ZEXDhz2PSc3TVbnC8eJL4u6iO+rhoovqtLEt9skyaAb5g4XTONBQAjdoCpi4qKWpz2whvtkxnCAYUrUFNPvz9WQAggFg+fANR9MKGhCRsQmQpg5PLy8pgnM3L7R48e3cnm1wlt43sINNTYc2vzl5SU+FDSLNo2YnIyQuCkpaX59TbiRSiw1vNVc5YIFT54JVW3tL9o2zJItNU+JM5UPSrO1KTG/MwYDBtytTXh7NOZx1AYFNWC1q1bF9RujQswB1CPDwwIz7yTT8Bo7w9jgdkQS1gONr+8NqweA6a3S4RQ3+rVq13b/EjXhc1PEQan3wCCRgObf9GiRc2m6b7CTltrmefiq9niy9LHxMX8/uJyQT9bC7hYM1ScKk8WF/evYQHAiB8pKSktOP3GUCavSpjkSFiRpgBO4ul2wgkcg/AJkJ3uxDQg9AeCei1NlFYcE96poXbMmjXLzu1X21LbxCut/GD+0tLSLgVKNEBwbNiwoQmHkTr1SYT+QFLtjzvO3xUuHM3N/GLbjNA5CIGih8WFsofEV/6R4uwLM1wJaMYtDNTNl8zWsVsNpDMmGAl72aUQsFDbT70/Hjj5BIwIQofMAZTd1vMEli1bZsf5nTQJ1SbH9+grETb/ihUr/FD7wdxqqrPeN8wmZBVK7cSnt5EInN6zxDxdOytwtj5TnN06M3TK7wl8VufptmBmMAypnlsov61OZkMRBiBMfKzKEAJuSlXhYI+9e/d2+ARUD7pOJATk6m3hXlQkhlMyOTnZcT+/ei/Gi/Biomx+mCW6kNT7JifjzJkz/Z1bSDwuHSszLx7gffqMBADbcbGFl5x0TgIAhNVt3LhxcAq6UjnhE5BMade9jyYAqE+s9i+99JLV0tISgs9CPb1IZUD1PexvqSkkxOZHbgGNU2d8InyP3zN37txuxfkZjOsKySweKt+lCgCQOtHxNyIH+/fvd+UTwL01NTV2noCar++UlwBC1SAUDHVieP1vJCCtWbPGtc2fl5fXhBCeyvxk4+Mz8lfgmcEZKU2NhNr8DMY1A2x77NAjJ52hMaDObPAJ1NfXu/YJ4OAPmBZgKDIJVAGk9huNcC3uTUpKQrada5sfNfxwYvGdd17Z2EP9EOPjPV7xrNCn2zg/g3HdAdu+qKjIFgJGFwwIRkDlnEQIAalNhBBuhLpPq6veXyQy2sdJcf4lS5YEupu9SIDNr0Yr5Ecdqz3+pleMExEGaT75tSYYjB8npH2PmL1dL1D1B+iMB8KKDZv80KFDrnwCCBHCJ4Bwo6pe6/3pREyJe2CWSOb/KJ699U4oKCiw4/y6L0QVAPgOwgHPKC0tjW1+xs2HysqKIFZ4ShXWmU8lqMAou+XGJwDH4LZt24I4vJPsbDCZamurRH3jGjjfpObi2uaXwqMJlYCRWKSbIiphbNjyvGjRIrb5GTcnkICTn59vQcXFSh9tRZaXo36AaGxsdGUOIEQotY8Qkm0geMCE0QhjwrWSEV3b/Ijzw68Bh55qghga8+M7aCoLFy70dW6BwbjJgJ15GzZs6HAMElPoq7C81GZYOM22b99uoTio3laswGGg9fX1IWQnUj8qw9Pf6A/Mnwibv6KiwgdtR/9NRPgbfWLlR59s8zNuGcAnUFpaGkQYjhiRVHNiShIKUJ0nT55shwj1duLBsWPHklG0tG/fvh2rMdoHAxrtDAmzIycnx7XNjzj/lClTOmx+J+anvmFqpKens83PuPUAIQD7HMxPzKJqArQy4zsk4cAnALtebydWvPXWW8nSLg/iaC419ZY22cBe1++JB2Tz02+i9lUhQK/4bbD558+fzzY/49YEmQMItYFhIqnm9IroAMwBiSS9rViBst7V1dUBqXKHcYwZUnvT0tLsTUL6tfHCNE07zu+0O9FQVn58hxAl2/yMWx4QAnl5uRY22MAGhyBQzQGV8D02z+zYscOVTwDA+QHZ2dkmCo4eOXLEdNteVVWVj8qFq1qMLgCgzcDUmDBhgl9vg8G4JYEz/IqLi22fgLpKOhFy9j0ejzh48KArn0AiUVlZ6Z08eXJYPxbd0Lz9+Ay/UWogAtWTOjXCYNzqkPZzcPjwR+1VlOL2lMRDRMIBNjuEABJ+9HauFcjmhxmBMTkxPYgEAsf5GYwowIEea9assX0CqhDQtQASAthFmAhzoLuQJoQfY1AdikY706spvxgrsgrZ5mcwugB8AtIut7AHXnUE6gKA7Gl49JEsdK2FwObNm+04v9NZfSCME68YJxx+kyZN8iu3MxiMSECewKZNm4KUuKNqAbpzDY5BZAwiRKi301OQNrxX9mnH+Q0H5icim7+iooJtfgYjXsAngL39CKuRENAFAKnZSKgJBAI96hOg/fx6JR+dMCaYMAgzNjQ0hFF1SGmGwWDEApgDa9ausYYMeUiu9Ff2DugCwFAYD9GBPXv2uMoTiAbE+ZGLQIeSGA7MD4KgQm7/li1bQpL5TaUJBoMRD8gn8MgjDzsW91AJ5sBTTz1lC4FE+wSQ208rv9q/KojoPWx+v98v/vu//ztTa4bBYMSLuro65PEH77uv91UMqBK0A8TiUYtw7969CfMJILdfrvwdNr8uANAv3uN7+C1wTPqJEyc43MdgJBKFhYXBxx4b7nj0mE69e/fGKhyUK3e3fQJHjx71ZGRkdNTtNxSmxysYn0KAeD948OBwVVWVxTY/g9EDgDmwbt1aa/DgQR2rbjRCIc/MzEyrsbHRbG1tjWu3nRQ2mZJsW17vS9dA8H2fPn2EvN5S22AwGAkGkoVWrVplwcPeVRgOjPnrX//adg4uX77cev311wOffPKJ+UNrnYEIQktLS2DevHn2OQEUhlSdjqq9TyFKlPF64okn/H/961/Z5mcwehrwCcAc+O3vfhvVKUifQ01HPB479aQwCEErwGq9a9cuC5mEUNvz8vIsaecHn3jyCfta+BLULcq6EADBLEB9gZKSEnH48GGPMkQGg9HTQLIQdhHSiT5dEdUdwHsIDvgScC/tQlTzDNT71JUfhGtwLfYASGEURtkxg8FgXFv4fD7bHMDega7MASJ1BScVHsxMr/r1TveB4BsoLy8PSbPBNBgMxvUBfAJSE7Bw3h8YE4ysO+0SQWgTBG0B/ofNmzeLDz/8kG1+BuN6A+cQ7t69OwhNQD3jL1FEqz58CThxKCcnpxkhQoPBYNw4KC4uTl66dGkQTHrXXXddxcjdJTA+PP2LFi2y9u/fzwk+DMaNCjjkSktLEcoLYw8+NhI5ZQ/qNj19RlEFqPuoSIw2hg4dapmmGejcE4PBuGGB7bdSEDRv3LjRLiaK/Hw6pVgn8urDvr/77rvtLMIxY8bgfIBgWlqaWVZWlqS3z2AwbnBYltUL8fnMzEwP9gbgrMAVK1aIadOm2cVFEcYD4fQefLZs2TJk84Ga09PTPahLoLfJYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBuLHx/wF/KenXydwZIgAAAABJRU5ErkJggg==";
|
|
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
|
-
|
|
2408
|
+
if (openConnectModal) {
|
|
2409
|
+
disconnect();
|
|
2410
|
+
openConnectModal && openConnectModal();
|
|
2411
|
+
}
|
|
1868
2412
|
return () => {
|
|
1869
|
-
|
|
1870
|
-
clearInterval(intervalRef.current);
|
|
1871
|
-
}
|
|
2413
|
+
address && disconnect();
|
|
1872
2414
|
};
|
|
1873
|
-
}, []);
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
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
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
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
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
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
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
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__ */
|
|
1907
|
-
|
|
2554
|
+
/* @__PURE__ */ jsx44(
|
|
2555
|
+
Button,
|
|
1908
2556
|
{
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
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
|
-
|
|
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/
|
|
2001
|
-
import { useMemo as
|
|
2002
|
-
import {
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
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
|
|
2008
|
-
const
|
|
2009
|
-
const
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
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
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
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
|
-
|
|
2072
|
-
|
|
2073
|
-
return
|
|
2074
|
-
|
|
2075
|
-
{
|
|
2076
|
-
|
|
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
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
{
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
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
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
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
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
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__ */
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
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/
|
|
2122
|
-
import { jsx as
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
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 {
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
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/
|
|
2140
|
-
import {
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
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
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
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
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
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
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
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
|
-
|
|
3088
|
+
overviewLoadingRef.current = false;
|
|
2181
3089
|
}
|
|
2182
3090
|
};
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
}) => {
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
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
|
-
|
|
2198
|
-
|
|
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/
|
|
2228
|
-
import {
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
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
|
|
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 = {};
|