diff --git a/packages/neuron-ui/src/components/ReplaceDuplicateWalletDialog/index.tsx b/packages/neuron-ui/src/components/ReplaceDuplicateWalletDialog/index.tsx index c644a496e9..133c7067d4 100644 --- a/packages/neuron-ui/src/components/ReplaceDuplicateWalletDialog/index.tsx +++ b/packages/neuron-ui/src/components/ReplaceDuplicateWalletDialog/index.tsx @@ -9,7 +9,7 @@ import { replaceWallet } from 'services/remote' import styles from './replaceDuplicateWalletDialog.module.scss' const useReplaceDuplicateWallet = () => { - const [extendedKey, setExtendedKey] = useState('') + const [duplicateWalletIds, setDuplicateWalletIds] = useState([]) const [importedWalletId, setImportedWalletId] = useState('') const onClose = useCallback(() => { @@ -28,7 +28,7 @@ const useReplaceDuplicateWallet = () => { const msg = typeof message === 'string' ? '' : message.content if (msg) { const obj = JSON.parse(msg) - setExtendedKey(obj.extendedKey) + setDuplicateWalletIds(obj.duplicateWalletIds) setImportedWalletId(obj.id) } } catch (error) { @@ -36,14 +36,14 @@ const useReplaceDuplicateWallet = () => { } } - const show = useMemo(() => !!extendedKey && !!importedWalletId, [importedWalletId, extendedKey]) + const show = useMemo(() => !!duplicateWalletIds.length && !!importedWalletId, [importedWalletId, duplicateWalletIds]) return { onImportingExitingWalletError, dialogProps: { show, onClose, - extendedKey, + duplicateWalletIds, importedWalletId, }, } @@ -52,12 +52,12 @@ const useReplaceDuplicateWallet = () => { const ReplaceDuplicateWalletDialog = ({ show, onClose, - extendedKey, + duplicateWalletIds, importedWalletId, }: { show: boolean onClose: () => void - extendedKey: string + duplicateWalletIds: string[] importedWalletId: string }) => { const { @@ -68,7 +68,10 @@ const ReplaceDuplicateWalletDialog = ({ const [selectedId, setSelectedId] = useState('') const [t] = useTranslation() - const group = useMemo(() => wallets.filter(item => item.extendedKey === extendedKey), [wallets, extendedKey]) + const group = useMemo( + () => wallets.filter(item => duplicateWalletIds.includes(item.id)), + [wallets, duplicateWalletIds] + ) const handleGroupChange = useCallback( (checked: string) => { diff --git a/packages/neuron-ui/src/containers/Main/hooks.ts b/packages/neuron-ui/src/containers/Main/hooks.ts index 44f337fde2..29fa5a37e0 100644 --- a/packages/neuron-ui/src/containers/Main/hooks.ts +++ b/packages/neuron-ui/src/containers/Main/hooks.ts @@ -325,15 +325,15 @@ export const useSubscription = ({ break case 'import-exist-xpubkey': { if (payload) { - const { existWalletIsWatchOnly, existingWalletId, id: importedWalletId } = JSON.parse(payload) - if (existWalletIsWatchOnly) { + const { duplicateWatchedWalletIds, id: importedWalletId } = JSON.parse(payload) + if (duplicateWatchedWalletIds.length) { showGlobalAlertDialog({ type: 'warning', message: t('main.import-exist-xpubkey-dialog.replace-tip'), action: 'all', onOk: () => { replaceWallet({ - existingWalletId, + existingWalletId: duplicateWatchedWalletIds[0], importedWalletId, }).then(res => { if (isSuccessResponse(res)) { diff --git a/packages/neuron-wallet/src/services/wallets.ts b/packages/neuron-wallet/src/services/wallets.ts index 6121bca49b..77ac8df4a5 100644 --- a/packages/neuron-wallet/src/services/wallets.ts +++ b/packages/neuron-wallet/src/services/wallets.ts @@ -405,16 +405,17 @@ export default class WalletService { wallet.saveKeystore(props.keystore!) } - const existWalletInfo = this.getAll().find(item => item.extendedKey === props.extendedKey) - if (existWalletInfo) { - const existWallet = FileKeystoreWallet.fromJSON(existWalletInfo) - const existWalletIsWatchOnly = existWallet.isHDWallet() && existWallet.loadKeystore().isEmpty() + const existWalletsProperties = this.getAll().filter(item => item.extendedKey === props.extendedKey) + if (existWalletsProperties.length) { + const existWallets = existWalletsProperties.map(v => this.get(v.id)) + const duplicateWatchedWalletIds = existWallets + .filter(v => v.isHDWallet() && v.loadKeystore().isEmpty()) + .map(v => v.id) this.importedWallet = wallet throw new DuplicateImportWallet( JSON.stringify({ - extendedKey: props.extendedKey, - existWalletIsWatchOnly, - existingWalletId: existWallet.id, + duplicateWalletIds: existWallets.map(v => v.id), + duplicateWatchedWalletIds, id, }) ) diff --git a/packages/neuron-wallet/tests/services/wallets.test.ts b/packages/neuron-wallet/tests/services/wallets.test.ts index 0d7eec58c6..bcaaf419e8 100644 --- a/packages/neuron-wallet/tests/services/wallets.test.ts +++ b/packages/neuron-wallet/tests/services/wallets.test.ts @@ -525,9 +525,9 @@ describe('wallet service', () => { try { walletService.create(wallet5) } catch (error) { - const { extendedKey, id } = JSON.parse(error.message) + const { duplicateWalletIds, id } = JSON.parse(error.message) await walletService.replace(createdWallet2.id, id) - expect(extendedKey).toBe(prefixWith0x('b'.repeat(66) + '2'.repeat(64))) + expect(duplicateWalletIds).toStrictEqual([createdWallet2.id]) expect(() => walletService.get(createdWallet2.id)).toThrowError() expect(walletService.get(id).name).toBe(wallet5.name) }