UNPKG

eros-sdk-react

Version:

eros sdk

1 lines 510 kB
{"version":3,"sources":["../src/components/index.tsx","../src/components/EmailModal/index.tsx","../src/ui/Modal/index.tsx","../src/hooks/useLayout.tsx","../src/ui/Overlay/index.tsx","../src/components/EmailModal/StepEmail.tsx","../src/ui/Button/index.tsx","../src/ui/Input/index.tsx","../src/ui/Field/index.tsx","../src/store/useLocalStore.ts","../src/api/request.ts","../src/config/env/index.ts","../src/store/index.ts","../src/utils/matchlog.ts","../src/api/index.ts","../src/hooks/useUserInfo.tsx","../src/MatchContext.tsx","../src/hooks/index.tsx","../src/hooks/useMatchEvents.ts","../src/hooks/eventManager.ts","../src/hooks/useWallet.tsx","../src/store/useStore.ts","../src/context/ModalContext.tsx","../src/ui/index.ts","../src/ui/Drawer/index.tsx","../src/ui/HashPanel/index.tsx","../src/ui/ModalDrawer/index.tsx","../src/hooks/useHash.ts","../src/ui/Popover/index.tsx","../src/ui/Switch/index.tsx","../src/ui/AlphaAvatar/index.tsx","../src/ui/Radio/index.tsx","../src/ui/Skeleton/index.tsx","../src/ui/Tabs/index.tsx","../src/ui/Lottie/index.tsx","../src/ui/Checkbox/index.tsx","../src/store/useTransactionStore.ts","../src/hooks/useCopyClipboard.ts","../src/context/ToastContext.tsx","../src/hooks/api/wallet.ts","../src/hooks/useMatchChain.tsx","../src/hooks/useMatchWallet.tsx","../src/config/index.tsx","../src/store/useContractStore.ts","../src/components/ImportToken/index.tsx","../src/hooks/useIsContract.ts","../src/hooks/useReceipt.tsx","../src/hooks/useTransaction.tsx","../src/store/useModalStore.ts","../src/hooks/useConfig.tsx","../src/components/CEXBindModal/index.tsx","../src/context/BusinessProvider.tsx","../src/context/index.tsx","../src/hooks/useWalletInit.ts","../src/utils/wallet.ts","../src/hooks/useInit.tsx","../src/i18n/en.json","../src/i18n/zh.json","../src/i18n/tw.json","../src/i18n/fr.json","../src/i18n/ja.json","../src/i18n/ko.json","../src/i18n/vi.json","../src/i18n/es.json","../src/i18n/pt.json","../src/i18n/index.ts","../src/components/EmailModal/StepVerify.tsx","../src/components/LoginBox/index.tsx","../src/hooks/useAppConfig.ts","../src/components/LoginButton/index.tsx","../src/components/LoginPanel/index.tsx","../src/components/LoginModal/index.tsx","../src/components/UserPopover/index.tsx","../src/assets/icon/ProfileIcon.tsx","../src/components/UsernameModal/index.tsx","../src/components/EVMModal/index.tsx","../src/components/WalletModalContent/index.tsx","../src/assets/wallet.ts","../src/hooks/useWalletBox.ts","../src/hooks/useEthersSigner.ts","../node_modules/@wagmi/core/src/version.ts","../node_modules/@wagmi/core/src/utils/getVersion.ts","../node_modules/@wagmi/core/src/errors/base.ts","../node_modules/@wagmi/core/src/errors/config.ts","../node_modules/@wagmi/core/src/actions/getConnectorClient.ts","../node_modules/@wagmi/core/src/exports/index.ts","../src/components/TRONModal/index.tsx","../src/lib/tron/TronLinkAdapter.ts","../src/hooks/useTRONWallet.ts","../src/lib/tron/BitgetAdapter.ts","../src/lib/tron/OKXAdapter.ts","../src/components/TONModal/index.tsx","../src/components/BTCModal/index.tsx","../src/lib/btc/UnisatAdapter.ts","../src/lib/btc/XverseAdapter.ts","../src/lib/btc/LeatherAdapter.ts","../src/hooks/useBTCWallet.ts","../src/lib/btc/PhantomAdapter.ts","../src/components/WalletModal/index.tsx","../src/components/AlphaAvatar/index.tsx","../src/components/WalletAsset/index.tsx","../src/components/TokenSend/index.tsx","../src/components/TokenDetail/index.tsx","../src/components/TokenSendList/index.tsx","../src/components/TransactionList/index.tsx"],"sourcesContent":["export {default as EmailModal} from './EmailModal'\nexport {default as Field} from '../ui/Field'\nexport {default as Input} from '../ui/Input'\nexport {default as Button} from '../ui/Button'\nexport {default as Modal, ModalWithHeader} from '../ui/Modal'\nexport {default as Popover} from \"../ui/Popover\"\n\nexport {default as LoginBox} from './LoginBox'\nexport {default as LoginButton} from './LoginButton'\nexport {default as LoginPanel} from './LoginPanel'\nexport {default as LoginModal} from './LoginModal'\nexport {default as UsernameModal} from './UsernameModal'\nexport {default as EVMModal} from \"./EVMModal\"\nexport {default as TRONModal} from \"./TRONModal\"\nexport {default as TONModal} from \"./TONModal\"\nexport {default as BTCModal} from \"./BTCModal\"\nexport {default as Overlay} from \"../ui/Overlay\"\nexport {default as WalletModal} from \"./WalletModal\"\nexport {default as WalletAsset} from \"./WalletAsset\"\nexport {default as TokenDetail} from \"./TokenDetail\"\nexport {default as TokenSend} from \"./TokenSend\"\nexport {default as TokenSendList} from \"./TokenSendList\"\nexport {default as TransactionList} from \"./TransactionList\"\n","import {useEffect, useState} from \"react\";\nimport {ModalWithHeader} from \"../../ui/Modal\";\nimport StepEmail from \"./StepEmail\";\nimport StepVerify from \"./StepVerify\";\nimport {EmailModalProps} from \"../../types/types\";\nimport {useIntl} from \"react-intl\";\n\nexport default function EmailModal({\n isOpen = false,\n width = 480,\n onClose,\n onBack,\n onLogin\n }: EmailModalProps) {\n const [step, setStep] = useState<\"input\" | \"verify\">(\"input\")\n const [emailVal, setEmailVal] = useState('')\n const intl = useIntl()\n\n useEffect(() => {\n if (!isOpen) {\n setStep('input')\n setEmailVal('')\n }\n }, [isOpen])\n\n return <ModalWithHeader\n isOpen={isOpen}\n width={width}\n onClose={onClose}\n title={intl.formatMessage({\n id:\"email\"\n })}\n onBack={step == 'verify' ? () => setStep(\"input\") : onBack}\n >\n {\n step === \"input\" ? <StepEmail email={emailVal} onContinue={(email) => {\n setEmailVal(email)\n setStep(\"verify\")\n }}/> : <StepVerify email={emailVal} onSuccess={onLogin}/>}\n </ModalWithHeader>\n}","import React, {PropsWithChildren, useEffect, useState} from \"react\";\nimport {ModalProps, ModalWithHeaderProps} from \"../../types\";\nimport ArrowLeftIcon from \"../../assets/icon/ArrowLeftIcon\";\nimport {CloseRoundIcon} from \"../../assets/icon\";\nimport {useDownMd} from \"../../hooks/useLayout\";\nimport Overlay from \"../Overlay\";\nimport { Button } from \"components\";\nimport { useIntl } from \"react-intl\";\n\nexport default function Modal({\n children,\n isOpen,\n width = 480,\n zIndex = 100,\n className = ''\n }: ModalProps) {\n\n return <Overlay isOpen={isOpen} zIndex={zIndex}>\n <div className={`matchid-modal ${className}`} style={{\n width\n }}>\n <div className=\"matchid-modal-mobile-header\"></div>\n {children}\n </div>\n </Overlay>\n}\n\nexport function ModalWithHeader({\n children,\n onBack,\n onClose,\n title,\n showBorder = true,\n showClose = true,\n ...props\n\n }: ModalWithHeaderProps) {\n const isDownMd = useDownMd()\n return <Modal {...props}>\n <div className={`matchid-modal-header ${showBorder ? 'matchid-modal-header-border' : ''}`}>\n <div className=\"matchid-modal-header-content\">\n {\n onBack &&\n <ArrowLeftIcon height={isDownMd ? 20 : 25} width={isDownMd ? 20 : 24} className=\"matchid-modal-header-back\" onClick={onBack}/>\n }\n <span className=\"matchid-modal-header-title\">{title}</span>\n </div>\n {onClose &&\n <CloseRoundIcon size={isDownMd ? 24 : 30} className=\"matchid-modal-header-close\" onClick={onClose}/>}\n </div>\n {children}\n </Modal>\n\n}\n\nexport function ConfirmModal({\n title,\n children,\n onClose,\n onConfirm,\n isOpen,\n confirmText,\n zIndex=100\n }: {\n title?: string\n onClose: () => void,\n onConfirm: () => Promise<void>,\n isOpen: boolean,\n confirmText?: React.ReactNode,\n zIndex?:number\n} & PropsWithChildren) {\n const intl = useIntl()\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n useEffect(() => {\n if (isOpen) {\n setError('')\n setLoading(false)\n }\n }, [isOpen]);\n const onSubmit = async () => {\n setError('')\n setLoading(true)\n try {\n await onConfirm()\n } catch (e: any) {\n setError(e.message)\n console.error(e)\n } finally {\n setLoading(false)\n }\n }\n\n return <ModalWithHeader isOpen={isOpen} onClose={onClose} title={title} zIndex={zIndex}>\n <div className=\"matchid-confirm-modal\">\n <div className=\"matchid-w-full\">{children}</div>\n {error && <div className={`matchid-error`}>{error}</div>}\n <Button size={\"lg\"} onClick={onSubmit} loading={loading} block highlight>{confirmText ?? intl.formatMessage({\n id:\"Confirm\"\n })}</Button>\n </div>\n </ModalWithHeader>\n}","import { useState ,useEffect} from \"react\";\n\nexport function useDownMd(): boolean {\n const [isBelowMd, setIsBelowMd] = useState(window.matchMedia('(max-width: 767px)').matches);\n\n useEffect(() => {\n const handleResize = () => {\n setIsBelowMd(window.matchMedia('(max-width: 767px)').matches);\n };\n\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return isBelowMd;\n}","import React, {PropsWithChildren, useEffect} from \"react\";\n\nexport default function Overlay({\n isOpen = false,\n children,\n zIndex = 100,\n }: {\n isOpen?: boolean\n zIndex?: number\n} & PropsWithChildren) {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\";\n } else {\n document.body.style.overflow = \"\";\n }\n\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen]);\n return isOpen ? <div\n className=\"matchid-overlay\"\n style={{\n zIndex\n }}\n >\n {children}\n </div> : <></>\n}","import {useEffect, useMemo, useState} from \"react\";\nimport {isValidEmail} from \"utils\";\nimport Button from \"../../ui/Button\";\nimport Input from \"../../ui/Input\";\nimport Field from \"../../ui/Field\";\nimport {FormattedMessage, useIntl} from \"react-intl\";\n\nexport default function StepEmail(props: {\n email: string\n onContinue: (email: string) => void\n}) {\n const intl = useIntl()\n const [emailVal, setEmailVal] = useState('')\n useEffect(() => {\n if (props.email) {\n setEmailVal(props.email)\n }\n }, []);\n\n const canContinue = useMemo(() => {\n return isValidEmail(emailVal)\n }, [emailVal])\n\n const onContinue = async () => {\n props.onContinue(emailVal)\n }\n\n return <div className=\"matchid-email-email-box\">\n <Field label={intl.formatMessage({\n id:\"emailAddress\"\n })}>\n <Input\n placeholder={intl.formatMessage({\n id:\"emailAddressPlaceholder\"\n })}\n onChange={e => setEmailVal(e.target.value)}\n value={emailVal}\n />\n </Field>\n\n <Button disabled={!canContinue} style={{\n marginTop:\"64px\"\n }} onClick={onContinue} size={\"lg\"} block highlight><FormattedMessage id={\"continue\"}/></Button>\n\n </div>\n}\n","import {LoadingIcon} from \"assets/icon\";\nimport {ButtonProps} from \"../../types/types\";\n\nexport default function Button({\n size = \"df\",\n disabled = false,\n loading = false,\n children,\n onClick,\n highlight = false,\n block = false,\n type = \"button\",\n rounded = true,\n className = '',\n style = {},\n dataset = {}\n }: ButtonProps & { dataset?: { [key: string]: string } }) {\n\n const onAction = () => {\n if (!disabled && !loading) {\n onClick && onClick()\n }\n }\n return <button\n type={type}\n className={`${className} matchid-btn ${'matchid-btn-' + size} ${highlight ? \"matchid-btn-highlight\" : ''} ${loading ? \"matchid-btn-loading\" : ''} ${block ? \"matchid-btn-block\" : ''} ${rounded ? \"matchid-btn-rounded\" : ''}`}\n disabled={disabled || loading}\n style={{\n ...style\n }}\n onClick={onAction}\n {...dataset}\n >\n {\n loading ?\n <LoadingIcon className=\"matchid-btn-loading-icon\" color=\"var(--matchid-btn-loading-color)\"/> :\n children\n }\n </button>\n}","import {InputProps} from \"types/types\";\nimport {DeleteRoundIcon, CloseEyeIcon, OpenEyeIcon, InputLengthIcon} from \"assets/icon\";\nimport {PropsWithChildren, useEffect, useRef, useState} from \"react\";\nimport {useDownMd} from \"../../hooks/useLayout\";\n\nexport default function Input({\n onChange,\n type,\n after,\n showLength = false,\n showClear = true,\n className = '',\n rows = 1,\n maxRows = 4,\n children,\n ...props\n }: InputProps & PropsWithChildren) {\n const [inputType, setInputType] = useState(type)\n const isDownMd = useDownMd()\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n const lineHeight = 24;\n const maxHeight = lineHeight * 4;\n textarea.style.height = Math.min(textarea.scrollHeight, maxHeight) + 'px';\n }\n }, [props.value]);\n return <div\n className={`matchid-input-box matchid-input-${type} ${props.value && props.value.length > 0 ? 'matchid-input-has-content' : ''} ${className}`}\n style={{\n // @ts-ignore\n '--max-rows': maxRows\n }}\n >\n {children ?? (type == \"textarea\" ?\n <textarea rows={1} onChange={onChange} {...props} className=\"matchid-input-field\" ref={textareaRef} style={{\n maxHeight: maxRows * 24 + 'px'\n }}/> :\n <input type={inputType} onChange={onChange} {...props} className=\"matchid-input-field\"/>)}\n {\n type != \"textarea\" && showClear && props.value && props.value.length > 0\n && <div className=\"matchid-input-delete-icon\" onClick={(e) => {\n if (onChange) {\n onChange({target: {value: ''}});\n }\n }}>\n <DeleteRoundIcon height={isDownMd ? 16 : 21} width={isDownMd ? 16 : 20}\n color=\"var(--matchid-input-delete-icon-color)\"/>\n </div>\n }\n {\n type === 'password' && <div className=\"matchid-input-eye-icon\" onClick={() => {\n setInputType(inputType === 'password' ? 'text' : 'password')\n }}>\n {\n inputType === 'password' ? <CloseEyeIcon size={isDownMd ? 16 : 20}/> :\n <OpenEyeIcon size={isDownMd ? 16 : 20}/>\n }\n </div>\n }\n {\n showLength && props.maxLength && <div className={`matchid-input-length`}>\n <span>{props.value?.length || 0}/{props.maxLength}</span>\n <InputLengthIcon color={'var(--icon-color)'}/>\n </div>\n }\n {\n after\n }\n </div>\n\n}","import {PropsWithChildren, ReactNode} from \"react\";\n\nexport default function Field({\n label,\n children,\n error,\n required,\n className=''\n }:{\n label: ReactNode,\n error?: ReactNode,\n required?: boolean\n className?: string\n\n}&PropsWithChildren){\n return <div className={`matchid-field-box ${className}`}>\n <div className=\"matchid-field-label\">{required&&<span className={\"matchid-field-required\"}>*</span>}{label}</div>\n {children}\n {error && <div className=\"matchid-field-error\">{error}</div>}\n </div>\n\n}","import {create} from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nimport {\n type IEnvConfigType,\n LocaleType,\n OverviewInfo,\n ThemeType,\n WalletAssetMergeType,\n WalletConfigType\n} from \"../types/types\";\nimport {getOverviewInfoApi} from \"../api\";\n\ninterface StoreState {\n appid:string\n token:string\n did:string\n mid:string\n theme:\"dark\"|\"light\"\n endpoints:IEnvConfigType['endpoints']\n\n setAppid: (appid: string) => void;\n setToken: (token: string) => void;\n setDid: (did: string) => void;\n setMid: (mid: string) => void;\n setEndpoints:(endpoints:IEnvConfigType['endpoints'])=>void\n\n logout: () => void;\n overview:OverviewInfo|null\n setOverview:(overview:OverviewInfo)=>void\n refreshOverview:()=>Promise<void>\n setTheme:(theme:\"dark\"|\"light\")=>void\n\n address:string\n setAddress:(address:string)=>void\n\n locale:LocaleType,\n setLocale:(locale:LocaleType)=>void\n\n wallet:WalletConfigType\n setWallet:(wallet:WalletConfigType)=>void\n\n chainId:number\n setChainId:(chainId:number)=>void\n\n assets:WalletAssetMergeType[]\n setAssets:(assets:WalletAssetMergeType[])=>void\n}\n\nconst persistedState = persist<StoreState>(\n set => ({\n appid: '',\n token:'',\n did:'',\n mid:'',\n overview:null,\n theme:'light',\n setOverview:(overview:OverviewInfo)=>set({\n overview,\n address:overview.address,\n did:overview.did,\n mid:overview.mid\n }),\n refreshOverview:async()=>{\n const res = await getOverviewInfoApi()\n if (res.data) {\n set({overview:res.data})\n set({address:res.data.address})\n set({did:res.data.did})\n set({mid:res.data.mid})\n }\n },\n endpoints:{\n back: \"https://api.matchid.ai/\",\n auth:\"https://auth.matchid.ai/\"\n },\n setDid: (did: string) => set({ did: did }),\n setToken: (token: string) => set({ token: token }),\n setAppid: (appid: string) => set({ appid: appid }),\n setMid: (mid: string) => set({ mid: mid }),\n logout: () => set({ token: '',did:'',mid:'',address:'',overview:null ,assets:[]}),\n setTheme:(theme:\"dark\"|\"light\")=>set({theme}),\n setEndpoints:(endpoints:IEnvConfigType['endpoints'])=>set({endpoints}),\n\n address:'',\n setAddress:(address:string)=>set({address}),\n\n locale:'en',\n setLocale:(locale:LocaleType)=>set({locale}),\n\n wallet:{\n type: \"UserPasscode\"\n },\n setWallet:(wallet:WalletConfigType)=>set({wallet}),\n\n chainId:698,\n setChainId:(chainId:number)=>set({chainId}),\n assets:[],\n setAssets:(assets:WalletAssetMergeType[])=>set({assets})\n\n\n }),\n { name: 'match-local' }\n);\n\nconst useLocalStore = create(devtools(persistedState));\n\nexport const localStore = useLocalStore;\n\nexport default useLocalStore;\n","import axios, {AxiosRequestConfig} from 'axios';\nimport {getAppid, getEndpoints, getLocale, getToken} from '../store';\nimport { localStore } from '../store/useLocalStore';\nimport matchlog from \"../utils/matchlog\";\nimport axiosRetry from \"axios-retry\";\n\nexport const SUCCESS_CODE = 0;\n\nexport const isSuccess = (res: { code: number; message: string; data?: any }) => {\n return res.code === SUCCESS_CODE;\n};\n\nexport interface MyResponseType<T> {\n code: number;\n data: T;\n message: string;\n success: boolean;\n fail: boolean;\n result: T;\n}\n\nconst instance = axios.create({\n timeout: 60000,\n validateStatus(status) {\n return status >= 200 && status <= 500;\n },\n});\n\n\n\nconst request = async <T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>> => {\n try {\n const endpoints = getEndpoints();\n const token = getToken()\n instance.defaults.baseURL = `${endpoints.back}`;\n\n instance.defaults.headers.common['Appid'] = getAppid()\n if(token){\n instance.defaults.headers.common['Authorization'] = token;\n }\n instance.defaults.headers.common['Accept-Language'] = getLocale()\n\n\n const {data} = await instance.request<MyResponseType<T>>(config);\n matchlog.log('api',data)\n if(data.code == 401001){\n localStore.getState().logout()\n throw new Error(\"Your session has expired, please log in again\")\n }\n // if (data.code !== 0) {\n // throw new Error(data.message);\n // }\n return data;\n } catch (err) {\n console.error('qwe-err', err);\n const message = 'Request Error';\n console.error(message);\n return {\n code: -1,\n data: null as any,\n message,\n success: false,\n fail: true,\n result: null as any,\n };\n }\n};\n\nconst retryInstance = axios.create({\n timeout: 60000,\n validateStatus(status) {\n return status >= 200 && status <= 500;\n },\n});\naxiosRetry(retryInstance, {\n retries: 3,\n retryDelay: (retryCount) => retryCount * 1000,\n shouldResetTimeout: true,\n retryCondition: (error) => {\n return (error!.response!.status >= 500 && error!.response!.status<600) || error.code === 'ECONNABORTED';\n },\n});\nexport const retryRequest = async <T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>> => {\n try {\n const endpoints = getEndpoints();\n const token = getToken()\n retryInstance.defaults.baseURL = `${endpoints.back}`;\n\n retryInstance.defaults.headers.common['Appid'] = getAppid()\n if(token){\n retryInstance.defaults.headers.common['Authorization'] = token;\n }\n retryInstance.defaults.headers.common['Accept-Language'] = getLocale()\n\n\n const {data} = await retryInstance.request<MyResponseType<T>>(config);\n matchlog.log('api',data)\n if(data.code == 401001){\n localStore.getState().logout()\n throw new Error(\"Your session has expired, please log in again\")\n }\n // if (data.code !== 0) {\n // throw new Error(data.message);\n // }\n return data;\n } catch (err) {\n console.error('qwe-err', err);\n const message = 'Request Error';\n console.error(message);\n return {\n code: -1,\n data: null as any,\n message,\n success: false,\n fail: true,\n result: null as any,\n };\n }\n};\n\nexport default request;","import type {IEnvConfigType} from \"../../types/types\";\n\nexport default {\n endpoints:{\n back: \"https://api.matchid.ai/\",\n auth:\"https://auth.matchid.ai/\"\n }\n} as IEnvConfigType","import { localStore } from './useLocalStore';\nimport DefaultEnv from '../config/env';\nexport const getEndpoints = ()=>{\n try {\n const store = localStore.getState();\n\n const env = store?.endpoints;\n\n if (env) {\n return env;\n } else {\n return DefaultEnv.endpoints\n }\n } catch (e) {\n return DefaultEnv.endpoints\n }\n}\n\nexport const getAppid = () => {\n try {\n const store = localStore.getState();\n const appid = store?.appid;\n if (appid) {\n return appid;\n } else {\n return '';\n }\n } catch (e) {\n return '';\n }\n}\n\nexport const getLocale = () => {\n try {\n const store = localStore.getState();\n const locale = store?.locale;\n if (locale) {\n return locale;\n } else {\n return 'en';\n }\n } catch (e) {\n return 'en';\n }\n}\nexport const getToken = () => {\n try {\n const store = localStore.getState();\n const token = store?.token;\n if (token) {\n return token;\n } else {\n return '';\n }\n } catch (e) {\n return '';\n }\n}","// src/utils/logger.ts\nconst matchDevExists = () => localStorage.getItem('matchid-sdk-react-debug') !== null;\n\nconst handler = {\n get(target: any, prop: string) {\n if (matchDevExists() && typeof target[prop] === 'function') {\n return target[prop].bind(console);\n }\n return () => {};\n }\n};\n\nconst matchlog = new Proxy(console, handler);\n\nexport default matchlog;","import request, {retryRequest} from \"./request\";\nimport {\n AppConfigType,\n BindInfoType,\n BindItemType,\n BindWalletParam,\n MetaPageType,\n OverviewInfo,\n PohItemType,\n PohZkpassParams,\n UserAssetToken,\n UserChainType,\n UserImportTokenType,\n UserTransactionNextPageParams,\n UserTransactionType,\n WalletAssetType,\n WalletChainType, WalletNFTType\n} from \"../types/types\";\n\nexport const getEmailCodeApi = (email: string) => {\n return request<any>({\n url: `/api/v1/email/code`,\n method: \"POST\",\n data: {email}\n });\n}\n\nexport const verifyEmailCodeApi = ({email, verification_key, verification_code}: {\n email: string,\n verification_key: string,\n verification_code: string\n}) => {\n return request<any>({\n url: `/api/v1/user/email/login`,\n method: \"POST\",\n data: {email, verification_key, verification_code}\n });\n}\n\n\nexport const getOverviewInfoApi = () => {\n return retryRequest<OverviewInfo>({\n url: `/api/v1/user/overview`,\n method: \"GET\",\n });\n}\nexport const toLogoutApi = () => {\n return retryRequest<any>({\n url: `/api/v1/user/logout`,\n method: \"POST\",\n });\n}\n\nexport const setUserNameApi = (data: any) => {\n return request({\n url: `/api/v1/user/name`,\n method: \"POSt\",\n data\n });\n}\n\nexport const getBindListApi = () => {\n return retryRequest<BindItemType[]>({\n url: `/api/v1/bind/list`,\n method: \"GET\",\n });\n}\n\nexport const getPohListApi = () => {\n return retryRequest<PohItemType[]>({\n url: `/api/v1/poh/list`,\n method: \"GET\",\n });\n}\n\nexport const getBindInfoApi = () => {\n return retryRequest<BindInfoType>({\n url: `/api/v1/bind`,\n method: \"GET\",\n });\n}\n\n\nexport const bindCexApi = (data: {\n cex: string,\n api_key: string,\n api_secret: string,\n api_passphrase?: string\n}) => {\n return request<any>({\n url: `/api/v1/cex/subscribe`,\n method: \"POST\",\n data\n });\n}\n\n\nexport const unBindApi = ({type}: { type: string }) => {\n return request<any>({\n url: `/api/v1/unbind`,\n method: \"POST\",\n data: {type}\n });\n}\n\nexport const unBindWalletApi = ({address}: { address: string }) => {\n return request<any>({\n url: `/api/v1/wallet/unbind`,\n method: \"POST\",\n data: {address}\n });\n}\n\nexport const verifyPohApi = ({\n taskId,\n schemaId,\n publicFields,\n allocatorAddress,\n publicFieldsHash,\n allocatorSignature,\n uHash,\n validatorAddress,\n validatorSignature\n }: PohZkpassParams) => {\n return request<any>({\n url: `/api/v1/poh/zkpass`,\n method: \"POST\",\n data: {\n taskId,\n schemaId,\n publicFields,\n allocatorAddress,\n publicFieldsHash,\n allocatorSignature,\n uHash,\n validatorAddress,\n validatorSignature\n }\n });\n}\n\nexport const chooseIdentityApi = ({identity}: { identity: string }) => {\n return request<any>({\n url: `/api/v1/user/choose/identity`,\n method: \"POST\",\n data: {identity}\n });\n}\n\nexport const mintPassportNftApi = () => {\n return request<any>({\n url: `/api/v1/mint/passport/nft`,\n method: \"POST\",\n });\n}\n\nexport const getAuthInfoApi = () => {\n return retryRequest<any>({\n url: `/api/v1/user/auth`,\n method: \"GET\",\n });\n}\n\nexport const getWalletNonceApi = (data: { address: string, type: string }) => {\n return retryRequest<any>({\n url: `/api/v1/login/wallet/init`,\n method: \"POST\",\n data: data\n });\n}\n\nexport const loginByWalletApi = ({\n type,\n address,\n signature,\n message,\n connector_type,\n wallet_client_type\n }: BindWalletParam) => {\n return request<any>({\n url: `/api/v1/login/wallet`,\n method: \"POST\",\n data: {type, address, signature, message, connector_type, wallet_client_type}\n });\n}\n\n\nexport const getWalletInitApi = (data: { address: string, type: string }) => {\n return retryRequest<any>({\n url: `/api/v1/wallet/init`,\n method: \"POST\",\n data,\n });\n}\n\nexport const toBindWalletApi = ({\n type,\n address,\n signature,\n message,\n connector_type,\n wallet_client_type\n }: BindWalletParam) => {\n return request<any>({\n url: `/api/v1/wallet/bind`,\n method: \"POST\",\n data: {type, address, signature, message, connector_type, wallet_client_type}\n });\n}\n\nexport const getAppConfigApi = () => {\n return retryRequest<AppConfigType>({\n url: `/api/v1/app/config`,\n method: \"GET\",\n });\n}\n\nexport const getUserChainListApi = () => {\n return request<UserChainType[]>({\n url: `/api/v1/user/chain/list`,\n method: \"GET\",\n });\n}\n\nexport const userImportTokenApi = (data: {\n chain_id: string,\n symbol: string,\n address: string,\n decimals: string,\n}) => {\n return request<any>({\n url: `/api/v1/user/import/token`,\n method: \"POST\",\n data\n });\n}\nexport const getUserImportTokenListApi = (data: {\n chain_id: string\n}) => {\n return request<UserImportTokenType[]>({\n url: `/api/v1/user/import/token/list`,\n method: \"POST\",\n data\n });\n}\n\nexport const getUserWalletAssetApi = (data: {\n chain_id: string\n}) => {\n return request<UserAssetToken[]>({\n url: `/api/v1/user/wallet/asset`,\n method: \"POST\",\n data\n });\n}\n\nexport const getUserWalletTransactionsApi = (data: {\n address?: string\n chain_id: string\n page?: string\n block_number?:number\n index?:number\n items_count?:number\n}) => {\n return request<{\n transactions: UserTransactionType[]\n next_page_params:UserTransactionNextPageParams\n }>({\n url: `/api/v1/user/wallet/transactions`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletAssetListApi = (data: {\n chain_id: string\n address: string\n}) => {\n return request<{\n asset_list:WalletAssetType[]\n asset_total_balance:string\n }>({\n url: `/api/v1/wallet/asset`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletListApi = (data: {\n page: number\n page_size: number\n}) => {\n return request<MetaPageType<{\n wallet_list:{\n address:string\n chain_network:string\n }[]\n mpc_address:string\n }>>({\n url: `/api/v1/wallet/list`,\n method: \"POST\",\n data\n });\n}\n\nexport const getWalletChainListApi = () => {\n return request<WalletChainType[]>({\n url: `/api/v1/wallet/chain`,\n method: \"POST\",\n });\n}\n\nexport const getWalletNftListApi = (data:{\n chain_id:string\n address:string\n})=>{\n return request<WalletNFTType[]>({\n url: `/api/v1/wallet/nfts`,\n method: \"POST\",\n data\n });\n}\n\nexport const tgAppLoginInitApi = ()=>{\n return retryRequest<{\n code:string\n login_url:string\n }>({\n url: `/api/v1/tgapp/login/init`,\n method: \"GET\",\n });\n}\n\nexport const getTgAppLoginStatus = (data:{\n code:string\n})=>{\n return retryRequest<{\n access_token:string\n token_type:string\n }>({\n url: `/api/v1/tgapp/login/status`,\n method: \"POST\",\n data\n });\n}\n\nexport const userInviteApi = (data:{\n invite_code:string\n})=>{\n return request<any>({\n url: `/api/v1/user/invite`,\n method: \"POST\",\n data\n });\n}\n","import useLocalStore from \"../store/useLocalStore\";\nimport { useMemo } from \"react\";\nimport { CEXType, ISocialLoginMethod, LoginMethodType } from \"../types/types\";\nimport {\n getAuthInfoApi,\n getEmailCodeApi,\n getOverviewInfoApi,\n tgAppLoginInitApi,\n toLogoutApi, userInviteApi,\n verifyEmailCodeApi\n} from \"../api\";\nimport { isSuccess } from \"../api/request\";\nimport { useMatch } from \"../MatchContext\";\nimport eventManager from \"./eventManager\";\nimport { encodeBase64, isInTgApp } from \"../utils\";\nimport matchlog from \"../utils/matchlog\";\nimport {\n useBTCModalStore,\n useCEXBindModalStore,\n useEVMModalStore,\n useTONModalStore,\n useTRONModalStore, useWalletModalStore\n} from \"../store/useModalStore\";\nimport { LOGIN_METHOD_MAP } from \"../config\";\nimport useStore from \"../store/useStore\";\nimport { useDownMd } from \"./useLayout\";\n\nexport default function useUserInfo() {\n const {\n appid,\n token,\n mid,\n did,\n logout: logoutStore,\n setOverview,\n overview,\n address,\n endpoints,\n locale,\n refreshOverview,\n } = useLocalStore();\n const { setTgAppAuthCode, emailLoginKey, setEmailLoginKey } = useStore()\n const isDownMd = useDownMd()\n const { events, login } = useMatch()\n const { open: EVMOpen } = useEVMModalStore()\n const { open: TRONOpen } = useTRONModalStore()\n const { open: TONOpen } = useTONModalStore()\n const { open: BTCOpen } = useBTCModalStore()\n const { open: CEXBindOpen } = useCEXBindModalStore()\n const walletModalStore = useWalletModalStore()\n\n const getRedirectUri = () => {\n return encodeURIComponent(window.location.href)\n }\n\n\n const isLogin = useMemo(() => !!token && !!overview, [token, overview])\n\n const logout = async () => {\n try {\n await toLogoutApi()\n } catch (err: any) {\n console.error('logout', err)\n }\n\n logoutStore()\n events && events!.onLogout && events!.onLogout()\n eventManager.emit('onLogout');\n }\n\n const loginByMethod = async (method: ISocialLoginMethod) => {\n const link = `${endpoints.back}api/v1/auth/${method == 'youtube' ? 'google' : method}?appid=${appid}&provider=${method == 'youtube' ? 'google' : method}&redirect=${encodeURIComponent(endpoints.auth + 'login/' + method)}&authorization=${new Date().getTime()}${method == \"youtube\" ? '&auth_type=youtube' : ''}`;\n matchlog.log('link', link)\n return window.open(\n link, // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const loginByTwitter = () => {\n return loginByMethod('twitter')\n }\n const loginByGoogle = () => {\n return loginByMethod('google')\n }\n\n const loginByWallet = async () => {\n // return EVMOpen('login')\n return window.open(`${endpoints.auth}login/wallet?appid=${appid}&locale=${locale}`)\n\n }\n const loginByTelegram = async () => {\n if (isInTgApp()) {\n //get auth code\n try {\n const res = await tgAppLoginInitApi()\n if (!isSuccess(res)) {\n throw new Error(res.message)\n }\n setTgAppAuthCode(res.data.code)\n const link = res.data.login_url + `?startapp=${res.data.code}_${appid}_${locale}`\n console.log('tgAppLoginInitLink', link)\n if (window.TelegramWebviewProxy) {\n console.log('in telegram webview')\n if (!window.Telegram) {\n throw new Error('Please import telegram-web-app.js first')\n }\n window.Telegram.WebApp.openTelegramLink(link)\n return\n }\n console.log('not in telegram webview')\n window.open(link)\n return\n\n\n } catch (e: any) {\n console.error('tgAppLoginInitApi', e)\n throw e\n }\n }\n\n return window.open(\n `${endpoints.auth}login/telegram?appid=${appid}&locale=${locale}`, // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const loginMethod = async (method: LoginMethodType | 'wallet', extra?: {\n [key: string]: any\n }) => {\n switch (method) {\n case \"wallet\":\n return walletModalStore.open(\"login\", extra?.methods)\n case \"evm\":\n return EVMOpen('login')\n // return window.open(`${endpoints.auth}login/wallet?appid=${appid}&locale=${locale}`)\n case \"sol\":\n if (isDownMd) {\n return window.location.href = `${endpoints.auth}login/sol?appid=${appid}&locale=${locale}&redirect_uri=${getRedirectUri()}`\n }\n return window.open(`${endpoints.auth}login/sol?appid=${appid}&locale=${locale}`)\n case \"tron\":\n return TRONOpen('login')\n case \"ton\":\n return TONOpen('login')\n case \"btc\":\n return BTCOpen('login')\n case \"telegram\":\n return await loginByTelegram()\n case \"youtube\":\n case \"twitter\":\n case \"google\":\n case \"discord\":\n case \"github\":\n case \"linkedin\":\n case \"kakao\":\n case \"facebook\":\n return await loginByMethod(method)\n default:\n throw new Error('unsupported method')\n\n }\n }\n\n\n const getLoginEmailCode = async (email: string) => {\n const res = await getEmailCodeApi(email);\n if (isSuccess(res)) {\n setEmailLoginKey(res.data.key)\n // window.sessionStorage.setItem('loginkey', res.data.key as string)\n return res.data.key as string\n }\n throw new Error(res.message)\n }\n\n const loginByEmail = async ({\n email,\n code\n }: { email: string, code: string }) => {\n try {\n const obj = {\n email: email,\n verification_key: emailLoginKey,\n verification_code: code,\n }\n const res = await verifyEmailCodeApi(obj);\n if (res && res.data && isSuccess(res)) {\n await login({\n // mid: res.data.mid,\n token: `${res.data.token_type} ${res.data.access_token}`\n })\n return true;\n\n } else {\n throw new Error(res.message)\n }\n } catch (error) {\n console.error('loginByEmail', error);\n throw error\n }\n return false\n };\n\n\n const bindWallet = async () => {\n if (!token) {\n throw new Error('You must login first')\n }\n return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)))\n }\n\n const bindTelegram = async () => {\n if (!token) {\n throw new Error('You must login first')\n }\n const authWindow = window.open(\n `${endpoints.auth}bind/telegram?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)), // Replace with the actual authorization URL\n 'authWindow',\n 'width=800,height=600'\n );\n }\n\n const auth = async () => {\n const res = await getAuthInfoApi()\n if (isSuccess(res)) {\n return res.data\n }\n throw new Error(res.message)\n }\n\n const bind = async (method: LoginMethodType | 'wallet', extra?: {\n [key: string]: any\n }) => {\n if (!token) {\n throw new Error('You must login first')\n }\n switch (method) {\n case \"wallet\":\n return walletModalStore.open(\"bind\", extra?.methods)\n case \"evm\":\n return EVMOpen('bind')\n // return window.open(`${endpoints.auth}bind/wallet?appid=${appid}&locale=${locale}&st=` + encodeURIComponent(encodeBase64(token)))\n case \"sol\":\n if (isDownMd) {\n return window.location.href = `${endpoints.auth}bind/sol?appid=${appid}&locale=${locale}&st=${encodeURIComponent(encodeBase64(token))}&redirect_uri=${getRedirectUri()}`\n }\n return window.open(`${endpoints.auth}bind/sol?appid=${appid}&locale=${locale}&st=${encodeURIComponent(encodeBase64(token))}`)\n case \"tron\":\n return TRONOpen('bind')\n case \"ton\":\n return TONOpen('bind')\n case \"btc\":\n return BTCOpen('bind')\n case \"telegram\":\n return await bindTelegram()\n case \"twitter\":\n case \"google\":\n case \"discord\":\n case \"github\":\n case \"linkedin\":\n case \"facebook\":\n case \"youtube\":\n const link = `${endpoints.back}api/v1/auth/${method == 'youtube' ? 'google' : method}?appid=${appid}&provider=${method == 'youtube' ? 'google' : method}&redirect=${encodeURIComponent(endpoints.auth + 'bind/' + method)}&authorization=${token.includes(\"Bearer \") ? token.split(' ')[1] : token}${method == \"youtube\" ? '&auth_type=youtube' : ''}`;\n matchlog.log('link', link)\n return window.open(\n link,\n 'authWindow',\n 'width=800,height=600'\n );\n default:\n throw new Error('unsupported method')\n\n }\n }\n\n const bindCex = (type: CEXType) => {\n return CEXBindOpen(type)\n }\n\n const getAuthInfo = async (method: keyof typeof LOGIN_METHOD_MAP) => {\n // create a full screen iframe to get the auth info\n const element_id = 'auth_iframe'\n //if the iframe already exists, remove it\n if (document.getElementById(element_id)) {\n document.getElementById(element_id)!.remove()\n }\n const iframe = document.createElement('iframe')\n iframe.id = element_id\n iframe.src = `${endpoints.auth}auth?appid=${appid}&method=${method}&locale=${locale}&token=${encodeURIComponent(encodeBase64(token))}`\n iframe.style.width = '100vw'\n iframe.style.height = '100vh'\n iframe.style.position = 'fixed'\n iframe.style.top = '0'\n iframe.style.left = '0'\n iframe.style.zIndex = '9999'\n iframe.style.border = 'none'\n //@ts-ignore\n iframe.allowTransparency = 'true'\n document.body.appendChild(iframe)\n return new Promise((resolve, reject) => {\n const authMessageHandle = (event: MessageEvent) => {\n if (endpoints.auth.includes(event.origin)) {\n const res = event.data\n if (res.source == 'match-auth') {\n window.removeEventListener('message', authMessageHandle)\n if (res.status == 'success') {\n resolve({\n ...res.data,\n method: res.method,\n appid: res.appid,\n did\n })\n } else {\n reject(new Error(res.message))\n }\n\n iframe.remove()\n }\n }\n }\n window.addEventListener('message', authMessageHandle)\n })\n }\n\n const invite = async (invite_code: string) => {\n return await userInviteApi({\n invite_code\n })\n }\n\n\n return {\n loginByMethod,\n loginByTelegram,\n loginByTwitter,\n loginByGoogle,\n loginByWallet,\n loginByEmail,\n\n bindWallet,\n bindTelegram,\n\n\n token,\n mid,\n did,\n address,\n isLogin,\n logout,\n getLoginEmailCode,\n refreshOverview,\n overview,\n bindCex,\n username: overview?.username || '',\n auth,\n\n login: loginMethod,\n bind,\n\n getAuthInfo,\n invite\n }\n}","// src/MatchContext.tsx\nimport React, {createContext, useContext, ReactNode, useEffect} from 'react';\nimport Providers from './context';\nimport {IEnvConfigType, IMatchEvents, LocaleType, WalletConfigType} from \"./types/types\";\nimport useWalletInit from \"hooks/useWalletInit\"\nimport useInit from \"./hooks/useInit\";\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {IntlProvider} from 'react-intl';\nimport {messages} from \"./i18n\"\nimport {getDefaultConfig, RainbowKitProvider} from \"@rainbow-me/rainbowkit\";\nimport {\n bitgetWallet,\n injectedWallet,\n metaMaskWallet,\n okxWallet,\n walletConnectWallet\n} from \"@rainbow-me/rainbowkit/wallets\";\nimport {arbitrum, base, bsc, mainnet, optimism, polygon} from \"wagmi/chains\";\nimport {matchMain} from \"./config/chains/MatchMain\";\nimport {matchTest} from \"./config/chains/MatchTest\";\nimport {WagmiProvider} from \"wagmi\";\n\nconst queryClient = new QueryClient();\nexport const wagmiConfig = getDefaultConfig({\n appName: \"MatchID\",\n projectId: \"9ac6ea7e07860f04616fb311b447dee9\",\n wallets: [\n {\n groupName: \"Recommended\",\n wallets: [\n metaMaskWallet,\n walletConnectWallet,\n okxWallet,\n bitgetWallet,\n injectedWallet,\n ],\n },\n ],\n chains: [mainnet, polygon, optimism, arbitrum, base, matchMain, matchTest, bsc],\n});\ntype MatchContextType = {\n appid: string;\n events?: IMatchEvents;\n login: (data: { token: string }) => Promise<voi