diff --git a/.123trigger b/.123trigger index 03276f73403..38536405ef0 100644 --- a/.123trigger +++ b/.123trigger @@ -133,4 +133,5 @@ 1.1.63 1.1.64 1.1.65 -1.1.66 \ No newline at end of file +1.1.66 +1.1.67 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index fbbb072c03f..c78929eb141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # CHANGELOG +## 1.1.67 +Build date: May 22, 2024. + +Features & Update: +- Update chain-list: + - Update price-id for DED + - Update ED for Vara + +Bugs fixed: +- Fix bug integrating chain online (#3084) + ## 1.1.66 Build date: May 21, 2024. diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 86b9b1b29af..e67d6328816 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,14 +1,14 @@ - 2522 AnhMTV Release version 1.1.66 - 2352 Nam Phạm [Issue 2754] fix: fix eslint - 2036 S2kael [Issue-3055] Update stable version for chain-list + 2530 AnhMTV Release version 1.1.67 + 2353 Nam Phạm [Issue 3081] fix: change initiation order of chain service + 2045 S2kael [Issue-3081] Update stable version for chain-list 815 lw-cdm Fix eslint issues 465 Jaco 0.42.5 (#969) 416 nguyentiendung [Issue-2914] Update yarn.lock 185 quangdo 148 bluezdot [Issue-3055] Update chainlist + 106 Automation Bot [CI Skip] Auto increase webapp build number 106 dominhquang [Issue-2649] Add send crash log feature 104 khainh predefine metadata for Polkadot & Kusama chains - 102 Automation Bot [CI Skip] Auto increase webapp build number 101 lw-cdm 83 Hieu Dao Update README.md 82 Thibaut Sardan Add account filtering feature (#832) diff --git a/package.json b/package.json index 009d1a30654..5075a6d8126 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "url": "https://github.com/Koniverse/Subwallet-V2.git" }, "sideEffects": false, - "version": "1.1.66", + "version": "1.1.67", "workspaces": [ "packages/*" ], diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 6745d3876ca..974abaa6996 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -17,7 +17,7 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "main": "index.js", "dependencies": { "@acala-network/api": "^5.0.2", @@ -52,10 +52,10 @@ "@sora-substrate/type-definitions": "^1.17.7", "@substrate/connect": "^0.8.9", "@subwallet/chain-list": "0.2.63", - "@subwallet/extension-base": "^1.1.66-0", - "@subwallet/extension-chains": "^1.1.66-0", - "@subwallet/extension-dapp": "^1.1.66-0", - "@subwallet/extension-inject": "^1.1.66-0", + "@subwallet/extension-base": "^1.1.67-1", + "@subwallet/extension-chains": "^1.1.67-1", + "@subwallet/extension-dapp": "^1.1.67-1", + "@subwallet/extension-inject": "^1.1.67-1", "@subwallet/keyring": "^0.1.5", "@subwallet/ui-keyring": "^0.1.5", "@walletconnect/sign-client": "^2.8.4", @@ -94,7 +94,7 @@ "web3-utils": "^1.10.0" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.1.66-0", + "@subwallet/extension-mocks": "^1.1.67-1", "@types/uuid": "^9.0.1" } } diff --git a/packages/extension-base/src/constants/storage.ts b/packages/extension-base/src/constants/storage.ts index 8344c135706..bd1415f0253 100644 --- a/packages/extension-base/src/constants/storage.ts +++ b/packages/extension-base/src/constants/storage.ts @@ -6,3 +6,5 @@ export const LANGUAGE = 'current-language'; export const CURRENCY = 'current-currency'; export const REMIND_EXPORT_ACCOUNT = 'remind_export_account'; + +export const LATEST_SESSION = 'general.latest-session'; \ No newline at end of file diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index cd0d382ba2d..01ba9685041 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -11,7 +11,7 @@ import { createSubscription } from '@subwallet/extension-base/background/handler import { AccountExternalError, AccountExternalErrorCode, AccountsWithCurrentAddress, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BasicTxErrorType, BasicTxWarningCode, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CreateDeriveAccountInfo, CronReloadRequest, CrowdloanJson, CurrentAccountInfo, DeriveAccountInfo, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, OptionInputAddress, PriceJson, RequestAccountBatchExportV2, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateSuriV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAccountMeta, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBatchRestoreV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestCheckPublicAndSecretKey, RequestConfirmationComplete, RequestConnectWalletConnect, RequestCrossChainTransfer, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDeriveCreateMultiple, RequestDeriveCreateV2, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetDeriveAccounts, RequestGetTransaction, RequestJsonRestoreV2, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveRecentAccount, RequestSeedCreateV2, RequestSeedValidateV2, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTransfer, RequestTransferCheckReferenceCount, RequestTransferCheckSupporting, RequestTransferExistentialDeposit, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseAccountMeta, ResponseChangeMasterPassword, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseFindRawMetadata, ResponseGetDeriveAccounts, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponsePrivateKeyValidateV2, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSeedCreateV2, ResponseSeedValidateV2, ResponseSubscribeHistory, ResponseUnlockKeyring, StakingJson, StakingRewardJson, StakingTxErrorType, StakingType, SupportTransferResponse, ThemeNames, TransactionHistoryItem, TransactionResponse, TransferTxErrorType, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes'; import { AccountAuthType, AccountJson, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountChangePassword, RequestAccountCreateExternal, RequestAccountCreateHardware, RequestAccountCreateSuri, RequestAccountEdit, RequestAccountExport, RequestAccountForget, RequestAccountShow, RequestAccountTie, RequestAccountValidate, RequestAuthorizeCancel, RequestAuthorizeReject, RequestBatchRestore, RequestCurrentAccountAddress, RequestDeriveCreate, RequestDeriveValidate, RequestJsonRestore, RequestMetadataApprove, RequestMetadataReject, RequestSeedCreate, RequestSeedValidate, RequestSigningApproveSignature, RequestSigningCancel, RequestTypes, ResponseAccountExport, ResponseAuthorizeList, ResponseDeriveValidate, ResponseJsonGetAccountInfo, ResponseSeedCreate, ResponseSeedValidate, ResponseType, SigningRequest, WindowOpenParams } from '@subwallet/extension-base/background/types'; import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning'; -import { ALL_ACCOUNT_KEY, ALL_GENESIS_HASH, XCM_FEE_RATIO, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants'; +import { ALL_ACCOUNT_KEY, ALL_GENESIS_HASH, LATEST_SESSION, XCM_FEE_RATIO, XCM_MIN_AMOUNT_RATIO } from '@subwallet/extension-base/constants'; import { ALLOWED_PATH } from '@subwallet/extension-base/defaults'; import { resolveAzeroAddressToDomain, resolveAzeroDomainToAddress } from '@subwallet/extension-base/koni/api/dotsama/domain'; import { parseSubstrateTransaction } from '@subwallet/extension-base/koni/api/dotsama/parseTransaction'; @@ -36,6 +36,7 @@ import { SWTransaction, SWTransactionResponse, SWTransactionResult, TransactionE import { WALLET_CONNECT_EIP155_NAMESPACE } from '@subwallet/extension-base/services/wallet-connect-service/constants'; import { isProposalExpired, isSupportWalletConnectChain, isSupportWalletConnectNamespace } from '@subwallet/extension-base/services/wallet-connect-service/helpers'; import { ResultApproveWalletConnectSession, WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types'; +import { SWStorage } from '@subwallet/extension-base/storage'; import { AccountsStore } from '@subwallet/extension-base/stores'; import { BalanceJson, BuyServiceInfo, BuyTokenInfo, EarningRewardJson, NominationPoolInfo, OptimalYieldPathParams, RequestEarlyValidateYield, RequestGetYieldPoolTargets, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseGetYieldPoolTargets, ValidateYieldProcessParams, YieldPoolType } from '@subwallet/extension-base/types'; import { SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, ValidateSwapProcessParams } from '@subwallet/extension-base/types/swap'; @@ -104,11 +105,13 @@ export default class KoniExtension { this.#lockTimeOut = setTimeout(() => { if (!this.#skipAutoLock) { this.keyringLock(); + updateLatestSession(Date.now()); } }, this.#timeAutoLock * 60 * 1000); } else if (this.#alwaysLock) { if (!this.#firstTime) { this.keyringLock(); + updateLatestSession(Date.now()); } } } @@ -118,6 +121,10 @@ export default class KoniExtension { } }; + const updateLatestSession = (time: number) => { + SWStorage.instance.setItem(LATEST_SESSION, JSON.stringify({ remind: true, timeCalculate: time })); + }; + this.#koniState.settingService.getSettings(updateTimeAutoLock); this.#koniState.settingService.getSubject().subscribe({ next: updateTimeAutoLock diff --git a/packages/extension-base/src/koni/background/handlers/State.ts b/packages/extension-base/src/koni/background/handlers/State.ts index c2a581a3053..6dc67f603c6 100644 --- a/packages/extension-base/src/koni/background/handlers/State.ts +++ b/packages/extension-base/src/koni/background/handlers/State.ts @@ -336,6 +336,8 @@ export default class KoniState { await this.dbService.stores.crowdloan.removeEndedCrowdloans(); await this.startSubscription(); + + this.chainService.checkLatestData(); } public async initMantaPay (password: string) { @@ -1912,6 +1914,8 @@ export default class KoniState { await this.chainService.init(); this.afterChainServiceInit(); + + this.chainService.checkLatestData(); } public async enableMantaPay (updateStore: boolean, address: string, password: string, seedPhrase?: string) { diff --git a/packages/extension-base/src/packageInfo.ts b/packages/extension-base/src/packageInfo.ts index fd7fc1fd461..641362340fd 100644 --- a/packages/extension-base/src/packageInfo.ts +++ b/packages/extension-base/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.1.66-0' }; +export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.1.67-1' }; diff --git a/packages/extension-base/src/services/chain-service/index.ts b/packages/extension-base/src/services/chain-service/index.ts index 46bd3287b62..63a0f646ff0 100644 --- a/packages/extension-base/src/services/chain-service/index.ts +++ b/packages/extension-base/src/services/chain-service/index.ts @@ -604,8 +604,6 @@ export class ChainService { await this.initAssetSettings(); this.initAssetRefMap(); await this.autoEnableTokens(); - - this.checkLatestData(); } initAssetRefMap () { @@ -687,7 +685,7 @@ export class ChainService { const latestAssetPatch = JSON.stringify(latestAssetInfo); if (this.assetMapPatch !== latestAssetPatch) { - const assetRegistry = filterAssetInfoMap(this.getChainInfoMap(), { ...ChainAssetMap, ...latestAssetInfo }); + const assetRegistry = filterAssetInfoMap(this.getChainInfoMap(), Object.assign({}, this.dataMap.assetRegistry, latestAssetInfo)); this.assetMapPatch = latestAssetPatch; this.dataMap.assetRegistry = assetRegistry; diff --git a/packages/extension-chains/package.json b/packages/extension-chains/package.json index bf78d3d1c51..046e9e08503 100644 --- a/packages/extension-chains/package.json +++ b/packages/extension-chains/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/networks": "^12.6.2", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.1.66-0" + "@subwallet/extension-inject": "^1.1.67-1" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-chains/src/packageInfo.ts b/packages/extension-chains/src/packageInfo.ts index f545a0dd3b4..d18ca3460eb 100644 --- a/packages/extension-chains/src/packageInfo.ts +++ b/packages/extension-chains/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.1.66-0' }; +export const packageInfo = { name: '@subwallet/extension-chains', path: 'auto', type: 'auto', version: '1.1.67-1' }; diff --git a/packages/extension-compat-metamask/package.json b/packages/extension-compat-metamask/package.json index 10e2d65c00b..5ec98c767a3 100644 --- a/packages/extension-compat-metamask/package.json +++ b/packages/extension-compat-metamask/package.json @@ -17,14 +17,14 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@metamask/detect-provider": "^1.2.0", "@polkadot/types": "^11.0.3", "@polkadot/util": "^12.6.2", - "@subwallet/extension-inject": "^1.1.66-0", + "@subwallet/extension-inject": "^1.1.67-1", "web3": "^1.10.0" }, "peerDependencies": { diff --git a/packages/extension-compat-metamask/src/packageInfo.ts b/packages/extension-compat-metamask/src/packageInfo.ts index 7edbe7fafa5..19323d195e2 100644 --- a/packages/extension-compat-metamask/src/packageInfo.ts +++ b/packages/extension-compat-metamask/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.1.66-0' }; +export const packageInfo = { name: '@subwallet/extension-compat-metamask', path: 'auto', type: 'auto', version: '1.1.67-1' }; diff --git a/packages/extension-dapp/package.json b/packages/extension-dapp/package.json index 10c49569b08..3854b6f6045 100644 --- a/packages/extension-dapp/package.json +++ b/packages/extension-dapp/package.json @@ -17,13 +17,13 @@ "./detectPackage.cjs" ], "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", "@polkadot/util": "^12.6.2", "@polkadot/util-crypto": "^12.6.2", - "@subwallet/extension-inject": "^1.1.66-0" + "@subwallet/extension-inject": "^1.1.67-1" }, "peerDependencies": { "@polkadot/api": "*", diff --git a/packages/extension-dapp/src/packageInfo.ts b/packages/extension-dapp/src/packageInfo.ts index 10ffeaa3c6a..00719e165b8 100644 --- a/packages/extension-dapp/src/packageInfo.ts +++ b/packages/extension-dapp/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.1.66-0' }; +export const packageInfo = { name: '@subwallet/extension-dapp', path: 'auto', type: 'auto', version: '1.1.67-1' }; diff --git a/packages/extension-inject/package.json b/packages/extension-inject/package.json index 321b8139d0b..1ac4ae37e10 100644 --- a/packages/extension-inject/package.json +++ b/packages/extension-inject/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-inject/src/packageInfo.ts b/packages/extension-inject/src/packageInfo.ts index f1ae5c3af43..8564f70b00a 100644 --- a/packages/extension-inject/src/packageInfo.ts +++ b/packages/extension-inject/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.1.66-0' }; +export const packageInfo = { name: '@subwallet/extension-inject', path: 'auto', type: 'auto', version: '1.1.67-1' }; diff --git a/packages/extension-koni-ui/package.json b/packages/extension-koni-ui/package.json index 9a8e53baf42..48892f4f4ce 100644 --- a/packages/extension-koni-ui/package.json +++ b/packages/extension-koni-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -35,10 +35,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.63", - "@subwallet/extension-base": "^1.1.66-0", - "@subwallet/extension-chains": "^1.1.66-0", - "@subwallet/extension-dapp": "^1.1.66-0", - "@subwallet/extension-inject": "^1.1.66-0", + "@subwallet/extension-base": "^1.1.67-1", + "@subwallet/extension-chains": "^1.1.67-1", + "@subwallet/extension-dapp": "^1.1.67-1", + "@subwallet/extension-inject": "^1.1.67-1", "@subwallet/keyring": "^0.1.5", "@subwallet/react-ui": "5.1.2-b77", "@subwallet/ui-keyring": "^0.1.5", @@ -83,7 +83,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.1.66-0", + "@subwallet/extension-mocks": "^1.1.67-1", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/extension-koni-ui/src/Popup/Account/AccountExport.tsx b/packages/extension-koni-ui/src/Popup/Account/AccountExport.tsx index d77154cde8e..716df1716aa 100644 --- a/packages/extension-koni-ui/src/Popup/Account/AccountExport.tsx +++ b/packages/extension-koni-ui/src/Popup/Account/AccountExport.tsx @@ -5,13 +5,13 @@ import { Layout, PageWrapper } from '@subwallet/extension-koni-ui/components'; import AlertBox from '@subwallet/extension-koni-ui/components/Alert'; import CloseIcon from '@subwallet/extension-koni-ui/components/Icon/CloseIcon'; import WordPhrase from '@subwallet/extension-koni-ui/components/WordPhrase'; -import { DEFAULT_ROUTER_PATH } from '@subwallet/extension-koni-ui/constants/router'; +import { DEFAULT_ROUTER_PATH } from '@subwallet/extension-koni-ui/constants'; import useGetAccountByAddress from '@subwallet/extension-koni-ui/hooks/account/useGetAccountByAddress'; import useCopy from '@subwallet/extension-koni-ui/hooks/common/useCopy'; import useFocusFormItem from '@subwallet/extension-koni-ui/hooks/form/useFocusFormItem'; import useDefaultNavigate from '@subwallet/extension-koni-ui/hooks/router/useDefaultNavigate'; import { exportAccount, exportAccountPrivateKey, keyringExportMnemonic } from '@subwallet/extension-koni-ui/messaging'; -import { PhosphorIcon, ThemeProps } from '@subwallet/extension-koni-ui/types'; +import { PhosphorIcon, RemindBackUpSeedPhraseParamState, ThemeProps } from '@subwallet/extension-koni-ui/types'; import { FormCallbacks, FormFieldData } from '@subwallet/extension-koni-ui/types/form'; import { KeyringPair$Json } from '@subwallet/keyring/types'; import { BackgroundIcon, Button, Field, Form, Icon, Input, PageIcon, SettingItem, SwQRCode } from '@subwallet/react-ui'; @@ -20,7 +20,7 @@ import { saveAs } from 'file-saver'; import { CheckCircle, CopySimple, DownloadSimple, FileJs, Leaf, QrCode, Wallet } from 'phosphor-react'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useLocation, useNavigate, useParams } from 'react-router-dom'; import styled from 'styled-components'; import { isEthereumAddress } from '@polkadot/util-crypto'; @@ -76,8 +76,9 @@ const Component: React.FC = (props: Props) => { const { t } = useTranslation(); const navigate = useNavigate(); - const { goHome } = useDefaultNavigate(); + const { goBack } = useDefaultNavigate(); const { accountAddress } = useParams(); + const isBackToHome = useLocation().state as RemindBackUpSeedPhraseParamState; const account = useGetAccountByAddress(accountAddress); @@ -275,18 +276,22 @@ const Component: React.FC = (props: Props) => { }, [account, t]); const onBack = useCallback(() => { - if (accountAddress) { + if (accountAddress && !isBackToHome?.from) { navigate(`/accounts/detail/${accountAddress}`); } else { - navigate(DEFAULT_ROUTER_PATH); + navigate(isBackToHome.from, { state: { ...isBackToHome, from: 'ignoreBanner' } }); } - }, [accountAddress, navigate]); + }, [accountAddress, isBackToHome, navigate]); + + const goHomeWithState = useCallback(() => { + goBack(DEFAULT_ROUTER_PATH, { from: 'ignoreBanner' }); + }, [goBack]); useEffect(() => { if (!account) { - goHome(); + goBack(DEFAULT_ROUTER_PATH, { from: 'ignoreBanner' }); } - }, [account, goHome, navigate]); + }, [account, goBack, navigate]); useEffect(() => { if (account?.address) { @@ -310,12 +315,12 @@ const Component: React.FC = (props: Props) => { icon: firstStep ? undefined : FinishIcon, disabled: isDisabled || !exportTypes.length, loading: loading, - onClick: firstStep ? form.submit : goHome + onClick: firstStep ? form.submit : goHomeWithState }} subHeaderIcons={[ { icon: , - onClick: goHome, + onClick: goHomeWithState, disabled: loading } ]} diff --git a/packages/extension-koni-ui/src/Popup/Account/NewSeedPhrase.tsx b/packages/extension-koni-ui/src/Popup/Account/NewSeedPhrase.tsx index efeb5a67954..b4e94442eea 100644 --- a/packages/extension-koni-ui/src/Popup/Account/NewSeedPhrase.tsx +++ b/packages/extension-koni-ui/src/Popup/Account/NewSeedPhrase.tsx @@ -34,7 +34,7 @@ const Component: React.FC = ({ className }: Props) => { const navigate = useNavigate(); const [_isConfirmedTermSeedPhrase] = useLocalStorage(CONFIRM_TERM_SEED_PHRASE, 'nonConfirmed'); const { goHome } = useDefaultNavigate(); - const { activeModal } = useContext(ModalContext); + const { activeModal, inactiveModal } = useContext(ModalContext); const checkUnlock = useUnlockChecker(); const onComplete = useCompleteCreateAccount(); @@ -106,7 +106,7 @@ const Component: React.FC = ({ className }: Props) => { if (_isConfirmedTermSeedPhrase === 'nonConfirmed') { activeModal(TERM_AND_CONDITION_SEED_PHRASE_MODAL); } - }, [_isConfirmedTermSeedPhrase, activeModal]); + }, [_isConfirmedTermSeedPhrase, activeModal, inactiveModal]); useEffect(() => { createSeedV2(undefined, undefined, DEFAULT_ACCOUNT_TYPES) diff --git a/packages/extension-koni-ui/src/Popup/Home/History/index.tsx b/packages/extension-koni-ui/src/Popup/Home/History/index.tsx index ad60b2cf85f..0747943620d 100644 --- a/packages/extension-koni-ui/src/Popup/Home/History/index.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/History/index.tsx @@ -8,11 +8,11 @@ import { YIELD_EXTRINSIC_TYPES } from '@subwallet/extension-base/koni/api/yield/ import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils'; import { quickFormatAddressToCompare } from '@subwallet/extension-base/utils'; import { AccountSelector, BasicInputEvent, ChainSelector, EmptyList, FilterModal, HistoryItem, Layout, PageWrapper } from '@subwallet/extension-koni-ui/components'; -import { HISTORY_DETAIL_MODAL } from '@subwallet/extension-koni-ui/constants'; +import { DEFAULT_SESSION_VALUE, HISTORY_DETAIL_MODAL, LATEST_SESSION, REMIND_BACKUP_SEED_PHRASE_MODAL } from '@subwallet/extension-koni-ui/constants'; import { DataContext } from '@subwallet/extension-koni-ui/contexts/DataContext'; import { useChainInfoWithState, useFilterModal, useHistorySelection, useSelector, useSetCurrentPage } from '@subwallet/extension-koni-ui/hooks'; import { cancelSubscription, subscribeTransactionHistory } from '@subwallet/extension-koni-ui/messaging'; -import { ChainItemType, ThemeProps, TransactionHistoryDisplayData, TransactionHistoryDisplayItem } from '@subwallet/extension-koni-ui/types'; +import { ChainItemType, SessionStorage, ThemeProps, TransactionHistoryDisplayData, TransactionHistoryDisplayItem } from '@subwallet/extension-koni-ui/types'; import { customFormatDate, findAccountByAddress, findNetworkJsonByGenesisHash, formatHistoryDate, isTypeStaking, isTypeTransfer } from '@subwallet/extension-koni-ui/utils'; import { ButtonProps, Icon, ModalContext, SwIconProps, SwList, SwSubHeader } from '@subwallet/react-ui'; import { Aperture, ArrowDownLeft, ArrowsLeftRight, ArrowUpRight, Clock, ClockCounterClockwise, Database, FadersHorizontal, Rocket, Spinner } from 'phosphor-react'; @@ -209,6 +209,7 @@ function filterDuplicateItems (items: TransactionHistoryItem[]): TransactionHist } const modalId = HISTORY_DETAIL_MODAL; +const remindSeedPhraseModalId = REMIND_BACKUP_SEED_PHRASE_MODAL; const DEFAULT_ITEMS_COUNT = 20; const NEXT_ITEMS_COUNT = 10; @@ -223,7 +224,6 @@ function Component ({ className = '' }: Props): React.ReactElement { const { language } = useSelector((root) => root.settings); const [loading, setLoading] = useState(true); const [rawHistoryList, setRawHistoryList] = useState([]); - const isActive = checkActive(modalId); const { filterSelectionMap, onApplyFilter, onChangeFilterOption, onCloseFilterModal, selectedFilters } = useFilterModal(FILTER_MODAL_ID); @@ -434,10 +434,19 @@ function Component ({ className = '' }: Props): React.ReactElement { }, [activeModal]); const onCloseDetail = useCallback(() => { + const infoSession = Date.now(); + + const { remind, timeBackup, timeCalculate } = (JSON.parse(localStorage.getItem(LATEST_SESSION) || JSON.stringify(DEFAULT_SESSION_VALUE))) as SessionStorage; + inactiveModal(modalId); + + if (infoSession - timeCalculate >= timeBackup && remind) { + activeModal(REMIND_BACKUP_SEED_PHRASE_MODAL); + } + setSelectedItem(null); setOpenDetailLink(false); - }, [inactiveModal]); + }, [activeModal, inactiveModal]); const onClickFilter = useCallback(() => { activeModal(FILTER_MODAL_ID); @@ -449,10 +458,11 @@ function Component ({ className = '' }: Props): React.ReactElement { if (existed) { setSelectedItem(existed); + inactiveModal(REMIND_BACKUP_SEED_PHRASE_MODAL); activeModal(modalId); } } - }, [activeModal, chain, extrinsicHashOrId, openDetailLink, historyMap]); + }, [activeModal, chain, extrinsicHashOrId, openDetailLink, historyMap, inactiveModal]); useEffect(() => { if (isActive) { @@ -465,8 +475,9 @@ function Component ({ className = '' }: Props): React.ReactElement { return selected; } }); + inactiveModal(remindSeedPhraseModalId); } - }, [isActive, historyMap]); + }, [isActive, historyMap, inactiveModal]); useEffect(() => { if (currentAccount?.address !== curAdr) { diff --git a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx index 3d6bb30a8b6..be351364278 100644 --- a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftCollectionDetail.tsx @@ -33,8 +33,8 @@ const subHeaderRightButton = ; function Component ({ className = '' }: Props): React.ReactElement { - const location = useLocation(); - const { collectionInfo, nftList } = location.state as INftCollectionDetail; + const state = useLocation().state as INftCollectionDetail; + const { collectionInfo, nftList } = state; const { t } = useTranslation(); const navigate = useNavigate(); @@ -67,8 +67,8 @@ function Component ({ className = '' }: Props): React.ReactElement { }, []); const handleOnClickNft = useCallback((state: INftItemDetail) => { - navigate('/home/nfts/item-detail', { state }); - }, [navigate]); + navigate('/home/nfts/item-detail', { state: { ...state, nftList } }); + }, [navigate, nftList]); const renderNft = useCallback((nftItem: NftItem) => { const routingParams = { collectionInfo, nftItem } as INftItemDetail; diff --git a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx index 68f571f38e8..1de0eac0184 100644 --- a/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx +++ b/packages/extension-koni-ui/src/Popup/Home/Nfts/NftItemDetail.tsx @@ -38,10 +38,11 @@ const modalCloseButton = ; +const collectionNFTUrl = '/home/nfts/collection-detail'; function Component ({ className = '' }: Props): React.ReactElement { - const location = useLocation(); - const { collectionInfo, nftItem } = location.state as INftItemDetail; + const state = useLocation().state as INftItemDetail; + const { collectionInfo, nftItem } = state; const { t } = useTranslation(); const notify = useNotification(); @@ -183,6 +184,10 @@ function Component ({ className = '' }: Props): React.ReactElement { } }, [nftItem.externalUrl]); + const goBackToNFTCollection = useCallback(() => { + goBack(collectionNFTUrl, state); + }, [goBack, state]); + const show3DModel = SHOW_3D_MODELS_CHAIN.includes(nftItem.chain); return ( @@ -191,7 +196,7 @@ function Component ({ className = '' }: Props): React.ReactElement { resolve={dataContext.awaitStores(['nft', 'accountState', 'chainStore'])} > { const { activeModal, inactiveModal } = useContext(ModalContext); const chainsByAccountType = useGetChainSlugsByAccountType(); const tokenGroupStructure = useTokenGroup(chainsByAccountType); + const location = useLocation(); const accountBalance = useAccountBalance(tokenGroupStructure.tokenGroupMap); const currentAccount = useSelector((state: RootState) => state.accountState.currentAccount); const [isConfirmedTermGeneral, setIsConfirmedTermGeneral] = useLocalStorage(CONFIRM_GENERAL_TERM, 'nonConfirmed'); - const mantaPayConfig = useGetMantaPayConfig(currentAccount?.address); const isZkModeSyncing = useSelector((state: RootState) => state.mantaPay.isSyncing); const handleMantaPaySync = useHandleMantaPaySync(); - const banners = useGetBannerByScreen('home'); const firstBanner = useMemo((): CampaignBanner | undefined => banners[0], [banners]); + const { sessionLatest } = useSetSessionLatest(); + const onOpenGlobalSearchToken = useCallback(() => { activeModal(GlobalSearchTokenModalId); }, [activeModal]); @@ -56,10 +60,26 @@ function Component ({ className = '' }: Props): React.ReactElement { }, [handleMantaPaySync, isZkModeSyncing, mantaPayConfig]); useEffect(() => { - if (firstBanner) { + const isFromIgnorePage = location.state as RemindBackUpSeedPhraseParamState; + const sessionLatestInit = (JSON.parse(localStorage.getItem(LATEST_SESSION) || JSON.stringify(DEFAULT_SESSION_VALUE))) as SessionStorage; + + if (firstBanner && !sessionLatestInit.remind && isFromIgnorePage?.from !== historyPageIgnoreBanner) { activeModal(HOME_CAMPAIGN_BANNER_MODAL); } - }, [activeModal, firstBanner]); + }, [activeModal, firstBanner, location]); + + useEffect(() => { + const infoSession = Date.now(); + + const isFromIgnorePage = location.state as RemindBackUpSeedPhraseParamState; + + if (infoSession - sessionLatest.timeCalculate > sessionLatest.timeBackup && + sessionLatest.remind && + (isFromIgnorePage?.from !== historyPageIgnoreRemind)) { + inactiveModal(HOME_CAMPAIGN_BANNER_MODAL); + activeModal(REMIND_BACKUP_SEED_PHRASE_MODAL); + } + }, [activeModal, inactiveModal, location, sessionLatest]); useEffect(() => { if (isConfirmedTermGeneral.includes('nonConfirmed')) { diff --git a/packages/extension-koni-ui/src/Popup/Root.tsx b/packages/extension-koni-ui/src/Popup/Root.tsx index b58cab4d4de..3a80ebb4589 100644 --- a/packages/extension-koni-ui/src/Popup/Root.tsx +++ b/packages/extension-koni-ui/src/Popup/Root.tsx @@ -239,7 +239,10 @@ function DefaultRoute ({ children }: { children: React.ReactNode }): React.React }, [currentAccount, initAccount]); if (rootLoading || redirectPath) { - return <>{redirectPath && }; + return <>{redirectPath && }; } else { return {children} diff --git a/packages/extension-koni-ui/src/Popup/Transaction/variants/Swap.tsx b/packages/extension-koni-ui/src/Popup/Transaction/variants/Swap.tsx index b26a4c317da..b8ac970462e 100644 --- a/packages/extension-koni-ui/src/Popup/Transaction/variants/Swap.tsx +++ b/packages/extension-koni-ui/src/Popup/Transaction/variants/Swap.tsx @@ -100,7 +100,7 @@ const Component = () => { const [swapError, setSwapError] = useState(undefined); const [isFormInvalid, setIsFormInvalid] = useState(false); const [currentOptimalSwapPath, setOptimalSwapPath] = useState(undefined); - // @ts-ignore + const [confirmedTerm, setConfirmedTerm] = useLocalStorage(CONFIRM_SWAP_TERM, ''); const [showQuoteArea, setShowQuoteArea] = useState(false); const optimalQuoteRef = useRef(undefined); diff --git a/packages/extension-koni-ui/src/Popup/TransactionDone.tsx b/packages/extension-koni-ui/src/Popup/TransactionDone.tsx index e9c4ce2538c..6297025bc9e 100644 --- a/packages/extension-koni-ui/src/Popup/TransactionDone.tsx +++ b/packages/extension-koni-ui/src/Popup/TransactionDone.tsx @@ -27,7 +27,7 @@ const Component: React.FC = (props: Props) => { const viewInHistory = useCallback( () => { if (address && chain && transactionId) { - navigate(`/home/history/${reformatAddress(address)}/${chain}/${transactionId}`); + navigate(`/home/history/${reformatAddress(address)}/${chain}/${transactionId}`, { state: { from: 'ignoreRemind' } }); } else { navigate('/home/history'); } diff --git a/packages/extension-koni-ui/src/components/Layout/base/Home.tsx b/packages/extension-koni-ui/src/components/Layout/base/Home.tsx index c061ae1ac59..35565e51e22 100644 --- a/packages/extension-koni-ui/src/components/Layout/base/Home.tsx +++ b/packages/extension-koni-ui/src/components/Layout/base/Home.tsx @@ -15,7 +15,7 @@ type Props = { showSearchIcon?: boolean; onClickFilterIcon?: () => void; onClickSearchIcon?: () => void; - showTabBar?: boolean + showTabBar?: boolean; }; const Home = ({ children, onClickFilterIcon, onClickSearchIcon, showFilterIcon, showSearchIcon, showTabBar }: Props) => { diff --git a/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/ExportAllSelector.tsx b/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/ExportAllSelector.tsx index 03c4eefa34a..52ade1298f5 100644 --- a/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/ExportAllSelector.tsx +++ b/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/ExportAllSelector.tsx @@ -8,7 +8,7 @@ import { BasicInputWrapper } from '@subwallet/extension-koni-ui/components/Field import ExportAllSelectItem from '@subwallet/extension-koni-ui/components/Layout/parts/SelectAccount/ExportAllSelectItem'; import { FilterModal } from '@subwallet/extension-koni-ui/components/Modal/FilterModal'; import { EXPORT_ACCOUNTS_PASSWORD_MODAL, SELECT_ACCOUNT_MODAL } from '@subwallet/extension-koni-ui/constants'; -import { useFilterModal } from '@subwallet/extension-koni-ui/hooks'; +import { useFilterModal, useGoBackSelectAccount } from '@subwallet/extension-koni-ui/hooks'; import { useSelectAccount } from '@subwallet/extension-koni-ui/hooks/modal/useSelectAccount'; import { AccountSignMode, ThemeProps } from '@subwallet/extension-koni-ui/types'; import { getSignMode, isAccountAll, searchAccountFunction } from '@subwallet/extension-koni-ui/utils'; @@ -19,8 +19,6 @@ import React, { ForwardedRef, forwardRef, SyntheticEvent, useCallback, useContex import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; -import useGoBackSelectAccount from '../../../../hooks/modal/useGoBackSelectAccount'; - interface Props extends ThemeProps, BasicInputWrapper { items: AccountJson[]; isSingleSelect?: boolean; diff --git a/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/index.tsx b/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/index.tsx index fcb0f39e335..23a42ca0d6a 100644 --- a/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/index.tsx +++ b/packages/extension-koni-ui/src/components/Layout/parts/SelectAccount/index.tsx @@ -4,20 +4,20 @@ import { AccountJson, CurrentAccountInfo } from '@subwallet/extension-base/background/types'; import ExportAllSelector from '@subwallet/extension-koni-ui/components/Layout/parts/SelectAccount/ExportAllSelector'; import { SimpleQrModal } from '@subwallet/extension-koni-ui/components/Modal'; -import { DISCONNECT_EXTENSION_MODAL, SELECT_ACCOUNT_MODAL } from '@subwallet/extension-koni-ui/constants'; -import { useDefaultNavigate, useGetCurrentAuth, useGetCurrentTab, useGoBackSelectAccount, useIsPopup, useTranslation } from '@subwallet/extension-koni-ui/hooks'; +import { DEFAULT_SESSION_VALUE, DISCONNECT_EXTENSION_MODAL, LATEST_SESSION, SELECT_ACCOUNT_MODAL } from '@subwallet/extension-koni-ui/constants'; +import { useDefaultNavigate, useGetCurrentAuth, useGetCurrentTab, useGoBackSelectAccount, useIsPopup, useSetSessionLatest, useTranslation } from '@subwallet/extension-koni-ui/hooks'; import { saveCurrentAccountAddress } from '@subwallet/extension-koni-ui/messaging'; import { RootState } from '@subwallet/extension-koni-ui/stores'; import { Theme } from '@subwallet/extension-koni-ui/themes'; -import { ThemeProps } from '@subwallet/extension-koni-ui/types'; +import { SessionStorage, ThemeProps } from '@subwallet/extension-koni-ui/types'; import { findAccountByAddress, funcSortByName, isAccountAll, searchAccountFunction } from '@subwallet/extension-koni-ui/utils'; import { BackgroundIcon, ButtonProps, Icon, ModalContext, SelectModal, Tooltip } from '@subwallet/react-ui'; import CN from 'classnames'; -import { Export, Plug, Plugs, PlugsConnected } from 'phosphor-react'; +import { Circle, Export, Plug, Plugs, PlugsConnected } from 'phosphor-react'; import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; import { useLocation, useNavigate } from 'react-router-dom'; -import styled from 'styled-components'; +import styled, { useTheme } from 'styled-components'; import { isEthereumAddress } from '@polkadot/util-crypto'; @@ -26,7 +26,9 @@ import { GeneralEmptyList } from '../../../EmptyList'; import { ConnectWebsiteModal } from '../ConnectWebsiteModal'; import SelectAccountFooter from '../SelectAccount/Footer'; -type Props = ThemeProps +interface Props extends ThemeProps { + id?: string +} enum ConnectionStatement { NOT_CONNECTED='not-connected', @@ -52,12 +54,13 @@ const modalId = SELECT_ACCOUNT_MODAL; const simpleQrModalId = 'simple-qr-modal-id'; const multiExportAccountModalId = 'multi-export-account-selector'; -function Component ({ className }: Props): React.ReactElement { +function Component ({ className, id }: Props): React.ReactElement { const { t } = useTranslation(); - const { activeModal, inactiveModal } = useContext(ModalContext); + const { activeModal, checkActive, inactiveModal } = useContext(ModalContext); const navigate = useNavigate(); const location = useLocation(); const { goHome } = useDefaultNavigate(); + const { setStateSelectAccount } = useSetSessionLatest(); const { accounts: _accounts, currentAccount, isAllAccount } = useSelector((state: RootState) => state.accountState); @@ -68,7 +71,10 @@ function Component ({ className }: Props): React.ReactElement { const isCurrentTabFetched = !!currentTab; const currentAuth = useGetCurrentAuth(); const isPopup = useIsPopup(); + const { token } = useTheme() as Theme; const [selectedQrAddress, setSelectedQrAddress] = useState(); + const [isRemindSeedPhrase, setIsRemindSeedPhrase] = useState(false); + const isActiveModal = useMemo(() => checkActive(modalId), [checkActive]); const accounts = useMemo((): AccountJson[] => { const result = [..._accounts].sort(funcSortByName); @@ -149,7 +155,7 @@ function Component ({ className }: Props): React.ReactElement { navigate(`/accounts/detail/${address}`); }, 100); }; - }, [navigate, inactiveModal]); + }, [inactiveModal, navigate]); const openDisconnectExtensionModal = useCallback(() => { activeModal(DISCONNECT_EXTENSION_MODAL); @@ -197,12 +203,20 @@ function Component ({ className }: Props): React.ReactElement { const renderSelectedItem = useCallback((item: AccountJson): React.ReactNode => { return ( -
+
); }, []); + useEffect(() => { + const { isFinished } = (JSON.parse(localStorage.getItem(LATEST_SESSION) || JSON.stringify(DEFAULT_SESSION_VALUE))) as SessionStorage; + + isActiveModal && setIsRemindSeedPhrase(!isFinished); + }, [isActiveModal]); + useEffect(() => { if (currentAuth) { if (!currentAuth.isAllowed) { @@ -307,19 +321,47 @@ function Component ({ className }: Props): React.ReactElement { activeModal(multiExportAccountModalId); }, [activeModal]); - const rightButton = useMemo((): ButtonProps => ({ - icon: ( - - ), - onClick: exportAllAccounts, - size: 'xs', - type: 'ghost', - tooltip: t('Export account'), - tooltipPlacement: 'topLeft' - }), [exportAllAccounts, t]); + const onCloseSelectAccountModal = useCallback(() => { + inactiveModal(modalId); + setStateSelectAccount(true); + }, [inactiveModal, setStateSelectAccount]); + + const rightButton = useMemo((): ButtonProps => { + return ({ + icon: ( + + ), + children: ( + isRemindSeedPhrase && +
+ +
+
+ ), + onClick: exportAllAccounts, + size: 'xs', + type: 'ghost', + tooltip: !isRemindSeedPhrase && t('Export account'), + tooltipPlacement: 'topLeft' + }); + }, [exportAllAccounts, isRemindSeedPhrase, t, token.colorHighlight]); return (
@@ -353,6 +395,7 @@ function Component ({ className }: Props): React.ReactElement { inputWidth={'100%'} itemKey='address' items={accounts} + onCancel={onCloseSelectAccountModal} onSelect={_onSelect} renderItem={renderItem} renderSelected={renderSelectedItem} @@ -518,6 +561,17 @@ const SelectAccount = styled(Component)(({ theme }) => { [`&.-${ConnectionStatement.PARTIAL_CONNECTED}`]: { '--bg-color': token.colorWarning } + }, + + '.__icon-export-remind': { + position: 'absolute', + top: '-35%', + left: '40%' + }, + + '.anticon.__export-remind-btn': { + height: 23, + width: 24 } }); }); diff --git a/packages/extension-koni-ui/src/components/Modal/Account/AccountExportPasswordModal.tsx b/packages/extension-koni-ui/src/components/Modal/Account/AccountExportPasswordModal.tsx index 250d81b01a9..ef6c9dd2980 100644 --- a/packages/extension-koni-ui/src/components/Modal/Account/AccountExportPasswordModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/Account/AccountExportPasswordModal.tsx @@ -42,7 +42,6 @@ const onExportJson = (jsonData: KeyringPairs$Json): (() => void) => { function Component ({ addresses, className = '' }: Props): React.ReactElement { const { t } = useTranslation(); const navigate = useNavigate(); - const { inactiveModal } = useContext(ModalContext); const [form] = Form.useForm(); diff --git a/packages/extension-koni-ui/src/components/Modal/Account/AccountTypeModal.tsx b/packages/extension-koni-ui/src/components/Modal/Account/AccountTypeModal.tsx index e410a7acdfa..d837d728b6c 100644 --- a/packages/extension-koni-ui/src/components/Modal/Account/AccountTypeModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/Account/AccountTypeModal.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { DEFAULT_ACCOUNT_TYPES } from '@subwallet/extension-koni-ui/constants'; -import { useClickOutSide, useSetSelectedAccountTypes, useSwitchModal, useTranslation } from '@subwallet/extension-koni-ui/hooks'; +import { useClickOutSide, useSetSelectedAccountTypes, useSetSessionLatest, useSwitchModal, useTranslation } from '@subwallet/extension-koni-ui/hooks'; import { PhosphorIcon, ThemeProps } from '@subwallet/extension-koni-ui/types'; import { renderModalSelector } from '@subwallet/extension-koni-ui/utils/common/dom'; import { Button, Icon, ModalContext, SwModal } from '@subwallet/react-ui'; @@ -31,20 +31,23 @@ const Component: React.FC = (props: Props) => { const { checkActive, inactiveModal } = useContext(ModalContext); const navigate = useNavigate(); const isActive = checkActive(id); + const { setStateSelectAccount } = useSetSessionLatest(); const setSelectedAccountTypes = useSetSelectedAccountTypes(false); const [selectedItems, setSelectedItems] = useState(DEFAULT_ACCOUNT_TYPES); const onCancel = useCallback(() => { + setStateSelectAccount(true); inactiveModal(id); - }, [id, inactiveModal]); + }, [id, inactiveModal, setStateSelectAccount]); const onSubmit = useCallback(() => { + setStateSelectAccount(true); setSelectedAccountTypes(selectedItems); navigate(url); inactiveModal(id); - }, [setSelectedAccountTypes, selectedItems, navigate, url, inactiveModal, id]); + }, [setStateSelectAccount, setSelectedAccountTypes, selectedItems, navigate, url, inactiveModal, id]); const onBack = useSwitchModal(id, previousId); diff --git a/packages/extension-koni-ui/src/components/Modal/Account/AttachAccountModal.tsx b/packages/extension-koni-ui/src/components/Modal/Account/AttachAccountModal.tsx index cc626489513..6ac102a0cf1 100644 --- a/packages/extension-koni-ui/src/components/Modal/Account/AttachAccountModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/Account/AttachAccountModal.tsx @@ -5,6 +5,7 @@ import BackIcon from '@subwallet/extension-koni-ui/components/Icon/BackIcon'; import CloseIcon from '@subwallet/extension-koni-ui/components/Icon/CloseIcon'; import { SettingItemSelection } from '@subwallet/extension-koni-ui/components/Setting/SettingItemSelection'; import { ATTACH_ACCOUNT_MODAL } from '@subwallet/extension-koni-ui/constants/modal'; +import { useSetSessionLatest } from '@subwallet/extension-koni-ui/hooks'; import useTranslation from '@subwallet/extension-koni-ui/hooks/common/useTranslation'; import useClickOutSide from '@subwallet/extension-koni-ui/hooks/dom/useClickOutSide'; import useIsPopup from '@subwallet/extension-koni-ui/hooks/dom/useIsPopup'; @@ -38,6 +39,7 @@ const Component: React.FC = ({ className }: Props) => { const { checkActive, inactiveModal } = useContext(ModalContext); const { token } = useTheme() as Theme; const isPopup = useIsPopup(); + const { setStateSelectAccount } = useSetSessionLatest(); const isActive = checkActive(modalId); @@ -45,7 +47,8 @@ const Component: React.FC = ({ className }: Props) => { const onCancel = useCallback(() => { inactiveModal(modalId); - }, [inactiveModal]); + setStateSelectAccount(true); + }, [inactiveModal, setStateSelectAccount]); useClickOutSide(isActive, renderModalSelector(className), onCancel); @@ -63,20 +66,22 @@ const Component: React.FC = ({ className }: Props) => { const onClickItem = useCallback((path: string) => { return () => { + setStateSelectAccount(true); inactiveModal(modalId); navigate(path); }; - }, [navigate, inactiveModal]); + }, [setStateSelectAccount, inactiveModal, navigate]); const onClickLedger = useCallback(() => { inactiveModal(modalId); + setStateSelectAccount(true); if (isPopup) { windowOpen({ allowedPath: '/accounts/connect-ledger' }).catch(console.error); } else { navigate('accounts/connect-ledger'); } - }, [inactiveModal, isPopup, navigate]); + }, [inactiveModal, isPopup, navigate, setStateSelectAccount]); const items = useMemo((): AttachAccountItem[] => ([ { diff --git a/packages/extension-koni-ui/src/components/Modal/Account/CreateAccountModal.tsx b/packages/extension-koni-ui/src/components/Modal/Account/CreateAccountModal.tsx index 3257ae465ed..8ba7fc6e648 100644 --- a/packages/extension-koni-ui/src/components/Modal/Account/CreateAccountModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/Account/CreateAccountModal.tsx @@ -7,6 +7,7 @@ import CloseIcon from '@subwallet/extension-koni-ui/components/Icon/CloseIcon'; import { SettingItemSelection } from '@subwallet/extension-koni-ui/components/Setting/SettingItemSelection'; import { EVM_ACCOUNT_TYPE } from '@subwallet/extension-koni-ui/constants/account'; import { CREATE_ACCOUNT_MODAL, DERIVE_ACCOUNT_MODAL, NEW_SEED_MODAL } from '@subwallet/extension-koni-ui/constants/modal'; +import { useSetSessionLatest } from '@subwallet/extension-koni-ui/hooks'; import useTranslation from '@subwallet/extension-koni-ui/hooks/common/useTranslation'; import useClickOutSide from '@subwallet/extension-koni-ui/hooks/dom/useClickOutSide'; import useGoBackSelectAccount from '@subwallet/extension-koni-ui/hooks/modal/useGoBackSelectAccount'; @@ -37,7 +38,7 @@ const modalId = CREATE_ACCOUNT_MODAL; const Component: React.FC = ({ className }: Props) => { const { t } = useTranslation(); const { activeModal, checkActive, inactiveModal } = useContext(ModalContext); - + const { setStateSelectAccount } = useSetSessionLatest(); const { token } = useTheme() as Theme; const { accounts } = useSelector((state: RootState) => state.accountState); const isActive = checkActive(modalId); @@ -52,8 +53,9 @@ const Component: React.FC = ({ className }: Props) => { ); const onCancel = useCallback(() => { + setStateSelectAccount(true); inactiveModal(modalId); - }, [inactiveModal]); + }, [inactiveModal, setStateSelectAccount]); useClickOutSide(isActive, renderModalSelector(className), onCancel); diff --git a/packages/extension-koni-ui/src/components/Modal/Account/DeriveAccountModal.tsx b/packages/extension-koni-ui/src/components/Modal/Account/DeriveAccountModal.tsx index 9d1d5dec9e5..28f79403afb 100644 --- a/packages/extension-koni-ui/src/components/Modal/Account/DeriveAccountModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/Account/DeriveAccountModal.tsx @@ -7,6 +7,7 @@ import AccountItemWithName from '@subwallet/extension-koni-ui/components/Account import BackIcon from '@subwallet/extension-koni-ui/components/Icon/BackIcon'; import { EVM_ACCOUNT_TYPE } from '@subwallet/extension-koni-ui/constants/account'; import { CREATE_ACCOUNT_MODAL, DERIVE_ACCOUNT_MODAL } from '@subwallet/extension-koni-ui/constants/modal'; +import { useSetSessionLatest } from '@subwallet/extension-koni-ui/hooks'; import useNotification from '@subwallet/extension-koni-ui/hooks/common/useNotification'; import useTranslation from '@subwallet/extension-koni-ui/hooks/common/useTranslation'; import useUnlockChecker from '@subwallet/extension-koni-ui/hooks/common/useUnlockChecker'; @@ -50,6 +51,7 @@ const Component: React.FC = ({ className }: Props) => { const sectionRef = useRef(null); const { checkActive, inactiveModal } = useContext(ModalContext); + const { setStateSelectAccount } = useSetSessionLatest(); const checkUnlock = useUnlockChecker(); const { accounts } = useSelector((state: RootState) => state.accountState); @@ -70,9 +72,10 @@ const Component: React.FC = ({ className }: Props) => { }, []); const onCancel = useCallback(() => { + setStateSelectAccount(true); inactiveModal(modalId); clearSearch(); - }, [clearSearch, inactiveModal]); + }, [clearSearch, inactiveModal, setStateSelectAccount]); useClickOutSide(isActive || !!selected, renderModalSelector(className), onCancel); @@ -85,6 +88,7 @@ const Component: React.FC = ({ className }: Props) => { address: account.address }).then(() => { inactiveModal(modalId); + setStateSelectAccount(true); clearSearch(); }).catch((e: Error) => { notify({ @@ -99,7 +103,7 @@ const Component: React.FC = ({ className }: Props) => { // User cancel unlock }); }; - }, [checkUnlock, clearSearch, inactiveModal, notify]); + }, [checkUnlock, clearSearch, inactiveModal, notify, setStateSelectAccount]); const renderItem = useCallback((account: AccountJson): React.ReactNode => { const disabled = !!selected; diff --git a/packages/extension-koni-ui/src/components/Modal/Account/ImportAccountModal.tsx b/packages/extension-koni-ui/src/components/Modal/Account/ImportAccountModal.tsx index d5bdc12ffa6..8a4fdfd24ab 100644 --- a/packages/extension-koni-ui/src/components/Modal/Account/ImportAccountModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/Account/ImportAccountModal.tsx @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { IMPORT_ACCOUNT_MODAL, IMPORT_SEED_MODAL } from '@subwallet/extension-koni-ui/constants'; -import { useClickOutSide, useGoBackSelectAccount, useIsPopup, useTranslation } from '@subwallet/extension-koni-ui/hooks'; +import { useClickOutSide, useGoBackSelectAccount, useIsPopup, useSetSessionLatest, useTranslation } from '@subwallet/extension-koni-ui/hooks'; import { windowOpen } from '@subwallet/extension-koni-ui/messaging'; import { Theme } from '@subwallet/extension-koni-ui/themes'; import { PhosphorIcon, ThemeProps } from '@subwallet/extension-koni-ui/types'; @@ -33,7 +33,7 @@ const Component: React.FC = ({ className }: Props) => { const navigate = useNavigate(); const { t } = useTranslation(); const { token } = useTheme() as Theme; - + const { setStateSelectAccount } = useSetSessionLatest(); const { activeModal, checkActive, inactiveModal } = useContext(ModalContext); const isActive = checkActive(modalId); @@ -41,17 +41,19 @@ const Component: React.FC = ({ className }: Props) => { const onBack = useGoBackSelectAccount(modalId); const onCancel = useCallback(() => { + setStateSelectAccount(true); inactiveModal(modalId); - }, [inactiveModal]); + }, [inactiveModal, setStateSelectAccount]); useClickOutSide(isActive, renderModalSelector(className), onCancel); const onClickItem = useCallback((path: string) => { return () => { inactiveModal(modalId); + setStateSelectAccount(true); navigate(path); }; - }, [navigate, inactiveModal]); + }, [inactiveModal, setStateSelectAccount, navigate]); const onClickJson = useCallback(() => { if (isPopup) { diff --git a/packages/extension-koni-ui/src/components/Modal/RemindBackupSeedPhraseModal.tsx b/packages/extension-koni-ui/src/components/Modal/RemindBackupSeedPhraseModal.tsx new file mode 100644 index 00000000000..198a3ff55f7 --- /dev/null +++ b/packages/extension-koni-ui/src/components/Modal/RemindBackupSeedPhraseModal.tsx @@ -0,0 +1,161 @@ +// Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { REMIND_BACKUP_SEED_PHRASE_MODAL, SELECT_ACCOUNT_MODAL, USER_GUIDE_URL } from '@subwallet/extension-koni-ui/constants'; +import { useSetSessionLatest } from '@subwallet/extension-koni-ui/hooks'; +import useTranslation from '@subwallet/extension-koni-ui/hooks/common/useTranslation'; +import { RootState } from '@subwallet/extension-koni-ui/stores'; +import { Theme } from '@subwallet/extension-koni-ui/themes'; +import { ThemeProps } from '@subwallet/extension-koni-ui/types'; +import { Button, ModalContext, PageIcon, SwModal } from '@subwallet/react-ui'; +import CN from 'classnames'; +import { ShieldCheck } from 'phosphor-react'; +import React, { useCallback, useContext, useEffect, useMemo } from 'react'; +import { useSelector } from 'react-redux'; +import { useLocation, useNavigate } from 'react-router-dom'; +import styled, { useTheme } from 'styled-components'; + +type Props = ThemeProps; + +const RemindBackupSeedPhraseModalId = REMIND_BACKUP_SEED_PHRASE_MODAL; +const AccountSelectorModalId = SELECT_ACCOUNT_MODAL; +const DomainUserGuide = '/account-management/export-and-backup-accounts'; +const HistoryPageUrl = '/home/history'; + +function Component ({ className }: Props): React.ReactElement { + const { t } = useTranslation(); + const { currentAccount, isAllAccount } = useSelector((state: RootState) => state.accountState); + const location = useLocation(); + const { activeModal, checkActive, inactiveModal } = useContext(ModalContext); + const { sessionLatest, setSessionLatest } = useSetSessionLatest(); + const navigate = useNavigate(); + const { token } = useTheme() as Theme; + const isActiveModal = useMemo(() => checkActive(AccountSelectorModalId), [checkActive]); + + const onCancel = useCallback(() => { + inactiveModal(RemindBackupSeedPhraseModalId); + setSessionLatest({ ...sessionLatest, timeCalculate: Date.now(), remind: false, isFinished: true }); + }, [inactiveModal, sessionLatest, setSessionLatest]); + + const onExport = useCallback(() => { + inactiveModal(RemindBackupSeedPhraseModalId); + const from = location.pathname.includes(HistoryPageUrl) ? HistoryPageUrl : location.pathname; + const state = (location.state ? { ...location.state, from } : { from }) as Record; + + if (isAllAccount || !!currentAccount?.isExternal) { + activeModal(AccountSelectorModalId); + setSessionLatest({ ...sessionLatest, timeCalculate: Date.now(), remind: false }); + } else if (currentAccount?.address) { + navigate(`/accounts/export/${currentAccount?.address}`, { state }); + setSessionLatest({ ...sessionLatest, timeCalculate: Date.now(), remind: false, isFinished: true }); + } + }, [activeModal, currentAccount?.address, currentAccount?.isExternal, inactiveModal, isAllAccount, location, navigate, sessionLatest, setSessionLatest]); + + useEffect(() => { + if (!sessionLatest.remind) { + inactiveModal(RemindBackupSeedPhraseModalId); + } + }, [inactiveModal, sessionLatest.remind]); + + useEffect(() => { + const element = document.getElementsByClassName('__tooltip-overlay-remind')[0]; + + if (element) { + if (element.classList.contains('ant-tooltip-hidden')) { + isActiveModal && element.classList.remove('ant-tooltip-hidden'); + } else { + (!isActiveModal) && element.classList.add('ant-tooltip-hidden'); + } + } + }, [isActiveModal]); + + const footerModal = useMemo(() => { + return ( + <> + + + + + ); + }, [onCancel, onExport, t]); + + return ( + <> + +
+ +
+ {t(' Once your seed phrase is lost, there is no way to recover your account. Back up now to secure your funds or learn how to with')} + + {t('our user guide.')} + +
+
+
+ + ); +} + +const RemindBackupSeedPhraseModal = styled(Component)(({ theme: { token } }: Props) => { + return { + '.__modal-content': { + display: 'flex', + flexDirection: 'column', + gap: token.size, + alignItems: 'center', + padding: `${token.padding}px ${token.padding}px 0 ${token.padding}px` + }, + + '.ant-sw-header-center-part': { + width: 'fit-content' + }, + + '.__modal-description': { + textAlign: 'center', + color: token.colorTextDescription, + fontSize: token.fontSizeHeading6, + lineHeight: token.lineHeightHeading6 + }, + + '.__modal-user-guide': { + marginLeft: token.marginXXS + }, + + '.ant-sw-modal-footer': { + borderTop: 'none', + display: 'flex', + gap: token.sizeSM + } + }; +}); + +export default RemindBackupSeedPhraseModal; diff --git a/packages/extension-koni-ui/src/components/Modal/ResetWalletModal.tsx b/packages/extension-koni-ui/src/components/Modal/ResetWalletModal.tsx index e9547add9f4..88fc05ee57c 100644 --- a/packages/extension-koni-ui/src/components/Modal/ResetWalletModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/ResetWalletModal.tsx @@ -1,7 +1,7 @@ // Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { RESET_WALLET_MODAL } from '@subwallet/extension-koni-ui/constants'; +import { LATEST_SESSION, RESET_WALLET_MODAL } from '@subwallet/extension-koni-ui/constants'; import { InjectContext } from '@subwallet/extension-koni-ui/contexts/InjectContext'; import useUILock from '@subwallet/extension-koni-ui/hooks/common/useUILock'; import { resetWallet } from '@subwallet/extension-koni-ui/messaging'; @@ -64,6 +64,7 @@ const Component: React.FC = (props: Props) => { }) .finally(() => { _setLoading(false); + localStorage.removeItem(LATEST_SESSION); onClose(); }); }, 300); diff --git a/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/GeneralTermModal.tsx b/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/GeneralTermModal.tsx index 328868991b1..2a4c2e76ca4 100644 --- a/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/GeneralTermModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/GeneralTermModal.tsx @@ -1,7 +1,6 @@ -// [object Object] +// Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -// eslint-disable-next-line header/header import { fetchStaticData } from '@subwallet/extension-base/utils/fetchStaticData'; import { GENERAL_TERM_AND_CONDITION_MODAL } from '@subwallet/extension-koni-ui/constants'; import useTranslation from '@subwallet/extension-koni-ui/hooks/common/useTranslation'; diff --git a/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/SeedPhraseTermModal.tsx b/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/SeedPhraseTermModal.tsx index 62a7ba3415e..1a29d4aa77b 100644 --- a/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/SeedPhraseTermModal.tsx +++ b/packages/extension-koni-ui/src/components/Modal/TermsAndConditions/SeedPhraseTermModal.tsx @@ -1,7 +1,6 @@ -// [object Object] +// Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -// eslint-disable-next-line header/header import { CONFIRM_TERM_SEED_PHRASE, TERM_AND_CONDITION_SEED_PHRASE_MODAL } from '@subwallet/extension-koni-ui/constants'; import useTranslation from '@subwallet/extension-koni-ui/hooks/common/useTranslation'; import { Theme, ThemeProps } from '@subwallet/extension-koni-ui/types'; diff --git a/packages/extension-koni-ui/src/components/Modal/index.tsx b/packages/extension-koni-ui/src/components/Modal/index.tsx index da360635ee4..499769ea92c 100644 --- a/packages/extension-koni-ui/src/components/Modal/index.tsx +++ b/packages/extension-koni-ui/src/components/Modal/index.tsx @@ -5,6 +5,7 @@ export { default as DisconnectExtensionModal } from './DisconnectExtensionModal' export { default as RequestCameraAccessModal } from './RequestCameraAccessModal'; export { default as RequestCreatePasswordModal } from './RequestCreatePasswordModal'; export { default as ResetWalletModal } from './ResetWalletModal'; +export { default as RemindBackupSeedPhraseModal } from './RemindBackupSeedPhraseModal'; export { SortingModal } from './SortingModal'; export * from './Account'; diff --git a/packages/extension-koni-ui/src/constants/common.ts b/packages/extension-koni-ui/src/constants/common.ts index 5c66d0e6ba5..c129d389152 100644 --- a/packages/extension-koni-ui/src/constants/common.ts +++ b/packages/extension-koni-ui/src/constants/common.ts @@ -16,4 +16,6 @@ export const SUPPORT_MAIL = 'mailto:support@subwallet.app'; export const ALL_KEY = 'all'; export const ASTAR_PORTAL_URL = 'https://portal.astar.network/astar/dapp-staking/discover'; +export const STATIC_DATA_CONTENT_URL = 'https://static-data.subwallet.app/'; + export const DEFAULT_CLAIM_DAPP_STAKING_REWARDS_STATE = ClaimDAppStakingRewardsState.NONE; diff --git a/packages/extension-koni-ui/src/constants/index.ts b/packages/extension-koni-ui/src/constants/index.ts index b1fbfaff037..8b0ed1423e9 100644 --- a/packages/extension-koni-ui/src/constants/index.ts +++ b/packages/extension-koni-ui/src/constants/index.ts @@ -17,3 +17,4 @@ export * from './strings'; export * from './transaction'; export * from './earning'; export * from './error'; +export * from './session'; diff --git a/packages/extension-koni-ui/src/constants/localStorage.ts b/packages/extension-koni-ui/src/constants/localStorage.ts index b28ee3fcc1e..1b6712f2c0a 100644 --- a/packages/extension-koni-ui/src/constants/localStorage.ts +++ b/packages/extension-koni-ui/src/constants/localStorage.ts @@ -30,3 +30,4 @@ export const CONFIRM_TERM_SEED_PHRASE = 'seed-phrase.term-and-condition'; export const CLAIM_DAPP_STAKING_REWARDS = 'general.claim-dapp-staking-rewards'; export const EARNING_MIGRATION_ANNOUNCEMENT = 'announcement.earning-migration'; export const TIME_OUT_RECORD = 'general.time-out-record'; +export const LATEST_SESSION = 'general.latest-session'; diff --git a/packages/extension-koni-ui/src/constants/modal.ts b/packages/extension-koni-ui/src/constants/modal.ts index cc3b2d1ea20..f8cbcfc03d0 100644 --- a/packages/extension-koni-ui/src/constants/modal.ts +++ b/packages/extension-koni-ui/src/constants/modal.ts @@ -26,7 +26,7 @@ export const EDIT_UNLOCK_TYPE_MODAL = 'edit-unlock-type-modal'; export const RESET_WALLET_MODAL = 'reset-wallet-modal'; export const ADD_CONNECTION_MODAL = 'add-connection-modal'; export const DISCONNECT_EXTENSION_MODAL = 'disconnect-extension-modal'; - +export const REMIND_BACKUP_SEED_PHRASE_MODAL = 'remind-backup-seed-phrase-modal'; export const EXPORT_ACCOUNTS_PASSWORD_MODAL = 'export-accounts-password-modal'; /* Campaign */ diff --git a/packages/extension-koni-ui/src/constants/session.ts b/packages/extension-koni-ui/src/constants/session.ts new file mode 100644 index 00000000000..9e5cb449dc3 --- /dev/null +++ b/packages/extension-koni-ui/src/constants/session.ts @@ -0,0 +1,11 @@ +// Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { SessionStorage } from '@subwallet/extension-koni-ui/types'; + +export const DEFAULT_SESSION_VALUE: SessionStorage = { + remind: false, + timeBackup: 300000, + timeCalculate: Date.now(), + isFinished: true +}; diff --git a/packages/extension-koni-ui/src/contexts/ThemeContext.tsx b/packages/extension-koni-ui/src/contexts/ThemeContext.tsx index 3d7cb0a18c4..88b10ffee87 100644 --- a/packages/extension-koni-ui/src/contexts/ThemeContext.tsx +++ b/packages/extension-koni-ui/src/contexts/ThemeContext.tsx @@ -89,6 +89,16 @@ const GlobalStyle = createGlobalStyle(({ theme }) => { } }, + '.__tooltip-overlay-remind': { + '.ant-tooltip-inner': { + fontSize: token.fontSizeXS, + lineHeight: token.lineHeightXS, + fontWeight: 700, + padding: `2px ${token.paddingXS}px`, + minHeight: 'auto' + } + }, + '.text-secondary': { color: token.colorTextSecondary }, diff --git a/packages/extension-koni-ui/src/contexts/WalletModalContext.tsx b/packages/extension-koni-ui/src/contexts/WalletModalContext.tsx index eaf1f0954bc..8cd761b395a 100644 --- a/packages/extension-koni-ui/src/contexts/WalletModalContext.tsx +++ b/packages/extension-koni-ui/src/contexts/WalletModalContext.tsx @@ -1,16 +1,17 @@ // Copyright 2019-2022 @polkadot/extension-ui authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { AttachAccountModal, ClaimDappStakingRewardsModal, CreateAccountModal, DeriveAccountModal, ImportAccountModal, ImportSeedModal, NewSeedModal, RequestCameraAccessModal, RequestCreatePasswordModal } from '@subwallet/extension-koni-ui/components'; +import { AttachAccountModal, ClaimDappStakingRewardsModal, CreateAccountModal, DeriveAccountModal, ImportAccountModal, ImportSeedModal, NewSeedModal, RemindBackupSeedPhraseModal, RequestCameraAccessModal, RequestCreatePasswordModal } from '@subwallet/extension-koni-ui/components'; import { CustomizeModal } from '@subwallet/extension-koni-ui/components/Modal/Customize/CustomizeModal'; import { EARNING_INSTRUCTION_MODAL } from '@subwallet/extension-koni-ui/constants'; +import { useGetConfig, useSetSessionLatest } from '@subwallet/extension-koni-ui/hooks'; import Confirmations from '@subwallet/extension-koni-ui/Popup/Confirmations'; import { RootState } from '@subwallet/extension-koni-ui/stores'; import { ModalContext, SwModal, useExcludeModal } from '@subwallet/react-ui'; import CN from 'classnames'; import React, { useCallback, useContext, useEffect } from 'react'; import { useSelector } from 'react-redux'; -import { useSearchParams } from 'react-router-dom'; +import { useLocation, useSearchParams } from 'react-router-dom'; import { UnlockModal } from '../components/Modal/UnlockModal'; @@ -56,6 +57,10 @@ export const WalletModalContext = ({ children }: Props) => { const [searchParams, setSearchParams] = useSearchParams(); const { hasConfirmations } = useSelector((state: RootState) => state.requestState); const { hasMasterPassword, isLocked } = useSelector((state: RootState) => state.accountState); + const { setSessionLatest } = useSetSessionLatest(); + const { getConfig } = useGetConfig(); + const { onHandleSessionLatest } = useSetSessionLatest(); + const location = useLocation(); useExcludeModal('confirmations'); useExcludeModal(EARNING_INSTRUCTION_MODAL); @@ -85,6 +90,11 @@ export const WalletModalContext = ({ children }: Props) => { } }, [activeModal, inactiveModals, searchParams]); + useEffect(() => { + getConfig() + .then(onHandleSessionLatest).catch(console.error); + }, [activeModal, getConfig, location.pathname, onHandleSessionLatest, setSessionLatest]); + // todo: will remove ClaimDappStakingRewardsModal after Astar upgrade to v3 return <> @@ -105,6 +115,7 @@ export const WalletModalContext = ({ children }: Props) => { + diff --git a/packages/extension-koni-ui/src/hooks/common/index.ts b/packages/extension-koni-ui/src/hooks/common/index.ts index d73deeba681..aa194a3edf4 100644 --- a/packages/extension-koni-ui/src/hooks/common/index.ts +++ b/packages/extension-koni-ui/src/hooks/common/index.ts @@ -13,6 +13,7 @@ export { default as useUILock } from './useUILock'; export { default as useUnlockChecker } from './useUnlockChecker'; export { default as useAlert } from './useAlert'; export { default as useGetChainSlugsByCurrentAccount } from './useGetChainSlugsByCurrentAccount'; +export { default as useSetSessionLatest } from './useSetSessionLatest'; export * from './useSelector'; export * from './useLazyList'; diff --git a/packages/extension-koni-ui/src/hooks/common/useSetSessionLatest.ts b/packages/extension-koni-ui/src/hooks/common/useSetSessionLatest.ts new file mode 100644 index 00000000000..38b25970312 --- /dev/null +++ b/packages/extension-koni-ui/src/hooks/common/useSetSessionLatest.ts @@ -0,0 +1,48 @@ +// Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { DEFAULT_SESSION_VALUE, LATEST_SESSION } from '@subwallet/extension-koni-ui/constants'; +import { SessionStorage } from '@subwallet/extension-koni-ui/types'; +import { Dispatch, SetStateAction, useCallback } from 'react'; +import { useLocation } from 'react-router-dom'; +import { useLocalStorage } from 'usehooks-ts'; + +export interface SetSessionLatestInterface { + sessionLatest: SessionStorage; + setSessionLatest: Dispatch>; + onHandleSessionLatest: (timeBackup: number) => void; + setStateSelectAccount: (isFinished: boolean) => void; +} + +const useSetSessionLatest = (): SetSessionLatestInterface => { + const [sessionLatest, setSessionLatest] = useLocalStorage(LATEST_SESSION, DEFAULT_SESSION_VALUE); + const location = useLocation(); + + const onHandleSessionLatest = useCallback((timeBackup: number) => { + const infoSession = Date.now(); + + const latestSession = (JSON.parse(localStorage.getItem(LATEST_SESSION) || JSON.stringify(DEFAULT_SESSION_VALUE))) as SessionStorage; + + if (infoSession - latestSession.timeCalculate >= timeBackup) { + setSessionLatest({ ...latestSession, remind: true, timeBackup, isFinished: false }); + } else if (infoSession - latestSession.timeCalculate < timeBackup) { + setSessionLatest({ timeBackup, timeCalculate: infoSession, remind: false, isFinished: true }); + } else if (location.pathname) { + setSessionLatest((session) => + ({ ...session, timeCalculate: session.remind ? session.timeCalculate : infoSession })); + } + }, [location.pathname, setSessionLatest]); + + const setStateSelectAccount = useCallback((isFinished: boolean) => { + setSessionLatest((prevState) => ({ ...prevState, isFinished })); + }, [setSessionLatest]); + + return { + sessionLatest, + onHandleSessionLatest, + setSessionLatest, + setStateSelectAccount + }; +}; + +export default useSetSessionLatest; diff --git a/packages/extension-koni-ui/src/hooks/index.ts b/packages/extension-koni-ui/src/hooks/index.ts index 311cfe2e0ce..f3130f6c538 100644 --- a/packages/extension-koni-ui/src/hooks/index.ts +++ b/packages/extension-koni-ui/src/hooks/index.ts @@ -18,3 +18,4 @@ export * from './screen'; export * from './wallet-connect'; export * from './history'; export * from './earning'; +export * from './staticContent'; diff --git a/packages/extension-koni-ui/src/hooks/router/useDefaultNavigate.tsx b/packages/extension-koni-ui/src/hooks/router/useDefaultNavigate.tsx index 1522e7f9f12..79fb0b1501e 100644 --- a/packages/extension-koni-ui/src/hooks/router/useDefaultNavigate.tsx +++ b/packages/extension-koni-ui/src/hooks/router/useDefaultNavigate.tsx @@ -21,8 +21,8 @@ export default function useDefaultNavigate () { ); const goBack = useCallback( - (urlToBack?: string) => { - typeof urlToBack === 'string' ? navigate(urlToBack) : navigate(RouteState.prevDifferentPathNum); + (urlToBack?: string, state?: unknown) => { + typeof urlToBack === 'string' ? navigate(urlToBack, { state }) : navigate(RouteState.prevDifferentPathNum); }, [navigate] ); diff --git a/packages/extension-koni-ui/src/hooks/staticContent/index.ts b/packages/extension-koni-ui/src/hooks/staticContent/index.ts new file mode 100644 index 00000000000..39e42f50d8e --- /dev/null +++ b/packages/extension-koni-ui/src/hooks/staticContent/index.ts @@ -0,0 +1,4 @@ +// Copyright 2019-2022 @polkadot/extension-koni-ui authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export { default as useGetConfig } from './useGetConfig'; diff --git a/packages/extension-koni-ui/src/hooks/staticContent/useGetConfig.ts b/packages/extension-koni-ui/src/hooks/staticContent/useGetConfig.ts new file mode 100644 index 00000000000..f68b562113b --- /dev/null +++ b/packages/extension-koni-ui/src/hooks/staticContent/useGetConfig.ts @@ -0,0 +1,31 @@ +// Copyright 2019-2022 @polkadot/extension-ui authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { DEFAULT_SESSION_VALUE, LATEST_SESSION, STATIC_DATA_CONTENT_URL } from '@subwallet/extension-koni-ui/constants'; +import { SessionStorage } from '@subwallet/extension-koni-ui/types'; +import axios from 'axios'; +import { useCallback, useMemo } from 'react'; + +interface BackupTimeOutData { + backupTimeout: number +} + +const useGetConfig = () => { + const latestSession = useMemo(() => + (JSON.parse(localStorage.getItem(LATEST_SESSION) || JSON.stringify(DEFAULT_SESSION_VALUE))) as SessionStorage, []); + + const getConfig = useCallback(async () => { + try { + const res = await axios + .get(`${STATIC_DATA_CONTENT_URL}/config/remind-backup/preview.json`); + + return (res?.data as BackupTimeOutData).backupTimeout; + } catch { + return latestSession.timeBackup; + } + }, [latestSession.timeBackup]); + + return { getConfig }; +}; + +export default useGetConfig; diff --git a/packages/extension-koni-ui/src/types/index.ts b/packages/extension-koni-ui/src/types/index.ts index 677010968e4..b095e29aa9f 100644 --- a/packages/extension-koni-ui/src/types/index.ts +++ b/packages/extension-koni-ui/src/types/index.ts @@ -130,3 +130,4 @@ export * from './transaction'; export * from './walletConnect'; export * from './earning'; export * from './missionPool'; +export * from './localStorage'; diff --git a/packages/extension-koni-ui/src/types/localStorage.ts b/packages/extension-koni-ui/src/types/localStorage.ts new file mode 100644 index 00000000000..af885018770 --- /dev/null +++ b/packages/extension-koni-ui/src/types/localStorage.ts @@ -0,0 +1,9 @@ +// Copyright 2019-2022 @subwallet/extension-koni-ui authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +export interface SessionStorage { + timeCalculate: number; + remind: boolean; + timeBackup: number; + isFinished: boolean; +} diff --git a/packages/extension-koni-ui/src/types/navigation.ts b/packages/extension-koni-ui/src/types/navigation.ts index cd0f8f4c67e..948a6c2c747 100644 --- a/packages/extension-koni-ui/src/types/navigation.ts +++ b/packages/extension-koni-ui/src/types/navigation.ts @@ -51,3 +51,7 @@ export type EarningPoolsParam = { export type EarningPositionDetailParam = { earningSlug: string, }; + +export type RemindBackUpSeedPhraseParamState = { + from: string; +} diff --git a/packages/extension-koni/package.json b/packages/extension-koni/package.json index e7860a661a3..ab06c3a4036 100644 --- a/packages/extension-koni/package.json +++ b/packages/extension-koni/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.1.66-0", - "@subwallet/extension-inject": "^1.1.66-0", - "@subwallet/extension-koni-ui": "^1.1.66-0" + "@subwallet/extension-base": "^1.1.67-1", + "@subwallet/extension-inject": "^1.1.67-1", + "@subwallet/extension-koni-ui": "^1.1.67-1" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/extension-koni/src/background.ts b/packages/extension-koni/src/background.ts index a8e0638e27e..e44657b13bf 100644 --- a/packages/extension-koni/src/background.ts +++ b/packages/extension-koni/src/background.ts @@ -21,6 +21,9 @@ const IDLE_TIME = 60000 * 2; // 2 minutes let idleTimer: NodeJS.Timeout; let waitingToStop = false; let openCount = 0; +const keyLatestSession = 'general.latest-session'; +const timeBackup = 300000; +const DEFAULT_LATEST_SESSION = { remind: false, timeCalculate: Date.now(), timeBackup, isFinished: false }; // setup the notification (same a FF default background, white text) withErrorLog(() => chrome.browserAction.setBadgeBackgroundColor({ color: '#d90000' })); @@ -60,6 +63,12 @@ chrome.runtime.onConnect.addListener((port): void => { // message and disconnect handlers port.onMessage.addListener((data: TransportRequestMessage) => handlers(data, port)); port.onDisconnect.addListener(() => { + const latestSessionRaw = localStorage.getItem(keyLatestSession); + + const latestSession = latestSessionRaw ? JSON.parse(latestSessionRaw) as { remind: boolean, timeCalculate: number } : DEFAULT_LATEST_SESSION; + + localStorage.setItem(keyLatestSession, JSON.stringify({ ...latestSession, remind: true })); + if (PORT_EXTENSION === port.name) { openCount -= 1; diff --git a/packages/extension-koni/src/packageInfo.ts b/packages/extension-koni/src/packageInfo.ts index 9faec4a5b94..b46a7647b59 100644 --- a/packages/extension-koni/src/packageInfo.ts +++ b/packages/extension-koni/src/packageInfo.ts @@ -3,4 +3,4 @@ // Do not edit, auto-generated by @polkadot/dev -export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.1.66-0' }; +export const packageInfo = { name: '@subwallet/extension-koni', path: 'auto', type: 'auto', version: '1.1.67-1' }; diff --git a/packages/extension-mocks/package.json b/packages/extension-mocks/package.json index 9b69f6924cb..6433af3b616 100644 --- a/packages/extension-mocks/package.json +++ b/packages/extension-mocks/package.json @@ -14,7 +14,7 @@ }, "sideEffects": false, "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "main": "index.js", "dependencies": { "@babel/runtime": "^7.20.6", diff --git a/packages/extension-web-ui/package.json b/packages/extension-web-ui/package.json index e73daabca37..1b92d0a4f6d 100644 --- a/packages/extension-web-ui/package.json +++ b/packages/extension-web-ui/package.json @@ -14,7 +14,7 @@ }, "sideEffects": true, "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "dependencies": { "@babel/runtime": "^7.20.6", "@coinbase/cbpay-js": "^1.7.0", @@ -36,10 +36,10 @@ "@ramonak/react-progress-bar": "^5.0.3", "@reduxjs/toolkit": "^1.9.1", "@subwallet/chain-list": "0.2.63", - "@subwallet/extension-base": "^1.1.66-0", - "@subwallet/extension-chains": "^1.1.66-0", - "@subwallet/extension-dapp": "^1.1.66-0", - "@subwallet/extension-inject": "^1.1.66-0", + "@subwallet/extension-base": "^1.1.67-1", + "@subwallet/extension-chains": "^1.1.67-1", + "@subwallet/extension-dapp": "^1.1.67-1", + "@subwallet/extension-inject": "^1.1.67-1", "@subwallet/keyring": "^0.1.5", "@subwallet/react-ui": "^5.1.2-b77", "@subwallet/ui-keyring": "^0.1.5", @@ -88,7 +88,7 @@ "usehooks-ts": "^2.9.1" }, "devDependencies": { - "@subwallet/extension-mocks": "^1.1.66-0", + "@subwallet/extension-mocks": "^1.1.67-1", "@types/bn.js": "^5.1.1", "@types/enzyme": "^3.10.12", "@types/enzyme-adapter-react-16": "^1.0.6", diff --git a/packages/web-runner/package.json b/packages/web-runner/package.json index 033bd39bfc3..537e5f02e82 100644 --- a/packages/web-runner/package.json +++ b/packages/web-runner/package.json @@ -14,12 +14,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.1.66-0", + "version": "1.1.67-1", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.1.66-0", - "@subwallet/extension-inject": "^1.1.66-0", - "@subwallet/extension-koni-ui": "^1.1.66-0" + "@subwallet/extension-base": "^1.1.67-1", + "@subwallet/extension-inject": "^1.1.67-1", + "@subwallet/extension-koni-ui": "^1.1.67-1" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/packages/webapp/package.json b/packages/webapp/package.json index 2e615a3cce8..bee249db11a 100644 --- a/packages/webapp/package.json +++ b/packages/webapp/package.json @@ -1,7 +1,7 @@ { "author": "Koni Studio", "bugs": "https://github.com/Koniverse/Subwallet-V2/issues", - "buildNumber": "1166001", + "buildNumber": "1166003", "contributors": [], "description": "A web runner simulate background.js can be use on mobile or environment support web view", "homepage": "https://github.com/Koniverse/Subwallet-V2/tree/master/packages/webapp#readme", @@ -15,12 +15,12 @@ }, "sideEffects": false, "type": "module", - "version": "1.1.66", + "version": "1.1.67-1", "dependencies": { "@babel/runtime": "^7.20.6", - "@subwallet/extension-base": "^1.1.66-0", - "@subwallet/extension-inject": "^1.1.66-0", - "@subwallet/extension-web-ui": "^1.1.66-0" + "@subwallet/extension-base": "^1.1.67-1", + "@subwallet/extension-inject": "^1.1.67-1", + "@subwallet/extension-web-ui": "^1.1.67-1" }, "devDependencies": { "@polkadot/dev": "^0.65.23", diff --git a/yarn.lock b/yarn.lock index 2eddec0f078..6a90263c659 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6141,7 +6141,7 @@ __metadata: languageName: node linkType: hard -"@subwallet/extension-base@^1.1.66-0, @subwallet/extension-base@workspace:packages/extension-base": +"@subwallet/extension-base@^1.1.67-1, @subwallet/extension-base@workspace:packages/extension-base": version: 0.0.0-use.local resolution: "@subwallet/extension-base@workspace:packages/extension-base" dependencies: @@ -6177,11 +6177,11 @@ __metadata: "@sora-substrate/type-definitions": ^1.17.7 "@substrate/connect": ^0.8.9 "@subwallet/chain-list": 0.2.63 - "@subwallet/extension-base": ^1.1.66-0 - "@subwallet/extension-chains": ^1.1.66-0 - "@subwallet/extension-dapp": ^1.1.66-0 - "@subwallet/extension-inject": ^1.1.66-0 - "@subwallet/extension-mocks": ^1.1.66-0 + "@subwallet/extension-base": ^1.1.67-1 + "@subwallet/extension-chains": ^1.1.67-1 + "@subwallet/extension-dapp": ^1.1.67-1 + "@subwallet/extension-inject": ^1.1.67-1 + "@subwallet/extension-mocks": ^1.1.67-1 "@subwallet/keyring": ^0.1.5 "@subwallet/ui-keyring": ^0.1.5 "@types/uuid": ^9.0.1 @@ -6222,7 +6222,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-chains@^1.1.66-0, @subwallet/extension-chains@workspace:packages/extension-chains": +"@subwallet/extension-chains@^1.1.67-1, @subwallet/extension-chains@workspace:packages/extension-chains": version: 0.0.0-use.local resolution: "@subwallet/extension-chains@workspace:packages/extension-chains" dependencies: @@ -6230,7 +6230,7 @@ __metadata: "@polkadot/networks": ^12.6.2 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.1.66-0 + "@subwallet/extension-inject": ^1.1.67-1 peerDependencies: "@polkadot/api": "*" "@polkadot/types": "*" @@ -6245,21 +6245,21 @@ __metadata: "@metamask/detect-provider": ^1.2.0 "@polkadot/types": ^11.0.3 "@polkadot/util": ^12.6.2 - "@subwallet/extension-inject": ^1.1.66-0 + "@subwallet/extension-inject": ^1.1.67-1 web3: ^1.10.0 peerDependencies: "@polkadot/util": "*" languageName: unknown linkType: soft -"@subwallet/extension-dapp@^1.1.66-0, @subwallet/extension-dapp@workspace:packages/extension-dapp": +"@subwallet/extension-dapp@^1.1.67-1, @subwallet/extension-dapp@workspace:packages/extension-dapp": version: 0.0.0-use.local resolution: "@subwallet/extension-dapp@workspace:packages/extension-dapp" dependencies: "@babel/runtime": ^7.20.6 "@polkadot/util": ^12.6.2 "@polkadot/util-crypto": ^12.6.2 - "@subwallet/extension-inject": ^1.1.66-0 + "@subwallet/extension-inject": ^1.1.67-1 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" @@ -6267,7 +6267,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-inject@^1.1.66-0, @subwallet/extension-inject@workspace:packages/extension-inject": +"@subwallet/extension-inject@^1.1.67-1, @subwallet/extension-inject@workspace:packages/extension-inject": version: 0.0.0-use.local resolution: "@subwallet/extension-inject@workspace:packages/extension-inject" dependencies: @@ -6285,7 +6285,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-koni-ui@^1.1.66-0, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": +"@subwallet/extension-koni-ui@^1.1.67-1, @subwallet/extension-koni-ui@workspace:packages/extension-koni-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-koni-ui@workspace:packages/extension-koni-ui" dependencies: @@ -6308,11 +6308,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.63 - "@subwallet/extension-base": ^1.1.66-0 - "@subwallet/extension-chains": ^1.1.66-0 - "@subwallet/extension-dapp": ^1.1.66-0 - "@subwallet/extension-inject": ^1.1.66-0 - "@subwallet/extension-mocks": ^1.1.66-0 + "@subwallet/extension-base": ^1.1.67-1 + "@subwallet/extension-chains": ^1.1.67-1 + "@subwallet/extension-dapp": ^1.1.67-1 + "@subwallet/extension-inject": ^1.1.67-1 + "@subwallet/extension-mocks": ^1.1.67-1 "@subwallet/keyring": ^0.1.5 "@subwallet/react-ui": 5.1.2-b77 "@subwallet/ui-keyring": ^0.1.5 @@ -6380,9 +6380,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.1.66-0 - "@subwallet/extension-inject": ^1.1.66-0 - "@subwallet/extension-koni-ui": ^1.1.66-0 + "@subwallet/extension-base": ^1.1.67-1 + "@subwallet/extension-inject": ^1.1.67-1 + "@subwallet/extension-koni-ui": ^1.1.67-1 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6408,7 +6408,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-mocks@^1.1.66-0, @subwallet/extension-mocks@workspace:packages/extension-mocks": +"@subwallet/extension-mocks@^1.1.67-1, @subwallet/extension-mocks@workspace:packages/extension-mocks": version: 0.0.0-use.local resolution: "@subwallet/extension-mocks@workspace:packages/extension-mocks" dependencies: @@ -6417,7 +6417,7 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/extension-web-ui@^1.1.66-0, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": +"@subwallet/extension-web-ui@^1.1.67-1, @subwallet/extension-web-ui@workspace:packages/extension-web-ui": version: 0.0.0-use.local resolution: "@subwallet/extension-web-ui@workspace:packages/extension-web-ui" dependencies: @@ -6441,11 +6441,11 @@ __metadata: "@ramonak/react-progress-bar": ^5.0.3 "@reduxjs/toolkit": ^1.9.1 "@subwallet/chain-list": 0.2.63 - "@subwallet/extension-base": ^1.1.66-0 - "@subwallet/extension-chains": ^1.1.66-0 - "@subwallet/extension-dapp": ^1.1.66-0 - "@subwallet/extension-inject": ^1.1.66-0 - "@subwallet/extension-mocks": ^1.1.66-0 + "@subwallet/extension-base": ^1.1.67-1 + "@subwallet/extension-chains": ^1.1.67-1 + "@subwallet/extension-dapp": ^1.1.67-1 + "@subwallet/extension-inject": ^1.1.67-1 + "@subwallet/extension-mocks": ^1.1.67-1 "@subwallet/keyring": ^0.1.5 "@subwallet/react-ui": ^5.1.2-b77 "@subwallet/ui-keyring": ^0.1.5 @@ -6628,9 +6628,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.1.66-0 - "@subwallet/extension-inject": ^1.1.66-0 - "@subwallet/extension-koni-ui": ^1.1.66-0 + "@subwallet/extension-base": ^1.1.67-1 + "@subwallet/extension-inject": ^1.1.67-1 + "@subwallet/extension-koni-ui": ^1.1.67-1 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0 @@ -6661,9 +6661,9 @@ __metadata: dependencies: "@babel/runtime": ^7.20.6 "@polkadot/dev": ^0.65.23 - "@subwallet/extension-base": ^1.1.66-0 - "@subwallet/extension-inject": ^1.1.66-0 - "@subwallet/extension-web-ui": ^1.1.66-0 + "@subwallet/extension-base": ^1.1.67-1 + "@subwallet/extension-inject": ^1.1.67-1 + "@subwallet/extension-web-ui": ^1.1.67-1 assert: ^2.0.0 babel-loader: ^9.1.3 browser-resolve: ^2.0.0