diff --git a/src/composables/useNeptuneWallet.ts b/src/composables/useNeptuneWallet.ts index 3aa5f29..a01b301 100644 --- a/src/composables/useNeptuneWallet.ts +++ b/src/composables/useNeptuneWallet.ts @@ -143,6 +143,28 @@ export function useNeptuneWallet() { return JSON.parse(resultJson) } + const importFromViewKey = async (viewKeyHex: string): Promise<{ receiver_identifier: string }> => { + try { + store.setLoading(true) + store.setError(null) + + const result = await decodeViewKey(viewKeyHex) + + store.setViewKey(viewKeyHex) + store.setReceiverId(result.receiver_identifier) + // Note: When importing from viewkey, we don't have the seed phrase + // and address needs to be derived from viewkey + + return result + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Failed to import from view key' + store.setError(errorMsg) + throw err + } finally { + store.setLoading(false) + } + } + // ===== API METHODS ===== const getUtxos = async ( @@ -275,6 +297,7 @@ export function useNeptuneWallet() { initWasm: ensureWasmInitialized, generateWallet, importWallet, + importFromViewKey, getViewKeyFromSeed, getAddressFromSeed, validateSeedPhrase, diff --git a/src/views/Auth/components/ImportWalletComponent.vue b/src/views/Auth/components/ImportWalletComponent.vue index aa33cfa..6fd4d7c 100644 --- a/src/views/Auth/components/ImportWalletComponent.vue +++ b/src/views/Auth/components/ImportWalletComponent.vue @@ -1,32 +1,71 @@ @@ -119,12 +164,17 @@ const navigateToNewWallet = () => { + + Importing from: + {{ importData.type === 'seed' ? 'Seed Phrase' : 'Keystore' }} + + { :loading="isLoading" @click="handleOpenWallet" > - {{ isLoading ? 'Opening...' : 'Open Wallet' }} - - - New Wallet + {{ isLoading ? 'Importing...' : 'Import Wallet' }} + + + Back + + + New Wallet + + @@ -194,6 +249,26 @@ const navigateToNewWallet = () => { } .auth-card-content { + .import-info { + text-align: center; + padding: var(--spacing-md); + background: var(--primary-light); + border-radius: var(--radius-md); + margin-bottom: var(--spacing-lg); + + .info-label { + font-size: var(--font-sm); + color: var(--text-secondary); + margin-bottom: var(--spacing-xs); + } + + .info-value { + font-size: var(--font-md); + font-weight: var(--font-semibold); + color: var(--primary-color); + } + } + .form-group { margin-bottom: var(--spacing-xl); } @@ -274,6 +349,15 @@ const navigateToNewWallet = () => { flex-direction: column; gap: var(--spacing-md); margin-bottom: var(--spacing-xl); + + .button-row { + display: flex; + gap: var(--spacing-md); + + > * { + flex: 1; + } + } } // Help Links