diff --git a/packages/hooks/hooks-eoa/cms/banner.ts b/packages/hooks/hooks-eoa/cms/banner.ts new file mode 100644 index 0000000000..beae5cb91e --- /dev/null +++ b/packages/hooks/hooks-eoa/cms/banner.ts @@ -0,0 +1,100 @@ +import { useCallback, useEffect, useMemo } from 'react'; +import { useAppEOASelector } from '../index'; +import { + TBaseCardItemType, + THomeBannerList, + TDiscoverDappBannerList, + TDiscoverLearnBannerList, +} from '@portkey-wallet/types/types-ca/cms'; +import { useCurrentNetworkInfo, useNetworkList } from '../network'; +import { ChainId } from '@portkey-wallet/types'; +import { useAppCommonDispatch } from '../..'; +import { + getDiscoverDappBannerAsync, + getDiscoverLearnBannerAsync, + getHomeBannerListAsync, + getTokenDetailBannerAsync, +} from '@portkey-wallet/store/store-ca/cms/actions'; + +export const useCMS = () => useAppEOASelector(state => state.cms); + +export const useCmsBanner = () => { + const dispatch = useAppCommonDispatch(); + const { networkType } = useCurrentNetworkInfo(); + + const { homeBannerListMap, discoverDappBannerListMap, discoverLearnBannerListMap, tokenDetailBannerListMap } = + useCMS(); + + const homeBannerList = useMemo( + () => homeBannerListMap?.[networkType] || [], + [homeBannerListMap, networkType], + ); + + const dappBannerList = useMemo( + () => discoverDappBannerListMap?.[networkType] || [], + [discoverDappBannerListMap, networkType], + ); + + const learnBannerList = useMemo( + () => discoverLearnBannerListMap?.[networkType] || [], + [discoverLearnBannerListMap, networkType], + ); + + const getTokenDetailBannerList = useCallback( + (chainId: ChainId, symbol: string): TBaseCardItemType[] => { + return ( + tokenDetailBannerListMap?.[networkType]?.find( + ele => + ele.chainId?.toLocaleLowerCase() === chainId?.toLocaleLowerCase() && + ele.symbol?.toLocaleLowerCase() === symbol?.toLocaleLowerCase(), + )?.items || [] + ); + }, + [networkType, tokenDetailBannerListMap], + ); + + const fetchHomeBannerListAsync = useCallback( + () => dispatch(getHomeBannerListAsync(networkType)), + [dispatch, networkType], + ); + + const fetchDiscoverDappBannerAsync = useCallback( + () => dispatch(getDiscoverDappBannerAsync(networkType)), + [dispatch, networkType], + ); + + const fetchTokenDetailBannerAsync = useCallback( + () => dispatch(getTokenDetailBannerAsync(networkType)), + [dispatch, networkType], + ); + + const fetchDiscoverLearnBannerAsync = useCallback( + () => dispatch(getDiscoverLearnBannerAsync(networkType)), + [dispatch, networkType], + ); + + return { + homeBannerList, + dappBannerList, + learnBannerList, + getTokenDetailBannerList, + fetchHomeBannerListAsync, + fetchDiscoverDappBannerAsync, + fetchTokenDetailBannerAsync, + fetchDiscoverLearnBannerAsync, + }; +}; + +export const useInitCmsBanner = () => { + const dispatch = useAppCommonDispatch(); + const networkList = useNetworkList(); + + useEffect(() => { + networkList.forEach(item => { + dispatch(getTokenDetailBannerAsync(item.networkType)); + dispatch(getHomeBannerListAsync(item.networkType)); + dispatch(getDiscoverDappBannerAsync(item.networkType)); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); +}; diff --git a/packages/hooks/hooks-eoa/cms/discover.ts b/packages/hooks/hooks-eoa/cms/discover.ts new file mode 100644 index 0000000000..afc2a0ce27 --- /dev/null +++ b/packages/hooks/hooks-eoa/cms/discover.ts @@ -0,0 +1,89 @@ +import { useCallback, useEffect, useMemo } from 'react'; +import { useAppEOASelector } from '../index'; +import { TDiscoverTabList, TDiscoverLearnGroupList, TDiscoverEarnList } from '@portkey-wallet/types/types-ca/cms'; +import { useAppCommonDispatch } from '../..'; +import { useCurrentNetworkInfo, useNetworkList } from '../network'; +import { + getDiscoverEarnAsync, + getDiscoverLearnAsync, + getDiscoverTabAsync, + getDappWhiteListAsync, +} from '@portkey-wallet/store/store-ca/cms/actions'; + +const DEFAULT_DISCOVER_TAB_LIST: TDiscoverTabList = [{ index: 2, name: 'Market', value: 'Market' }]; + +export const useCMS = () => useAppEOASelector(state => state.cms); + +export const useDiscoverData = () => { + const dispatch = useAppCommonDispatch(); + const { networkType } = useCurrentNetworkInfo(); + const { discoverTabListMap, discoverEarnListMap, discoverLearnGroupListMap } = useCMS(); + + const discoverHeaderTabList = useMemo(() => { + if (!discoverTabListMap?.[networkType] || discoverTabListMap?.[networkType]?.length === 0) + return DEFAULT_DISCOVER_TAB_LIST; + + return discoverTabListMap?.[networkType] || DEFAULT_DISCOVER_TAB_LIST; + }, [discoverTabListMap, networkType]); + + const earnList = useMemo( + () => discoverEarnListMap?.[networkType] || [], + [discoverEarnListMap, networkType], + ); + + const learnGroupList = useMemo( + () => discoverLearnGroupListMap?.[networkType] || [], + [discoverLearnGroupListMap, networkType], + ); + const learnShortGroupList = useMemo(() => { + const learnGroupList = discoverLearnGroupListMap?.[networkType] || []; + return learnGroupList.map(group => ({ + ...group, + items: group.items?.slice(0, 4), + })); + }, [discoverLearnGroupListMap, networkType]); + + const fetchDiscoverTabAsync = useCallback(() => dispatch(getDiscoverTabAsync(networkType)), [dispatch, networkType]); + + const fetchDiscoverEarnAsync = useCallback( + () => dispatch(getDiscoverEarnAsync(networkType)), + [dispatch, networkType], + ); + + const fetchDiscoverLearnAsync = useCallback( + () => dispatch(getDiscoverLearnAsync(networkType)), + [dispatch, networkType], + ); + return { + discoverHeaderTabList, + earnList, + learnGroupList, + learnShortGroupList, + fetchDiscoverTabAsync, + fetchDiscoverEarnAsync, + fetchDiscoverLearnAsync, + }; +}; + +export const useInitCMSDiscoverNewData = () => { + const dispatch = useAppCommonDispatch(); + const networkList = useNetworkList(); + + useEffect(() => { + networkList.forEach(item => { + dispatch(getDiscoverTabAsync(item.networkType)); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); +}; + +export const useInitDappWhiteListData = () => { + const dispatch = useAppCommonDispatch(); + const networkList = useNetworkList(); + useEffect(() => { + networkList.forEach(item => { + dispatch(getDappWhiteListAsync(item.networkType)); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); +}; diff --git a/packages/hooks/hooks-eoa/cms/index.ts b/packages/hooks/hooks-eoa/cms/index.ts new file mode 100644 index 0000000000..de3d93655b --- /dev/null +++ b/packages/hooks/hooks-eoa/cms/index.ts @@ -0,0 +1,331 @@ +import { useCallback, useEffect, useMemo } from 'react'; +import { useAppCommonDispatch, useAppEOASelector, useEffectOnce } from '../../index'; +import { useCurrentNetworkInfo, useNetworkList } from '@portkey-wallet/hooks/hooks-eoa/network'; +import { + getDiscoverGroupAsync, + getSocialMediaAsync, + getRememberMeBlackListAsync, + getTabMenuAsync, + setEntrance, + getLoginControlListAsync, +} from '@portkey-wallet/store/store-eoa/cms/actions'; +import { getFaviconUrl, getOrigin } from '@portkey-wallet/utils/dapp/browser'; +import { checkSiteIsInBlackList } from '@portkey-wallet/utils/session'; +import { DEFAULT_ENTRANCE_SHOW, generateEntranceShow, getEntrance } from './util'; +import { IEntranceItem, IEntranceMatchValueConfig } from '@portkey-wallet/types/types-eoa/cms'; +import { NetworkType } from '@portkey-wallet/types'; + +export const useCMS = () => useAppEOASelector(state => state.cms); + +export function useTabMenuList(isInit = false) { + const dispatch = useAppCommonDispatch(); + const { tabMenuListNetMap } = useCMS(); + const { networkType } = useCurrentNetworkInfo(); + const networkList = useNetworkList(); + + const tabMenuList = useMemo(() => tabMenuListNetMap[networkType] || [], [networkType, tabMenuListNetMap]); + + useEffect(() => { + if (isInit) { + networkList.forEach(item => { + dispatch(getTabMenuAsync(item.networkType)); + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (!isInit) { + dispatch(getTabMenuAsync(networkType)); + } + }, [dispatch, isInit, networkType]); + + return tabMenuList; +} + +export function useSocialMediaList(isInit = false) { + const dispatch = useAppCommonDispatch(); + const { socialMediaListNetMap } = useCMS(); + const { networkType } = useCurrentNetworkInfo(); + const networkList = useNetworkList(); + + const socialMediaList = useMemo(() => socialMediaListNetMap[networkType] || [], [networkType, socialMediaListNetMap]); + + useEffect(() => { + if (isInit) { + networkList.forEach(item => { + dispatch(getSocialMediaAsync(item.networkType)); + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (!isInit) { + dispatch(getSocialMediaAsync(networkType)); + } + }, [dispatch, isInit, networkType]); + + return socialMediaList; +} + +export function useDiscoverGroupList(isInit = false) { + const dispatch = useAppCommonDispatch(); + const { discoverGroupListNetMap } = useCMS(); + const { networkType } = useCurrentNetworkInfo(); + const networkList = useNetworkList(); + + const discoverGroupList = useMemo( + () => discoverGroupListNetMap[networkType] || [], + [networkType, discoverGroupListNetMap], + ); + + useEffect(() => { + if (isInit) { + networkList.forEach(item => { + dispatch(getDiscoverGroupAsync(item.networkType)); + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (!isInit) { + dispatch(getDiscoverGroupAsync(networkType)); + } + }, [dispatch, isInit, networkType]); + + return discoverGroupList || []; +} + +export const useEntrance = (config: IEntranceMatchValueConfig, isInit = false) => { + const dispatch = useAppCommonDispatch(); + const { entranceNetMap } = useCMS(); + const { networkType } = useCurrentNetworkInfo(); + const networkList = useNetworkList(); + + const entrance = useMemo( + () => ({ + ...DEFAULT_ENTRANCE_SHOW, + ...entranceNetMap?.[networkType], + }), + [networkType, entranceNetMap], + ); + + const refresh = useCallback( + async (network?: NetworkType) => { + const _entranceList = (await getEntrance(network || networkType)) as IEntranceItem[]; + const _entrance = await generateEntranceShow(config, _entranceList || []); + dispatch( + setEntrance({ + network: network || networkType, + value: _entrance, + }), + ); + return _entrance; + }, + [config, dispatch, networkType], + ); + + useEffectOnce(() => { + if (isInit) { + networkList.forEach(item => { + refresh(item.networkType); + }); + } + }); + + useEffectOnce(() => { + if (!isInit) { + refresh(); + } + }); + + return { + entrance, + refresh, + }; +}; + +export const useETransShow = (config: IEntranceMatchValueConfig) => { + const { entrance, refresh } = useEntrance(config); + const { eTransferUrl } = useCurrentNetworkInfo(); + + const isETransDepositShow = useMemo(() => !!entrance.eTransDeposit, [entrance.eTransDeposit]); + + const isETransWithdrawShow = useMemo( + () => !!(entrance.eTransWithdraw && eTransferUrl), + [eTransferUrl, entrance.eTransWithdraw], + ); + + const isETransShow = useMemo( + () => isETransDepositShow || isETransWithdrawShow || false, + [isETransDepositShow, isETransWithdrawShow], + ); + + const refreshETrans = useCallback(async () => { + let _isETransDepositShow = false; + let _isETransWithdrawShow = false; + try { + const result = await refresh(); + _isETransDepositShow = result.eTransDeposit; + _isETransWithdrawShow = result.eTransWithdraw; + } catch (error) { + console.log('refreshBuyButton error'); + } + + return { + isETransDepositShow: _isETransDepositShow, + isETransWithdrawShow: _isETransWithdrawShow, + }; + }, [refresh]); + + return { + isETransShow, + isETransDepositShow, + isETransWithdrawShow, + refreshETrans, + }; +}; +export const useBridgeButtonShow = (config: IEntranceMatchValueConfig) => { + const { entrance } = useEntrance(config); + const isBridgeShow = useMemo(() => entrance?.bridge, [entrance.bridge]); + + return { + isBridgeShow, + }; +}; + +export const useFreeMintShow = (config: IEntranceMatchValueConfig) => { + const { entrance } = useEntrance(config); + const isFreeMintNftShow = useMemo(() => entrance?.freeMintNft, [entrance.freeMintNft]); + + return { + isFreeMintNftShow, + }; +}; +export const useNFTTabShow = (config: IEntranceMatchValueConfig) => { + const { entrance } = useEntrance(config); + const isNFTTabShow = useMemo(() => entrance?.nft, [entrance.nft]); + + return { + isNFTTabShow, + }; +}; +export const useSwapButtonShow = (config: IEntranceMatchValueConfig) => { + const { entrance } = useEntrance(config); + const isSwapShow = useMemo(() => entrance?.swap, [entrance.swap]); + + return { + isSwapShow, + }; +}; + +export const useRememberMeBlackList = (isInit = false) => { + const dispatch = useAppCommonDispatch(); + const { rememberMeBlackListMap } = useCMS(); + const { networkType } = useCurrentNetworkInfo(); + const networkList = useNetworkList(); + + const rememberMeBlackList = useMemo( + () => rememberMeBlackListMap?.[networkType]?.map(ele => ele?.url) || [], + [networkType, rememberMeBlackListMap], + ); + + useEffect(() => { + if (isInit) { + networkList.forEach(item => { + dispatch(getRememberMeBlackListAsync(item.networkType)); + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (!isInit) { + dispatch(getRememberMeBlackListAsync(networkType)); + } + }, [dispatch, isInit, networkType]); + + return rememberMeBlackList || []; +}; + +export const useFetchCurrentRememberMeBlackList = () => { + const dispatch = useAppCommonDispatch(); + const { networkType } = useCurrentNetworkInfo(); + + return useCallback(() => { + dispatch(getRememberMeBlackListAsync(networkType)); + }, [dispatch, networkType]); +}; + +export const useCheckSiteIsInBlackList = () => { + const list = useRememberMeBlackList(); + return useCallback((url: string) => checkSiteIsInBlackList(list, getOrigin(url)), [list]); +}; + +export const useGetCmsWebsiteInfo = () => { + const { cmsWebsiteMap } = useCMS(); + const { s3Url } = useCurrentNetworkInfo(); + + const getCmsWebsiteInfoImageUrl = useCallback( + (domain: string): string => { + const target = cmsWebsiteMap?.[domain]; + + // if in cms + if (target?.imgUrl?.filename_disk) return `${s3Url}/${target?.imgUrl?.filename_disk}`; + + return getFaviconUrl(domain); + }, + [cmsWebsiteMap, s3Url], + ); + + const getCmsWebsiteInfoName = useCallback((domain: string) => cmsWebsiteMap?.[domain]?.title || '', [cmsWebsiteMap]); + + return { + getCmsWebsiteInfoImageUrl, + getCmsWebsiteInfoName, + }; +}; + +export const useGetLoginControlListAsync = () => { + const dispatch = useAppCommonDispatch(); + const networkList = useNetworkList(); + return useCallback(async () => { + try { + await dispatch(getLoginControlListAsync(networkList.map(item => item.networkType))); + } catch (error) { + console.log(error, '======error'); + } + }, [dispatch, networkList]); +}; + +export const useLoginModeControlList = (forceUpdate?: boolean) => { + const { loginModeListMap } = useCMS(); + const { networkType } = useCurrentNetworkInfo(); + + const getLoginControlListAsync = useGetLoginControlListAsync(); + const dispatch = useAppCommonDispatch(); + + useEffect(() => { + if (forceUpdate) { + getLoginControlListAsync(); + } + }, [dispatch, getLoginControlListAsync, forceUpdate]); + + return { + loginModeListMap, + currentNetworkLoginModeList: loginModeListMap?.[networkType], + }; +}; + +export const useGetS3ImageUrl = () => { + const { s3Url } = useCurrentNetworkInfo(); + + return useCallback( + (filename_disk: string) => { + return `${s3Url}/${filename_disk}`; + }, + [s3Url], + ); +}; diff --git a/packages/hooks/hooks-eoa/cms/util.ts b/packages/hooks/hooks-eoa/cms/util.ts new file mode 100644 index 0000000000..54db7a4b75 --- /dev/null +++ b/packages/hooks/hooks-eoa/cms/util.ts @@ -0,0 +1,259 @@ +import { + IEntranceItem, + IEntranceMatchKey, + IEntranceMatchRuleType, + IEntranceMatchValueConfig, + IEntranceMatchValueMap, + IEntranceModuleName, + IEntrance, + IBaseEntranceItem, + ILoginModeItem, + TLoginModeIndexKey, + TLoginModeRecommendKey, + IMatchListItem, + TLink, + TLinkType, +} from '@portkey-wallet/types/types-eoa/cms'; +import BigNumber from 'bignumber.js'; +import { getEntrance as getEntranceGraphQL, getCodePushControl } from '@portkey-wallet/graphql/cms/queries'; +import { NetworkType } from '@portkey-wallet/types'; +import { VersionDeviceType } from '@portkey-wallet/types/types-eoa/device'; +import { isExtension } from '@portkey-wallet/utils'; +import 'query-string'; + +const createEntranceMatchRule = (type: IEntranceMatchRuleType, params: string): any => { + switch (type) { + case 'String': + return new String(params); + case 'BigNumber': + return new BigNumber(params); + case 'Regex': + return new RegExp(params); + default: + return {}; + } +}; + +export const DEFAULT_ENTRANCE_SHOW: IEntrance = { + bridge: false, + eTransDeposit: false, + eTransWithdraw: false, + swap: false, + freeMintNft: false, + nft: false, +}; + +const checkIsEntranceShow: any = ( + item: IBaseEntranceItem, + matchValueMap: IEntranceMatchValueMap, + keyName: keyof IMatchListItem = 'entranceMatch_id', +) => { + const { defaultSwitch, matchList } = item; + + let matchValue = defaultSwitch; + + if (matchList?.length === 0) return defaultSwitch; + + for (let i = 0; i < matchList.length; i++) { + const ele = matchList[i]; + const { matchRuleList, matchSwitch } = ele[keyName] || {}; + + if (!matchRuleList && !matchSwitch) return defaultSwitch; + + if (!Array.isArray(matchRuleList) || matchRuleList.length === 0) continue; + + const isMatch = matchRuleList.every(rule => { + const { type, left, opt, right: matchKey } = rule; + const matchRule = createEntranceMatchRule(type as IEntranceMatchRuleType, left); + const matchValue = matchValueMap[matchKey as IEntranceMatchKey]; + + if (matchRule[opt] && matchValue !== undefined) { + return matchRule[opt](matchValue); + } + return false; + }); + + if (isMatch) { + matchValue = !!matchSwitch; + break; + } + } + + return matchValue; +}; + +export const generateMatchValueMap = async (config: IEntranceMatchValueConfig) => { + const matchValueMap: IEntranceMatchValueMap = {}; + for (const key in config) { + if (Object.prototype.hasOwnProperty.call(config, key)) { + const value = config[key as IEntranceMatchKey]; + if (typeof value === 'function') { + try { + matchValueMap[key as IEntranceMatchKey] = await value(); + } catch (error) { + console.log('Entrance: generate config error', error); + } + } + if (typeof value === 'string') matchValueMap[key as IEntranceMatchKey] = value; + } + } + return matchValueMap; +}; + +export const generateEntranceShow = async ( + config: IEntranceMatchValueConfig, + entranceList: IEntranceItem[], +): Promise => { + const matchValueMap = await generateMatchValueMap(config); + + const entranceShow: IEntrance = { ...DEFAULT_ENTRANCE_SHOW }; + + (Object.keys(entranceShow) as Array).forEach(moduleName => { + const entranceStrategy = entranceList.find(ele => ele.moduleName.value === moduleName); + if (!entranceStrategy) return; + entranceShow[moduleName] = checkIsEntranceShow(entranceStrategy, matchValueMap); + }); + + return entranceShow; +}; + +export const getEntrance = async (networkType: NetworkType) => { + const result = await getEntranceGraphQL(networkType, { + filter: { + entranceMatch_id: { + status: { + _eq: 'published', + }, + }, + }, + sort: '-entranceMatch_id.weight', + }); + if (result.data.entrance) { + return result.data.entrance; + } + throw new Error('getEntrance error'); +}; + +export const getCmsCodePoshControl = async ({ + version, + label, + networkType, + isIOS, +}: { + version: string; + label: string; + networkType: NetworkType; + isIOS: boolean; +}) => { + const result = await getCodePushControl(networkType, { + filter: { + _and: [{ label: { _icontains: label } }, { label: { _icontains: isIOS ? 'iOS' : 'android' } }], + version: { _eq: version }, + status: { _eq: 'published' }, + }, + }); + + if (!result?.data?.codePushControl?.[0]) throw new Error('getCmsCodePoshControl error'); + + return result?.data?.codePushControl?.[0]; +}; + +const LoginModeKeys = { + [VersionDeviceType.Android]: 'android', + [VersionDeviceType.Extension]: 'extension', + [VersionDeviceType.iOS]: 'iOS', +}; + +export const parseLoginModeList = ( + loginModeList: ILoginModeItem[], + matchValueMap: IEntranceMatchValueMap, + deviceType: VersionDeviceType, +) => { + const key = LoginModeKeys[deviceType]; + const indexKey = `${key}Index` as TLoginModeIndexKey; + + return loginModeList + .filter(item => checkIsEntranceShow(item, matchValueMap, 'loginModeMatch_id')) + .sort((a, b) => (a[indexKey] as number) - (b[indexKey] as number)); +}; + +export const sortLoginModeListToAll = (loginModeList: ILoginModeItem[], deviceType: VersionDeviceType) => { + const key = LoginModeKeys[deviceType]; + const indexKey = `${key}Index` as TLoginModeIndexKey; + return loginModeList.sort((a, b) => a[indexKey] - b[indexKey]); +}; + +export const filterLoginModeListToRecommend = (loginModeList: ILoginModeItem[], deviceType: VersionDeviceType) => { + const key = LoginModeKeys[deviceType]; + const recommendKey = `${key}Recommend` as TLoginModeRecommendKey; + const indexKey = `${key}Index` as TLoginModeIndexKey; + + return loginModeList.filter(item => item[recommendKey]).sort((a, b) => a[indexKey] - b[indexKey]); +}; + +export const filterLoginModeListToOther = (loginModeList: ILoginModeItem[], deviceType: VersionDeviceType) => { + const key = LoginModeKeys[deviceType]; + const recommendKey = `${key}Recommend` as TLoginModeRecommendKey; + const indexKey = `${key}Index` as TLoginModeIndexKey; + + return loginModeList.filter(item => !item[recommendKey]).sort((a, b) => a[indexKey] - b[indexKey]); +}; + +export function parseLink(link?: string, defaultUrl?: string): TLink { + try { + console.log('parseLink===', link, 'defaultUrl', defaultUrl); + const realLink = link?.trim(); + if (!realLink) { + return { + type: isExtension() ? 'external' : 'internal', + location: defaultUrl || '', + params: {}, + }; + } + const protocolMatch = realLink.match(/^portkey:\/\/(external|internal|native)\?/); + const type = protocolMatch ? (protocolMatch[1] as TLinkType) : 'external'; // default is external + + const queryString = realLink.split('?')[1] || ''; + const queryParams = queryString.split('&').reduce((acc, current) => { + const [key, value] = current.split('='); + if (key && value) { + acc[key] = decodeURIComponent(value); + } + return acc; + }, {} as { [key: string]: string }); + const location = queryParams['location'] || ''; + const paramsObj = Object.keys(queryParams).reduce((acc, key) => { + if (key !== 'location') { + acc[key] = queryParams[key]; + } + return acc; + }, {} as { [key: string]: string }); + let params; + if (isExtension()) { + params = paramsObj.params; + } else { + try { + params = JSON.parse(paramsObj.params); + } catch (e) { + params = {}; + } + } + console.log('parseLink===result', { + type, + location, + params, + }); + return { + type, + location, + params, + }; + } catch (e) { + console.error('parseLink failed', e); + return { + type: isExtension() ? 'external' : 'internal', + location: defaultUrl || '', + params: {}, + }; + } +} diff --git a/packages/hooks/hooks-eoa/dapp.ts b/packages/hooks/hooks-eoa/dapp.ts new file mode 100644 index 0000000000..4283bfc51e --- /dev/null +++ b/packages/hooks/hooks-eoa/dapp.ts @@ -0,0 +1,132 @@ +import { useMemo, useCallback } from 'react'; +import AElf from 'aelf-sdk'; +import { useAppCommonDispatch, useAppEOASelector } from '../index'; +import { updateSessionInfo } from '@portkey-wallet/store/store-eoa/dapp/actions'; +import { useCurrentNetwork, useCurrentNetworkInfo } from './network'; +import { NetworkType } from '@portkey-wallet/types'; +import { SessionExpiredPlan, SessionInfo } from '@portkey-wallet/types/session'; +import { formatExpiredTime, signSession } from '@portkey-wallet/utils/session'; +import { AElfWallet } from '@portkey-wallet/types/aelf'; +import { getRawParams } from '@portkey-wallet/utils/dapp/decodeTx'; +import { useCurrentChainList } from './chainList'; +export const useDapp = () => useAppEOASelector(state => state.dapp); + +export const useCurrentDappList = () => { + const { dappMap } = useDapp(); + const currentNetwork = useCurrentNetwork(); + return useMemo(() => { + return dappMap[currentNetwork]; + }, [currentNetwork, dappMap]); +}; + +export const useIsInCurrentDappList = () => { + const list = useCurrentDappList(); + + return useCallback( + (origin: string): boolean => { + return !!list?.some(ele => ele.origin === origin.trim()); + }, + [list], + ); +}; + +export const useCurrentDappInfo = (origin: string) => { + const list = useCurrentDappList(); + return useMemo(() => list?.find(item => item.origin === origin), [list, origin]); +}; + +export const useUpdateSessionInfo = () => { + const dispatch = useAppCommonDispatch(); + const { networkType } = useCurrentNetworkInfo(); + // const { caHash } = useCurrentWalletInfo(); + return useCallback( + (params: { networkType?: NetworkType; origin: string; expiredPlan?: SessionExpiredPlan; manager?: AElfWallet }) => { + // if (!caHash) return; + let sessionInfo: SessionInfo | undefined = undefined; + if (params.expiredPlan) { + const { manager, expiredPlan } = params; + if (!manager?.keyPair) return; + const expiredTime = formatExpiredTime(expiredPlan); + + // TODO caHash change what + const baseSession = { + origin: params.origin, + expiredPlan, + expiredTime, + keyPair: manager.keyPair, + managerAddress: manager.address, + // caHash, + }; + + const signature = signSession(baseSession); + sessionInfo = { + createTime: Date.now(), + signature, + expiredPlan, + expiredTime, + }; + } + if (params.manager) delete params.manager; + return dispatch( + updateSessionInfo({ + ...params, + networkType: params.networkType || networkType, + sessionInfo, + }), + ); + }, + [dispatch, networkType], + ); +}; + +export function useDecodeTx() { + const currentChainList = useCurrentChainList(); + const getDecodedTxData = useCallback( + async (raw: string) => { + const instanceList = currentChainList + ?.map(item => { + if (item?.endPoint) { + return new AElf(new AElf.providers.HttpProvider(item.endPoint)); + } + return null; + }) + .filter(instance => instance !== null); + if (!instanceList || instanceList.length === 0) { + throw new Error('No valid instances found'); + } + const promises = instanceList?.map(instance => getRawParams(instance, raw)); + if (!promises || promises.length === 0) { + throw new Error('Failed to decode transaction on all chains'); + } + function promiseAny(promises: Promise[]): Promise { + return new Promise((resolve, reject) => { + const errors: any[] = []; + let pending = promises.length; + if (pending === 0) { + return reject('All promises were rejected'); + } + promises.forEach((promise, index) => { + Promise.resolve(promise) + .then(resolve) + .catch(error => { + errors[index] = error; + pending -= 1; + if (pending === 0) { + reject('All promises were rejected'); + } + }); + }); + }); + } + try { + const res = await promiseAny(promises); + return res; + } catch (error) { + console.error('All promises failed:', error); + throw new Error('Failed to decode transaction on all chains'); + } + }, + [currentChainList], + ); + return getDecodedTxData; +} diff --git a/packages/mobile-aelf/js/assets/image/svgs.js b/packages/mobile-aelf/js/assets/image/svgs.js index 2f23a2713f..d49f50fc28 100644 --- a/packages/mobile-aelf/js/assets/image/svgs.js +++ b/packages/mobile-aelf/js/assets/image/svgs.js @@ -1,2 +1,2 @@ /* eslint-disable prettier/prettier */ -export default {'Chain=AELF Main':'\n\n\n\n','Chain=AELF Side':'\n\n\n\n\n\n\n\n\n','Chain=Arbitrum':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Avalanche':'\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Base':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Binance':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Ethereum':'\n\n\n\n\n\n\n\n\n','Chain=Flow':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Moonbeam':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Optimism':'\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Polkadot':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Polygon':'\n\n\n\n\n\n\n\n\n','Chain=Solana':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=TON':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Testnet':'\n\n\n\n\n','Chain=Tron':'\n\n\n\n','Contract':'\n\n\n\n\n','ELF':'\n\n\n','ETransfer':'\n\n\n','ETransferLogo':'\n\n\n\n\n\n\n\n\n\n\n','accessory':'\n\n\n','activity-fail':'\n\n\n\n\n\n\n','activity-mined':'\n\n\n\n\n\n\n','activity-pending':'\n\n\n\n\n\n\n\n\n\n','activity':'\n\n\n\n','add-contact':'\n\n\n\n\n\n\n','add-contact1':'\n \n','add-tab':'\n\n\n','add':'\n\n\n','add1':'\n\n\n\n\n\n\n','add2':'\n\n ymquiytxjt\n \n \n \n \n \n \n \n \n \n \n \n \n \n','add3':'\n\n wivmphxoms\n \n \n \n \n \n \n \n \n','add4':'\n\n\n','album':'\n\n epepouhbdw\n \n \n \n \n \n \n \n \n','allowance-delete':'\n \n','app-blue-logo':'\n\n\n\n','app-logo-new':'\n\n\n\n','apple-icon':'\n\n\n\n\n\n','apple-white':'\n\n\n','apple':'\n\n\n\n','arrow-down-thin':'\n\n\n\n\n','arrow-left':'\n\n\n','arrow-right-thin':'\n\n\n\n\n','arrow-right':'\n\n\n','awaken-swap-round':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','awaken-swap':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','awakenLogo':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','bingoGame':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','block-back':'\n\n\n','book-mark-fill':'\n\n\n','book-mark':'\n\n\n','bookmark':'\n\n\n\n','bookmarked':'\n\n\n\n','buy':'\n\n\n\n\n','buy1':'\n\n\n\n','buy2':'\n\n\n\n','camera':'\n\n\n\n\n','chain_Logos':'\n\n\n\n\n\n\n','chain_side':'\n\n\n\n\n\n\n\n\n','change':'\n\n\n','chat-add-contact':'\n\n\n','chat-add-member':'\n\n\n','chat-add':'\n\n\n','chat-added':'\n\n\n','chat-album':'\n\n\n\n\n','chat-block':'cg\n\n\n','chat-bookmark':'\n\n\n','chat-camera':'\n\n\n\n','chat-chat':'\n\n\n','chat-create-group':'\n\n\n\n\n\n','chat-delete-emoji':'\n\n\n\n\n','chat-delete':'\n\n\n','chat-emoji':'\n\n\n\n\n\n','chat-file':'\n\n\n\n\n\n\n\n\n\n\n\n','chat-find-more':'\n\n\n\n','chat-group-avatar-header':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-group-avatar-small-logo':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-group-avatar':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-group-info':'\n\n\n\n\n\n','chat-keyboard':'\n\n\n\n\n\n\n\n\n\n\n\n','chat-leave-group':'\n\n\n\n\n','chat-mute':'\n\n\n','chat-new-chat':'\n\n\n','chat-pin':'\n\n\n','chat-profile':'\n\n\n\n\n','chat-qr-code':'\n\n\n','chat-remove-member':'\n\n\n','chat-reply':'\n\n\n','chat-report':'\n\n\n','chat-reshutter':'\n\n\n\n\n','chat-robot':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-scroll-to-bottom':'\n\n\n\n','chat-send':'\n\n\n','chat-shutter':'\n\n\n\n','chat-tab':'\n\n\n','chat-transfer':'\n\n\n\n\n','chat-unmute':'\n\n\n\n\n','chat-unpin':'\n\n\n\n\n','chat-unsupported-channel':'\n\n\n\n\n\n\n\n\n\n\n\n','check-circle':'\n\n\n\n\n','check-false':'\n\n fzoykpdoyh\n \n \n \n \n \n \n \n','check-true':'\n\n mbcnnswjqh\n \n \n \n \n \n \n \n \n \n \n','check':'\n\n\n','checkUpdate':'\n\n\n\n\n\n\n','checkbox-Checked':'\n\n\n\n\n\n\n\n\n\n\n','checkbox-new':'\n\n\n','checkbox':'\n\n\n\n\n\n\n','checked':'\n\n\n','checked_circle':'\n\n\n\n\n','chevron-right':'\n \n','chevron_down':'\n\n\n\n\n','chevron_right':'\n\n\n','chevron_right2':'\n\n\n','clear':'\n\n qzqvrhcbqn\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','clear1':'\n\n pgqcjmcbit\n \n \n \n \n \n \n \n \n','clear2':'\n\n oinrqzcjps\n \n \n \n \n \n \n \n \n \n \n \n \n','clear3':'\n\n\n','clear4':'\n\n\n\n','clock':'\n\n\n','close-red-packet':'\n\n\n\n\n','close':'\n\n tqsruqxgrb\n \n \n \n \n \n \n \n \n','close1':'\n\n ozresgjsts\n \n \n \n \n \n \n \n \n \n \n','close2':'\n\n yyybesklsg\n \n \n \n \n \n \n \n \n \n \n','close3':'\n\n\n','close4':'\n\n\n\n\n','close_thick':'\n\n\n\n\n','collect':'\n\n\n','collected':'\n\n\n','contact':'\n\n ymwllfkfjj\n \n \n \n \n \n \n \n \n \n \n \n \n \n','contact2':'\n\n mkokwgrdlj\n \n \n \n \n \n \n \n \n \n \n','copy-checked':'\n\n\n\n','copy-pre':'\n\n\n\n','copy-thin':'\n\n\n\n\n','copy':'\n\n\n\n\n','copy1':'\n\n\n\n','copy3':'\n\n\n','copy_v2':'\n\n\n\n\n','crypto-box-with-border':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','crypto-gift':'\n\n\n\n\n','default_record':'\n\n\n\n\n','delete-image2':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','delete-img':'\n\n\n\n\n\n\n\n\n\n\n\n\n','delete-mint':'\n\n\n\n\n','delete':'\n\n\n','deposit-receive':'\n\n\n\n','deposit':'\n\n\n\n','deposit1':'\n\n\n\n','depositMain':'\n\n\n\n','deposit_status_failed':'\n\n\n','deposit_status_processing':'\n\n\n','deposit_status_success':'\n\n\n','desk-mac':'\n\n desk_mac\n \n \n \n \n \n \n \n \n \n \n','desk-win':'\n\n wnusftfmuc\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','direction-arrow-right':'\n\n\n\n\n\n\n','direction-right':'\n\n\n','direction-up':'\n\n\n','direction_down':'\n\n\n\n\n','disabled_visible':'\n\n\n','discord':'\n\n\n','discover':'\n\n\n\n','discover_close':'\n\n\n\n\n','down-arrow':'\n\n\n','drag':'\n\n\n\n','eBridge':'\n\n\n\n\n\n\n\n\n\n\n\n','eBridgeFavIcon':'\n\n\n\n\n\n','eBridgeLogo':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','edit':'\n\n\n','edit1':'\n \n','edit_thin':'\n\n\n\n\n','edit_token':'\n\n\n\n\n\n\n','elf-icon':'\n\n\n\n\n','email-login':'\n\n\n','email-white':'\n\n\n\n\n\n\n\n\n\n','email':'\n\n\n\n\n\n\n\n\n\n','error':'\n\n\n\n\n','explore':'\n\n\n','external':'\n \n','eye':'\n\n\n\n\n','eyeClosed':'\n\n\n\n\n','face-id':'\n\n\n','facebook-icon':'\n\n\n\n\n\n\n\n\n\n\n\n','facebook-white':'\n\n\n','facebook':'\n\n\n','fail':'\n\n gjgrrybzwe\n \n \n \n \n \n \n','faucet':'\n\n\n\n\n\n\n\n\n\n','favorite-disable':'\n\n\n','favorite-unselected':'\n\n\n','favorite':'\n\n\n','filter-top':'\n\n\n','filter':'\n\n\n','finish':'\n\n sytkvvhtjm\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','forest':'\n\n\n\n','free-mint-entry':'\n\n\n\n\n','gear':'\n\n\n\n\n','gift-box-close':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','gift-box-open':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','gift-thin':'\n\n\n\n\n','gift':'\n\n\n\n\n','gift_thin':'\n\n\n\n\n','google-drive':'\n\n\n\n\n\n\n\n','google-icon':'\n\n\n\n\n\n\n\n','google':'\n\n\n\n\n\n','grid':'\n\n\n\n\n','guardian-apple':'\n\n\n\n\n','guardian-email':'\n\n\n\n\n\n\n\n\n\n\n','guardian-facebook':'\n\n\n\n\n','guardian-google':'\n\n\n\n\n\n\n','guardian-phone':'\n\n\n\n\n\n\n\n\n\n\n','guardian':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','guardians-telegram':'\n\n\n\n\n\n\n\n\n\n\n\n','guardians-x':'\n\n\n\n\n','help-gray':'\n\n\n\n\n','help-white':'\n\n\n\n\n','help':'\n\n\n\n\n','history':'\n\n\n','home':'\n\n\n','homepage':'\n\n\n','httpWarn':'\n\n\n\n\n','httpsLock':'\n\n\n\n\n\n\n','iCloud':'\n\n\n\n\n\n\n\n\n','image-loading':'\n\n\n\n\n\n\n','import':'\n\n cfqdrgpdnt\n \n \n \n \n \n \n \n \n','info-white':'\n\n\n\n\n','info':'\n\n\n\n\n','inport':'\n\n\n','inviteFriend':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','keyboard_arrow_down':'\n\n\n','left-arrow-v2':'\n\n\n','left-arrow':'\n\n\n','lock-gift':'\n\n\n\n\n','lock':'\n\n\n','lock_security':'\n\n\n\n\n','logo-icon-text':'\n\n\n\n\n\n\n\n\n\n','logo-icon':'\n\n\n','logo-text':'\n\n zjqebghwfq\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','logout':'\n\n\n\n\n','luckiest':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','mainnet':'\n\n\n\n','master1':'\n\n master1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master2':'\n\n master2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master3':'\n\n master3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master4':'\n\n master4\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master5':'\n\n master5\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master6':'\n\n master6\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','mintFail':'\n\n\n\n','minted':'\n\n\n\n','more-circle':'\n\n\n','more-info':'\n\n\n\n\n','more-vertical':'\n\n\n','more':'\n\n\n','more_normal':'\n\n\n\n','more_selected':'\n\n\n\n','more_verti':'\n\n\n\n\n','my-avatar':'\n\n\n','my-pin':'\n\n\n\n\n','my':'\n\n\n','my_about':'\n\n\n\n\n','my_auto_lock':'\n\n\n\n\n','my_biometric':'\n\n\n\n\n','my_change':'\n\n\n\n\n','my_connect':'\n\n\n\n\n','my_contact':'\n\n\n','my_device':'\n\n\n','my_guardians':'\n\n\n','my_help':'\n\n\n','my_mail_thin':'\n\n\n','my_pin':'\n\n\n\n\n','my_referral':'\n\n\n','my_token allowance':'\n\n\n','my_transaction_limit':'\n\n\n','my_update':'\n\n\n','no-bookmarks':'\n\n\n\n\n\n','no-data-detail':'\n\n\n\n\n\n\n\n\n','no-data-nft':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','no-data':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','no-message':'\n\n\n\n\n\n\n\n','no-records':'\n\n\n\n\n\n','no-result':'\n\n nsgwxrxohh\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','officialGroup':'\n\n\n\n\n\n\n\n\n\n\n','paste':'\n\n\n','phone-Android':'\n\n phone_Android\n \n \n \n \n \n \n \n \n \n \n','phone-iOS':'\n\n phone_iOS\n \n \n \n \n \n \n \n \n \n \n','phone':'\n\n\n','photo':'\n\n\n\n\n','pin-list-icon':'\n\n\n','pin-message':'\n\n\n','privacy-policy':'\n\n\n\n\n\n','private key':'\n\n\n','profile':'\n\n\n\n\n','qrCode-white':'\n\n\n','question-mark':'\n\n uhxdjnzjyz\n \n \n \n \n \n \n \n \n','question-mark2':'\n\n\n','question':'\n\n\n','receive':'\n\n\n\n\n\n\n\n\n\n','receive1':'\n\n\n\n','recovery phrase':'\n\n\n','red-delete':'\n\n\n','red-packet-opened':'\n\n\n\n\n\n\n\n','red-packet':'\n\n\n\n\n\n','referral':'\n\n\n\n\n\n','refresh':'\n\n wxwmniiwhr\n \n \n \n \n \n \n \n \n \n \n','refresh1':'\n\n\n\n\n','reload':'\n\n glmbgniwte\n \n \n \n \n \n \n \n \n \n \n \n','remove':'\n \n','right-arrow':'\n\n\n','right-arrow2':'\n\n right02\n \n \n \n \n \n \n \n \n','rows':'\n\n\n\n\n','scan-frame':'\n\n vzbmmmilfr\n \n \n \n \n \n \n \n \n \n \n','scan-square':'\n\n\n\n\n\n\n\n','scan':'\n\n\n\n\n','search':'\n\n\n','selected':'\n\n\n','selected2':'\n\n sdcfxhevmq\n \n \n \n \n \n \n \n \n \n \n','selected3':'\n\n a a a\n \n \n \n \n \n \n \n \n \n \n \n \n','selected4':'\n\n\n','selected5':'\n\n\n','sell':'\n\n\n\n\n\n\n\n\n\n\n','send-red-packet-button':'\n\n\n\n\n','send-small':'\n\n\n\n\n','send-thin':'\n\n\n\n\n','send':'\n\n\n\n\n','send1':'\n\n\n\n','setting':'\n\n rokdjfskko\n \n \n \n \n \n \n \n \n \n','setting2':'\n\n jjtrxyphxg\n \n \n \n \n \n \n \n \n \n \n \n \n','settings':'\n\n\n','settingsAboutUs':'\n\n zqlgqdoeve\n \n \n \n \n \n \n \n \n \n \n \n \n','settingsAddressBook':'\n\n qgmvghoedy\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','settingsHelp':'\n\n zqoxrydqmd\n \n \n \n \n \n \n \n \n \n \n \n \n \n','settingsNetworks':'\n\n otxgxofwcv\n \n \n \n \n \n \n \n \n \n \n \n \n \n','settingsSecurity':'\n\n hqqhptctxw\n \n \n \n \n \n \n \n \n \n \n','settingsSetting':'\n\n vuuzuuyxty\n \n \n \n \n \n \n \n \n \n \n \n \n','share-gift':'\n\n\n\n\n','share-thin':'\n\n\n','share':'\n\n\n\n\n\n','share2':'\n\n\n\n\n\n\n','sideChain':'\n\n\n\n\n\n\n\n\n','side_chain':'\n\n\n\n\n\n\n','social-recovery':'\n\n cjrewsnkts\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','solid-down-arrow':'\n\n\n','sort-asc':'\n\n\n','sort-desc':'\n\n\n','star':'\n\n\n','success':'\n\n gxszmwdsui\n \n \n \n \n \n \n','suggest-add':'\n\n\n','suggest-circle':'\n\n\n\n\n\n\n','suggest-close':'\n\n\n','swap-arrow':'\n\n\n\n\n','swap-thin':'\n\n\n\n\n','swap':'\n\n\n\n\n','switch':'\n\n\n','telegram-blue':'\n\n\n','telegram-mono':'\n\n\n\n\n\n\n\n\n\n','telegram-white':'\n\n\n\n\n\n\n\n\n\n','telegram':'\n\n\n\n\n\n\n\n\n\n\n','terms':'\n\n\n\n\n\n','testnet':'\n\n\n\n\n','third-party-gate-io':'\n\n\n\n\n\n\n\n\n\n\n','time':'\n\n\n\n','token_list_item_right':'\n\n\n\n\n\n\n','touch-id':'\n\n\n\n','trade-small':'\n\n\n','trade':'\n\n\n\n\n\n\n\n\n\n','transfer-preview':'\n\n\n\n\n','transfer-receive':'\n\n iyvgjvxgxm\n \n \n \n \n \n \n \n \n \n \n \n \n','transfer-send':'\n\n uonrsgnbug\n \n \n \n \n \n \n \n \n \n \n \n','transfer':'\n\n xpkknuehvy\n \n \n \n \n \n \n \n \n \n \n \n \n \n','trend':'\n\n\n','tune':'\n\n\n','twitter-icon':'\n\n\n\n\n','twitter-white':'\n\n\n','twitter':'\n\n\n','unselected':'\n\n\n','up-arrow':'\n\n up\n \n \n \n \n \n \n \n \n','upload-avatar-button':'\n\n\n\n\n\n\n\n\n\n\n','upload':'\n\n\n\n\n','usdt-icon':'\n\n\n\n\n\n','vector-right':'\n\n\n','visa':'\n\n\n','visibility':'\n\n\n','visibility_lock':'\n\n\n','visibility_off':'\n\n\n','wallet-gray':'\n\n\n','wallet-security':'\n\n\n\n\n\n','wallet':'\n\n bfzjdifnru\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','wallet_fill':'\n\n\n','warning-fill':'\n\n\n\n\n','warning':'\n\n\n','warning1':'\n\n\n','warning2':'\n\n\n','warning3':'\n\n\n','warning_v2':'\n\n\n\n\n','withdraw':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','zklogin_watermark':'\n\n\n\n\n'}; +export default {'Chain=AELF Main':'\n\n\n\n','Chain=AELF Side':'\n\n\n\n\n\n\n\n\n','Chain=Arbitrum':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Avalanche':'\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Base':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Binance':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Ethereum':'\n\n\n\n\n\n\n\n\n','Chain=Flow':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Moonbeam':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Optimism':'\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Polkadot':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Polygon':'\n\n\n\n\n\n\n\n\n','Chain=Solana':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=TON':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','Chain=Testnet':'\n\n\n\n\n','Chain=Tron':'\n\n\n\n','Contract':'\n\n\n\n\n','ELF':'\n\n\n','ETransfer':'\n\n\n','ETransferLogo':'\n\n\n\n\n\n\n\n\n\n\n','accessory':'\n\n\n','activity-fail':'\n\n\n\n\n\n\n','activity-mined':'\n\n\n\n\n\n\n','activity-pending':'\n\n\n\n\n\n\n\n\n\n','activity':'\n\n\n\n','add-contact':'\n\n\n\n\n\n\n','add-contact1':'\n \n','add-tab':'\n\n\n','add':'\n\n\n','add1':'\n\n\n\n\n\n\n','add2':'\n\n ymquiytxjt\n \n \n \n \n \n \n \n \n \n \n \n \n \n','add3':'\n\n wivmphxoms\n \n \n \n \n \n \n \n \n','add4':'\n\n\n','album':'\n\n epepouhbdw\n \n \n \n \n \n \n \n \n','allowance-delete':'\n \n','app-blue-logo':'\n\n\n\n','app-logo-new':'\n\n\n\n\n\n\n\n','apple-icon':'\n\n\n\n\n\n','apple-white':'\n\n\n','apple':'\n\n\n\n','arrow-down-thin':'\n\n\n\n\n','arrow-left':'\n\n\n','arrow-right-thin':'\n\n\n\n\n','arrow-right':'\n\n\n','awaken-swap-round':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','awaken-swap':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','awakenLogo':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','bingoGame':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','block-back':'\n\n\n','book-mark-fill':'\n\n\n','book-mark':'\n\n\n','bookmark':'\n\n\n\n','bookmarked':'\n\n\n\n','buy':'\n\n\n\n\n','buy1':'\n\n\n\n','buy2':'\n\n\n\n','camera':'\n\n\n\n\n','chain_Logos':'\n\n\n\n\n\n\n','chain_side':'\n\n\n\n\n\n\n\n\n','change':'\n\n\n','chat-add-contact':'\n\n\n','chat-add-member':'\n\n\n','chat-add':'\n\n\n','chat-added':'\n\n\n','chat-album':'\n\n\n\n\n','chat-block':'cg\n\n\n','chat-bookmark':'\n\n\n','chat-camera':'\n\n\n\n','chat-chat':'\n\n\n','chat-create-group':'\n\n\n\n\n\n','chat-delete-emoji':'\n\n\n\n\n','chat-delete':'\n\n\n','chat-emoji':'\n\n\n\n\n\n','chat-file':'\n\n\n\n\n\n\n\n\n\n\n\n','chat-find-more':'\n\n\n\n','chat-group-avatar-header':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-group-avatar-small-logo':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-group-avatar':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-group-info':'\n\n\n\n\n\n','chat-keyboard':'\n\n\n\n\n\n\n\n\n\n\n\n','chat-leave-group':'\n\n\n\n\n','chat-mute':'\n\n\n','chat-new-chat':'\n\n\n','chat-pin':'\n\n\n','chat-profile':'\n\n\n\n\n','chat-qr-code':'\n\n\n','chat-remove-member':'\n\n\n','chat-reply':'\n\n\n','chat-report':'\n\n\n','chat-reshutter':'\n\n\n\n\n','chat-robot':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','chat-scroll-to-bottom':'\n\n\n\n','chat-send':'\n\n\n','chat-shutter':'\n\n\n\n','chat-tab':'\n\n\n','chat-transfer':'\n\n\n\n\n','chat-unmute':'\n\n\n\n\n','chat-unpin':'\n\n\n\n\n','chat-unsupported-channel':'\n\n\n\n\n\n\n\n\n\n\n\n','check-circle':'\n\n\n\n\n','check-false':'\n\n fzoykpdoyh\n \n \n \n \n \n \n \n','check-true':'\n\n mbcnnswjqh\n \n \n \n \n \n \n \n \n \n \n','check':'\n\n\n','checkUpdate':'\n\n\n\n\n\n\n','checkbox-Checked':'\n\n\n\n\n\n\n\n\n\n\n','checkbox-new':'\n\n\n','checkbox':'\n\n\n\n\n\n\n','checked':'\n\n\n','checked_circle':'\n\n\n\n\n','chevron-right':'\n \n','chevron_down':'\n\n\n\n\n','chevron_right':'\n\n\n','chevron_right2':'\n\n\n','clear':'\n\n qzqvrhcbqn\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','clear1':'\n\n pgqcjmcbit\n \n \n \n \n \n \n \n \n','clear2':'\n\n oinrqzcjps\n \n \n \n \n \n \n \n \n \n \n \n \n','clear3':'\n\n\n','clear4':'\n\n\n\n','clock':'\n\n\n','close-red-packet':'\n\n\n\n\n','close':'\n\n tqsruqxgrb\n \n \n \n \n \n \n \n \n','close1':'\n\n ozresgjsts\n \n \n \n \n \n \n \n \n \n \n','close2':'\n\n yyybesklsg\n \n \n \n \n \n \n \n \n \n \n','close3':'\n\n\n','close4':'\n\n\n\n\n','close_thick':'\n\n\n\n\n','collect':'\n\n\n','collected':'\n\n\n','contact':'\n\n ymwllfkfjj\n \n \n \n \n \n \n \n \n \n \n \n \n \n','contact2':'\n\n mkokwgrdlj\n \n \n \n \n \n \n \n \n \n \n','copy-checked':'\n\n\n\n','copy-pre':'\n\n\n\n','copy-thin':'\n\n\n\n\n','copy':'\n\n\n\n\n','copy1':'\n\n\n\n','copy3':'\n\n\n','copy_v2':'\n\n\n\n\n','crypto-box-with-border':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','crypto-gift':'\n\n\n\n\n','default_record':'\n\n\n\n\n','delete-image2':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','delete-img':'\n\n\n\n\n\n\n\n\n\n\n\n\n','delete-mint':'\n\n\n\n\n','delete':'\n\n\n','deposit-receive':'\n\n\n\n','deposit':'\n\n\n\n','deposit1':'\n\n\n\n','depositMain':'\n\n\n\n','deposit_status_failed':'\n\n\n','deposit_status_processing':'\n\n\n','deposit_status_success':'\n\n\n','desk-mac':'\n\n desk_mac\n \n \n \n \n \n \n \n \n \n \n','desk-win':'\n\n wnusftfmuc\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','direction-arrow-right':'\n\n\n\n\n\n\n','direction-right':'\n\n\n','direction-up':'\n\n\n','direction_down':'\n\n\n\n\n','disabled_visible':'\n\n\n','discord':'\n\n\n','discover':'\n\n\n\n','discover_close':'\n\n\n\n\n','down-arrow':'\n\n\n','drag':'\n\n\n\n','eBridge':'\n\n\n\n\n\n\n\n\n\n\n\n','eBridgeFavIcon':'\n\n\n\n\n\n','eBridgeLogo':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','edit':'\n\n\n','edit1':'\n \n','edit_thin':'\n\n\n\n\n','edit_token':'\n\n\n\n\n\n\n','elf-icon':'\n\n\n\n\n','email-login':'\n\n\n','email-white':'\n\n\n\n\n\n\n\n\n\n','email':'\n\n\n\n\n\n\n\n\n\n','error':'\n\n\n\n\n','explore':'\n\n\n','external':'\n \n','eye':'\n\n\n\n\n','eyeClosed':'\n\n\n\n\n','face-id':'\n\n\n','facebook-icon':'\n\n\n\n\n\n\n\n\n\n\n\n','facebook-white':'\n\n\n','facebook':'\n\n\n','fail':'\n\n gjgrrybzwe\n \n \n \n \n \n \n','faucet':'\n\n\n\n\n\n\n\n\n\n','favorite-disable':'\n\n\n','favorite-unselected':'\n\n\n','favorite':'\n\n\n','filter-top':'\n\n\n','filter':'\n\n\n','finish':'\n\n sytkvvhtjm\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','forest':'\n\n\n\n','free-mint-entry':'\n\n\n\n\n','gear':'\n\n\n\n\n','gift-box-close':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','gift-box-open':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','gift-thin':'\n\n\n\n\n','gift':'\n\n\n\n\n','gift_thin':'\n\n\n\n\n','google-drive':'\n\n\n\n\n\n\n\n','google-icon':'\n\n\n\n\n\n\n\n','google':'\n\n\n\n\n\n','grid':'\n\n\n\n\n','guardian-apple':'\n\n\n\n\n','guardian-email':'\n\n\n\n\n\n\n\n\n\n\n','guardian-facebook':'\n\n\n\n\n','guardian-google':'\n\n\n\n\n\n\n','guardian-phone':'\n\n\n\n\n\n\n\n\n\n\n','guardian':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','guardians-telegram':'\n\n\n\n\n\n\n\n\n\n\n\n','guardians-x':'\n\n\n\n\n','help-gray':'\n\n\n\n\n','help-white':'\n\n\n\n\n','help':'\n\n\n\n\n','history':'\n\n\n','home':'\n\n\n','homepage':'\n\n\n','httpWarn':'\n\n\n\n\n','httpsLock':'\n\n\n\n\n\n\n','iCloud':'\n\n\n\n\n\n\n\n\n','image-loading':'\n\n\n\n\n\n\n','import':'\n\n cfqdrgpdnt\n \n \n \n \n \n \n \n \n','info-white':'\n\n\n\n\n','info':'\n\n\n\n\n','inport':'\n\n\n','inviteFriend':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','keyboard_arrow_down':'\n\n\n','left-arrow-v2':'\n\n\n','left-arrow':'\n\n\n','lock-gift':'\n\n\n\n\n','lock':'\n\n\n','lock_security':'\n\n\n\n\n','logo-icon-text':'\n\n\n\n\n\n\n\n\n\n','logo-icon':'\n\n\n','logo-text':'\n\n zjqebghwfq\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','logout':'\n\n\n\n\n','luckiest':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n','mainnet':'\n\n\n\n','master1':'\n\n master1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master2':'\n\n master2\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master3':'\n\n master3\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master4':'\n\n master4\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master5':'\n\n master5\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','master6':'\n\n master6\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','mintFail':'\n\n\n\n','minted':'\n\n\n\n','more-circle':'\n\n\n','more-info':'\n\n\n\n\n','more-vertical':'\n\n\n','more':'\n\n\n','more_normal':'\n\n\n\n','more_selected':'\n\n\n\n','more_verti':'\n\n\n\n\n','my-avatar':'\n\n\n','my-pin':'\n\n\n\n\n','my':'\n\n\n','my_about':'\n\n\n\n\n','my_auto_lock':'\n\n\n\n\n','my_biometric':'\n\n\n\n\n','my_change':'\n\n\n\n\n','my_connect':'\n\n\n\n\n','my_contact':'\n\n\n','my_device':'\n\n\n','my_guardians':'\n\n\n','my_help':'\n\n\n','my_mail_thin':'\n\n\n','my_pin':'\n\n\n\n\n','my_referral':'\n\n\n','my_token allowance':'\n\n\n','my_transaction_limit':'\n\n\n','my_update':'\n\n\n','no-bookmarks':'\n\n\n\n\n\n','no-data-detail':'\n\n\n\n\n\n\n\n\n','no-data-nft':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','no-data':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','no-message':'\n\n\n\n\n\n\n\n','no-records':'\n\n\n\n\n\n','no-result':'\n\n nsgwxrxohh\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','officialGroup':'\n\n\n\n\n\n\n\n\n\n\n','paste':'\n\n\n','phone-Android':'\n\n phone_Android\n \n \n \n \n \n \n \n \n \n \n','phone-iOS':'\n\n phone_iOS\n \n \n \n \n \n \n \n \n \n \n','phone':'\n\n\n','photo':'\n\n\n\n\n','pin-list-icon':'\n\n\n','pin-message':'\n\n\n','privacy-policy':'\n\n\n\n\n\n','private key':'\n\n\n','profile':'\n\n\n\n\n','qrCode-white':'\n\n\n','question-mark':'\n\n uhxdjnzjyz\n \n \n \n \n \n \n \n \n','question-mark2':'\n\n\n','question':'\n\n\n','receive':'\n\n\n\n\n\n\n\n\n\n','receive1':'\n\n\n\n','recovery phrase':'\n\n\n','red-delete':'\n\n\n','red-packet-opened':'\n\n\n\n\n\n\n\n','red-packet':'\n\n\n\n\n\n','referral':'\n\n\n\n\n\n','refresh':'\n\n wxwmniiwhr\n \n \n \n \n \n \n \n \n \n \n','refresh1':'\n\n\n\n\n','reload':'\n\n glmbgniwte\n \n \n \n \n \n \n \n \n \n \n \n','remove':'\n \n','right-arrow':'\n\n\n','right-arrow2':'\n\n right02\n \n \n \n \n \n \n \n \n','rows':'\n\n\n\n\n','scan-frame':'\n\n vzbmmmilfr\n \n \n \n \n \n \n \n \n \n \n','scan-square':'\n\n\n\n\n\n\n\n','scan':'\n\n\n\n\n','search':'\n\n\n','selected':'\n\n\n','selected2':'\n\n sdcfxhevmq\n \n \n \n \n \n \n \n \n \n \n','selected3':'\n\n a a a\n \n \n \n \n \n \n \n \n \n \n \n \n','selected4':'\n\n\n','selected5':'\n\n\n','sell':'\n\n\n\n\n\n\n\n\n\n\n','send-red-packet-button':'\n\n\n\n\n','send-small':'\n\n\n\n\n','send-thin':'\n\n\n\n\n','send':'\n\n\n\n\n','send1':'\n\n\n\n','setting':'\n\n rokdjfskko\n \n \n \n \n \n \n \n \n \n','setting2':'\n\n jjtrxyphxg\n \n \n \n \n \n \n \n \n \n \n \n \n','settings':'\n\n\n','settingsAboutUs':'\n\n zqlgqdoeve\n \n \n \n \n \n \n \n \n \n \n \n \n','settingsAddressBook':'\n\n qgmvghoedy\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','settingsHelp':'\n\n zqoxrydqmd\n \n \n \n \n \n \n \n \n \n \n \n \n \n','settingsNetworks':'\n\n otxgxofwcv\n \n \n \n \n \n \n \n \n \n \n \n \n \n','settingsSecurity':'\n\n hqqhptctxw\n \n \n \n \n \n \n \n \n \n \n','settingsSetting':'\n\n vuuzuuyxty\n \n \n \n \n \n \n \n \n \n \n \n \n','share-gift':'\n\n\n\n\n','share-thin':'\n\n\n','share':'\n\n\n\n\n\n','share2':'\n\n\n\n\n\n\n','sideChain':'\n\n\n\n\n\n\n\n\n','side_chain':'\n\n\n\n\n\n\n','social-recovery':'\n\n cjrewsnkts\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','solid-down-arrow':'\n\n\n','sort-asc':'\n\n\n','sort-desc':'\n\n\n','star':'\n\n\n','success':'\n\n gxszmwdsui\n \n \n \n \n \n \n','suggest-add':'\n\n\n','suggest-circle':'\n\n\n\n\n\n\n','suggest-close':'\n\n\n','swap-arrow':'\n\n\n\n\n','swap-thin':'\n\n\n\n\n','swap':'\n\n\n\n\n','switch':'\n\n\n','telegram-blue':'\n\n\n','telegram-mono':'\n\n\n\n\n\n\n\n\n\n','telegram-white':'\n\n\n\n\n\n\n\n\n\n','telegram':'\n\n\n\n\n\n\n\n\n\n\n','terms':'\n\n\n\n\n\n','testnet':'\n\n\n\n\n','third-party-gate-io':'\n\n\n\n\n\n\n\n\n\n\n','time':'\n\n\n\n','token_list_item_right':'\n\n\n\n\n\n\n','touch-id':'\n\n\n\n','trade-small':'\n\n\n','trade':'\n\n\n\n\n\n\n\n\n\n','transfer-preview':'\n\n\n\n\n','transfer-receive':'\n\n iyvgjvxgxm\n \n \n \n \n \n \n \n \n \n \n \n \n','transfer-send':'\n\n uonrsgnbug\n \n \n \n \n \n \n \n \n \n \n \n','transfer':'\n\n xpkknuehvy\n \n \n \n \n \n \n \n \n \n \n \n \n \n','trend':'\n\n\n','tune':'\n\n\n','twitter-icon':'\n\n\n\n\n','twitter-white':'\n\n\n','twitter':'\n\n\n','unselected':'\n\n\n','up-arrow':'\n\n up\n \n \n \n \n \n \n \n \n','upload-avatar-button':'\n\n\n\n\n\n\n\n\n\n\n','upload':'\n\n\n\n\n','usdt-icon':'\n\n\n\n\n\n','vector-right':'\n\n\n','visa':'\n\n\n','visibility':'\n\n\n','visibility_lock':'\n\n\n','visibility_off':'\n\n\n','wallet-gray':'\n\n\n','wallet-security':'\n\n\n\n\n\n','wallet':'\n\n bfzjdifnru\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n','wallet_fill':'\n\n\n','warning-fill':'\n\n\n\n\n','warning':'\n\n\n','warning1':'\n\n\n','warning2':'\n\n\n','warning3':'\n\n\n','warning_v2':'\n\n\n\n\n','withdraw':'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n','zklogin_watermark':'\n\n\n\n\n'}; diff --git a/packages/mobile-aelf/js/assets/image/svgs/app-logo-new.svg b/packages/mobile-aelf/js/assets/image/svgs/app-logo-new.svg index 8d3acd137f..f858550cef 100644 --- a/packages/mobile-aelf/js/assets/image/svgs/app-logo-new.svg +++ b/packages/mobile-aelf/js/assets/image/svgs/app-logo-new.svg @@ -1,4 +1,8 @@ - - + + + + + + diff --git a/packages/mobile-aelf/js/hooks/network.ts b/packages/mobile-aelf/js/hooks/network.ts index a65d329869..66bde0d806 100644 --- a/packages/mobile-aelf/js/hooks/network.ts +++ b/packages/mobile-aelf/js/hooks/network.ts @@ -1,56 +1,35 @@ -import { NetworkItem } from '@portkey-wallet/types/types-ca/network'; -import { useWallet } from '@portkey-wallet/hooks/hooks-ca/wallet'; -import { changeNetworkType } from '@portkey-wallet/store/store-ca/wallet/actions'; -import { ParamListBase, RouteProp } from '@react-navigation/native'; -import { RootStackParamList } from 'navigation'; -import { useAppDispatch } from 'store/hooks'; -import navigationService, { NavigateName } from 'utils/navigationService'; +import { NetworkItem } from '@portkey-wallet/types/types-eoa/network'; import { useThrottleCallback } from '@portkey-wallet/hooks'; -import { useResetStore } from '@portkey-wallet/hooks/hooks-ca'; +import { useResetStore } from '@portkey-wallet/hooks/hooks-eoa'; import { useLanguage } from 'i18n/hooks'; import ActionSheet from 'components/ActionSheet'; -import { DefaultChainId } from '@portkey-wallet/constants/constants-ca/network'; -import im from '@portkey-wallet/im'; import { request } from '@portkey-wallet/api/api-did'; import signalrFCM from '@portkey-wallet/socket/socket-fcm'; -import { useCurrentNetworkInfo, useNetworkList } from '@portkey-wallet/hooks/hooks-ca/network'; +import { useCurrentNetworkInfo, useNetworkList, useSwitchNetwork } from '@portkey-wallet/hooks/hooks-eoa/network'; import { useCallback } from 'react'; -const STAY_ROUTE_NAMES: NavigateName[] = ['LoginEmail', 'SignUpEmail', 'LoginQRCode']; -export function useChangeNetwork(route: RouteProp) { - const dispatch = useAppDispatch(); - const wallet = useWallet(); - +export function useChangeNetwork() { const resetStore = useResetStore(); const { t } = useLanguage(); + const switchNetwork = useSwitchNetwork(); + const onConfirm = useThrottleCallback( - async (network: NetworkItem, logged: boolean) => { - let routeName: keyof RootStackParamList = 'LoginPortkey'; - if (logged) { - routeName = 'Tab'; - } + async (logged: boolean) => { + console.log('logged', logged); + // if (logged) { + // routeName = 'Tab'; + // } resetStore(); request.initService(); - im.destroy(); - dispatch(changeNetworkType(network.networkType)); + switchNetwork(); signalrFCM.switchNetwork(); - - if ( - routeName !== route.name && - !(routeName === 'LoginPortkey' && STAY_ROUTE_NAMES.includes(route.name as NavigateName)) - ) { - navigationService.reset(routeName); - } }, - [dispatch, resetStore, route.name], + [resetStore, switchNetwork], ); return useThrottleCallback( (network: NetworkItem, isShowAlert = true) => { - const { walletInfo, originChainId } = wallet; - const { caInfo } = walletInfo || {}; - const tmpCaInfo = caInfo?.[network.networkType]; - const tmpChainId = tmpCaInfo?.originChainId || originChainId || DefaultChainId; - const logged = tmpCaInfo?.managerInfo && tmpCaInfo[tmpChainId]?.caAddress; + // TODO other network logged + const logged = false; const networkName = network.networkType === 'MAINNET' ? 'Mainnet' : 'Testnet'; if (!isShowAlert) { @@ -70,19 +49,19 @@ export function useChangeNetwork(route: RouteProp) { { title: 'Cancel', type: 'outline' }, { title: 'Confirm', - onPress: () => onConfirm(network, logged), + onPress: () => onConfirm(logged), }, ], }); }, - [wallet, onConfirm, t], + [onConfirm, t], ); } -export function useChangeNetworkDirectly(route: RouteProp) { +export function useChangeNetworkDirectly() { const currentNetworkInfo = useCurrentNetworkInfo(); const networkList = useNetworkList(); - const changeNetwork = useChangeNetwork(route); + const changeNetwork = useChangeNetwork(); return useCallback(() => { const targetNetwork = networkList.find(network => network.name !== currentNetworkInfo.name); diff --git a/packages/mobile-aelf/js/pages/Home/HomeTab/index.tsx b/packages/mobile-aelf/js/pages/Home/HomeTab/index.tsx index ca9079bba0..5ea4cc4f46 100644 --- a/packages/mobile-aelf/js/pages/Home/HomeTab/index.tsx +++ b/packages/mobile-aelf/js/pages/Home/HomeTab/index.tsx @@ -10,7 +10,7 @@ import { useCredentials } from '../../../hooks/store'; import { useBackupWalletModal } from '../../Login/hooks/useBackupWalletModal'; import * as Clipboard from 'expo-clipboard'; import { useGetContract, useGetViewContract } from 'hooks/contract'; -import { useCurrentNetwork, useSwitchNetwork } from '@portkey-wallet/hooks/hooks-eoa/network'; +import { useCurrentNetwork } from '@portkey-wallet/hooks/hooks-eoa/network'; import { useDAppChain, useDAppChainId, useGetChainInfo } from '@portkey-wallet/hooks/hooks-eoa/network/chain'; import CommonButton from 'components/CommonButton'; import navigationService from 'utils/navigationService'; @@ -98,7 +98,6 @@ const HomeTab: React.FC = ({ _ }) => { } }, [currentAccount?.address, dAppChainId, getChainInfo, getViewContract]); - const switchNetwork = useSwitchNetwork(); const resetWalletClick = useCallback(async () => { try { dispatch(resetWallet()); @@ -107,14 +106,6 @@ const HomeTab: React.FC = ({ _ }) => { console.log('checkPin error', error); } }, [dispatch]); - const switchNetworkClick = useCallback(async () => { - try { - switchNetwork(); - // navigationService.reset('Referral'); - } catch (error) { - console.log('checkPin error', error); - } - }, [switchNetwork]); useEffect(() => { if (walletList.length < 1) { navigationService.reset('Referral'); @@ -131,10 +122,15 @@ const HomeTab: React.FC = ({ _ }) => { Copy Address - - Switch Network + navigationService.push('SwitchNetworks')} style={{ marginTop: 20 }}> + Switch NetworkType (current: {currentNetwork}) + + navigationService.push('AboutUs')} style={{ marginTop: 20 }}> + About + + navigationService.push('DappList')} style={{ marginTop: 20 }}> + Connected Dapps - navigationService.push('Security')} style={{ marginTop: 20 }}> Security @@ -226,9 +222,6 @@ const HomeTab: React.FC = ({ _ }) => { Reset Wallet - - Switch NetworkType (current: {currentNetwork}) - navigationService.push('SwapHome')} style={{ marginTop: 20 }}> Swap diff --git a/packages/mobile-aelf/js/pages/My/AccountSettings/AboutUs/index.tsx b/packages/mobile-aelf/js/pages/My/AccountSettings/AboutUs/index.tsx index f3b854bbf0..ad4d351860 100644 --- a/packages/mobile-aelf/js/pages/My/AccountSettings/AboutUs/index.tsx +++ b/packages/mobile-aelf/js/pages/My/AccountSettings/AboutUs/index.tsx @@ -10,15 +10,14 @@ import * as Application from 'expo-application'; import MenuItem, { IMenuItemProps } from '../../components/MenuItem'; import Divider from 'components/Divider'; import navigationService from 'utils/navigationService'; -import { OfficialWebsite } from '@portkey-wallet/constants/constants-ca/network'; -import { useSocialMediaList } from '@portkey-wallet/hooks/hooks-ca/cms'; +import { OfficialWebsite } from '@portkey-wallet/constants/constants-eoa/network'; import { codePushOperator, parseLabel } from 'utils/update'; import { parseVersion } from 'utils'; import { useUpdateInfo } from 'store/user/hooks'; import { makeStyles } from '@rneui/themed'; -import { useCurrentNetworkInfo } from '@portkey-wallet/hooks/hooks-ca/network'; import { FontStyles } from 'assets/theme/styles'; import fonts from 'assets/theme/fonts'; +import { useSocialMediaList } from '@portkey-wallet/hooks/hooks-eoa/cms'; const AboutUs = () => { const { t } = useLanguage(); @@ -67,18 +66,16 @@ const AboutUs = () => { [], ); - const { portkeyFinanceUrl } = useCurrentNetworkInfo(); - return ( - Portkey + {t('aelf Wallet')} {parseVersion([`v${Application.nativeApplicationVersion}`, parseLabel(codePushOperator.localPackage?.label)])} @@ -95,16 +92,7 @@ const AboutUs = () => { /> ))} - - { - Linking.openURL(portkeyFinanceUrl || ''); - }} - /> - - + diff --git a/packages/mobile-aelf/js/pages/My/AccountSettings/SwitchNetworks/index.tsx b/packages/mobile-aelf/js/pages/My/AccountSettings/SwitchNetworks/index.tsx deleted file mode 100644 index 8f852773b1..0000000000 --- a/packages/mobile-aelf/js/pages/My/AccountSettings/SwitchNetworks/index.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import PageContainer from 'components/PageContainer'; -import { useLanguage } from 'i18n/hooks'; -import { pTd } from 'utils/unit'; -import { View } from 'react-native'; -import GStyles from 'assets/theme/GStyles'; -import { useAppSelector } from 'store/hooks'; -import { TextM, TextS } from 'components/CommonText'; -import Touchable from 'components/Touchable'; -import { defaultColors } from 'assets/theme'; -import Svg from 'components/Svg'; -import { useNetworkList } from '@portkey-wallet/hooks/hooks-ca/network'; -import { useChangeNetwork } from 'hooks/network'; -import { useRoute } from '@react-navigation/native'; -import { makeStyles, useTheme } from '@rneui/themed'; - -const SwitchNetworks: React.FC = () => { - const { t } = useLanguage(); - const { currentNetwork } = useAppSelector(state => state.wallet); - const NetworkList = useNetworkList(); - const route = useRoute(); - const changeNetwork = useChangeNetwork(route); - const styles = getStyles(); - const theme = useTheme(); - - return ( - - {NetworkList.map(item => ( - changeNetwork(item)}> - - - - {item.name} - {item.networkType === currentNetwork && ( - - Current - - )} - - {item.networkType !== currentNetwork && ( - - )} - - - ))} - - ); -}; - -const getStyles = makeStyles(theme => ({ - pageWrap: { - flex: 1, - backgroundColor: theme.colors.bg6, - ...GStyles.paddingArg(16, 0, 0, 0), - }, - networkItemWrap: { - display: 'flex', - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - height: pTd(74), - paddingHorizontal: pTd(16), - backgroundColor: theme.colors.bg6, - }, - networkItem: { - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - }, - networkText: { - fontSize: pTd(16), - marginLeft: pTd(8), - }, - curLabel: { - borderRadius: pTd(4), - marginLeft: pTd(4), - backgroundColor: theme.colors.bgSuccess2, - height: pTd(20), - width: pTd(55), - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - }, -})); - -export default SwitchNetworks; diff --git a/packages/mobile-aelf/js/pages/My/WalletHome/AboutUs/index.tsx b/packages/mobile-aelf/js/pages/My/WalletHome/AboutUs/index.tsx deleted file mode 100644 index b88d634dc0..0000000000 --- a/packages/mobile-aelf/js/pages/My/WalletHome/AboutUs/index.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import React, { memo, useMemo } from 'react'; -import { Linking, StyleSheet, View } from 'react-native'; -import PageContainer from 'components/PageContainer'; -import Svg from 'components/Svg'; -import { pTd } from 'utils/unit'; -import { defaultColors } from 'assets/theme'; -import { useLanguage } from 'i18n/hooks'; -import { TextM, TextXXL, TextXXXL } from 'components/CommonText'; -import * as Application from 'expo-application'; -import MenuItem, { IMenuItemProps } from '../../components/MenuItem'; -import Divider from 'components/Divider'; -import navigationService from 'utils/navigationService'; -import { OfficialWebsite } from '@portkey-wallet/constants/constants-ca/network'; -import { useSocialMediaList } from '@portkey-wallet/hooks/hooks-ca/cms'; -import { useCurrentNetworkInfo } from '@portkey-wallet/hooks/hooks-ca/network'; -import { codePushOperator, parseLabel } from 'utils/update'; -import { parseVersion } from 'utils'; -import { useUpdateInfo } from 'store/user/hooks'; -import { makeStyles, useTheme } from '@rneui/themed'; - -const AboutUs = () => { - const { t } = useLanguage(); - const socialMediaList = useSocialMediaList(); - const { s3Url } = useCurrentNetworkInfo(); - const updateInfo = useUpdateInfo(); - const styles = getStyles(); - - const officialList = useMemo( - (): IMenuItemProps[] => [ - { - icon: 'terms', - title: 'Terms of Service', - onPress: () => { - navigationService.navigate('ViewOnWebView', { - title: 'Terms of Service', - url: `${OfficialWebsite}/terms-of-service`, - }); - }, - }, - { - icon: 'privacy-policy', - title: 'Privacy Policy', - onPress: () => { - navigationService.navigate('ViewOnWebView', { - title: 'Privacy Policy', - url: `${OfficialWebsite}/privacy-policy`, - }); - }, - }, - ], - [], - ); - - const bottomList = useMemo( - (): IMenuItemProps[] => [ - { - showWarningCycle: true, - icon: 'checkUpdate', - title: 'Check for Updates', - onPress: () => { - codePushOperator.checkToUpdate(); - }, - }, - ], - [], - ); - - return ( - - - - - Portkey - - {parseVersion([`V${Application.nativeApplicationVersion}`, parseLabel(codePushOperator.localPackage?.label)])} - - - {socialMediaList.map((item, index) => ( - - { - Linking.openURL(item.link); - }} - /> - {index === socialMediaList.length - 1 && } - - ))} - - - - {officialList.map((item, index) => ( - - - - ))} - - - {!!updateInfo && ( - - {bottomList.map((item, index) => ( - - - {index !== bottomList.length - 1 && } - - ))} - - )} - - ); -}; - -export default memo(AboutUs); - -const getStyles = makeStyles(theme => ({ - pageContainer: { - backgroundColor: theme.colors.bg6, - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - flex: 1, - paddingHorizontal: pTd(16), - }, - logoWrap: { - width: pTd(80), - height: pTd(80), - justifyContent: 'center', - alignItems: 'center', - borderRadius: pTd(16), - marginTop: pTd(32), - marginBottom: pTd(16), - overflow: 'hidden', - }, - version: { - marginTop: pTd(4), - fontSize: pTd(14), - lineHeight: pTd(20), - color: theme.colors.textBase3, - marginBottom: pTd(32), - }, - btnContainer: { - backgroundColor: theme.colors.bg6, - width: '100%', - marginBottom: pTd(16), - }, - menuItem: { - paddingVertical: pTd(16), - paddingHorizontal: pTd(0), - backgroundColor: theme.colors.bg6, - }, - innerBtnWrap: { - marginBottom: 0, - }, - dividerStyle: { - marginVertical: pTd(4), - // marginHorizontal: pTd(16), - }, -})); diff --git a/packages/mobile-aelf/js/pages/My/WalletHome/SwitchNetworks/index.tsx b/packages/mobile-aelf/js/pages/My/WalletHome/SwitchNetworks/index.tsx index abd78d451e..98a8047c5a 100644 --- a/packages/mobile-aelf/js/pages/My/WalletHome/SwitchNetworks/index.tsx +++ b/packages/mobile-aelf/js/pages/My/WalletHome/SwitchNetworks/index.tsx @@ -4,22 +4,20 @@ import { useLanguage } from 'i18n/hooks'; import { pTd } from 'utils/unit'; import { View, Text } from 'react-native'; import GStyles from 'assets/theme/GStyles'; -import { useAppSelector } from 'store/hooks'; import { TextM } from 'components/CommonText'; import Touchable from 'components/Touchable'; import { defaultColors } from 'assets/theme'; import Svg from 'components/Svg'; -import { useNetworkList } from '@portkey-wallet/hooks/hooks-ca/network'; +import { useNetworkList } from '@portkey-wallet/hooks/hooks-eoa/network'; import { useChangeNetwork } from 'hooks/network'; -import { useRoute } from '@react-navigation/native'; import { makeStyles, useTheme } from '@rneui/themed'; +import { useCurrentNetwork } from '@portkey-wallet/hooks/hooks-eoa/network'; const SwitchNetworks: React.FC = () => { const { t } = useLanguage(); - const { currentNetwork } = useAppSelector(state => state.wallet); + const currentNetwork = useCurrentNetwork(); const NetworkList = useNetworkList(); - const route = useRoute(); - const changeNetwork = useChangeNetwork(route); + const changeNetwork = useChangeNetwork(); const styles = getStyles(); const theme = useTheme(); diff --git a/packages/mobile-aelf/js/store/config.ts b/packages/mobile-aelf/js/store/config.ts index b0f439cd58..0db0d20f69 100644 --- a/packages/mobile-aelf/js/store/config.ts +++ b/packages/mobile-aelf/js/store/config.ts @@ -9,6 +9,8 @@ import { networkSlice } from '@portkey-wallet/store/store-eoa/network/slice'; import awakenSlice from '@portkey-wallet/store/awaken/slice'; import contactSlice from '@portkey-wallet/store/store-eoa/contact/slice'; import { configSlice } from '@portkey-wallet/store/store-eoa/config/slice'; +import { cmsSlice } from '@portkey-wallet/store/store-eoa/cms/slice'; +import { dappSlice } from '@portkey-wallet/store/store-eoa/dapp/slice'; interface ThunkOptions { extraArgument: E; @@ -28,7 +30,15 @@ const reduxPersistConfig = { // Optionally, just specify the keys you DO want stored to persistence. // An empty array means 'don't store any reducers' -> infinite-red/ignite#409 - whitelist: [walletSlice.name, networkSlice.name, awakenSlice.name, contactSlice.name, configSlice.name], + whitelist: [ + walletSlice.name, + networkSlice.name, + awakenSlice.name, + contactSlice.name, + configSlice.name, + cmsSlice.name, + dappSlice.name, + ], // More info here: https://shift.infinite.red/shipping-persistant-reducers-7341691232b1 // transforms: [immutablePersistenceTransform], diff --git a/packages/mobile-aelf/js/store/rootReducer.ts b/packages/mobile-aelf/js/store/rootReducer.ts index eb8355fe0a..b27472d3a7 100644 --- a/packages/mobile-aelf/js/store/rootReducer.ts +++ b/packages/mobile-aelf/js/store/rootReducer.ts @@ -13,6 +13,8 @@ import activitySlice from '@portkey-wallet/store/store-eoa/activity/slice'; import awakenSlice from '@portkey-wallet/store/awaken/slice'; import { contactSlice } from '@portkey-wallet/store/store-eoa/contact/slice'; import { configSlice } from '@portkey-wallet/store/store-eoa/config/slice'; +import { cmsSlice } from '@portkey-wallet/store/store-eoa/cms/slice'; +import { dappSlice } from '@portkey-wallet/store/store-eoa/dapp/slice'; const userPersistConfig = { key: userSlice.name, @@ -61,8 +63,8 @@ const rootReducer = combineReducers({ [assetsSlice.name]: assetsReducer, [activitySlice.name]: activitySlice.reducer, [tokenManagementSlice.name]: tokenManagementSlice.reducer, - // [dappSlice.name]: dappSlice.reducer, - // [cmsSlice.name]: cmsSlice.reducer, + [dappSlice.name]: dappSlice.reducer, + [cmsSlice.name]: cmsSlice.reducer, // [discoverSlice.name]: discoverReducer, // [txFeeSlice.name]: txFeeSlice.reducer, diff --git a/packages/store/store-eoa/cms/actions.ts b/packages/store/store-eoa/cms/actions.ts new file mode 100644 index 0000000000..5c302e0f19 --- /dev/null +++ b/packages/store/store-eoa/cms/actions.ts @@ -0,0 +1,430 @@ +import { createAsyncThunk, createAction } from '@reduxjs/toolkit'; +import { ICMSState } from './types'; +import { NetworkType } from '@portkey-wallet/types'; +import { + getDiscoverGroup, + getSocialMedia, + getTabMenu, + getRememberMeBlackListSites, + getLoginMode, + getHomeBanner, + getDiscoverDappBanner, + getTokenDetailBanner, + getDiscoverLearnBanner, + getDiscoverTabList, + getDiscoverEarnList, + getDiscoverLearnGroupList, + getDappWhiteListCustom, +} from '@portkey-wallet/graphql/cms/queries'; +import { + IEntrance, + ILoginModeItem, + TBaseCardItemType, + TDiscoverEarnList, + TDiscoverLearnGroupList, + TDiscoverTabList, + TTokenDetailBannerItemType, + TWhiteListDappList, +} from '@portkey-wallet/types/types-eoa/cms'; + +export const getSocialMediaAsync = createAsyncThunk>, NetworkType>( + 'cms/getSocialMediaAsync', + async (network: NetworkType) => { + const result = await getSocialMedia(network, { + sort: 'index', + limit: -1, + filter: { + status: { + _eq: 'published', + }, + }, + }); + + if (result.data.socialMedia && Array.isArray(result.data.socialMedia)) { + console.log('getSocialMedia getSocialMediaAsync', result.data.socialMedia); + return { + socialMediaListNetMap: { + [network]: result.data.socialMedia, + }, + }; + } else { + throw new Error('getSocialMediaAsync error'); + } + }, +); + +export const getTabMenuAsync = createAsyncThunk>, NetworkType>( + 'cms/getTabMenuAsync', + async (network: NetworkType) => { + const result = await getTabMenu(network, { + limit: -1, + sort: 'index', + filter: { + status: { + _eq: 'published', + }, + }, + }); + + if (result.data.tabMenu && Array.isArray(result.data.tabMenu)) { + return { + tabMenuListNetMap: { + [network]: result.data.tabMenu, + }, + }; + } else { + throw new Error('getTabMenuAsync error'); + } + }, +); + +export const getDiscoverGroupAsync = createAsyncThunk< + Required>, + NetworkType +>('cms/getDiscoverGroupAsync', async (network: NetworkType) => { + const result = await getDiscoverGroup(network, { + limit: -1, + limit1: -1, + sort: 'index', + sort1: 'index', + filter: { + status: { + _eq: 'published', + }, + }, + filter1: { + status: { + _eq: 'published', + }, + }, + }); + + if (result.data.discoverGroup && Array.isArray(result.data.discoverGroup)) { + return { + discoverGroupListNetMap: { + [network]: result.data.discoverGroup, + }, + }; + } else { + throw new Error('discoverGroupListNetMap error'); + } +}); + +export const getRememberMeBlackListAsync = createAsyncThunk< + Required>, + NetworkType +>('cms/getRememberMeBlackListAsync', async (network: NetworkType) => { + const result = await getRememberMeBlackListSites(network, { + filter: { + status: { + _eq: 'published', + }, + }, + }); + + if (result.data.rememberMeBlackListSites) { + return { + rememberMeBlackListMap: { + [network]: result.data.rememberMeBlackListSites, + }, + }; + } else { + throw new Error('rememberMeBlackListMap error'); + } +}); + +export const getLoginControlListAsync = createAsyncThunk>, NetworkType[]>( + 'cms/getLoginModeList', + async (networkList: NetworkType[]) => { + try { + const res = await Promise.all( + networkList.map(async network => { + try { + return await getLoginMode(network, { + filter6: { + status: { + _eq: 'published', + }, + }, + }); + } catch (error) { + console.log(error, '=====error'); + return null; + } + }), + ); + const loginModeListMap: { [T in NetworkType]?: ILoginModeItem[] } = {}; + res?.map((item, index) => { + if (item?.data) { + loginModeListMap[networkList[index]] = item.data.loginMode as ILoginModeItem[]; + } + }); + return { loginModeListMap }; + } catch (error) { + throw new Error('getLoginControlListAsync error'); + } + }, +); + +export const getHomeBannerListAsync = createAsyncThunk>, NetworkType>( + 'cms/getHomeBannerListAsync', + async (network: NetworkType) => { + let returnList: TBaseCardItemType[] = []; + try { + const result = await getHomeBanner(network, {}); + if (result.data.homeBanner?.status === 'published') { + returnList = result?.data?.homeBanner?.items + ?.filter(ele => ele?.portkeyCard_id?.status === 'published') + ?.map(ele => ({ + imgUrl: ele?.portkeyCard_id?.imgUrl, + index: ele?.portkeyCard_id?.index, + url: ele?.portkeyCard_id?.url, + appLink: ele?.portkeyCard_id?.appLink, + extensionLink: ele?.portkeyCard_id?.extensionLink, + })) + ?.sort((a, b) => Number(a.index) - Number(b.index)) as TBaseCardItemType[]; + } + + console.log('getHomeBannerListAsync', returnList); + + return { + homeBannerListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getHomeBannerListAsync error'); + } + }, +); + +export const getDiscoverDappBannerAsync = createAsyncThunk< + Required>, + NetworkType +>('cms/getDiscoverDappBannerAsync', async (network: NetworkType) => { + let returnList: TBaseCardItemType[] = []; + try { + const result = await getDiscoverDappBanner(network, {}); + if (result.data?.discoverDappBanner?.status === 'published') { + returnList = result?.data?.discoverDappBanner?.items + ?.filter(ele => ele?.portkeyCard_id?.status === 'published') + ?.map(ele => ({ + index: ele?.portkeyCard_id?.index, + url: ele?.portkeyCard_id?.url, + appLink: ele?.portkeyCard_id?.appLink, + extensionLink: ele?.portkeyCard_id?.extensionLink, + imgUrl: { + filename_disk: ele?.portkeyCard_id?.imgUrl?.filename_disk, + }, + title: ele?.portkeyCard_id?.title, + description: ele?.portkeyCard_id?.description, + })) + ?.sort((a, b) => Number(a.index) - Number(b.index)) as TBaseCardItemType[]; + } + + console.log('getDiscoverDappBannerAsync', returnList); + + return { + discoverDappBannerListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getDiscoverDappBannerAsync error'); + } +}); + +export const getDiscoverLearnBannerAsync = createAsyncThunk< + Required>, + NetworkType +>('cms/getDiscoverLearnBannerAsync', async (network: NetworkType) => { + let returnList: TBaseCardItemType[] = []; + try { + const result = await getDiscoverLearnBanner(network, {}); + if (result.data?.discoverLearnBanner?.status === 'published') { + returnList = result?.data?.discoverLearnBanner?.items + ?.filter(ele => ele?.portkeyCard_id?.status === 'published') + ?.map(ele => ({ + index: ele?.portkeyCard_id?.index, + url: ele?.portkeyCard_id?.url, + appLink: ele?.portkeyCard_id?.appLink, + extensionLink: ele?.portkeyCard_id?.extensionLink, + imgUrl: { + filename_disk: ele?.portkeyCard_id?.imgUrl?.filename_disk, + }, + })) + ?.sort((a, b) => Number(a.index) - Number(b.index)) as TBaseCardItemType[]; + } + + console.log('getDiscoverLearnBannerAsync', returnList); + + return { + discoverLearnBannerListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getDiscoverLearnBannerAsync error'); + } +}); + +export const getTokenDetailBannerAsync = createAsyncThunk< + Required>, + NetworkType +>('cms/getTokenDetailBannerAsync', async (network: NetworkType) => { + let returnList: TTokenDetailBannerItemType[] = []; + + try { + const result = await getTokenDetailBanner(network, {}); + + returnList = result.data?.tokenDetailBanner + .filter(ele => ele.status === 'published') + .map(i => ({ + chainId: i.chainId, + symbol: i.symbol, + items: i.items + ?.filter(ele => ele?.portkeyCard_id?.status === 'published') + ?.map(ele => ({ + index: ele?.portkeyCard_id?.index, + url: ele?.portkeyCard_id?.url, + appLink: ele?.portkeyCard_id?.appLink, + extensionLink: ele?.portkeyCard_id?.extensionLink, + imgUrl: { + filename_disk: ele?.portkeyCard_id?.imgUrl?.filename_disk, + }, + })) + ?.sort((a, b) => Number(a.index) - Number(b.index)), + })) as TTokenDetailBannerItemType[]; + + console.log('getTokenDetailBannerAsync', returnList); + + return { + tokenDetailBannerListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getTokenDetailBannerAsync error'); + } +}); + +export const getDiscoverTabAsync = createAsyncThunk>, NetworkType>( + 'cms/getDiscoverTabAsync', + async (network: NetworkType) => { + let returnList: TDiscoverTabList = []; + try { + const result = await getDiscoverTabList(network, {}); + + returnList = (result.data?.discoverTabData + .filter(ele => ele.status === 'published') + .map(i => ({ + index: i.index || 0, + value: i.value || '', + name: i.name || '', + })) + ?.sort((a, b) => Number(a.index) - Number(b.index)) || []) as TDiscoverTabList; + + console.log('getDiscoverTabAsync', returnList); + + return { + discoverTabListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getTokenDetailBannerAsync error'); + } + }, +); + +export const getDiscoverEarnAsync = createAsyncThunk>, NetworkType>( + 'cms/getDiscoverEarnAsync', + async (network: NetworkType) => { + let returnList: TDiscoverEarnList = []; + try { + const result = await getDiscoverEarnList(network, {}); + + if (result.data?.discoverEarnData?.status === 'published') { + returnList = result?.data?.discoverEarnData?.items + ?.filter(ele => ele?.portkeyCard_id?.status === 'published') + ?.map(ele => ({ + ...ele?.portkeyCard_id, + imgUrl: { + filename_disk: ele?.portkeyCard_id?.imgUrl?.filename_disk, + }, + })) + ?.sort((a, b) => Number(a.index) - Number(b.index)) as TBaseCardItemType[]; + } + + console.log('getDiscoverEarnAsync list ', returnList); + + return { + discoverEarnListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getDiscoverEarnAsync error'); + } + }, +); + +export const getDiscoverLearnAsync = createAsyncThunk< + Required>, + NetworkType +>('cms/getDiscoverLearnAsync', async (network: NetworkType) => { + let returnList: TDiscoverLearnGroupList = []; + + try { + const result = await getDiscoverLearnGroupList(network, {}); + returnList = (result?.data?.discoverLearnGroup + .filter(ele => ele.status === 'published') + .map(group => ({ + index: group.index, + title: group.title, + value: group.value, + items: group?.items + ?.filter(i => i?.portkeyCard_id?.status === 'published') + ?.map(ele => ({ ...ele?.portkeyCard_id })) + .sort((a, b) => Number(a.index) - Number(b.index)), + })) + .sort((a, b) => Number(a.index) - Number(b.index)) || []) as TDiscoverLearnGroupList; + + console.log('getDiscoverLearnAsync list ', returnList); + + return { + discoverLearnGroupListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getDiscoverLearnAsync error'); + } +}); + +export const getDappWhiteListAsync = createAsyncThunk>, NetworkType>( + 'cms/getDappWhiteListAsync', + async (network: NetworkType) => { + let returnList: TWhiteListDappList = []; + + try { + const result = await getDappWhiteListCustom(network, {}); + returnList = result?.data?.dappList.map(item => item.domainName || '') || []; + + console.log('getDappWhiteListAsync list ', returnList); + + return { + dappWhiteListMap: { + [network]: returnList, + }, + }; + } catch (error) { + throw new Error('getDiscoverLearnAsync error'); + } + }, +); + +export const setEntrance = createAction<{ + network: NetworkType; + value: IEntrance; +}>('cms/setEntrance'); diff --git a/packages/store/store-eoa/cms/deepEqual.ts b/packages/store/store-eoa/cms/deepEqual.ts new file mode 100644 index 0000000000..ac2ed4d09f --- /dev/null +++ b/packages/store/store-eoa/cms/deepEqual.ts @@ -0,0 +1,26 @@ +export function deepEqual(object1: any, object2: any): boolean { + if (!object1 || !object2) { + return false; + } + const keys1 = Object.keys(object1); + const keys2 = Object.keys(object2); + + if (keys1.length !== keys2.length) { + return false; + } + + for (const key of keys1) { + const val1 = object1[key]; + const val2 = object2[key]; + const areObjects = isObject(val1) && isObject(val2); + if ((areObjects && !deepEqual(val1, val2)) || (!areObjects && val1 !== val2)) { + return false; + } + } + + return true; +} + +function isObject(object: any): boolean { + return object != null && typeof object === 'object'; +} diff --git a/packages/store/store-eoa/cms/slice.ts b/packages/store/store-eoa/cms/slice.ts new file mode 100644 index 0000000000..04f2e777f8 --- /dev/null +++ b/packages/store/store-eoa/cms/slice.ts @@ -0,0 +1,146 @@ +import { createSlice } from '@reduxjs/toolkit'; +import { + getDiscoverGroupAsync, + getSocialMediaAsync, + getTabMenuAsync, + getRememberMeBlackListAsync, + setEntrance, + getLoginControlListAsync, + getHomeBannerListAsync, + getTokenDetailBannerAsync, + getDiscoverDappBannerAsync, + getDiscoverLearnBannerAsync, + getDiscoverTabAsync, + getDiscoverEarnAsync, + getDiscoverLearnAsync, + getDappWhiteListAsync, +} from './actions'; +import { ICMSState, CmsWebsiteMapItem } from './types'; +import { deepEqual } from './deepEqual'; + +const initialState: ICMSState = { + socialMediaListNetMap: {}, + tabMenuListNetMap: {}, + discoverGroupListNetMap: {}, + rememberMeBlackListMap: {}, + entranceNetMap: {}, + homeBannerListMap: {}, + tokenDetailBannerListMap: {}, + discoverDappBannerListMap: {}, + discoverLearnBannerListMap: {}, + discoverTabListMap: {}, + discoverEarnListMap: {}, + discoverLearnGroupListMap: {}, + dappWhiteListMap: {}, +}; +export const cmsSlice = createSlice({ + name: 'cms', + initialState, + reducers: {}, + extraReducers: builder => { + builder + .addCase(getSocialMediaAsync.fulfilled, (state, action) => { + console.log('getSocialMediaAsync=fulfilled', action); + state.socialMediaListNetMap = { + ...state.socialMediaListNetMap, + ...action.payload.socialMediaListNetMap, + }; + }) + .addCase(getTabMenuAsync.fulfilled, (state, action) => { + state.tabMenuListNetMap = { + ...state.tabMenuListNetMap, + ...action.payload.tabMenuListNetMap, + }; + }) + .addCase(getDiscoverGroupAsync.fulfilled, (state, action) => { + const newWebSiteMap: { [url: string]: CmsWebsiteMapItem } = {}; + Object.values(action.payload.discoverGroupListNetMap).map(networkData => { + networkData.map(group => { + group.items.map(item => { + newWebSiteMap[item.url] = { + title: item.title, + imgUrl: item.imgUrl, + }; + }); + }); + }); + state.discoverGroupListNetMap = { + ...state.discoverGroupListNetMap, + ...action.payload.discoverGroupListNetMap, + }; + state.cmsWebsiteMap = { + ...state.cmsWebsiteMap, + ...newWebSiteMap, + }; + }) + .addCase(getRememberMeBlackListAsync.fulfilled, (state, action) => { + state.rememberMeBlackListMap = { + ...state.rememberMeBlackListMap, + ...action.payload.rememberMeBlackListMap, + }; + }) + .addCase(setEntrance, (state, action) => { + if (state.entranceNetMap && deepEqual(state.entranceNetMap[action.payload.network], action.payload.value)) { + return; + } + state.entranceNetMap = { + ...state.entranceNetMap, + [action.payload.network]: action.payload.value, + }; + }) + .addCase(getLoginControlListAsync.fulfilled, (state, action) => { + state.loginModeListMap = { + ...(state.loginModeListMap ?? {}), + ...action.payload.loginModeListMap, + }; + }) + .addCase(getHomeBannerListAsync.fulfilled, (state, action) => { + state.homeBannerListMap = { + ...(state.homeBannerListMap ?? {}), + ...action.payload.homeBannerListMap, + }; + }) + .addCase(getTokenDetailBannerAsync.fulfilled, (state, action) => { + state.tokenDetailBannerListMap = { + ...(state.tokenDetailBannerListMap ?? {}), + ...action.payload.tokenDetailBannerListMap, + }; + }) + .addCase(getDiscoverDappBannerAsync.fulfilled, (state, action) => { + state.discoverDappBannerListMap = { + ...(state.discoverDappBannerListMap ?? {}), + ...action.payload.discoverDappBannerListMap, + }; + }) + .addCase(getDiscoverLearnBannerAsync.fulfilled, (state, action) => { + state.discoverLearnBannerListMap = { + ...(state.discoverLearnBannerListMap ?? {}), + ...action.payload.discoverLearnBannerListMap, + }; + }) + .addCase(getDiscoverTabAsync.fulfilled, (state, action) => { + state.discoverTabListMap = { + ...(state.discoverTabListMap ?? {}), + ...action.payload.discoverTabListMap, + }; + }) + .addCase(getDiscoverEarnAsync.fulfilled, (state, action) => { + state.discoverEarnListMap = { + ...(state.discoverEarnListMap ?? {}), + ...action.payload.discoverEarnListMap, + }; + }) + .addCase(getDiscoverLearnAsync.fulfilled, (state, action) => { + state.discoverLearnGroupListMap = { + ...(state.discoverLearnGroupListMap ?? {}), + ...action.payload.discoverLearnGroupListMap, + }; + }) + .addCase(getDappWhiteListAsync.fulfilled, (state, action) => { + state.dappWhiteListMap = { + ...(state.dappWhiteListMap ?? {}), + ...action.payload.dappWhiteListMap, + }; + }); + }, +}); diff --git a/packages/store/store-eoa/cms/types.ts b/packages/store/store-eoa/cms/types.ts new file mode 100644 index 0000000000..37e55e2da3 --- /dev/null +++ b/packages/store/store-eoa/cms/types.ts @@ -0,0 +1,115 @@ +import { NetworkType } from '@portkey-wallet/types'; +import { + IEntrance, + ILoginModeItem, + TDiscoverDappBannerList, + TDiscoverEarnList, + TDiscoverLearnBannerList, + TDiscoverLearnGroupList, + TDiscoverTabList, + THomeBannerList, + TTokenDetailBannerList, + TWhiteListDappList, +} from '@portkey-wallet/types/types-eoa/cms'; + +export interface SocialMediaItem { + index: number; + title: string; + link: string; + svgUrl?: { + filename_disk?: string; + }; +} + +export interface TabMenuItem { + index: number; + title: string; + type: { + value: string; + }; +} + +export interface DiscoverItem { + id: string; + index: number; + title: string; + description: string; + url: string; + imgUrl?: { + filename_disk?: string; + }; + appLink?: string; + extensionLink?: string; +} +export interface DiscoverGroup { + id: string; + index: number; + title: string; + items: DiscoverItem[]; +} + +export interface RememberMeBlackListSiteItem { + name: string; + url: string; +} + +export interface EntranceControlType { + isAndroidBridgeShow?: boolean; + isExtensionBridgeShow?: boolean; + isIOSBridgeShow?: boolean; +} + +export interface CmsWebsiteMapItem { + title?: string; + imgUrl?: { + filename_disk?: string; + }; +} + +export interface ICMSState { + socialMediaListNetMap: { + [T in NetworkType]?: SocialMediaItem[]; + }; + tabMenuListNetMap: { + [T in NetworkType]?: TabMenuItem[]; + }; + discoverGroupListNetMap: { + [T in NetworkType]?: DiscoverGroup[]; + }; + rememberMeBlackListMap?: { + [T in NetworkType]?: RememberMeBlackListSiteItem[]; + }; + cmsWebsiteMap?: { + [url: string]: CmsWebsiteMapItem; + }; + entranceNetMap?: { + [T in NetworkType]?: Partial; + }; + loginModeListMap?: { + [T in NetworkType]?: ILoginModeItem[]; + }; + homeBannerListMap?: { + [T in NetworkType]?: THomeBannerList; + }; + tokenDetailBannerListMap?: { + [T in NetworkType]?: TTokenDetailBannerList; + }; + discoverDappBannerListMap?: { + [T in NetworkType]?: TDiscoverDappBannerList; + }; + discoverLearnBannerListMap?: { + [T in NetworkType]?: TDiscoverLearnBannerList; + }; + discoverTabListMap?: { + [T in NetworkType]?: TDiscoverTabList; + }; + discoverEarnListMap: { + [T in NetworkType]?: TDiscoverEarnList; + }; + discoverLearnGroupListMap: { + [T in NetworkType]?: TDiscoverLearnGroupList; + }; + dappWhiteListMap: { + [T in NetworkType]?: TWhiteListDappList; + }; +} diff --git a/packages/store/store-eoa/dapp/actions.ts b/packages/store/store-eoa/dapp/actions.ts new file mode 100644 index 0000000000..b7e48556c2 --- /dev/null +++ b/packages/store/store-eoa/dapp/actions.ts @@ -0,0 +1,30 @@ +import { NetworkType } from '@portkey-wallet/types'; +import { createAction } from '@reduxjs/toolkit'; +import { DappStoreItem } from './type'; +import { SessionInfo } from '@portkey-wallet/types/session'; + +export const addDapp = createAction<{ + networkType: NetworkType; + dapp: DappStoreItem; +}>('dapp/addDapp'); + +export const removeDapp = createAction<{ + networkType: NetworkType; + origin: string; +}>('dapp/removeDapp'); + +export const updateDapp = createAction<{ + networkType: NetworkType; + origin: string; + dapp: DappStoreItem; +}>('dapp/updateDapp'); + +export const resetDappList = createAction('dapp/resetDappList'); + +export const resetDapp = createAction('dapp/resetDapp'); + +export const updateSessionInfo = createAction<{ + networkType: NetworkType; + origin: string; + sessionInfo?: SessionInfo; +}>('dapp/updateSessionInfo'); diff --git a/packages/store/store-eoa/dapp/slice.ts b/packages/store/store-eoa/dapp/slice.ts new file mode 100644 index 0000000000..e4d32329ca --- /dev/null +++ b/packages/store/store-eoa/dapp/slice.ts @@ -0,0 +1,54 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { IDappStoreState } from './type'; +import { createSlice } from '@reduxjs/toolkit'; +import { addDapp, removeDapp, resetDapp, resetDappList, updateDapp, updateSessionInfo } from './actions'; + +const initialState: IDappStoreState = { + dappMap: {}, +}; +export const dappSlice = createSlice({ + name: 'dapp', + initialState, + reducers: {}, + extraReducers: builder => { + builder + .addCase(addDapp, (state, action) => { + const { networkType, dapp } = action.payload; + let dappList = state.dappMap[networkType]; + if (!dappList) dappList = []; + if (dappList.some(item => item.origin === dapp.origin)) throw Error('dapp already exists'); + dappList.push({ ...dapp, connectedTime: Date.now() }); + state.dappMap[networkType] = dappList; + }) + .addCase(removeDapp, (state, action) => { + const { networkType, origin } = action.payload; + const dappList = state.dappMap[networkType]; + if (!dappList || !dappList.some(item => item.origin === origin)) throw Error('origin does not exist'); + state.dappMap[networkType] = dappList.filter(item => item.origin !== origin); + }) + .addCase(updateDapp, (state, action) => { + const { networkType, dapp, origin } = action.payload; + const dappList = state.dappMap[networkType]; + if (!dappList || !dappList.some(item => item.origin === origin)) throw Error('origin does not exist'); + state.dappMap[networkType] = dappList.map(item => { + if (item.origin === origin) return { ...item, ...dapp }; + return item; + }); + }) + .addCase(updateSessionInfo, (state, action) => { + const { networkType, origin, sessionInfo } = action.payload; + const dappList = state.dappMap[networkType]; + if (!dappList || !dappList.some(item => item.origin === origin)) throw Error('origin does not exist'); + state.dappMap[networkType] = dappList.map(item => { + if (item.origin === origin) return { ...item, sessionInfo }; + return item; + }); + }) + .addCase(resetDappList, (state, action) => { + state.dappMap[action.payload] = []; + }) + .addCase(resetDapp, state => { + state.dappMap = {}; + }); + }, +}); diff --git a/packages/store/store-eoa/dapp/type.ts b/packages/store/store-eoa/dapp/type.ts new file mode 100644 index 0000000000..14a5f391b5 --- /dev/null +++ b/packages/store/store-eoa/dapp/type.ts @@ -0,0 +1,15 @@ +import { NetworkType, Timestamp } from '@portkey-wallet/types'; +import { SessionInfo } from '@portkey-wallet/types/session'; + +export type DappStoreItem = { + origin: string; + name?: string; + icon?: string; + svgIcon?: string; + sessionInfo?: SessionInfo; + connectedTime?: Timestamp; +}; + +export interface IDappStoreState { + dappMap: { [key in NetworkType]?: DappStoreItem[] }; +} diff --git a/packages/types/types-eoa/cms.ts b/packages/types/types-eoa/cms.ts new file mode 100644 index 0000000000..fbfaeac0fa --- /dev/null +++ b/packages/types/types-eoa/cms.ts @@ -0,0 +1,118 @@ +import { LOGIN_TYPE_LABEL_MAP } from '@portkey-wallet/constants/verifier'; +import { ChainId } from '..'; + +export type IEntranceModuleName = 'bridge' | 'eTransDeposit' | 'eTransWithdraw' | 'swap' | 'freeMintNft' | 'nft'; +export type IEntranceMatchKey = 'version' | 'installationTime' | 'deviceType'; +export type IEntranceMatchRuleType = 'String' | 'BigNumber' | 'Regex'; + +export type IEntrance = Record; + +export type IEntranceMatchRuleItem = { + type: IEntranceMatchRuleType; + left: string; + opt: string; + right: IEntranceMatchKey; +}; +export type IEntranceMatchItem = { + matchRuleList: IEntranceMatchRuleItem[]; + weight: number; + matchSwitch: boolean; + description?: string; +}; + +export type IMatchListItem = { + entranceMatch_id?: IEntranceMatchItem; + loginModeMatch_id?: IEntranceMatchItem; +}; + +export interface IBaseEntranceItem { + defaultSwitch: boolean; + matchList: Array; +} +export interface IEntranceItem extends IBaseEntranceItem { + moduleName: { + value: IEntranceModuleName; + }; +} + +export type IEntranceMatchValueConfig = Partial Promise)>>; +export type IEntranceMatchValueMap = Partial>; + +export type TLoginMode = (typeof LOGIN_TYPE_LABEL_MAP)[keyof typeof LOGIN_TYPE_LABEL_MAP]; + +type TCMSLoginMode = { + label?: string; + value?: TLoginMode; +}; + +export interface ILoginModeItem extends IBaseEntranceItem { + extensionIndex: number; + iOSIndex: number; + androidIndex: number; + extensionRecommend: boolean; + iOSRecommend: boolean; + androidRecommend: boolean; + type?: TCMSLoginMode; +} + +export type TLoginModeIndexKey = keyof Pick; +export type TLoginModeRecommendKey = keyof Pick< + ILoginModeItem, + 'extensionRecommend' | 'iOSRecommend' | 'androidRecommend' +>; + +export type TBaseCardItemType = { + index: string | number; + title?: string; + value?: string; + description?: string; + buttonTitle?: string; + imgUrl: { + filename_disk: string; + }; + url: string; + appLink?: string; + extensionLink?: string; +}; + +export type TDiscoverTabValue = 'Dapp' | 'Earn' | 'Market' | 'Learn'; + +export type TBaseTabItemType = { + index: string | number; + name?: string; + value?: TDiscoverTabValue; +}; + +export type TDiscoverLearnGroupItemType = { + index: string | number; + title: string; + value?: string; + items?: TBaseCardItemType[]; +}; + +export type TDappWhiteListItemType = string; + +export type TTokenDetailBannerItemType = { + chainId: ChainId; + symbol: string; + items?: TBaseCardItemType[]; +}; + +export type TTokenDetailBannerList = TTokenDetailBannerItemType[]; +export type THomeBannerList = TBaseCardItemType[]; +export type TDiscoverLearnBannerList = TBaseCardItemType[]; +export type TDiscoverDappBannerList = TBaseCardItemType[]; + +export type TDiscoverTabList = TBaseTabItemType[]; +export type TDiscoverEarnList = TBaseCardItemType[]; +export type TDiscoverLearnGroupList = TDiscoverLearnGroupItemType[]; +export type TWhiteListDappList = TDappWhiteListItemType[]; + +export type TLinkType = 'external' | 'internal' | 'native'; +export type TLink = { + type: TLinkType; + location: string; + params?: any; +}; +export type TAppLink = TLink; +export type TExtensionLink = TLink; diff --git a/packages/types/types-eoa/device.ts b/packages/types/types-eoa/device.ts new file mode 100644 index 0000000000..9d45fe0880 --- /dev/null +++ b/packages/types/types-eoa/device.ts @@ -0,0 +1,45 @@ +import { PartialOption } from '../common'; + +export interface DeviceInfoType { + deviceName?: string; + deviceType?: DeviceType; +} + +export interface ExtraDataType { + transactionTime: number; + deviceInfo: string; + version: string; +} + +export interface ExtraDataDecodeType extends Omit { + deviceInfo: DeviceInfoType; +} + +export type QRExtraDataType = PartialOption; + +export interface DeviceItemType extends ExtraDataDecodeType { + managerAddress?: string | null; +} + +// version 0.0.1 +export enum DeviceType { + OTHER, + MAC, + IOS, + WINDOWS, + ANDROID, +} + +export enum VersionDeviceType { + Android, + iOS, + Extension, +} + +export type UpdateNotify = { + content: string; + downloadUrl: string; + isForceUpdate: boolean; + targetVersion: string; + title: string; +}; diff --git a/packages/types/types-eoa/store.ts b/packages/types/types-eoa/store.ts index 96c4a810b0..430e805f56 100644 --- a/packages/types/types-eoa/store.ts +++ b/packages/types/types-eoa/store.ts @@ -17,6 +17,10 @@ import { ActivityStateType } from '@portkey-wallet/store/store-eoa/activity/type import { contactSlice, TContactState } from '@portkey-wallet/store/store-eoa/contact/slice'; import { configSlice } from '@portkey-wallet/store/store-eoa/config/slice'; import { TConfigStateType } from '@portkey-wallet/store/store-eoa/config/types'; +import { cmsSlice } from '@portkey-wallet/store/store-eoa/cms/slice'; +import { ICMSState } from '@portkey-wallet/store/store-eoa/cms/types'; +import { dappSlice } from '@portkey-wallet/store/store-eoa/dapp/slice'; +import { IDappStoreState } from '@portkey-wallet/store/store-eoa/dapp/type'; export type EOACommonState = { [settingsSlice.name]: SettingsState; @@ -29,4 +33,6 @@ export type EOACommonState = { [awakenSlice.name]: TAwakenState; [contactSlice.name]: TContactState; [configSlice.name]: TConfigStateType; + [cmsSlice.name]: ICMSState; + [dappSlice.name]: IDappStoreState; }; diff --git a/packages/utils/session.ts b/packages/utils/session.ts index a4ec78f501..6a7a0b2ae3 100644 --- a/packages/utils/session.ts +++ b/packages/utils/session.ts @@ -11,7 +11,7 @@ const HOUR = 60 * 60 * 1000; interface IBaseSessionParams { origin: string; managerAddress: string; - caHash: string; + caHash?: string; expiredPlan: SessionExpiredPlan; expiredTime: Timestamp; }