From 2a9a51f6f67400b6da3192cbea60ef129cabc594 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 26 Dec 2025 12:36:38 +0800 Subject: [PATCH 1/9] feat(contact): optimize contact card UI with avataaars and snapdom - Add ContactAvatar component with Avataaars-based avatars - Implement 8-char base64 avatar encoding for QR code embedding - Add snapdom for DOM screenshot download functionality - Remove memo from shared QR content (privacy: memo is private) - Fix store initialization: ensure contacts visible across all pages - Add AddressBookSuggestionProvider for decoupled AddressInput - Add E2E test for contact-to-transfer flow validation --- e2e/contact-address-input.spec.ts | 224 +++++++++++ e2e/screenshots/contact-01-address-book.png | Bin 0 -> 24151 bytes e2e/screenshots/contact-02-send-page.png | Bin 0 -> 33845 bytes .../contact-03-address-input-focused.png | Bin 0 -> 44749 bytes .../contact-05-suggestions-with-contact.png | Bin 0 -> 44747 bytes e2e/screenshots/contact-06-contact-picker.png | Bin 0 -> 48033 bytes e2e/screenshots/debug-01-address-book.png | Bin 0 -> 93248 bytes e2e/screenshots/debug-02-send-page.png | Bin 0 -> 93248 bytes package.json | 4 + pnpm-lock.yaml | 31 ++ src/components/common/contact-avatar.tsx | 107 ++++++ src/components/contact/contact-card.tsx | 65 ++++ .../transfer/address-input.stories.tsx | 13 +- src/components/transfer/address-input.tsx | 30 +- .../transfer/contact-suggestion-context.tsx | 57 +++ src/components/transfer/index.ts | 1 + src/i18n/locales/en/common.json | 3 +- src/i18n/locales/zh-CN/common.json | 3 +- src/lib/__tests__/avatar-codec.test.ts | 72 ++++ src/lib/avatar-codec.ts | 186 +++++++++ src/lib/qr-parser.test.ts | 4 +- src/lib/qr-parser.ts | 4 +- src/pages/address-book/index.tsx | 11 +- src/pages/home/index.tsx | 9 +- src/pages/send/index.tsx | 24 +- .../sheets/ContactAddConfirmJob.tsx | 39 +- .../activities/sheets/ContactEditJob.tsx | 46 ++- .../activities/sheets/ContactPickerJob.tsx | 31 +- .../activities/sheets/ContactShareJob.tsx | 214 +++++------ .../__stories__/ContactJobs.stories.tsx | 354 ++++++++---------- src/stackflow/activities/tabs/HomeTab.tsx | 9 +- src/stackflow/activities/tabs/TransferTab.tsx | 10 +- 32 files changed, 1135 insertions(+), 416 deletions(-) create mode 100644 e2e/contact-address-input.spec.ts create mode 100644 e2e/screenshots/contact-01-address-book.png create mode 100644 e2e/screenshots/contact-02-send-page.png create mode 100644 e2e/screenshots/contact-03-address-input-focused.png create mode 100644 e2e/screenshots/contact-05-suggestions-with-contact.png create mode 100644 e2e/screenshots/contact-06-contact-picker.png create mode 100644 e2e/screenshots/debug-01-address-book.png create mode 100644 e2e/screenshots/debug-02-send-page.png create mode 100644 src/components/common/contact-avatar.tsx create mode 100644 src/components/contact/contact-card.tsx create mode 100644 src/components/transfer/contact-suggestion-context.tsx create mode 100644 src/lib/__tests__/avatar-codec.test.ts create mode 100644 src/lib/avatar-codec.ts diff --git a/e2e/contact-address-input.spec.ts b/e2e/contact-address-input.spec.ts new file mode 100644 index 00000000..cc56b951 --- /dev/null +++ b/e2e/contact-address-input.spec.ts @@ -0,0 +1,224 @@ +/** + * E2E 测试 - 联系人与地址输入集成 + * + * 测试场景: + * 1. 注入钱包和联系人数据 + * 2. 验证 AddressBookPage 能看到联系人 + * 3. 验证 AddressInput 能看到联系人建议 + * 4. 验证 ContactPickerJob 能看到联系人 + */ + +import { test, expect, type Page } from '@playwright/test' + +const TEST_WALLET_DATA = { + wallets: [ + { + id: 'test-wallet-1', + name: '测试钱包', + address: '0x71C7656EC7ab88b098defB751B7401B5f6d8976F', + chain: 'ethereum', + chainAddresses: [ + { chain: 'ethereum', address: '0x71C7656EC7ab88b098defB751B7401B5f6d8976F', tokens: [] }, + ], + encryptedMnemonic: { ciphertext: 'test', iv: 'test', salt: 'test' }, + createdAt: Date.now(), + tokens: [], + }, + ], + currentWalletId: 'test-wallet-1', + selectedChain: 'ethereum', +} + +const TEST_CONTACT = { + name: 'Alice Test', + address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345', +} + +const TEST_ADDRESS_BOOK_DATA = { + version: 2, + contacts: [ + { + id: 'contact-1', + name: TEST_CONTACT.name, + addresses: [ + { + id: 'addr-1', + address: TEST_CONTACT.address, + chainType: 'ethereum', + isDefault: true, + }, + ], + createdAt: Date.now(), + updatedAt: Date.now(), + }, + ], +} + +async function setupTestData(page: Page) { + await page.addInitScript((data) => { + localStorage.setItem('bfm_wallets', JSON.stringify(data.wallet)) + localStorage.setItem('bfm_address_book', JSON.stringify(data.addressBook)) + }, { wallet: TEST_WALLET_DATA, addressBook: TEST_ADDRESS_BOOK_DATA }) +} + +test.describe('联系人与转账页面集成', () => { + test('Step 1: 通讯录页面能看到预置联系人', async ({ page }) => { + await setupTestData(page) + await page.goto('/#/address-book') + await page.waitForLoadState('networkidle') + await page.waitForTimeout(500) + + await page.screenshot({ + path: 'e2e/screenshots/contact-01-address-book.png', + fullPage: true, + }) + + // 检查联系人是否显示 + const contactName = page.locator(`text=${TEST_CONTACT.name}`) + await expect(contactName).toBeVisible({ timeout: 5000 }) + console.log(`[OK] Contact "${TEST_CONTACT.name}" visible in address book`) + }) + + test('Step 2: 转账页面 AddressInput 聚焦后显示联系人建议', async ({ page }) => { + await setupTestData(page) + await page.goto('/#/send') + await page.waitForLoadState('networkidle') + await page.waitForTimeout(500) + + await page.screenshot({ + path: 'e2e/screenshots/contact-02-send-page.png', + fullPage: true, + }) + + // 点击地址输入框 + const addressInputField = page.locator('input').first() + await addressInputField.click() + await page.waitForTimeout(500) + + await page.screenshot({ + path: 'e2e/screenshots/contact-03-address-input-focused.png', + fullPage: true, + }) + + // 检查是否有建议下拉 + const suggestionDropdown = page.locator('[role="listbox"]') + const dropdownVisible = await suggestionDropdown.isVisible() + console.log(`Suggestion dropdown visible: ${dropdownVisible}`) + + // 检查"暂无联系人"消息 + const noContacts = page.locator('text=暂无联系人') + const noContactsVisible = await noContacts.isVisible() + console.log(`"暂无联系人" message visible: ${noContactsVisible}`) + + if (noContactsVisible) { + await page.screenshot({ + path: 'e2e/screenshots/contact-04-ERROR-no-contacts.png', + fullPage: true, + }) + } + + // 检查联系人是否在建议中 + const suggestionWithContact = page.locator(`[role="option"]:has-text("${TEST_CONTACT.name}")`) + const contactInSuggestions = await suggestionWithContact.isVisible() + console.log(`Contact "${TEST_CONTACT.name}" in suggestions: ${contactInSuggestions}`) + + if (contactInSuggestions) { + await page.screenshot({ + path: 'e2e/screenshots/contact-05-suggestions-with-contact.png', + fullPage: true, + }) + } + + // 断言:不应该显示"暂无联系人" + expect(noContactsVisible).toBe(false) + }) + + test('Step 3: ContactPickerJob 能看到联系人', async ({ page }) => { + await setupTestData(page) + await page.goto('/#/send') + await page.waitForLoadState('networkidle') + await page.waitForTimeout(500) + + // 点击地址输入框 + const addressInputField = page.locator('input').first() + await addressInputField.click() + await page.waitForTimeout(500) + + // 点击"查看全部联系人"按钮 + const viewAllButton = page.locator('button:has-text("查看全部"), button:has-text("View all")') + if (await viewAllButton.isVisible()) { + await viewAllButton.click() + await page.waitForTimeout(500) + + await page.screenshot({ + path: 'e2e/screenshots/contact-06-contact-picker.png', + fullPage: true, + }) + + // 检查 ContactPickerJob 中是否有联系人 + const pickerContact = page.locator(`text=${TEST_CONTACT.name}`) + const pickerContactVisible = await pickerContact.isVisible() + console.log(`Contact "${TEST_CONTACT.name}" in picker: ${pickerContactVisible}`) + + // 检查"暂无联系人" + const noContactsInPicker = page.locator('text=暂无联系人') + const noContactsInPickerVisible = await noContactsInPicker.isVisible() + console.log(`"暂无联系人" in picker visible: ${noContactsInPickerVisible}`) + + if (noContactsInPickerVisible) { + await page.screenshot({ + path: 'e2e/screenshots/contact-07-ERROR-picker-no-contacts.png', + fullPage: true, + }) + } + + expect(noContactsInPickerVisible).toBe(false) + } + }) + + test('调试:检查 localStorage 和 store 状态', async ({ page }) => { + await setupTestData(page) + + // 检查 localStorage 注入是否成功 + await page.goto('/#/') + await page.waitForLoadState('networkidle') + + const storageData = await page.evaluate(() => { + return { + addressBook: localStorage.getItem('bfm_address_book'), + wallets: localStorage.getItem('bfm_wallets'), + } + }) + + console.log('=== localStorage Debug ===') + console.log('Address book:', storageData.addressBook) + console.log('Wallets:', storageData.wallets?.substring(0, 100) + '...') + + // 去通讯录页面 + await page.goto('/#/address-book') + await page.waitForLoadState('networkidle') + await page.waitForTimeout(500) + + await page.screenshot({ + path: 'e2e/screenshots/debug-01-address-book.png', + fullPage: true, + }) + + // 去转账页面 + await page.goto('/#/send') + await page.waitForLoadState('networkidle') + await page.waitForTimeout(500) + + await page.screenshot({ + path: 'e2e/screenshots/debug-02-send-page.png', + fullPage: true, + }) + + // 检查 localStorage 是否还在 + const storageAfterNav = await page.evaluate(() => { + return localStorage.getItem('bfm_address_book') + }) + console.log('=== After navigation ===') + console.log('Address book still exists:', !!storageAfterNav) + }) +}) diff --git a/e2e/screenshots/contact-01-address-book.png b/e2e/screenshots/contact-01-address-book.png new file mode 100644 index 0000000000000000000000000000000000000000..693d0034703999a9ab99dd7681b1ab4d052cd8f7 GIT binary patch literal 24151 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%0Af86tVma0yrIAZ?Lr4Ii6*)Q^Nn~e* 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 literal 0 HcmV?d00001 diff --git a/e2e/screenshots/contact-05-suggestions-with-contact.png b/e2e/screenshots/contact-05-suggestions-with-contact.png new file mode 100644 index 0000000000000000000000000000000000000000..2a87c2f6bd1c0a5231bc9242adeef75d97013c23 GIT binary patch literal 44747 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 KfBxA)~05?&mg9+sJIJ0Vx^!q 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 z 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 literal 0 HcmV?d00001 diff --git a/e2e/screenshots/contact-06-contact-picker.png b/e2e/screenshots/contact-06-contact-picker.png new file mode 100644 index 0000000000000000000000000000000000000000..22600a4c7309d61ae2235d71adec946c1c4f669f GIT binary patch literal 48033 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 literal 0 HcmV?d00001 diff --git a/e2e/screenshots/debug-02-send-page.png b/e2e/screenshots/debug-02-send-page.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fce3696df5d0f143ebfe72159ad3b4a0ccf840 GIT binary patch literal 93248 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index cbed76de..507f9576 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "@fontsource-variable/figtree": "^5.2.10", "@fontsource/dm-mono": "^5.2.7", "@fontsource/dm-serif-display": "^5.2.8", + "@gamepark/avataaars": "^3.0.0", "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", "@noble/secp256k1": "^3.0.0", @@ -83,6 +84,7 @@ "@tanstack/react-router": "^1.140.0", "@tanstack/react-store": "^0.8.0", "@types/yargs": "^17.0.35", + "@zumer/snapdom": "^2.0.1", "big.js": "^7.0.1", "bip39": "^3.1.0", "buffer": "^6.0.3", @@ -91,6 +93,7 @@ "i18next": "^25.7.1", "idb": "^8.0.3", "jsqr": "^1.4.0", + "lodash": "^4.17.21", "qrcode.react": "^4.2.0", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -117,6 +120,7 @@ "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@types/big.js": "^6.2.2", + "@types/lodash": "^4.17.21", "@types/node": "^24.10.1", "@types/qrcode": "^1.5.6", "@types/react": "^19.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be9b83ec..c878aa8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: '@fontsource/dm-serif-display': specifier: ^5.2.8 version: 5.2.8 + '@gamepark/avataaars': + specifier: ^3.0.0 + version: 3.0.0(react@19.2.3) '@noble/curves': specifier: ^2.0.1 version: 2.0.1 @@ -98,6 +101,9 @@ importers: '@types/yargs': specifier: ^17.0.35 version: 17.0.35 + '@zumer/snapdom': + specifier: ^2.0.1 + version: 2.0.1 big.js: specifier: ^7.0.1 version: 7.0.1 @@ -122,6 +128,9 @@ importers: jsqr: specifier: ^1.4.0 version: 1.4.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 qrcode.react: specifier: ^4.2.0 version: 4.2.0(react@19.2.3) @@ -195,6 +204,9 @@ importers: '@types/big.js': specifier: ^6.2.2 version: 6.2.2 + '@types/lodash': + specifier: ^4.17.21 + version: 4.17.21 '@types/node': specifier: ^24.10.1 version: 24.10.4 @@ -1345,6 +1357,11 @@ packages: '@fontsource/dm-serif-display@5.2.8': resolution: {integrity: sha512-GYSDSlGU6vyhv9a5MwaiVNf9HCuSVpK8hEFRyG4NNDHCDeHiX7YHDAcWsaoLKKcfXLgWG9YkBkk9T3SxM4rAjQ==} + '@gamepark/avataaars@3.0.0': + resolution: {integrity: sha512-MOe/jtEe2UkxQSfZ2TyqfRnihVBpGUeFwbM9aFZYVQoe5Jdw4kRx0bEKHHw2XnXaYJ2UEJOYys4iAdjBTv4tEg==} + peerDependencies: + react: '>=18' + '@hono/node-server@1.19.7': resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} engines: {node: '>=18.14.1'} @@ -2507,6 +2524,9 @@ packages: '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash@4.17.21': + resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} + '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} @@ -2785,6 +2805,9 @@ packages: '@vueuse/shared@12.8.2': resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + '@zumer/snapdom@2.0.1': + resolution: {integrity: sha512-78/qbYl2FTv4H6qaXcNfAujfIOSzdvs83NW63VbyC9QA3sqNPfPvhn4xYMO6Gy11hXwJUEhd0z65yKiNzDwy9w==} + abitype@0.7.1: resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} peerDependencies: @@ -7635,6 +7658,10 @@ snapshots: '@fontsource/dm-serif-display@5.2.8': {} + '@gamepark/avataaars@3.0.0(react@19.2.3)': + dependencies: + react: 19.2.3 + '@hono/node-server@1.19.7(hono@4.11.1)': dependencies: hono: 4.11.1 @@ -8741,6 +8768,8 @@ snapshots: '@types/linkify-it@5.0.0': {} + '@types/lodash@4.17.21': {} + '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 @@ -9122,6 +9151,8 @@ snapshots: transitivePeerDependencies: - typescript + '@zumer/snapdom@2.0.1': {} + abitype@0.7.1(typescript@5.9.3)(zod@4.2.1): dependencies: typescript: 5.9.3 diff --git a/src/components/common/contact-avatar.tsx b/src/components/common/contact-avatar.tsx new file mode 100644 index 00000000..3b720349 --- /dev/null +++ b/src/components/common/contact-avatar.tsx @@ -0,0 +1,107 @@ +/** + * ContactAvatar - 联系人头像组件 + * 支持格式: + * - avatar:HASH - Avataaars 编码(8字符 base64) + * - https://... - 外部图片 URL + * - emoji - 单个表情符号 + * 如需从地址生成头像,请使用 generateAvatarFromAddress(address, seed) + */ + +import { useMemo } from 'react' +import Avatar from '@gamepark/avataaars' +import { renderToStaticMarkup } from 'react-dom/server' +import { decodeAvatar } from '@/lib/avatar-codec' +import { IconUser } from '@tabler/icons-react' + +interface ContactAvatarProps { + /** 头像源:avatar:HASH / http(s) URL / emoji */ + src?: string | undefined + size?: number | undefined + className?: string | undefined +} + +/** 解析 avatar URL */ +function parseAvatarSrc(src: string): { type: 'hash' | 'url' | 'emoji'; value: string } { + try { + const url = new URL(src) + if (url.protocol === 'avatar:') { + return { type: 'hash', value: url.pathname } + } + if (url.protocol === 'http:' || url.protocol === 'https:') { + return { type: 'url', value: src } + } + } catch { + // 不是有效 URL,当作 emoji + } + return { type: 'emoji', value: src } +} + +const DROP_SHADOW = 'drop-shadow(0 8px 16px color-mix(in oklch, var(--primary) 30%, transparent))' + +/** 生成 Avataaars SVG data URL */ +function generateAvatarDataUrl(hash: string): string { + const config = decodeAvatar(hash) + const svgMarkup = renderToStaticMarkup( + + ) + return `data:image/svg+xml,${encodeURIComponent(svgMarkup)}` +} + +export function ContactAvatar({ src, size = 64, className }: ContactAvatarProps) { + const parsed = useMemo(() => src ? parseAvatarSrc(src) : null, [src]) + + const imgSrc = useMemo(() => { + if (!parsed) return null + if (parsed.type === 'hash') return generateAvatarDataUrl(parsed.value) + if (parsed.type === 'url') return parsed.value + return null + }, [parsed]) + + // 无头像或 emoji + if (!imgSrc) { + return ( +

+ ) + } + + // 图片(hash 或 URL) + return ( +
+ avatar +
+ ) +} diff --git a/src/components/contact/contact-card.tsx b/src/components/contact/contact-card.tsx new file mode 100644 index 00000000..e9ebc11b --- /dev/null +++ b/src/components/contact/contact-card.tsx @@ -0,0 +1,65 @@ +/** + * ContactCard - 联系人名片卡片 + * 用于分享和展示联系人信息 + */ + +import { QRCodeSVG } from 'qrcode.react'; +import { ContactAvatar } from '@/components/common/contact-avatar'; +import { generateAvatarFromAddress } from '@/lib/avatar-codec'; +import type { ContactAddressInfo } from '@/lib/qr-parser'; + +const CHAIN_NAMES: Record = { + ethereum: 'ETH', + bitcoin: 'BTC', + tron: 'TRX', +}; + +const CHAIN_COLORS: Record = { + ethereum: '#627EEA', + bitcoin: '#F7931A', + tron: '#FF0013', +}; + +export interface ContactCardProps { + name: string; + avatar?: string | undefined; + address?: string | undefined; + addresses: ContactAddressInfo[]; + qrContent: string; +} + +export function ContactCard({ name, avatar, address, addresses, qrContent }: ContactCardProps) { + const effectiveAddress = address || addresses[0]?.address; + const effectiveAvatar = avatar || (effectiveAddress ? generateAvatarFromAddress(effectiveAddress) : undefined); + return ( +
+
+ +
+

{name}

+
+ {addresses.map((a) => ( + + {CHAIN_NAMES[a.chainType] || a.chainType.toUpperCase()} + + ))} +
+
+
+ +
+
+ +
+
+ +
+

扫码添加联系人

+
+
+ ); +} diff --git a/src/components/transfer/address-input.stories.tsx b/src/components/transfer/address-input.stories.tsx index 404adf87..a4ddf49d 100644 --- a/src/components/transfer/address-input.stories.tsx +++ b/src/components/transfer/address-input.stories.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { AddressInput } from './address-input'; +import { AddressBookSuggestionProvider } from './contact-suggestion-context'; import { addressBookActions } from '@/stores'; const meta: Meta = { @@ -110,7 +111,11 @@ export const WithContactSuggestions: Story = { ], memo: '朋友', }); - return ; + return ( + + + + ); }, ], render: () => { @@ -155,7 +160,11 @@ export const FilterByChain: Story = { { id: '3', address: 'c7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', chainType: 'ccchain', isDefault: true }, ], }); - return ; + return ( + + + + ); }, ], render: () => { diff --git a/src/components/transfer/address-input.tsx b/src/components/transfer/address-input.tsx index c79c0ad6..223f220f 100644 --- a/src/components/transfer/address-input.tsx +++ b/src/components/transfer/address-input.tsx @@ -1,10 +1,11 @@ import { useState, forwardRef, useId, useMemo, useCallback, useRef, useEffect } from 'react'; import { cn } from '@/lib/utils'; import { useTranslation } from 'react-i18next'; -import { useStore } from '@tanstack/react-store'; -import { IconLineScan as ScanLine, IconClipboardCopy as ClipboardPaste, IconUser, IconUsers } from '@tabler/icons-react'; +import { IconLineScan as ScanLine, IconClipboardCopy as ClipboardPaste, IconUsers } from '@tabler/icons-react'; +import { ContactAvatar } from '@/components/common/contact-avatar'; import { clipboardService } from '@/services/clipboard'; -import { addressBookStore, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores'; +import { useContactSuggestions } from './contact-suggestion-context'; +import type { ChainType, ContactSuggestion } from '@/stores'; interface AddressInputProps extends Omit, 'onChange'> { value?: string | undefined; @@ -45,29 +46,28 @@ const AddressInput = forwardRef( const errorId = useId(); const listboxId = useId(); - // Get contacts from store - const addressBookState = useStore(addressBookStore); + // Get contacts from context (provided by AddressBookSuggestionProvider) + const { getSuggestions, hasContacts } = useContactSuggestions(); const currentValue = value || internalValue; const isValid = isValidAddress(currentValue); const hasError = !!(error || (!isValid && currentValue)); // Get contact suggestions - now supports empty query for "focus to show all" - const suggestions = useMemo((): ContactSuggestion[] => { + const suggestions = useMemo(() => { if (!showSuggestions) return []; - // Pass empty string to get all contacts when no input - return addressBookSelectors.suggestContacts(addressBookState, currentValue || '', chainType, maxSuggestions); - }, [addressBookState, currentValue, chainType, showSuggestions, maxSuggestions]); + return getSuggestions(currentValue || '', chainType, maxSuggestions); + }, [getSuggestions, currentValue, chainType, showSuggestions, maxSuggestions]); // Show dropdown when focused and has contacts (even without input) useEffect(() => { - if (focused && showSuggestions && (suggestions.length > 0 || addressBookState.contacts.length > 0)) { + if (focused && showSuggestions && (suggestions.length > 0 || hasContacts)) { setShowDropdown(true); setSelectedIndex(-1); } else { setShowDropdown(false); } - }, [focused, suggestions.length, addressBookState.contacts.length, showSuggestions]); + }, [focused, suggestions.length, hasContacts, showSuggestions]); // Handle click outside to close dropdown useEffect(() => { @@ -207,9 +207,11 @@ const AddressInput = forwardRef( )} onClick={() => handleSelectSuggestion(suggestion)} > -
- -
+

{suggestion.contact.name}

{suggestion.matchedAddress.address}

diff --git a/src/components/transfer/contact-suggestion-context.tsx b/src/components/transfer/contact-suggestion-context.tsx new file mode 100644 index 00000000..4465e6c4 --- /dev/null +++ b/src/components/transfer/contact-suggestion-context.tsx @@ -0,0 +1,57 @@ +import { createContext, useContext, useEffect, useMemo, type ReactNode } from 'react' +import { useStore } from '@tanstack/react-store' +import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores' + +interface ContactSuggestionContextValue { + /** 根据查询获取建议 */ + getSuggestions: (query: string, chainType?: ChainType, limit?: number) => ContactSuggestion[] + /** 是否有联系人 */ + hasContacts: boolean +} + +const ContactSuggestionContext = createContext(null) + +/** + * 地址簿联系人建议 Provider + * 确保 store 已初始化,并提供联系人查询能力 + */ +export function AddressBookSuggestionProvider({ children }: { children: ReactNode }) { + const addressBookState = useStore(addressBookStore) + + // 确保 store 已初始化 + useEffect(() => { + if (!addressBookState.isInitialized) { + addressBookActions.initialize() + } + }, [addressBookState.isInitialized]) + + const value = useMemo(() => ({ + getSuggestions: (query, chainType, limit = 5) => + addressBookSelectors.suggestContacts(addressBookState, query, chainType, limit), + hasContacts: addressBookState.contacts.length > 0, + }), [addressBookState]) + + return ( + + {children} + + ) +} + +/** + * 获取联系人建议 context + * 如果不在 Provider 内,返回空实现(不报错,保持组件可独立使用) + */ +export function useContactSuggestions() { + const context = useContext(ContactSuggestionContext) + + // 返回默认空实现,让组件可以独立工作 + if (!context) { + return { + getSuggestions: () => [], + hasContacts: false, + } + } + + return context +} diff --git a/src/components/transfer/index.ts b/src/components/transfer/index.ts index 29316e53..7a47c7da 100644 --- a/src/components/transfer/index.ts +++ b/src/components/transfer/index.ts @@ -1,2 +1,3 @@ export { AddressInput, isValidAddress } from './address-input' export { AmountInput, sanitizeInput, limitDecimals } from './amount-input' +export { AddressBookSuggestionProvider, useContactSuggestions } from './contact-suggestion-context' diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 141fd029..f57832fd 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -332,7 +332,8 @@ "memo": "Memo", "memoPlaceholder": "Add memo (optional)", "shareContact": "Share Contact", - "scanToAdd": "Scan to add contact" + "scanToAdd": "Scan to add contact", + "changeAvatar": "Click to change avatar" }, "time": { "justNow": "Just now", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index c3e1f311..72ede708 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -310,7 +310,8 @@ "memo": "备注", "memoPlaceholder": "添加备注(可选)", "shareContact": "分享名片", - "scanToAdd": "扫码添加联系人" + "scanToAdd": "扫码添加联系人", + "changeAvatar": "点击切换头像" }, "time": { "justNow": "刚刚", diff --git a/src/lib/__tests__/avatar-codec.test.ts b/src/lib/__tests__/avatar-codec.test.ts new file mode 100644 index 00000000..3c6d8903 --- /dev/null +++ b/src/lib/__tests__/avatar-codec.test.ts @@ -0,0 +1,72 @@ +import { describe, it, expect } from 'vitest' +import { + encodeAvatar, + decodeAvatar, + generateRandomAvatar, + generateAvatarFromSeed, + type AvatarConfig, +} from '../avatar-codec' + +describe('avatar-codec', () => { + it('should encode and decode avatar config correctly', () => { + const config: AvatarConfig = { + topType: 'LongHairMiaWallace', + hairColor: 'BrownDark', + accessoriesType: 'Prescription02', + facialHairType: 'Blank', + facialHairColor: 'Black', + clotheType: 'Hoodie', + clotheColor: 'PastelBlue', + graphicType: 'Bat', + eyeType: 'Happy', + eyebrowType: 'Default', + mouthType: 'Smile', + skinColor: 'Light', + } + + const encoded = encodeAvatar(config) + expect(encoded.length).toBe(8) + + const decoded = decodeAvatar(encoded) + expect(decoded).toEqual(config) + }) + + it('should generate 8-character base64 string', () => { + const config = generateRandomAvatar() + const encoded = encodeAvatar(config) + + expect(encoded.length).toBe(8) + expect(/^[A-Za-z0-9+/=]+$/.test(encoded)).toBe(true) + }) + + it('should generate consistent avatar from same seed', () => { + const seed = 'test-user-123' + const avatar1 = generateAvatarFromSeed(seed) + const avatar2 = generateAvatarFromSeed(seed) + + expect(avatar1).toEqual(avatar2) + }) + + it('should generate different avatars from different seeds', () => { + const avatar1 = generateAvatarFromSeed('user-a') + const avatar2 = generateAvatarFromSeed('user-b') + + expect(avatar1).not.toEqual(avatar2) + }) + + it('should handle invalid encoded string gracefully', () => { + const decoded = decodeAvatar('invalid!') + expect(decoded.topType).toBeDefined() + expect(decoded.skinColor).toBeDefined() + }) + + it('should encode all possible option combinations', () => { + for (let i = 0; i < 10; i++) { + const config = generateRandomAvatar() + const encoded = encodeAvatar(config) + const decoded = decodeAvatar(encoded) + + expect(decoded).toEqual(config) + } + }) +}) diff --git a/src/lib/avatar-codec.ts b/src/lib/avatar-codec.ts new file mode 100644 index 00000000..9c7f05f2 --- /dev/null +++ b/src/lib/avatar-codec.ts @@ -0,0 +1,186 @@ +/** + * Avataaars 编码/解码工具 + * 将 Avatar 配置压缩为 8 字符的 base64 字符串 + */ + +export const AVATAR_OPTIONS = { + topType: [ + 'NoHair', 'Eyepatch', 'Hat', 'Hijab', 'Turban', + 'WinterHat1', 'WinterHat2', 'WinterHat3', 'WinterHat4', + 'LongHairBigHair', 'LongHairBob', 'LongHairBun', 'LongHairCurly', + 'LongHairCurvy', 'LongHairDreads', 'LongHairFrida', 'LongHairFro', + 'LongHairFroBand', 'LongHairNotTooLong', 'LongHairShavedSides', + 'LongHairMiaWallace', 'LongHairStraight', 'LongHairStraight2', + 'LongHairStraightStrand', 'ShortHairDreads01', 'ShortHairDreads02', + 'ShortHairFrizzle', 'ShortHairShaggyMullet', 'ShortHairShortCurly', + 'ShortHairShortFlat', 'ShortHairShortRound', 'ShortHairShortWaved', + 'ShortHairSides', 'ShortHairTheCaesar', 'ShortHairTheCaesarSidePart', + ], + hairColor: [ + 'Auburn', 'Black', 'Blonde', 'BlondeGolden', 'Brown', + 'BrownDark', 'PastelPink', 'Platinum', 'Red', 'SilverGray', + ], + accessoriesType: [ + 'Blank', 'Kurt', 'Prescription01', 'Prescription02', + 'Round', 'Sunglasses', 'Wayfarers', + ], + facialHairType: [ + 'Blank', 'BeardMedium', 'BeardLight', 'BeardMajestic', + 'MoustacheFancy', 'MoustacheMagnum', + ], + facialHairColor: [ + 'Auburn', 'Black', 'Blonde', 'BlondeGolden', + 'Brown', 'BrownDark', 'Platinum', 'Red', + ], + clotheType: [ + 'BlazerShirt', 'BlazerSweater', 'CollarSweater', + 'GraphicShirt', 'Hoodie', 'Overall', + 'ShirtCrewNeck', 'ShirtScoopNeck', 'ShirtVNeck', + ], + clotheColor: [ + 'Black', 'Blue01', 'Blue02', 'Blue03', 'Gray01', 'Gray02', + 'Heather', 'PastelBlue', 'PastelGreen', 'PastelOrange', + 'PastelRed', 'PastelYellow', 'Pink', 'Red', 'White', + ], + graphicType: [ + 'Bat', 'Cumbia', 'Deer', 'Diamond', 'Hola', + 'Pizza', 'Resist', 'Selena', 'Bear', 'SkullOutline', 'Skull', + ], + eyeType: [ + 'Close', 'Cry', 'Default', 'Dizzy', 'EyeRoll', + 'Happy', 'Hearts', 'Side', 'Squint', 'Surprised', + 'Wink', 'WinkWacky', + ], + eyebrowType: [ + 'Angry', 'AngryNatural', 'Default', 'DefaultNatural', + 'FlatNatural', 'RaisedExcited', 'RaisedExcitedNatural', + 'SadConcerned', 'SadConcernedNatural', 'UnibrowNatural', + 'UpDown', 'UpDownNatural', + ], + mouthType: [ + 'Concerned', 'Default', 'Disbelief', 'Eating', + 'Grimace', 'Sad', 'ScreamOpen', 'Serious', + 'Smile', 'Tongue', 'Twinkle', 'Vomit', + ], + skinColor: [ + 'Tanned', 'Yellow', 'Pale', 'Light', 'Brown', 'DarkBrown', 'Black', + ], +} as const + +const BIT_WIDTHS = [6, 4, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3] as const +const FIELD_ORDER = [ + 'topType', 'hairColor', 'accessoriesType', 'facialHairType', + 'facialHairColor', 'clotheType', 'clotheColor', 'graphicType', + 'eyeType', 'eyebrowType', 'mouthType', 'skinColor', +] as const + +export type AvatarConfig = { + [K in keyof typeof AVATAR_OPTIONS]: (typeof AVATAR_OPTIONS)[K][number] +} + +export function encodeAvatar(config: AvatarConfig): string { + let bits = 0n + let offset = 0 + + for (let i = 0; i < FIELD_ORDER.length; i++) { + const field = FIELD_ORDER[i]! + const options = AVATAR_OPTIONS[field] as readonly string[] + const value = config[field] + const index = options.indexOf(value) + const idx = index >= 0 ? index : 0 + + bits |= BigInt(idx) << BigInt(offset) + offset += BIT_WIDTHS[i]! + } + + const bytes = new Uint8Array(6) + for (let i = 0; i < 6; i++) { + bytes[i] = Number((bits >> BigInt(i * 8)) & 0xffn) + } + + return btoa(String.fromCharCode(...bytes)) +} + +export function decodeAvatar(encoded: string): AvatarConfig { + try { + const binary = atob(encoded) + let bits = 0n + + for (let i = 0; i < binary.length && i < 6; i++) { + bits |= BigInt(binary.charCodeAt(i)) << BigInt(i * 8) + } + + const config: Record = {} + let offset = 0 + + for (let i = 0; i < FIELD_ORDER.length; i++) { + const field = FIELD_ORDER[i]! + const width = BIT_WIDTHS[i]! + const mask = (1n << BigInt(width)) - 1n + const index = Number((bits >> BigInt(offset)) & mask) + const options = AVATAR_OPTIONS[field] as readonly string[] + + config[field] = options[index % options.length]! + offset += width + } + + return config as AvatarConfig + } catch { + return generateRandomAvatar() + } +} + +export function generateRandomAvatar(): AvatarConfig { + const random = (arr: readonly T[]): T => arr[Math.floor(Math.random() * arr.length)] as T + + return { + topType: random(AVATAR_OPTIONS.topType), + hairColor: random(AVATAR_OPTIONS.hairColor), + accessoriesType: random(AVATAR_OPTIONS.accessoriesType), + facialHairType: random(AVATAR_OPTIONS.facialHairType), + facialHairColor: random(AVATAR_OPTIONS.facialHairColor), + clotheType: random(AVATAR_OPTIONS.clotheType), + clotheColor: random(AVATAR_OPTIONS.clotheColor), + graphicType: random(AVATAR_OPTIONS.graphicType), + eyeType: random(AVATAR_OPTIONS.eyeType), + eyebrowType: random(AVATAR_OPTIONS.eyebrowType), + mouthType: random(AVATAR_OPTIONS.mouthType), + skinColor: random(AVATAR_OPTIONS.skinColor), + } +} + +export function generateAvatarFromSeed(seed: string): AvatarConfig { + let hash = 0 + for (let i = 0; i < seed.length; i++) { + hash = ((hash << 5) - hash + seed.charCodeAt(i)) | 0 + } + + const pick = (arr: readonly T[], offset: number): T => { + const idx = Math.abs((hash + offset * 31) % arr.length) + return arr[idx] as T + } + + return { + topType: pick(AVATAR_OPTIONS.topType, 0), + hairColor: pick(AVATAR_OPTIONS.hairColor, 1), + accessoriesType: pick(AVATAR_OPTIONS.accessoriesType, 2), + facialHairType: pick(AVATAR_OPTIONS.facialHairType, 3), + facialHairColor: pick(AVATAR_OPTIONS.facialHairColor, 4), + clotheType: pick(AVATAR_OPTIONS.clotheType, 5), + clotheColor: pick(AVATAR_OPTIONS.clotheColor, 6), + graphicType: pick(AVATAR_OPTIONS.graphicType, 7), + eyeType: pick(AVATAR_OPTIONS.eyeType, 8), + eyebrowType: pick(AVATAR_OPTIONS.eyebrowType, 9), + mouthType: pick(AVATAR_OPTIONS.mouthType, 10), + skinColor: pick(AVATAR_OPTIONS.skinColor, 11), + } +} + +/** 从地址生成头像 URL(用于联系人默认头像) */ +export function generateAvatarFromAddress(address: string, seed: number = 0): string { + const combinedSeed = seed === 0 ? address.toLowerCase() : `${address.toLowerCase()}:${seed}` + const config = generateAvatarFromSeed(combinedSeed) + return `avatar:${encodeAvatar(config)}` +} + + diff --git a/src/lib/qr-parser.test.ts b/src/lib/qr-parser.test.ts index a30963e7..3db3387f 100644 --- a/src/lib/qr-parser.test.ts +++ b/src/lib/qr-parser.test.ts @@ -342,7 +342,6 @@ describe('qr-parser', () => { { chainType: 'ethereum' as const, address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, { chainType: 'bitcoin' as const, address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, ], - memo: '同事', avatar: '👩‍💻', } const content = generateContactQRContent(original) @@ -351,8 +350,9 @@ describe('qr-parser', () => { const contact = result as ParsedContact expect(contact.name).toBe(original.name) expect(contact.addresses).toHaveLength(2) - expect(contact.memo).toBe(original.memo) expect(contact.avatar).toBe(original.avatar) + // memo 不应该被包含在分享内容中 + expect(contact.memo).toBeUndefined() }) it('handles special characters in name', () => { diff --git a/src/lib/qr-parser.ts b/src/lib/qr-parser.ts index 906e9504..d9011839 100644 --- a/src/lib/qr-parser.ts +++ b/src/lib/qr-parser.ts @@ -262,14 +262,13 @@ function parseContactURI(content: string): ParsedContact | null { /** * 生成联系人二维码内容 + * 注意:不包含 memo(备注是私人信息,不分享) */ export function generateContactQRContent(contact: { name: string addresses: ContactAddressInfo[] - memo?: string | undefined avatar?: string | undefined }): string { - // 使用 JSON 格式,更灵活 return JSON.stringify({ type: 'contact', name: contact.name, @@ -278,7 +277,6 @@ export function generateContactQRContent(contact: { address: a.address, label: a.label, })), - memo: contact.memo, avatar: contact.avatar, }) } diff --git a/src/pages/address-book/index.tsx b/src/pages/address-book/index.tsx index c18d6a56..e39d60e5 100644 --- a/src/pages/address-book/index.tsx +++ b/src/pages/address-book/index.tsx @@ -9,6 +9,8 @@ import { IconUser as User, IconDotsVertical as MoreVertical, } from '@tabler/icons-react'; +import { ContactAvatar } from '@/components/common/contact-avatar'; +import { generateAvatarFromAddress } from '@/lib/avatar-codec'; import { PageHeader } from '@/components/layout/page-header'; import { addressBookStore, @@ -29,7 +31,7 @@ export function AddressBookPage() { const contacts = addressBookState.contacts; const currentWallet = useStore(walletStore, walletSelectors.getCurrentWallet); - // Initialize address book from storage + // 确保 store 已初始化 useEffect(() => { if (!addressBookState.isInitialized) { addressBookActions.initialize(); @@ -203,9 +205,10 @@ function ContactListItem({ contact, onEdit, onDelete, onShare }: ContactListItem
{/* 头像 */} -
- {contact.name.slice(0, 1).toUpperCase()} -
+ {/* 信息 */}
diff --git a/src/pages/home/index.tsx b/src/pages/home/index.tsx index 84c3f78b..b8059f63 100644 --- a/src/pages/home/index.tsx +++ b/src/pages/home/index.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigation, useFlow } from '@/stackflow'; import { TokenList } from '@/components/token/token-list'; @@ -29,7 +29,6 @@ import { useCurrentChainTokens, useHasWallet, useWalletInitialized, - walletActions, type ChainType, } from '@/stores'; @@ -68,12 +67,6 @@ export function HomePage() { const [copied, setCopied] = useState(false); - useEffect(() => { - if (!isInitialized) { - walletActions.initialize(); - } - }, [isInitialized]); - const handleCopyAddress = async () => { if (chainAddress?.address) { await clipboard.write({ text: chainAddress.address }); diff --git a/src/pages/send/index.tsx b/src/pages/send/index.tsx index 9cd9113d..31931f90 100644 --- a/src/pages/send/index.tsx +++ b/src/pages/send/index.tsx @@ -4,7 +4,7 @@ import { useNavigation, useActivityParams, useFlow } from '@/stackflow'; import { setTransferConfirmCallback, setTransferWalletLockCallback, setScannerResultCallback } from '@/stackflow/activities/sheets'; import type { Contact, ContactAddress } from '@/stores'; import { PageHeader } from '@/components/layout/page-header'; -import { AddressInput } from '@/components/transfer/address-input'; +import { AddressInput, AddressBookSuggestionProvider } from '@/components/transfer'; import { AmountInput } from '@/components/transfer/amount-input'; import { GradientButton } from '@/components/common/gradient-button'; import { Alert } from '@/components/common/alert'; @@ -269,16 +269,18 @@ export function SendPage() {
{/* Address input */} - + + + {/* Amount input */} { + setAvatarSeed(prev => prev + 1) + }, []) + const handleSave = useCallback(async () => { if (!name.trim() || addresses.length === 0) return setIsSaving(true) try { + // 生成最终头像(avatar:HASH 格式) + const finalAvatar = params.avatar || + (addresses[0]?.address ? generateAvatarFromAddress(addresses[0].address, avatarSeed) : undefined) + // 添加联系人 addressBookActions.addContact({ name: name.trim(), @@ -79,7 +91,7 @@ function ContactAddConfirmJobContent() { isDefault: i === 0, })), memo: memo.trim() || undefined, - avatar: params.avatar, + avatar: finalAvatar, }) setSaved(true) @@ -89,7 +101,7 @@ function ContactAddConfirmJobContent() { } finally { setIsSaving(false) } - }, [name, memo, addresses, params.avatar, pop]) + }, [name, memo, addresses, params.avatar, avatarSeed, pop]) const handleCancel = useCallback(() => { pop() @@ -114,13 +126,22 @@ function ContactAddConfirmJobContent() {
{/* Avatar & Name */}
-
- {params.avatar ? ( - {params.avatar} - ) : ( - +
+ setName(e.target.value)} diff --git a/src/stackflow/activities/sheets/ContactEditJob.tsx b/src/stackflow/activities/sheets/ContactEditJob.tsx index 6a309e0e..10b716c8 100644 --- a/src/stackflow/activities/sheets/ContactEditJob.tsx +++ b/src/stackflow/activities/sheets/ContactEditJob.tsx @@ -6,7 +6,9 @@ import { useStore } from "@tanstack/react-store"; import { cn } from "@/lib/utils"; import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType } from "@/stores"; import { detectAddressFormat } from "@/lib/address-format"; -import { IconUser as User, IconWallet as Wallet, IconFileText as FileText } from "@tabler/icons-react"; +import { IconWallet as Wallet, IconFileText as FileText, IconRefresh as Refresh } from "@tabler/icons-react"; +import { ContactAvatar } from "@/components/common/contact-avatar"; +import { generateAvatarFromAddress } from "@/lib/avatar-codec"; import { useFlow } from "../../stackflow"; import { ActivityParamsProvider, useActivityParams } from "../../hooks"; @@ -26,6 +28,7 @@ function ContactEditJobContent() { const [name, setName] = useState(""); const [address, setAddress] = useState(""); const [memo, setMemo] = useState(""); + const [avatarSeed, setAvatarSeed] = useState(0); const isEditing = !!contact; @@ -42,6 +45,14 @@ function ContactEditJobContent() { } }, [contact, defaultAddress]); + // 切换头像 + const handleChangeAvatar = useCallback(() => { + setAvatarSeed(prev => prev + 1); + }, []); + + // 当前头像 URL + const currentAvatar = contact?.avatar || (address.trim() ? generateAvatarFromAddress(address.trim(), avatarSeed) : undefined); + const handleSave = useCallback(() => { const trimmedName = name.trim(); const trimmedAddress = address.trim(); @@ -53,10 +64,14 @@ function ContactEditJobContent() { const detectedFormat = detectAddressFormat(trimmedAddress); const chainType = (defaultChain as ChainType) ?? detectedFormat.chainType ?? "ethereum"; + // 生成最终头像 + const finalAvatar = contact?.avatar || generateAvatarFromAddress(trimmedAddress, avatarSeed); + if (isEditing && contact) { - // Update contact name and memo + // Update contact name, memo and avatar addressBookActions.updateContact(contact.id, { name: trimmedName, + avatar: finalAvatar, ...(trimmedMemo ? { memo: trimmedMemo } : {}), }); @@ -82,12 +97,13 @@ function ContactEditJobContent() { isDefault: true, }, ], + avatar: finalAvatar, ...(trimmedMemo ? { memo: trimmedMemo } : {}), }); } pop(); - }, [name, address, memo, isEditing, contact, defaultAddress, defaultChain, pop]); + }, [name, address, memo, avatarSeed, isEditing, contact, defaultAddress, defaultChain, pop]); const canSave = name.trim().length > 0 && address.trim().length > 0; @@ -108,12 +124,22 @@ function ContactEditJobContent() { {/* Content */}
- {/* Name input */} -
- + {/* Avatar & Name */} +
+ diff --git a/src/stackflow/activities/sheets/ContactPickerJob.tsx b/src/stackflow/activities/sheets/ContactPickerJob.tsx index 0a500868..b396172d 100644 --- a/src/stackflow/activities/sheets/ContactPickerJob.tsx +++ b/src/stackflow/activities/sheets/ContactPickerJob.tsx @@ -1,11 +1,13 @@ -import { useState, useMemo } from "react"; +import { useState, useMemo, useEffect } from "react"; import type { ActivityComponentType } from "@stackflow/react"; import { BottomSheet } from "@/components/layout/bottom-sheet"; import { useTranslation } from "react-i18next"; import { useStore } from "@tanstack/react-store"; import { cn } from "@/lib/utils"; -import { IconUser, IconSearch, IconChevronRight } from "@tabler/icons-react"; -import { addressBookStore, addressBookSelectors, type ChainType, type Contact, type ContactAddress } from "@/stores"; +import { IconSearch, IconChevronRight } from "@tabler/icons-react"; +import { ContactAvatar } from "@/components/common/contact-avatar"; +import { generateAvatarFromAddress } from "@/lib/avatar-codec"; +import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType, type Contact, type ContactAddress } from "@/stores"; import { useFlow } from "../../stackflow"; import { ActivityParamsProvider, useActivityParams } from "../../hooks"; @@ -29,6 +31,13 @@ function ContactPickerJobContent() { const addressBookState = useStore(addressBookStore); + // 确保 store 已初始化 + useEffect(() => { + if (!addressBookState.isInitialized) { + addressBookActions.initialize(); + } + }, [addressBookState.isInitialized]); + const filteredContacts = useMemo(() => { let contacts = addressBookState.contacts; @@ -118,9 +127,11 @@ function ContactPickerJobContent() { onClick={() => handleSelectAddress(contact, address)} className="hover:bg-muted/50 flex w-full items-center gap-3 px-4 py-3 transition-colors" > -
- -
+

{contact.name}

@@ -141,9 +152,11 @@ function ContactPickerJobContent() { onClick={() => setExpandedContactId(isExpanded ? null : contact.id)} className="hover:bg-muted/50 flex w-full items-center gap-3 px-4 py-3 transition-colors" > -

- -
+

{contact.name}

diff --git a/src/stackflow/activities/sheets/ContactShareJob.tsx b/src/stackflow/activities/sheets/ContactShareJob.tsx index 7ad0f4b0..f51b9d07 100644 --- a/src/stackflow/activities/sheets/ContactShareJob.tsx +++ b/src/stackflow/activities/sheets/ContactShareJob.tsx @@ -1,183 +1,143 @@ /** * ContactShareJob - 分享联系人名片 - * + * * 显示联系人二维码,让他人扫描添加 + * 使用 snapdom 实现高质量的名片截图下载 */ -import { useMemo } from 'react' -import type { ActivityComponentType } from '@stackflow/react' -import { BottomSheet } from '@/components/layout/bottom-sheet' -import { useTranslation } from 'react-i18next' -import { Button } from '@/components/ui/button' -import { - IconUser as User, - IconX as X, - IconDownload as Download, - IconShare as Share, -} from '@tabler/icons-react' -import { QRCodeSVG } from 'qrcode.react' -import { generateContactQRContent, type ContactAddressInfo } from '@/lib/qr-parser' -import { useFlow } from '../../stackflow' -import { ActivityParamsProvider, useActivityParams } from '../../hooks' +import { useMemo, useRef, useCallback, useState } from 'react'; +import type { ActivityComponentType } from '@stackflow/react'; +import { BottomSheet } from '@/components/layout/bottom-sheet'; +import { useTranslation } from 'react-i18next'; +import { Button } from '@/components/ui/button'; +import { IconX as X, IconDownload as Download, IconShare as Share, IconLoader2 as Loader } from '@tabler/icons-react'; +import { generateContactQRContent, type ContactAddressInfo } from '@/lib/qr-parser'; +import { ContactCard } from '@/components/contact/contact-card'; +import { useFlow } from '../../stackflow'; +import { ActivityParamsProvider, useActivityParams } from '../../hooks'; /** Job 参数 */ export type ContactShareJobParams = { /** 联系人名称 */ - name: string + name: string; /** 地址列表 JSON */ - addresses: string + addresses: string; /** 备注 */ - memo?: string | undefined + memo?: string | undefined; /** 头像 */ - avatar?: string | undefined -} + avatar?: string | undefined; +}; const CHAIN_NAMES: Record = { ethereum: 'ETH', bitcoin: 'BTC', tron: 'TRX', -} +}; function ContactShareJobContent() { - const { t } = useTranslation('common') - const { pop } = useFlow() - const params = useActivityParams() - - // 解析地址列表 + const { t } = useTranslation('common'); + const { pop } = useFlow(); + const params = useActivityParams(); + const cardRef = useRef(null); + const [isDownloading, setIsDownloading] = useState(false); + const addresses: ContactAddressInfo[] = useMemo(() => { try { - return JSON.parse(params.addresses || '[]') + return JSON.parse(params.addresses || '[]'); } catch { - return [] + return []; } - }, [params.addresses]) - - // 生成二维码内容 + }, [params.addresses]); + const qrContent = useMemo(() => { return generateContactQRContent({ name: params.name, addresses, - memo: params.memo, avatar: params.avatar, - }) - }, [params.name, addresses, params.memo, params.avatar]) - - // 下载二维码 - const handleDownload = () => { - const svg = document.getElementById('contact-qr-code') - if (!svg) return - - const svgData = new XMLSerializer().serializeToString(svg) - const canvas = document.createElement('canvas') - const ctx = canvas.getContext('2d') - const img = new Image() - - img.onload = () => { - canvas.width = img.width - canvas.height = img.height - ctx?.drawImage(img, 0, 0) - - const link = document.createElement('a') - link.download = `contact-${params.name}.png` - link.href = canvas.toDataURL('image/png') - link.click() + }); + }, [params.name, addresses, params.avatar]); + + const handleDownload = useCallback(async () => { + const cardElement = cardRef.current; + if (!cardElement || isDownloading) return; + + setIsDownloading(true); + try { + const { snapdom } = await import('@zumer/snapdom'); + await snapdom.download(cardElement, { + type: 'png', + filename: `contact-${params.name}.png`, + scale: 2, + quality: 1, + }); + } catch (error) { + console.error('Download failed:', error); + } finally { + setIsDownloading(false); } - - img.src = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svgData))) - } - - // 分享(如果支持 Web Share API) - const handleShare = async () => { - if (navigator.share) { - try { - await navigator.share({ - title: t('addressBook.shareContact'), - text: `${params.name} - ${addresses.map(a => `${CHAIN_NAMES[a.chainType] || a.chainType}: ${a.address}`).join(', ')}`, - }) - } catch { - // User cancelled or share failed - } + }, [params.name, isDownloading]); + + const handleShare = useCallback(async () => { + const cardElement = cardRef.current; + if (!cardElement || !navigator.share) return; + + setIsDownloading(true); + try { + const { snapdom } = await import('@zumer/snapdom'); + const result = await snapdom(cardElement, { scale: 2 }); + const blob = await result.toBlob(); + const file = new File([blob], `contact-${params.name}.png`, { type: 'image/png' }); + + await navigator.share({ + title: t('addressBook.shareContact'), + text: `${params.name} - ${addresses.map((a) => `${CHAIN_NAMES[a.chainType] || a.chainType}: ${a.address}`).join(', ')}`, + files: [file], + }); + } catch { + // User cancelled or share failed + } finally { + setIsDownloading(false); } - } - + }, [params.name, addresses, t, isDownloading]); + return (

- {/* Handle */}
- - {/* Header */} +
-

- {t('addressBook.shareContact')} -

+

{t('addressBook.shareContact')}

- - {/* Content */} +
- {/* Contact Info */} -
-
- {params.avatar ? ( - {params.avatar} - ) : ( - - )} -
-
-

{params.name}

-

- {addresses.map(a => CHAIN_NAMES[a.chainType] || a.chainType).join(' · ')} -

-
+
+
- - {/* QR Code */} -
- -
- - {/* Hint */} -

- {t('addressBook.scanToAdd')} -

+ +

{t('addressBook.scanToAdd')}

- - {/* Actions */} +
- {'share' in navigator && ( - )}
- ) + ); } export const ContactShareJob: ActivityComponentType = ({ params }) => { @@ -185,5 +145,5 @@ export const ContactShareJob: ActivityComponentType = ({ - ) -} + ); +}; diff --git a/src/stackflow/activities/sheets/__stories__/ContactJobs.stories.tsx b/src/stackflow/activities/sheets/__stories__/ContactJobs.stories.tsx index 41f47bee..413507a5 100644 --- a/src/stackflow/activities/sheets/__stories__/ContactJobs.stories.tsx +++ b/src/stackflow/activities/sheets/__stories__/ContactJobs.stories.tsx @@ -1,42 +1,46 @@ -import type { Meta, StoryObj } from '@storybook/react' -import { useState } from 'react' -import { QRCodeSVG } from 'qrcode.react' -import { parseQRContent, generateContactQRContent, type ParsedContact } from '@/lib/qr-parser' +import type { Meta, StoryObj } from '@storybook/react'; +import { useState, useRef, useCallback } from 'react'; +import { QRCodeSVG } from 'qrcode.react'; +import { IconDownload as Download, IconLoader2 as Loader } from '@tabler/icons-react'; +import { parseQRContent, generateContactQRContent, type ParsedContact } from '@/lib/qr-parser'; +import { encodeAvatar, generateRandomAvatar, generateAvatarFromSeed } from '@/lib/avatar-codec'; +import { ContactAvatar } from '@/components/common/contact-avatar'; +import { Button } from '@/components/ui/button'; +import { ContactCard } from '@/components/contact/contact-card'; const meta: Meta = { title: 'Sheets/ContactJobs', parameters: { layout: 'centered', }, -} +}; -export default meta +export default meta; /** 联系人协议解析测试 */ export const ContactProtocolDemo: StoryObj = { render: () => { - const [name, setName] = useState('张三') - const [ethAddress, setEthAddress] = useState('0x742d35Cc6634C0532925a3b844Bc9e7595f12345') - const [btcAddress, setBtcAddress] = useState('') - const [memo, setMemo] = useState('好友') - + const [name, setName] = useState('张三'); + const [ethAddress, setEthAddress] = useState('0x742d35Cc6634C0532925a3b844Bc9e7595f12345'); + const [btcAddress, setBtcAddress] = useState(''); + const [memo, setMemo] = useState('好友'); + const addresses = [ ethAddress && { chainType: 'ethereum' as const, address: ethAddress }, btcAddress && { chainType: 'bitcoin' as const, address: btcAddress }, - ].filter(Boolean) as { chainType: 'ethereum' | 'bitcoin' | 'tron'; address: string }[] - + ].filter(Boolean) as { chainType: 'ethereum' | 'bitcoin' | 'tron'; address: string }[]; + const qrContent = generateContactQRContent({ name, addresses, - memo: memo || undefined, - }) - - const parsed = parseQRContent(qrContent) - + }); + + const parsed = parseQRContent(qrContent); + return (

联系人协议测试

- +
@@ -57,7 +61,7 @@ export const ContactProtocolDemo: StoryObj = { />
- +
- +
- +
- +
-
+          
             {JSON.stringify(JSON.parse(qrContent), null, 2)}
           
- +
{parsed.type === 'contact' ? (
@@ -102,184 +106,128 @@ export const ContactProtocolDemo: StoryObj = { )}
- ) + ); }, -} +}; -/** 添加联系人确认 UI 预览 */ -export const ContactAddConfirmPreview: StoryObj = { +/** Avatar 编码演示 */ +export const AvatarCodecDemo: StoryObj = { render: () => { - const [name, setName] = useState('张三') - const [memo, setMemo] = useState('') - const [saved, setSaved] = useState(false) - - const addresses = [ - { chainType: 'ethereum', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, - { chainType: 'bitcoin', address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, - ] - - const chainNames: Record = { - ethereum: 'Ethereum', - bitcoin: 'Bitcoin', - tron: 'Tron', - } - + const [avatarCode, setAvatarCode] = useState(() => { + const config = generateRandomAvatar(); + return `avatar:${encodeAvatar(config)}`; + }); + + const regenerate = () => { + const config = generateRandomAvatar(); + setAvatarCode(`avatar:${encodeAvatar(config)}`); + }; + + const fromSeed = (seed: string) => { + const config = generateAvatarFromSeed(seed); + setAvatarCode(`avatar:${encodeAvatar(config)}`); + }; + return ( -
- {/* Handle */} -
-
-
- - {/* Title */} -
-

添加联系人

-
- - {/* Content */} -
- {/* Avatar & Name */} -
-
- - - -
- setName(e.target.value)} - placeholder="输入联系人名称" - className="flex-1 rounded-lg border px-3 py-2" - /> +
+

Avatar 编码演示

+ +
+
+ + {avatarCode} + 8 字符 base64
- - {/* Addresses */} -
- -
- {addresses.map((addr, i) => ( -
- - - -
-
- {chainNames[addr.chainType] || addr.chainType} -
-
{addr.address}
-
-
- ))} -
+ +
+ + 👨‍💼 + Emoji 回退
- - {/* Memo */} -
- - setMemo(e.target.value)} - placeholder="添加备注(可选)" - className="w-full rounded-lg border px-3 py-2" - /> + +
+ + undefined + 默认头像
- - {/* Actions */} -
- - + +
+ + +
- ) + ); }, -} +}; -/** 分享名片 UI 预览 */ -export const ContactSharePreview: StoryObj = { +/** 新版名片卡片样式 - 支持 snapdom 截图下载 */ +export const ContactCardPreview: StoryObj = { render: () => { + const cardRef = useRef(null); + const [isDownloading, setIsDownloading] = useState(false); + const [avatarCode] = useState(() => `avatar:${encodeAvatar(generateRandomAvatar())}`); + const contact = { name: '张三', + avatar: avatarCode, addresses: [ { chainType: 'ethereum' as const, address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, + { chainType: 'bitcoin' as const, address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, ], - memo: '好友', - } - - const qrContent = generateContactQRContent(contact) - + }; + + const qrContent = generateContactQRContent(contact); + + const handleDownload = useCallback(async () => { + const cardElement = cardRef.current; + if (!cardElement || isDownloading) return; + + setIsDownloading(true); + try { + const { snapdom } = await import('@zumer/snapdom'); + await snapdom.download(cardElement, { + type: 'png', + filename: `contact-${contact.name}.png`, + scale: 2, + quality: 1, + }); + } catch (error) { + console.error('Download failed:', error); + } finally { + setIsDownloading(false); + } + }, [isDownloading]); + return ( -
- {/* Handle */} -
-
-
- - {/* Header */} -
- -

分享名片

-
-
- - {/* Content */} -
- {/* Contact Info */} -
-
- - - -
-
-

{contact.name}

-

ETH

-
-
- - {/* QR Code */} -
- -
- - {/* Hint */} -

- 扫码添加联系人 -

-
- - {/* Actions */} -
- - +
+

新版名片卡片 (Avataaars + snapdom)

+

+ 头像编码: {avatarCode} +

+ +
+
+ +
- ) + ); }, -} +}; /** 边界条件测试 */ export const EdgeCases: StoryObj = { @@ -287,15 +235,18 @@ export const EdgeCases: StoryObj = { const testCases = [ { name: '正常联系人', - content: '{"type":"contact","name":"张三","addresses":[{"chainType":"ethereum","address":"0x742d35Cc6634C0532925a3b844Bc9e7595f12345"}]}', + content: + '{"type":"contact","name":"张三","addresses":[{"chainType":"ethereum","address":"0x742d35Cc6634C0532925a3b844Bc9e7595f12345"}]}', }, { name: '多地址联系人', - content: '{"type":"contact","name":"李四","addresses":[{"chainType":"ethereum","address":"0x742d35Cc6634C0532925a3b844Bc9e7595f12345"},{"chainType":"bitcoin","address":"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"}]}', + content: + '{"type":"contact","name":"李四","addresses":[{"chainType":"ethereum","address":"0x742d35Cc6634C0532925a3b844Bc9e7595f12345"},{"chainType":"bitcoin","address":"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"}]}', }, { name: '带备注和头像', - content: '{"type":"contact","name":"王五","addresses":[{"chainType":"tron","address":"TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW"}],"memo":"老板","avatar":"👨‍💼"}', + content: + '{"type":"contact","name":"王五","addresses":[{"chainType":"tron","address":"TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW"}],"memo":"老板","avatar":"👨‍💼"}', }, { name: 'URI 格式', @@ -303,7 +254,8 @@ export const EdgeCases: StoryObj = { }, { name: '空名称 (无效)', - content: '{"type":"contact","name":"","addresses":[{"chainType":"ethereum","address":"0x742d35Cc6634C0532925a3b844Bc9e7595f12345"}]}', + content: + '{"type":"contact","name":"","addresses":[{"chainType":"ethereum","address":"0x742d35Cc6634C0532925a3b844Bc9e7595f12345"}]}', }, { name: '空地址列表 (无效)', @@ -317,12 +269,12 @@ export const EdgeCases: StoryObj = { name: '普通地址', content: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345', }, - ] - + ]; + return (

边界条件测试

- + @@ -333,33 +285,37 @@ export const EdgeCases: StoryObj = { {testCases.map((tc) => { - const parsed = parseQRContent(tc.content) - const isContact = parsed.type === 'contact' - const contactParsed = parsed as ParsedContact - + const parsed = parseQRContent(tc.content); + const isContact = parsed.type === 'contact'; + const contactParsed = parsed as ParsedContact; + return ( - ) + ); })}
{tc.name} - + {parsed.type} {isContact ? ( - {contactParsed.name} ({contactParsed.addresses.length} 地址) + + {contactParsed.name} ({contactParsed.addresses.length} 地址) + ) : ( - )}
- ) + ); }, -} +}; diff --git a/src/stackflow/activities/tabs/HomeTab.tsx b/src/stackflow/activities/tabs/HomeTab.tsx index b3245da4..26e3aa68 100644 --- a/src/stackflow/activities/tabs/HomeTab.tsx +++ b/src/stackflow/activities/tabs/HomeTab.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useFlow } from "../../stackflow"; import { Button } from "@/components/ui/button"; @@ -24,7 +24,6 @@ import { useCurrentChainTokens, useHasWallet, useWalletInitialized, - walletActions, type ChainType, } from "@/stores"; @@ -74,12 +73,6 @@ export function HomeTab() { // 查询并缓存安全密码公钥(进入钱包时自动查询) useSecurityPasswordQuery(selectedChain, chainAddress?.address); - useEffect(() => { - if (!isInitialized) { - walletActions.initialize(); - } - }, [isInitialized]); - const handleCopyAddress = async () => { if (chainAddress?.address) { await clipboard.write({ text: chainAddress.address }); diff --git a/src/stackflow/activities/tabs/TransferTab.tsx b/src/stackflow/activities/tabs/TransferTab.tsx index 402b4040..734dfd9e 100644 --- a/src/stackflow/activities/tabs/TransferTab.tsx +++ b/src/stackflow/activities/tabs/TransferTab.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo } from "react"; +import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { useStore } from "@tanstack/react-store"; import { useFlow } from "../../stackflow"; @@ -7,7 +7,7 @@ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/com import { PageHeader } from "@/components/layout/page-header"; import { TransactionItem } from "@/components/transaction/transaction-item"; import { useTransactionHistoryQuery } from "@/queries"; -import { addressBookActions, addressBookStore, addressBookSelectors, useCurrentWallet, useSelectedChain, type Contact } from "@/stores"; +import { addressBookStore, addressBookSelectors, useCurrentWallet, useSelectedChain, type Contact } from "@/stores"; import { IconSend } from "@tabler/icons-react"; export function TransferTab() { @@ -22,12 +22,6 @@ export function TransferTab() { // - 共享缓存: 多个组件使用同一数据 const { transactions, isLoading } = useTransactionHistoryQuery(currentWallet?.id); - useEffect(() => { - if (!addressBookState.isInitialized) { - addressBookActions.initialize(); - } - }, [addressBookState.isInitialized]); - const recentContacts = useMemo(() => { const filtered = selectedChain ? contacts.filter((contact) => From a66f3fc3530f9ac4185c14ea4d9b55c86a259ba3 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 26 Dec 2025 12:44:06 +0800 Subject: [PATCH 2/9] refactor: move store initialization to App level AppInitializer - Create AppInitializer for unified store initialization at App level - Remove defensive initialization from AddressBookPage, ContactPickerJob, AddressBookSuggestionProvider - This ensures single source of truth: initialization happens once in App, components only read --- .../transfer/contact-suggestion-context.tsx | 13 ++------ src/frontend-main.tsx | 25 ++++++++------- src/pages/address-book/index.tsx | 9 +----- src/providers/AppInitializer.tsx | 32 +++++++++++++++++++ src/providers/index.ts | 1 + .../activities/sheets/ContactPickerJob.tsx | 11 ++----- 6 files changed, 53 insertions(+), 38 deletions(-) create mode 100644 src/providers/AppInitializer.tsx create mode 100644 src/providers/index.ts diff --git a/src/components/transfer/contact-suggestion-context.tsx b/src/components/transfer/contact-suggestion-context.tsx index 4465e6c4..6095ae59 100644 --- a/src/components/transfer/contact-suggestion-context.tsx +++ b/src/components/transfer/contact-suggestion-context.tsx @@ -1,6 +1,6 @@ -import { createContext, useContext, useEffect, useMemo, type ReactNode } from 'react' +import { createContext, useContext, useMemo, type ReactNode } from 'react' import { useStore } from '@tanstack/react-store' -import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores' +import { addressBookStore, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores' interface ContactSuggestionContextValue { /** 根据查询获取建议 */ @@ -13,18 +13,11 @@ const ContactSuggestionContext = createContext { - if (!addressBookState.isInitialized) { - addressBookActions.initialize() - } - }, [addressBookState.isInitialized]) - const value = useMemo(() => ({ getSuggestions: (query, chainType, limit = 5) => addressBookSelectors.suggestContacts(addressBookState, query, chainType, limit), diff --git a/src/frontend-main.tsx b/src/frontend-main.tsx index 8de2092b..22b77987 100644 --- a/src/frontend-main.tsx +++ b/src/frontend-main.tsx @@ -9,6 +9,7 @@ import { MigrationProvider } from './contexts/MigrationContext' import { StackflowApp } from './StackflowApp' import { ChainIconProvider, TokenIconProvider } from './components/wallet' import { useChainConfigs } from './stores/chain-config' +import { AppInitializer } from './providers' import './styles/globals.css' // Mock 模式下注册全局中间件 @@ -57,17 +58,19 @@ export function startFrontendMain(rootElement: HTMLElement): void { - - - - - {/* Mock DevTools - 仅在 mock 模式下显示 */} - {MockDevTools && ( - - - - )} - + + + + + + {/* Mock DevTools - 仅在 mock 模式下显示 */} + {MockDevTools && ( + + + + )} + + diff --git a/src/pages/address-book/index.tsx b/src/pages/address-book/index.tsx index e39d60e5..40434f33 100644 --- a/src/pages/address-book/index.tsx +++ b/src/pages/address-book/index.tsx @@ -1,4 +1,4 @@ -import { useState, useCallback, useMemo, useRef, useEffect } from 'react'; +import { useState, useCallback, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigation, useFlow } from '@/stackflow'; import { setWalletLockConfirmCallback } from '@/stackflow/activities/sheets'; @@ -31,13 +31,6 @@ export function AddressBookPage() { const contacts = addressBookState.contacts; const currentWallet = useStore(walletStore, walletSelectors.getCurrentWallet); - // 确保 store 已初始化 - useEffect(() => { - if (!addressBookState.isInitialized) { - addressBookActions.initialize(); - } - }, [addressBookState.isInitialized]); - const [searchQuery, setSearchQuery] = useState(''); const deletingContactRef = useRef(null); diff --git a/src/providers/AppInitializer.tsx b/src/providers/AppInitializer.tsx new file mode 100644 index 00000000..de71c82d --- /dev/null +++ b/src/providers/AppInitializer.tsx @@ -0,0 +1,32 @@ +import { useEffect, useState, type ReactNode } from 'react' +import { addressBookActions, addressBookStore } from '@/stores' +import { useStore } from '@tanstack/react-store' + +/** + * App 级别的初始化组件 + * 在应用启动时统一初始化所有需要持久化的 store + * + * 这确保了单一数据源原则: + * - 初始化只在这里发生一次 + * - 所有子组件只需要读取 store,不需要各自初始化 + */ +export function AppInitializer({ children }: { children: ReactNode }) { + const [isReady, setIsReady] = useState(false) + const addressBookState = useStore(addressBookStore) + + useEffect(() => { + // 统一初始化所有需要持久化的 store + if (!addressBookState.isInitialized) { + addressBookActions.initialize() + } + setIsReady(true) + }, []) // 只在挂载时执行一次 + + // 可选:在 store 未初始化完成时显示 loading + // 但这里因为是同步初始化,所以直接渲染 + if (!isReady) { + return null + } + + return <>{children} +} diff --git a/src/providers/index.ts b/src/providers/index.ts new file mode 100644 index 00000000..3a4c3c2e --- /dev/null +++ b/src/providers/index.ts @@ -0,0 +1 @@ +export { AppInitializer } from './AppInitializer' diff --git a/src/stackflow/activities/sheets/ContactPickerJob.tsx b/src/stackflow/activities/sheets/ContactPickerJob.tsx index b396172d..37d43b1a 100644 --- a/src/stackflow/activities/sheets/ContactPickerJob.tsx +++ b/src/stackflow/activities/sheets/ContactPickerJob.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo, useEffect } from "react"; +import { useState, useMemo } from "react"; import type { ActivityComponentType } from "@stackflow/react"; import { BottomSheet } from "@/components/layout/bottom-sheet"; import { useTranslation } from "react-i18next"; @@ -7,7 +7,7 @@ import { cn } from "@/lib/utils"; import { IconSearch, IconChevronRight } from "@tabler/icons-react"; import { ContactAvatar } from "@/components/common/contact-avatar"; import { generateAvatarFromAddress } from "@/lib/avatar-codec"; -import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType, type Contact, type ContactAddress } from "@/stores"; +import { addressBookStore, addressBookSelectors, type ChainType, type Contact, type ContactAddress } from "@/stores"; import { useFlow } from "../../stackflow"; import { ActivityParamsProvider, useActivityParams } from "../../hooks"; @@ -31,13 +31,6 @@ function ContactPickerJobContent() { const addressBookState = useStore(addressBookStore); - // 确保 store 已初始化 - useEffect(() => { - if (!addressBookState.isInitialized) { - addressBookActions.initialize(); - } - }, [addressBookState.isInitialized]); - const filteredContacts = useMemo(() => { let contacts = addressBookState.contacts; From b14997612e410960b60ee13d7929508e1ebd0be3 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 26 Dec 2025 12:55:10 +0800 Subject: [PATCH 3/9] fix: implement proper recent contacts tracking (single source of truth) - Add recentContactIds to preferences store (stores only IDs, not copies) - Add trackRecentContact action to update recent list after transfer - Update TransferTab to lookup contacts by ID from addressBookStore - Track contact on successful transfer in SendPage This follows single source of truth principle: - Contact data lives only in addressBookStore.contacts - recentContactIds is just an ordered list of ID references - Display reads from contacts using IDs, ensuring data consistency --- src/pages/send/index.tsx | 11 ++++++ src/stackflow/activities/tabs/TransferTab.tsx | 16 ++++++-- src/stores/preferences.test.ts | 38 +++++++++++++++++++ src/stores/preferences.ts | 23 +++++++++++ 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/src/pages/send/index.tsx b/src/pages/send/index.tsx index 31931f90..e03e5e0f 100644 --- a/src/pages/send/index.tsx +++ b/src/pages/send/index.tsx @@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next'; import { useNavigation, useActivityParams, useFlow } from '@/stackflow'; import { setTransferConfirmCallback, setTransferWalletLockCallback, setScannerResultCallback } from '@/stackflow/activities/sheets'; import type { Contact, ContactAddress } from '@/stores'; +import { addressBookStore, addressBookSelectors, preferencesActions } from '@/stores'; import { PageHeader } from '@/components/layout/page-header'; import { AddressInput, AddressBookSuggestionProvider } from '@/components/transfer'; import { AmountInput } from '@/components/transfer/amount-input'; @@ -108,6 +109,16 @@ export function SendPage() { return () => window.removeEventListener('contact-picker-select', handleContactSelect as EventListener); }, [setToAddress]); + // 转账成功后,追踪最近使用的联系人(单一数据源:只存 ID) + useEffect(() => { + if (state.resultStatus === 'success' && state.toAddress) { + const matched = addressBookSelectors.getContactByAddress(addressBookStore.state, state.toAddress); + if (matched) { + preferencesActions.trackRecentContact(matched.contact.id); + } + } + }, [state.resultStatus, state.toAddress]); + const handleContactPicker = useCallback(() => { push('ContactPickerJob', { chainType: selectedChain }); }, [push, selectedChain]); diff --git a/src/stackflow/activities/tabs/TransferTab.tsx b/src/stackflow/activities/tabs/TransferTab.tsx index 734dfd9e..9a45db1a 100644 --- a/src/stackflow/activities/tabs/TransferTab.tsx +++ b/src/stackflow/activities/tabs/TransferTab.tsx @@ -8,6 +8,7 @@ import { PageHeader } from "@/components/layout/page-header"; import { TransactionItem } from "@/components/transaction/transaction-item"; import { useTransactionHistoryQuery } from "@/queries"; import { addressBookStore, addressBookSelectors, useCurrentWallet, useSelectedChain, type Contact } from "@/stores"; +import { useRecentContactIds } from "@/stores/preferences"; import { IconSend } from "@tabler/icons-react"; export function TransferTab() { @@ -17,19 +18,28 @@ export function TransferTab() { const selectedChain = useSelectedChain(); const addressBookState = useStore(addressBookStore); const contacts = addressBookState.contacts; + const recentContactIds = useRecentContactIds(); // 使用 TanStack Query 管理交易历史 // - 30s staleTime: Tab 切换不会重复请求 // - 共享缓存: 多个组件使用同一数据 const { transactions, isLoading } = useTransactionHistoryQuery(currentWallet?.id); + // 根据 recentContactIds 获取最近使用的联系人(单一数据源:只存 ID,显示时查找) const recentContacts = useMemo(() => { + // 根据 ID 查找联系人,过滤掉已删除的 + const foundContacts = recentContactIds + .map((id) => contacts.find((c) => c.id === id)) + .filter((c): c is Contact => c !== undefined); + + // 如果指定了链类型,进一步过滤 const filtered = selectedChain - ? contacts.filter((contact) => + ? foundContacts.filter((contact) => contact.addresses.some((addr) => addr.chainType === selectedChain) ) - : contacts; + : foundContacts; + return filtered.slice(0, 4); - }, [contacts, selectedChain]); + }, [recentContactIds, contacts, selectedChain]); // Helper to get primary address for a contact const getPrimaryAddress = (contact: Contact): string => { diff --git a/src/stores/preferences.test.ts b/src/stores/preferences.test.ts index b1f6e7cf..3c8825be 100644 --- a/src/stores/preferences.test.ts +++ b/src/stores/preferences.test.ts @@ -90,6 +90,7 @@ describe('preferencesStore', () => { language: 'zh-CN', currency: 'USD', theme: 'light', + recentContactIds: [], })) preferencesActions.initialize() vi.clearAllMocks() @@ -99,6 +100,7 @@ describe('preferencesStore', () => { language: 'zh-CN', currency: 'USD', theme: 'system', + recentContactIds: [], })) }) @@ -185,6 +187,7 @@ describe('preferencesStore', () => { language: 'ar', currency: 'USD', theme: 'system', + recentContactIds: [], })) preferencesActions.initialize() @@ -198,6 +201,7 @@ describe('preferencesStore', () => { language: 'zh-CN', currency: 'USD', theme: 'system', + recentContactIds: [], })) preferencesActions.initialize() @@ -213,6 +217,7 @@ describe('preferencesStore', () => { language: 'zh-CN', currency: 'USD', theme: 'system', + recentContactIds: [], })) preferencesActions.initialize() @@ -222,4 +227,37 @@ describe('preferencesStore', () => { expect(document.documentElement.classList.contains('dark')).toBe(false) }) }) + + describe('trackRecentContact', () => { + it('adds contact ID to the front of the list', () => { + preferencesActions.trackRecentContact('contact-1') + expect(preferencesStore.state.recentContactIds).toEqual(['contact-1']) + + preferencesActions.trackRecentContact('contact-2') + expect(preferencesStore.state.recentContactIds).toEqual(['contact-2', 'contact-1']) + }) + + it('moves existing contact ID to the front', () => { + preferencesActions.trackRecentContact('contact-1') + preferencesActions.trackRecentContact('contact-2') + preferencesActions.trackRecentContact('contact-1') + expect(preferencesStore.state.recentContactIds).toEqual(['contact-1', 'contact-2']) + }) + + it('limits the list to 10 items', () => { + for (let i = 1; i <= 15; i++) { + preferencesActions.trackRecentContact(`contact-${i}`) + } + expect(preferencesStore.state.recentContactIds).toHaveLength(10) + expect(preferencesStore.state.recentContactIds[0]).toBe('contact-15') + expect(preferencesStore.state.recentContactIds[9]).toBe('contact-6') + }) + + it('persists to localStorage', () => { + preferencesActions.trackRecentContact('contact-1') + expect(localStorageMock.setItem).toHaveBeenCalled() + const savedValue = localStorageMock.setItem.mock.calls[0]![1] + expect(JSON.parse(savedValue).recentContactIds).toEqual(['contact-1']) + }) + }) }) diff --git a/src/stores/preferences.ts b/src/stores/preferences.ts index 9c399723..8502725c 100644 --- a/src/stores/preferences.ts +++ b/src/stores/preferences.ts @@ -25,6 +25,8 @@ export interface PreferencesState { language: LanguageCode currency: CurrencyCode theme: ThemePreference + /** 最近使用的联系人 ID 列表(最多 10 个,最新在前) */ + recentContactIds: string[] } // Default state @@ -32,6 +34,7 @@ const defaultState: PreferencesState = { language: defaultLanguage, currency: 'USD', theme: 'system', + recentContactIds: [], } let systemThemeMediaQuery: MediaQueryList | null = null @@ -154,6 +157,22 @@ export const preferencesActions = { syncTheme(theme) }, + /** + * 记录最近使用的联系人 + * 将联系人 ID 移到列表最前面,保持最多 10 个 + */ + trackRecentContact(contactId: string): void { + preferencesStore.setState((state) => { + // 移除已存在的相同 ID + const filtered = state.recentContactIds.filter((id) => id !== contactId) + // 添加到最前面,最多保留 10 个 + const recentContactIds = [contactId, ...filtered].slice(0, 10) + const newState = { ...state, recentContactIds } + saveToStorage(newState) + return newState + }) + }, + /** 初始化 - 同步 i18n 语言和文字方向 */ initialize(): void { const state = preferencesStore.state @@ -183,5 +202,9 @@ export function useTheme(): 'light' | 'dark' | 'system' { return useStore(preferencesStore, (s) => s.theme) } +export function useRecentContactIds(): string[] { + return useStore(preferencesStore, (s) => s.recentContactIds) +} + // Re-export language config export { languages, type LanguageCode } From 8eb3b90c556ad0f74b0fc7dc94d2b731bae6f718 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 26 Dec 2025 13:02:50 +0800 Subject: [PATCH 4/9] refactor: remove AddressBookSuggestionProvider, enforce single source of truth - Delete contact-suggestion-context.tsx (unnecessary middleware layer) - AddressInput now directly uses useStore(addressBookStore) - All contact-related components read from the same addressBookStore: - AddressBookPage - AddressInput (dropdown suggestions) - ContactPickerJob (bottom sheet) - TransferTab (recent contacts) This ensures true single source of truth: - No Context Provider copying/caching data - All components directly subscribe to addressBookStore - Data consistency guaranteed across all views --- .../transfer/address-input.stories.tsx | 15 ++---- src/components/transfer/address-input.tsx | 13 ++--- .../transfer/contact-suggestion-context.tsx | 50 ------------------- src/components/transfer/index.ts | 1 - src/pages/send/index.tsx | 26 +++++----- 5 files changed, 23 insertions(+), 82 deletions(-) delete mode 100644 src/components/transfer/contact-suggestion-context.tsx diff --git a/src/components/transfer/address-input.stories.tsx b/src/components/transfer/address-input.stories.tsx index a4ddf49d..7f4cceb4 100644 --- a/src/components/transfer/address-input.stories.tsx +++ b/src/components/transfer/address-input.stories.tsx @@ -1,7 +1,6 @@ import { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { AddressInput } from './address-input'; -import { AddressBookSuggestionProvider } from './contact-suggestion-context'; import { addressBookActions } from '@/stores'; const meta: Meta = { @@ -84,6 +83,7 @@ export const TransferForm: Story = { /** * 带联系人建议 - 聚焦即展开,显示所有联系人 + * AddressInput 直接从 addressBookStore 读取数据(单一数据源) */ export const WithContactSuggestions: Story = { decorators: [ @@ -111,11 +111,7 @@ export const WithContactSuggestions: Story = { ], memo: '朋友', }); - return ( - - - - ); + return ; }, ], render: () => { @@ -142,6 +138,7 @@ export const WithContactSuggestions: Story = { /** * 按链类型过滤 - 只显示指定链的地址 + * AddressInput 直接从 addressBookStore 读取数据(单一数据源) */ export const FilterByChain: Story = { decorators: [ @@ -160,11 +157,7 @@ export const FilterByChain: Story = { { id: '3', address: 'c7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', chainType: 'ccchain', isDefault: true }, ], }); - return ( - - - - ); + return ; }, ], render: () => { diff --git a/src/components/transfer/address-input.tsx b/src/components/transfer/address-input.tsx index 223f220f..0b88ffd7 100644 --- a/src/components/transfer/address-input.tsx +++ b/src/components/transfer/address-input.tsx @@ -1,11 +1,11 @@ import { useState, forwardRef, useId, useMemo, useCallback, useRef, useEffect } from 'react'; import { cn } from '@/lib/utils'; import { useTranslation } from 'react-i18next'; +import { useStore } from '@tanstack/react-store'; import { IconLineScan as ScanLine, IconClipboardCopy as ClipboardPaste, IconUsers } from '@tabler/icons-react'; import { ContactAvatar } from '@/components/common/contact-avatar'; import { clipboardService } from '@/services/clipboard'; -import { useContactSuggestions } from './contact-suggestion-context'; -import type { ChainType, ContactSuggestion } from '@/stores'; +import { addressBookStore, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores'; interface AddressInputProps extends Omit, 'onChange'> { value?: string | undefined; @@ -46,8 +46,9 @@ const AddressInput = forwardRef( const errorId = useId(); const listboxId = useId(); - // Get contacts from context (provided by AddressBookSuggestionProvider) - const { getSuggestions, hasContacts } = useContactSuggestions(); + // 直接从 addressBookStore 读取数据(单一数据源) + const addressBookState = useStore(addressBookStore); + const hasContacts = addressBookState.contacts.length > 0; const currentValue = value || internalValue; const isValid = isValidAddress(currentValue); @@ -56,8 +57,8 @@ const AddressInput = forwardRef( // Get contact suggestions - now supports empty query for "focus to show all" const suggestions = useMemo(() => { if (!showSuggestions) return []; - return getSuggestions(currentValue || '', chainType, maxSuggestions); - }, [getSuggestions, currentValue, chainType, showSuggestions, maxSuggestions]); + return addressBookSelectors.suggestContacts(addressBookState, currentValue || '', chainType, maxSuggestions); + }, [addressBookState, currentValue, chainType, showSuggestions, maxSuggestions]); // Show dropdown when focused and has contacts (even without input) useEffect(() => { diff --git a/src/components/transfer/contact-suggestion-context.tsx b/src/components/transfer/contact-suggestion-context.tsx deleted file mode 100644 index 6095ae59..00000000 --- a/src/components/transfer/contact-suggestion-context.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { createContext, useContext, useMemo, type ReactNode } from 'react' -import { useStore } from '@tanstack/react-store' -import { addressBookStore, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores' - -interface ContactSuggestionContextValue { - /** 根据查询获取建议 */ - getSuggestions: (query: string, chainType?: ChainType, limit?: number) => ContactSuggestion[] - /** 是否有联系人 */ - hasContacts: boolean -} - -const ContactSuggestionContext = createContext(null) - -/** - * 地址簿联系人建议 Provider - * 提供联系人查询能力(store 已由 StoreProvider 在 App 级别初始化) - */ -export function AddressBookSuggestionProvider({ children }: { children: ReactNode }) { - const addressBookState = useStore(addressBookStore) - - const value = useMemo(() => ({ - getSuggestions: (query, chainType, limit = 5) => - addressBookSelectors.suggestContacts(addressBookState, query, chainType, limit), - hasContacts: addressBookState.contacts.length > 0, - }), [addressBookState]) - - return ( - - {children} - - ) -} - -/** - * 获取联系人建议 context - * 如果不在 Provider 内,返回空实现(不报错,保持组件可独立使用) - */ -export function useContactSuggestions() { - const context = useContext(ContactSuggestionContext) - - // 返回默认空实现,让组件可以独立工作 - if (!context) { - return { - getSuggestions: () => [], - hasContacts: false, - } - } - - return context -} diff --git a/src/components/transfer/index.ts b/src/components/transfer/index.ts index 7a47c7da..29316e53 100644 --- a/src/components/transfer/index.ts +++ b/src/components/transfer/index.ts @@ -1,3 +1,2 @@ export { AddressInput, isValidAddress } from './address-input' export { AmountInput, sanitizeInput, limitDecimals } from './amount-input' -export { AddressBookSuggestionProvider, useContactSuggestions } from './contact-suggestion-context' diff --git a/src/pages/send/index.tsx b/src/pages/send/index.tsx index e03e5e0f..22370dfd 100644 --- a/src/pages/send/index.tsx +++ b/src/pages/send/index.tsx @@ -5,7 +5,7 @@ import { setTransferConfirmCallback, setTransferWalletLockCallback, setScannerRe import type { Contact, ContactAddress } from '@/stores'; import { addressBookStore, addressBookSelectors, preferencesActions } from '@/stores'; import { PageHeader } from '@/components/layout/page-header'; -import { AddressInput, AddressBookSuggestionProvider } from '@/components/transfer'; +import { AddressInput } from '@/components/transfer'; import { AmountInput } from '@/components/transfer/amount-input'; import { GradientButton } from '@/components/common/gradient-button'; import { Alert } from '@/components/common/alert'; @@ -279,19 +279,17 @@ export function SendPage() { )}
- {/* Address input */} - - - + {/* Address input - 直接从 addressBookStore 读取(单一数据源) */} + {/* Amount input */} Date: Fri, 26 Dec 2025 13:18:11 +0800 Subject: [PATCH 5/9] refactor(contact): replace chainType filter with address validation - Show all contacts in picker/dropdown, disable invalid addresses - Use isValidAddressForChain() for real-time address validation - Add 3-address limit per contact (QR capacity constraint) - Add noValidAddress i18n translation - Update keyboard nav to skip disabled addresses --- src/components/transfer/address-input.tsx | 75 ++++++++---- src/i18n/locales/en/common.json | 1 + src/i18n/locales/zh-CN/common.json | 1 + .../activities/sheets/ContactPickerJob.tsx | 115 +++++++++++------- src/stores/address-book.test.ts | 47 +++++++ src/stores/address-book.ts | 13 +- 6 files changed, 181 insertions(+), 71 deletions(-) diff --git a/src/components/transfer/address-input.tsx b/src/components/transfer/address-input.tsx index 0b88ffd7..5ccc98f1 100644 --- a/src/components/transfer/address-input.tsx +++ b/src/components/transfer/address-input.tsx @@ -5,6 +5,7 @@ import { useStore } from '@tanstack/react-store'; import { IconLineScan as ScanLine, IconClipboardCopy as ClipboardPaste, IconUsers } from '@tabler/icons-react'; import { ContactAvatar } from '@/components/common/contact-avatar'; import { clipboardService } from '@/services/clipboard'; +import { isValidAddressForChain } from '@/lib/address-format'; import { addressBookStore, addressBookSelectors, type ChainType, type ContactSuggestion } from '@/stores'; interface AddressInputProps extends Omit, 'onChange'> { @@ -54,10 +55,16 @@ const AddressInput = forwardRef( const isValid = isValidAddress(currentValue); const hasError = !!(error || (!isValid && currentValue)); - // Get contact suggestions - now supports empty query for "focus to show all" + // 获取联系人建议 - 显示所有联系人,用地址合法性验证标记可选地址 const suggestions = useMemo(() => { if (!showSuggestions) return []; - return addressBookSelectors.suggestContacts(addressBookState, currentValue || '', chainType, maxSuggestions); + // 获取所有联系人的建议(不按 chainType 过滤) + const allSuggestions = addressBookSelectors.suggestContacts(addressBookState, currentValue || '', undefined, maxSuggestions); + // 标记每个建议的地址是否对当前链有效 + return allSuggestions.map((s) => ({ + ...s, + isValidForCurrentChain: chainType ? isValidAddressForChain(s.matchedAddress.address, chainType) : true, + })); }, [addressBookState, currentValue, chainType, showSuggestions, maxSuggestions]); // Show dropdown when focused and has contacts (even without input) @@ -118,7 +125,7 @@ const AddressInput = forwardRef( setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1)); break; case 'Enter': - if (selectedIndex >= 0 && suggestions[selectedIndex]) { + if (selectedIndex >= 0 && suggestions[selectedIndex] && suggestions[selectedIndex].isValidForCurrentChain) { e.preventDefault(); handleSelectSuggestion(suggestions[selectedIndex]); } @@ -196,30 +203,44 @@ const AddressInput = forwardRef( > {suggestions.length > 0 ? (
    - {suggestions.map((suggestion, index) => ( -
  • handleSelectSuggestion(suggestion)} - > - -
    -

    {suggestion.contact.name}

    -

    {suggestion.matchedAddress.address}

    -
    - {suggestion.matchedAddress.chainType} -
  • - ))} + {suggestions.map((suggestion, index) => { + const isDisabled = !suggestion.isValidForCurrentChain; + return ( +
  • !isDisabled && handleSelectSuggestion(suggestion)} + > + +
    +

    {suggestion.contact.name}

    +

    {suggestion.matchedAddress.address}

    +
    + {suggestion.matchedAddress.chainType} +
  • + ); + })}
) : (
diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index f57832fd..b2edc2ca 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -99,6 +99,7 @@ "name": "Name", "namePlaceholder": "Enter contact name", "noContacts": "No contacts", + "noValidAddress": "No valid address", "save": "Save", "selectAddress": "Select address", "selectContact": "Select Contact", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index 72ede708..f87e6f52 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -59,6 +59,7 @@ "save": "保存", "cancel": "取消", "noContacts": "暂无联系人", + "noValidAddress": "无可用地址", "viewAll": "查看全部联系人", "selectContact": "选择联系人", "selectAddress": "选择地址" diff --git a/src/stackflow/activities/sheets/ContactPickerJob.tsx b/src/stackflow/activities/sheets/ContactPickerJob.tsx index 37d43b1a..f00b2b8c 100644 --- a/src/stackflow/activities/sheets/ContactPickerJob.tsx +++ b/src/stackflow/activities/sheets/ContactPickerJob.tsx @@ -7,11 +7,13 @@ import { cn } from "@/lib/utils"; import { IconSearch, IconChevronRight } from "@tabler/icons-react"; import { ContactAvatar } from "@/components/common/contact-avatar"; import { generateAvatarFromAddress } from "@/lib/avatar-codec"; +import { isValidAddressForChain } from "@/lib/address-format"; import { addressBookStore, addressBookSelectors, type ChainType, type Contact, type ContactAddress } from "@/stores"; import { useFlow } from "../../stackflow"; import { ActivityParamsProvider, useActivityParams } from "../../hooks"; type ContactPickerJobParams = { + /** 当前选中的链类型,用于验证地址合法性 */ chainType?: string; }; @@ -31,25 +33,18 @@ function ContactPickerJobContent() { const addressBookState = useStore(addressBookStore); + // 显示所有联系人(不按 chainType 过滤),但用地址合法性验证来标记可选地址 const filteredContacts = useMemo(() => { let contacts = addressBookState.contacts; - // Filter by chain type if specified - if (chainType) { - contacts = addressBookSelectors.getContactsByChain(addressBookState, chainType); - } - // Filter by search query if (searchQuery) { - contacts = addressBookSelectors.searchContacts( - { ...addressBookState, contacts }, - searchQuery - ); + contacts = addressBookSelectors.searchContacts(addressBookState, searchQuery); } // Sort by updated time (most recent first) return [...contacts].sort((a, b) => b.updatedAt - a.updatedAt); - }, [addressBookState, chainType, searchQuery]); + }, [addressBookState, searchQuery]); const handleSelectAddress = (contact: Contact, address: ContactAddress) => { // Store selected address in a way that can be retrieved by the caller @@ -61,11 +56,18 @@ function ContactPickerJobContent() { pop(); }; + // 获取联系人的所有地址,并标记当前链是否可用 const getRelevantAddresses = (contact: Contact) => { - if (chainType) { - return contact.addresses.filter((a) => a.chainType === chainType); - } - return contact.addresses; + return contact.addresses.map((addr) => ({ + ...addr, + isValidForCurrentChain: chainType ? isValidAddressForChain(addr.address, chainType) : true, + })); + }; + + // 检查联系人是否有当前链的有效地址 + const hasValidAddress = (contact: Contact) => { + if (!chainType) return true; + return contact.addresses.some((addr) => isValidAddressForChain(addr.address, chainType)); }; return ( @@ -107,18 +109,25 @@ function ContactPickerJobContent() {
{filteredContacts.map((contact) => { const addresses = getRelevantAddresses(contact); + const validAddresses = addresses.filter((a) => a.isValidForCurrentChain); const hasMultipleAddresses = addresses.length > 1; const isExpanded = expandedContactId === contact.id; + const contactHasValidAddress = hasValidAddress(contact); - // If only one address or expanded, show all addresses + // If only one address, show directly if (!hasMultipleAddresses) { const address = addresses[0]; if (!address) return null; + const isDisabled = !address.isValidForCurrentChain; return (
- + {address.chainType} @@ -143,7 +155,10 @@ function ContactPickerJobContent() {
{isExpanded && (
- {addresses.map((address) => ( -
- - {address.chainType} - - {address.isDefault && ( - - Default + > +
+

+ {truncateAddress(address.address)} +

+ {address.label && ( +

{address.label}

+ )} +
+ + {address.chainType} - )} - - ))} + {address.isDefault && ( + + Default + + )} + + ); + })}
)}
diff --git a/src/stores/address-book.test.ts b/src/stores/address-book.test.ts index f97be112..b7a6c507 100644 --- a/src/stores/address-book.test.ts +++ b/src/stores/address-book.test.ts @@ -110,6 +110,53 @@ describe('AddressBookStore', () => { expect(updated?.addresses).toHaveLength(2) expect(updated?.addresses[1]?.chainType).toBe('bfmeta') }) + + it('throws error when adding more than 3 addresses', () => { + const contact = addressBookActions.addContact({ + name: 'Alice', + addresses: [ + createAddress('0x1111', 'ethereum'), + createAddress('0x2222', 'ethereum'), + createAddress('0x3333', 'ethereum'), + ], + }) + + expect(() => { + addressBookActions.addAddressToContact(contact.id, { + address: '0x4444444444444444444444444444444444444444', + chainType: 'ethereum', + }) + }).toThrow('Maximum 3 addresses per contact') + }) + }) + + describe('addContact with address limit', () => { + it('allows up to 3 addresses', () => { + const contact = addressBookActions.addContact({ + name: 'Alice', + addresses: [ + createAddress('0x1111', 'ethereum'), + createAddress('0x2222', 'ethereum'), + createAddress('0x3333', 'ethereum'), + ], + }) + + expect(contact.addresses).toHaveLength(3) + }) + + it('throws error when creating contact with more than 3 addresses', () => { + expect(() => { + addressBookActions.addContact({ + name: 'Alice', + addresses: [ + createAddress('0x1111', 'ethereum'), + createAddress('0x2222', 'ethereum'), + createAddress('0x3333', 'ethereum'), + createAddress('0x4444', 'ethereum'), + ], + }) + }).toThrow('Maximum 3 addresses per contact') + }) }) describe('removeAddressFromContact', () => { diff --git a/src/stores/address-book.ts b/src/stores/address-book.ts index 8ce56ab6..469e9137 100644 --- a/src/stores/address-book.ts +++ b/src/stores/address-book.ts @@ -157,13 +157,18 @@ export const addressBookActions = { })) }, - /** 添加联系人 */ + /** 添加联系人(每个联系人最多 3 个地址) */ addContact: ( contact: Omit & { avatar?: string | undefined memo?: string | undefined } ): Contact => { + // 验证地址数量限制 + if (contact.addresses.length > 3) { + throw new Error('Maximum 3 addresses per contact') + } + const now = Date.now() const newContact: Contact = { ...contact, @@ -207,7 +212,7 @@ export const addressBookActions = { }) }, - /** 添加地址到联系人 */ + /** 添加地址到联系人(最多 3 个地址,超出将抛出错误) */ addAddressToContact: ( contactId: string, address: Omit & { label?: string | undefined } @@ -220,6 +225,10 @@ export const addressBookActions = { addressBookStore.setState((state) => { const contacts = state.contacts.map((c) => { if (c.id !== contactId) return c + // 限制每个联系人最多 3 个地址(QR 码容量限制) + if (c.addresses.length >= 3) { + throw new Error('Maximum 3 addresses per contact') + } return { ...c, addresses: [...c.addresses, newAddress], From bec1cb69edba555a10aad92d3fbb2e04fedc96d1 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 26 Dec 2025 13:44:36 +0800 Subject: [PATCH 6/9] refactor(contact): remove chainType, use custom label for addresses BREAKING CHANGE: ContactAddress no longer has chainType field - Remove chainType from ContactAddress interface - Add custom label field (e.g. 'Main', 'Exchange') - Use detectAddressFormat for chain validation instead of stored type - Update all components to display label or detected chain type - Add addressLabel input in ContactEditJob - Update QR protocol to use label instead of chainType - Limit contacts to max 3 addresses (QR capacity) --- src/components/contact/contact-card.tsx | 37 ++++++---- .../transfer/address-input.stories.tsx | 16 ++--- src/components/transfer/address-input.tsx | 18 +++-- src/i18n/locales/en/common.json | 2 + src/i18n/locales/zh-CN/common.json | 2 + src/lib/qr-parser.test.ts | 21 +++--- src/lib/qr-parser.ts | 17 +++-- src/pages/address-book/index.stories.tsx | 10 +-- src/pages/address-book/index.test.tsx | 8 +-- src/pages/address-book/index.tsx | 1 - .../migration/mpay-transformer.test.ts | 12 ++-- src/services/migration/mpay-transformer.ts | 2 +- .../sheets/ContactAddConfirmJob.tsx | 46 ++++++------ .../activities/sheets/ContactEditJob.tsx | 38 +++++++--- .../activities/sheets/ContactPickerJob.tsx | 20 +++--- .../activities/sheets/ContactShareJob.tsx | 8 +-- src/stackflow/activities/tabs/TransferTab.tsx | 4 +- src/stores/address-book.test.ts | 71 +++++++------------ src/stores/address-book.ts | 22 +++--- 19 files changed, 179 insertions(+), 176 deletions(-) diff --git a/src/components/contact/contact-card.tsx b/src/components/contact/contact-card.tsx index e9ebc11b..e13c807d 100644 --- a/src/components/contact/contact-card.tsx +++ b/src/components/contact/contact-card.tsx @@ -6,20 +6,24 @@ import { QRCodeSVG } from 'qrcode.react'; import { ContactAvatar } from '@/components/common/contact-avatar'; import { generateAvatarFromAddress } from '@/lib/avatar-codec'; +import { detectAddressFormat } from '@/lib/address-format'; import type { ContactAddressInfo } from '@/lib/qr-parser'; -const CHAIN_NAMES: Record = { - ethereum: 'ETH', - bitcoin: 'BTC', - tron: 'TRX', -}; - const CHAIN_COLORS: Record = { ethereum: '#627EEA', bitcoin: '#F7931A', tron: '#FF0013', }; +/** 获取地址显示标签和颜色 */ +function getAddressDisplay(addr: ContactAddressInfo): { label: string; color: string } { + const detected = detectAddressFormat(addr.address); + const chainType = detected.chainType; + const label = addr.label || chainType?.toUpperCase() || ''; + const color = chainType ? CHAIN_COLORS[chainType] || '#6B7280' : '#6B7280'; + return { label, color }; +} + export interface ContactCardProps { name: string; avatar?: string | undefined; @@ -38,15 +42,18 @@ export function ContactCard({ name, avatar, address, addresses, qrContent }: Con

{name}

- {addresses.map((a) => ( - - {CHAIN_NAMES[a.chainType] || a.chainType.toUpperCase()} - - ))} + {addresses.map((a, i) => { + const { label, color } = getAddressDisplay(a); + return ( + + {label} + + ); + })}
diff --git a/src/components/transfer/address-input.stories.tsx b/src/components/transfer/address-input.stories.tsx index 7f4cceb4..2378ea4a 100644 --- a/src/components/transfer/address-input.stories.tsx +++ b/src/components/transfer/address-input.stories.tsx @@ -93,21 +93,21 @@ export const WithContactSuggestions: Story = { addressBookActions.addContact({ name: 'Alice', addresses: [ - { id: '1', address: '0x1234567890abcdef1234567890abcdef12345678', chainType: 'ethereum', isDefault: true }, + { id: '1', address: '0x1234567890abcdef1234567890abcdef12345678', label: 'ETH', isDefault: true }, ], memo: '同事', }); addressBookActions.addContact({ name: 'Bob', addresses: [ - { id: '2', address: '0xabcdef1234567890abcdef1234567890abcdef12', chainType: 'ethereum', isDefault: true }, - { id: '3', address: 'c7R6wVdPvHqvRxe5Q9ZvWr7CpPn5Mk5Xz3', chainType: 'bfmeta' }, + { id: '2', address: '0xabcdef1234567890abcdef1234567890abcdef12', label: 'ETH', isDefault: true }, + { id: '3', address: 'c7R6wVdPvHqvRxe5Q9ZvWr7CpPn5Mk5Xz3', label: 'BFMETA' }, ], }); addressBookActions.addContact({ name: 'Charlie', addresses: [ - { id: '4', address: '0x9876543210fedcba9876543210fedcba98765432', chainType: 'ethereum', isDefault: true }, + { id: '4', address: '0x9876543210fedcba9876543210fedcba98765432', label: 'ETH', isDefault: true }, ], memo: '朋友', }); @@ -147,14 +147,14 @@ export const FilterByChain: Story = { addressBookActions.addContact({ name: 'Alice', addresses: [ - { id: '1', address: '0x1234567890abcdef1234567890abcdef12345678', chainType: 'ethereum', isDefault: true }, - { id: '2', address: 'b7R6wVdPvHqvRxe5Q9ZvWr7CpPn5Mk5Xz3', chainType: 'bfmeta' }, + { id: '1', address: '0x1234567890abcdef1234567890abcdef12345678', label: 'ETH', isDefault: true }, + { id: '2', address: 'b7R6wVdPvHqvRxe5Q9ZvWr7CpPn5Mk5Xz3', label: 'BFMETA' }, ], }); addressBookActions.addContact({ name: 'Bob', addresses: [ - { id: '3', address: 'c7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', chainType: 'ccchain', isDefault: true }, + { id: '3', address: 'c7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', label: 'CCCHAIN', isDefault: true }, ], }); return ; @@ -166,7 +166,7 @@ export const FilterByChain: Story = { return (

- 设置 chainType="bfmeta",只显示 BFMeta 链的地址 + 设置 chainType="bfmeta",只显示 BFMeta 链有效的地址

, 'onChange'> { value?: string | undefined; @@ -58,8 +65,7 @@ const AddressInput = forwardRef( // 获取联系人建议 - 显示所有联系人,用地址合法性验证标记可选地址 const suggestions = useMemo(() => { if (!showSuggestions) return []; - // 获取所有联系人的建议(不按 chainType 过滤) - const allSuggestions = addressBookSelectors.suggestContacts(addressBookState, currentValue || '', undefined, maxSuggestions); + const allSuggestions = addressBookSelectors.suggestContacts(addressBookState, currentValue || '', maxSuggestions); // 标记每个建议的地址是否对当前链有效 return allSuggestions.map((s) => ({ ...s, @@ -235,9 +241,9 @@ const AddressInput = forwardRef( )}>{suggestion.matchedAddress.address}

{suggestion.matchedAddress.chainType} + )}>{getAddressDisplayLabel(suggestion.matchedAddress)} ); })} diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index b2edc2ca..233049a8 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -100,6 +100,8 @@ "namePlaceholder": "Enter contact name", "noContacts": "No contacts", "noValidAddress": "No valid address", + "addressLabel": "Address Label", + "addressLabelPlaceholder": "e.g. Main, Exchange", "save": "Save", "selectAddress": "Select address", "selectContact": "Select Contact", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index f87e6f52..df908502 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -60,6 +60,8 @@ "cancel": "取消", "noContacts": "暂无联系人", "noValidAddress": "无可用地址", + "addressLabel": "地址标签", + "addressLabelPlaceholder": "如:主账户、交易所", "viewAll": "查看全部联系人", "selectContact": "选择联系人", "selectAddress": "选择地址" diff --git a/src/lib/qr-parser.test.ts b/src/lib/qr-parser.test.ts index 3db3387f..d108ee95 100644 --- a/src/lib/qr-parser.test.ts +++ b/src/lib/qr-parser.test.ts @@ -222,7 +222,8 @@ describe('qr-parser', () => { const contact = result as ParsedContact expect(contact.name).toBe('张三') expect(contact.addresses).toHaveLength(1) - expect(contact.addresses[0]?.chainType).toBe('ethereum') + // 旧格式的 chainType 会被用作 label + expect(contact.addresses[0]?.label).toBe('ethereum') expect(contact.addresses[0]?.address).toBe('0x742d35Cc6634C0532925a3b844Bc9e7595f12345') }) @@ -231,9 +232,9 @@ describe('qr-parser', () => { type: 'contact', name: '李四', addresses: [ - { chainType: 'ethereum', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, - { chainType: 'bitcoin', address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, - { chainType: 'tron', address: 'TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW' }, + { label: 'ETH', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, + { label: 'BTC', address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, + { label: 'TRX', address: 'TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW' }, ], }) const result = parseQRContent(content) @@ -246,7 +247,7 @@ describe('qr-parser', () => { const content = JSON.stringify({ type: 'contact', name: '王五', - addresses: [{ chainType: 'ethereum', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }], + addresses: [{ label: 'ETH', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }], memo: '好友', avatar: '👨‍💼', }) @@ -291,7 +292,7 @@ describe('qr-parser', () => { const contact = result as ParsedContact expect(contact.name).toBe('张三') expect(contact.addresses).toHaveLength(1) - expect(contact.addresses[0]?.chainType).toBe('ethereum') + expect(contact.addresses[0]?.label).toBe('ETH') }) it('parses contact:// URI with multiple addresses', () => { @@ -327,7 +328,7 @@ describe('qr-parser', () => { it('generates valid JSON for single address', () => { const content = generateContactQRContent({ name: '张三', - addresses: [{ chainType: 'ethereum', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }], + addresses: [{ label: 'ETH', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }], }) const parsed = JSON.parse(content) expect(parsed.type).toBe('contact') @@ -339,8 +340,8 @@ describe('qr-parser', () => { const original = { name: '李四', addresses: [ - { chainType: 'ethereum' as const, address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, - { chainType: 'bitcoin' as const, address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, + { label: 'ETH' as const, address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }, + { label: 'BTC' as const, address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq' }, ], avatar: '👩‍💻', } @@ -358,7 +359,7 @@ describe('qr-parser', () => { it('handles special characters in name', () => { const content = generateContactQRContent({ name: '张三 (老板)', - addresses: [{ chainType: 'ethereum', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }], + addresses: [{ label: 'ETH', address: '0x742d35Cc6634C0532925a3b844Bc9e7595f12345' }], }) const result = parseQRContent(content) expect(result.type).toBe('contact') diff --git a/src/lib/qr-parser.ts b/src/lib/qr-parser.ts index d9011839..696d6b5c 100644 --- a/src/lib/qr-parser.ts +++ b/src/lib/qr-parser.ts @@ -40,10 +40,10 @@ export interface ParsedDeepLink { raw: string } -/** 联系人地址 */ +/** 联系人地址(QR 协议格式) */ export interface ContactAddressInfo { - chainType: 'ethereum' | 'bitcoin' | 'tron' address: string + /** 地址标签(用于显示) */ label?: string | undefined } @@ -206,9 +206,9 @@ function parseContactURI(content: string): ParsedContact | null { type: 'contact', name: data.name, addresses: data.addresses.map((a: { chainType?: string; chain?: string; address: string; label?: string }) => ({ - chainType: a.chainType || a.chain, address: a.address, - label: a.label, + // 优先用 label,否则用旧格式的 chainType 作为 label + label: a.label || a.chainType || a.chain, })), memo: data.memo, avatar: data.avatar, @@ -233,20 +233,20 @@ function parseContactURI(content: string): ParsedContact | null { const params = new URLSearchParams(query) const addresses: ContactAddressInfo[] = [] - // 解析各链地址 + // 解析各链地址(用链类型作为默认 label) const ethAddr = params.get('eth') if (ethAddr && ETH_ADDRESS_REGEX.test(ethAddr)) { - addresses.push({ chainType: 'ethereum', address: ethAddr, label: params.get('eth_label') ?? undefined }) + addresses.push({ address: ethAddr, label: params.get('eth_label') || 'ETH' }) } const btcAddr = params.get('btc') if (btcAddr && BTC_ADDRESS_REGEX.test(btcAddr)) { - addresses.push({ chainType: 'bitcoin', address: btcAddr, label: params.get('btc_label') ?? undefined }) + addresses.push({ address: btcAddr, label: params.get('btc_label') || 'BTC' }) } const trxAddr = params.get('trx') if (trxAddr && TRON_ADDRESS_REGEX.test(trxAddr)) { - addresses.push({ chainType: 'tron', address: trxAddr, label: params.get('trx_label') ?? undefined }) + addresses.push({ address: trxAddr, label: params.get('trx_label') || 'TRX' }) } if (addresses.length === 0) return null @@ -273,7 +273,6 @@ export function generateContactQRContent(contact: { type: 'contact', name: contact.name, addresses: contact.addresses.map(a => ({ - chainType: a.chainType, address: a.address, label: a.label, })), diff --git a/src/pages/address-book/index.stories.tsx b/src/pages/address-book/index.stories.tsx index 52564696..2bec5ebe 100644 --- a/src/pages/address-book/index.stories.tsx +++ b/src/pages/address-book/index.stories.tsx @@ -16,8 +16,8 @@ export default meta type Story = StoryObj // Helper to create addresses -function createAddresses(address: string, chainType = 'ethereum') { - return [{ id: crypto.randomUUID(), address, chainType: chainType as 'ethereum' }] +function createAddresses(address: string, label = 'ETH') { + return [{ id: crypto.randomUUID(), address, label }] } const resetStores = () => { @@ -99,9 +99,9 @@ export const MultipleAddresses: Story = { addressBookActions.addContact({ name: 'Multi-Chain User', addresses: [ - { id: '1', address: '0x1234567890abcdef1234567890abcdef12345678', chainType: 'ethereum' }, - { id: '2', address: 'b7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', chainType: 'bfmeta' }, - { id: '3', address: 'TJYs1234567890abcdef1234567890abc', chainType: 'tron' }, + { id: '1', address: '0x1234567890abcdef1234567890abcdef12345678', label: 'ETH' }, + { id: '2', address: 'b7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', label: 'BFMETA' }, + { id: '3', address: 'TJYs1234567890abcdef1234567890abc', label: 'TRX' }, ], memo: '多链用户', }) diff --git a/src/pages/address-book/index.test.tsx b/src/pages/address-book/index.test.tsx index 10e16081..943249c2 100644 --- a/src/pages/address-book/index.test.tsx +++ b/src/pages/address-book/index.test.tsx @@ -6,8 +6,8 @@ import { addressBookActions, walletStore } from '@/stores' const mockPush = vi.fn() // Helper to create addresses -function createAddresses(address: string, chainType = 'ethereum') { - return [{ id: crypto.randomUUID(), address, chainType: chainType as 'ethereum' }] +function createAddresses(address: string, label = 'ETH') { + return [{ id: crypto.randomUUID(), address, label }] } // Mock dependencies @@ -148,8 +148,8 @@ describe('AddressBookPage', () => { addressBookActions.addContact({ name: 'Multi', addresses: [ - { id: '1', address: '0x1111', chainType: 'ethereum' }, - { id: '2', address: 'b7ADmv...', chainType: 'bfmeta' }, + { id: '1', address: '0x1111', label: 'ETH' }, + { id: '2', address: 'b7ADmv...', label: 'BFMETA' }, ], }) diff --git a/src/pages/address-book/index.tsx b/src/pages/address-book/index.tsx index 40434f33..cee79d0d 100644 --- a/src/pages/address-book/index.tsx +++ b/src/pages/address-book/index.tsx @@ -65,7 +65,6 @@ export function AddressBookPage() { name: contact.name, addresses: JSON.stringify( contact.addresses.map((a) => ({ - chainType: a.chainType, address: a.address, label: a.label, })), diff --git a/src/services/migration/mpay-transformer.test.ts b/src/services/migration/mpay-transformer.test.ts index c39c1456..9d9ca268 100644 --- a/src/services/migration/mpay-transformer.test.ts +++ b/src/services/migration/mpay-transformer.test.ts @@ -252,7 +252,7 @@ describe('mpay-transformer', () => { expect(contact.name).toBe('Alice') expect(contact.addresses).toHaveLength(1) expect(contact.addresses[0]?.address).toBe('bfm123456') - expect(contact.addresses[0]?.chainType).toBe('bfmeta') + expect(contact.addresses[0]?.label).toBe('BFMETA') expect(contact.memo).toBe('My friend') expect(contact.createdAt).toBeTypeOf('number') expect(contact.updatedAt).toBeTypeOf('number') @@ -270,7 +270,7 @@ describe('mpay-transformer', () => { expect(contact.id).toBe('addr-book-2') expect(contact.name).toBe('Bob') expect(contact.addresses[0]?.address).toBe('0xabc123') - expect(contact.addresses[0]?.chainType).toBe('ethereum') // Default + expect(contact.addresses[0]?.label).toBe('ETHEREUM') // Default expect(contact.memo).toBeUndefined() }) @@ -284,7 +284,7 @@ describe('mpay-transformer', () => { const contact = transformAddressBookEntry(entry) - expect(contact.addresses[0]?.chainType).toBe('ethereum') // Default when no chain detected + expect(contact.addresses[0]?.label).toBe('ETHEREUM') // Default when no chain detected }) it('should select first mappable chain from multi-chain entry', () => { @@ -298,7 +298,7 @@ describe('mpay-transformer', () => { const contact = transformAddressBookEntry(entry) // First mappable chain should be selected - expect(contact.addresses[0]?.chainType).toBe('ethereum') + expect(contact.addresses[0]?.label).toBe('ETHEREUM') }) it('should skip unmappable chains and use first mappable', () => { @@ -311,7 +311,7 @@ describe('mpay-transformer', () => { const contact = transformAddressBookEntry(entry) - expect(contact.addresses[0]?.chainType).toBe('bfmeta') + expect(contact.addresses[0]?.label).toBe('BFMETA') }) it('should use ethereum as default when all chains are unmappable', () => { @@ -324,7 +324,7 @@ describe('mpay-transformer', () => { const contact = transformAddressBookEntry(entry) - expect(contact.addresses[0]?.chainType).toBe('ethereum') // Default + expect(contact.addresses[0]?.label).toBe('ETHEREUM') // Default }) it('should handle entry without remarks', () => { diff --git a/src/services/migration/mpay-transformer.ts b/src/services/migration/mpay-transformer.ts index 1120e72e..8e9d86ae 100644 --- a/src/services/migration/mpay-transformer.ts +++ b/src/services/migration/mpay-transformer.ts @@ -119,7 +119,7 @@ export function transformAddressBookEntry(entry: MpayAddressBookEntry): Contact { id: crypto.randomUUID(), address: entry.address, - chainType: chain, + label: chain.toUpperCase(), isDefault: true, }, ], diff --git a/src/stackflow/activities/sheets/ContactAddConfirmJob.tsx b/src/stackflow/activities/sheets/ContactAddConfirmJob.tsx index f9ef1c0c..5757aad0 100644 --- a/src/stackflow/activities/sheets/ContactAddConfirmJob.tsx +++ b/src/stackflow/activities/sheets/ContactAddConfirmJob.tsx @@ -18,7 +18,8 @@ import { import { ContactAvatar } from '@/components/common/contact-avatar' import { generateAvatarFromAddress } from '@/lib/avatar-codec' import { cn } from '@/lib/utils' -import { addressBookActions, type ChainType } from '@/stores' +import { detectAddressFormat } from '@/lib/address-format' +import { addressBookActions } from '@/stores' import { useFlow } from '../../stackflow' import { ActivityParamsProvider, useActivityParams } from '../../hooks' @@ -35,17 +36,10 @@ export type ContactAddConfirmJobParams = { } interface AddressInfo { - chainType: ChainType address: string label?: string } -const CHAIN_NAMES: Record = { - ethereum: 'Ethereum', - bitcoin: 'Bitcoin', - tron: 'Tron', -} - function ContactAddConfirmJobContent() { const { t } = useTranslation('common') const { pop } = useFlow() @@ -86,7 +80,6 @@ function ContactAddConfirmJobContent() { addresses: addresses.map((a, i) => ({ id: `addr-${i}`, address: a.address, - chainType: a.chainType, label: a.label, isDefault: i === 0, })), @@ -156,23 +149,28 @@ function ContactAddConfirmJobContent() { {t('addressBook.addresses')}
- {addresses.map((addr, i) => ( -
- -
-
- {CHAIN_NAMES[addr.chainType] || addr.chainType} - {addr.label && ` · ${addr.label}`} -
-
- {addr.address} + {addresses.map((addr, i) => { + const detected = detectAddressFormat(addr.address) + const displayLabel = addr.label || detected.chainType?.toUpperCase() || '' + return ( +
+ +
+ {displayLabel && ( +
+ {displayLabel} +
+ )} +
+ {addr.address} +
-
- ))} + ) + })}
diff --git a/src/stackflow/activities/sheets/ContactEditJob.tsx b/src/stackflow/activities/sheets/ContactEditJob.tsx index 10b716c8..980064b1 100644 --- a/src/stackflow/activities/sheets/ContactEditJob.tsx +++ b/src/stackflow/activities/sheets/ContactEditJob.tsx @@ -5,8 +5,7 @@ import { useTranslation } from "react-i18next"; import { useStore } from "@tanstack/react-store"; import { cn } from "@/lib/utils"; import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType } from "@/stores"; -import { detectAddressFormat } from "@/lib/address-format"; -import { IconWallet as Wallet, IconFileText as FileText, IconRefresh as Refresh } from "@tabler/icons-react"; +import { IconWallet as Wallet, IconFileText as FileText, IconRefresh as Refresh, IconTag as Tag } from "@tabler/icons-react"; import { ContactAvatar } from "@/components/common/contact-avatar"; import { generateAvatarFromAddress } from "@/lib/avatar-codec"; import { useFlow } from "../../stackflow"; @@ -27,6 +26,7 @@ function ContactEditJobContent() { const [name, setName] = useState(""); const [address, setAddress] = useState(""); + const [addressLabel, setAddressLabel] = useState(""); const [memo, setMemo] = useState(""); const [avatarSeed, setAvatarSeed] = useState(0); @@ -41,6 +41,7 @@ function ContactEditJobContent() { if (contact) { setName(contact.name); setAddress(defaultAddress?.address ?? ""); + setAddressLabel(defaultAddress?.label ?? ""); setMemo(contact.memo ?? ""); } }, [contact, defaultAddress]); @@ -56,14 +57,11 @@ function ContactEditJobContent() { const handleSave = useCallback(() => { const trimmedName = name.trim(); const trimmedAddress = address.trim(); + const trimmedLabel = addressLabel.trim(); const trimmedMemo = memo.trim(); if (!trimmedName || !trimmedAddress) return; - // Detect chain type from address format - const detectedFormat = detectAddressFormat(trimmedAddress); - const chainType = (defaultChain as ChainType) ?? detectedFormat.chainType ?? "ethereum"; - // 生成最终头像 const finalAvatar = contact?.avatar || generateAvatarFromAddress(trimmedAddress, avatarSeed); @@ -76,12 +74,12 @@ function ContactEditJobContent() { }); // Update address if changed - if (defaultAddress && defaultAddress.address !== trimmedAddress) { + if (defaultAddress && (defaultAddress.address !== trimmedAddress || defaultAddress.label !== trimmedLabel)) { // Remove old address and add new one addressBookActions.removeAddressFromContact(contact.id, defaultAddress.id); addressBookActions.addAddressToContact(contact.id, { address: trimmedAddress, - chainType, + label: trimmedLabel || undefined, isDefault: true, }); } @@ -93,7 +91,7 @@ function ContactEditJobContent() { { id: crypto.randomUUID(), address: trimmedAddress, - chainType, + label: trimmedLabel || undefined, isDefault: true, }, ], @@ -103,7 +101,7 @@ function ContactEditJobContent() { } pop(); - }, [name, address, memo, avatarSeed, isEditing, contact, defaultAddress, defaultChain, pop]); + }, [name, address, addressLabel, memo, avatarSeed, isEditing, contact, defaultAddress, pop]); const canSave = name.trim().length > 0 && address.trim().length > 0; @@ -173,6 +171,26 @@ function ContactEditJobContent() { />
+ {/* Address label input */} +
+ + setAddressLabel(e.target.value)} + placeholder={t("contact.addressLabelPlaceholder")} + maxLength={20} + className={cn( + "w-full rounded-xl border border-border bg-background px-4 py-3 text-sm", + "focus:outline-none focus:ring-2 focus:ring-primary" + )} + /> +
+ {/* Memo input */}
- {address.chainType} + {getAddressDisplayLabel(address)} ); @@ -202,15 +209,12 @@ function ContactPickerJobContent() { )}> {truncateAddress(address.address)}

- {address.label && ( -

{address.label}

- )}
- {address.chainType} + {getAddressDisplayLabel(address)} {address.isDefault && ( diff --git a/src/stackflow/activities/sheets/ContactShareJob.tsx b/src/stackflow/activities/sheets/ContactShareJob.tsx index f51b9d07..fbfdd3e9 100644 --- a/src/stackflow/activities/sheets/ContactShareJob.tsx +++ b/src/stackflow/activities/sheets/ContactShareJob.tsx @@ -28,11 +28,7 @@ export type ContactShareJobParams = { avatar?: string | undefined; }; -const CHAIN_NAMES: Record = { - ethereum: 'ETH', - bitcoin: 'BTC', - tron: 'TRX', -}; + function ContactShareJobContent() { const { t } = useTranslation('common'); @@ -90,7 +86,7 @@ function ContactShareJobContent() { await navigator.share({ title: t('addressBook.shareContact'), - text: `${params.name} - ${addresses.map((a) => `${CHAIN_NAMES[a.chainType] || a.chainType}: ${a.address}`).join(', ')}`, + text: `${params.name} - ${addresses.map((a) => `${a.label || ''}: ${a.address}`).join(', ')}`, files: [file], }); } catch { diff --git a/src/stackflow/activities/tabs/TransferTab.tsx b/src/stackflow/activities/tabs/TransferTab.tsx index 9a45db1a..bb926b52 100644 --- a/src/stackflow/activities/tabs/TransferTab.tsx +++ b/src/stackflow/activities/tabs/TransferTab.tsx @@ -31,10 +31,10 @@ export function TransferTab() { .map((id) => contacts.find((c) => c.id === id)) .filter((c): c is Contact => c !== undefined); - // 如果指定了链类型,进一步过滤 + // 如果指定了链类型,使用 getContactsByChain 过滤(基于地址格式检测) const filtered = selectedChain ? foundContacts.filter((contact) => - contact.addresses.some((addr) => addr.chainType === selectedChain) + addressBookSelectors.getContactsByChain({ contacts: [contact], isInitialized: true }, selectedChain).length > 0 ) : foundContacts; diff --git a/src/stores/address-book.test.ts b/src/stores/address-book.test.ts index b7a6c507..b80bd58b 100644 --- a/src/stores/address-book.test.ts +++ b/src/stores/address-book.test.ts @@ -8,11 +8,11 @@ import { } from './address-book' /** Helper to create a contact address */ -function createAddress(address: string, chainType: string = 'ethereum'): ContactAddress { +function createAddress(address: string, label?: string): ContactAddress { return { id: crypto.randomUUID(), address, - chainType: chainType as ContactAddress['chainType'], + label, } } @@ -101,14 +101,14 @@ describe('AddressBookStore', () => { addressBookActions.addAddressToContact(contact.id, { address: 'b7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', - chainType: 'bfmeta', + label: 'BFMETA', }) const state = addressBookStore.state const updated = state.contacts.find((c) => c.id === contact.id) expect(updated?.addresses).toHaveLength(2) - expect(updated?.addresses[1]?.chainType).toBe('bfmeta') + expect(updated?.addresses[1]?.label).toBe('BFMETA') }) it('throws error when adding more than 3 addresses', () => { @@ -124,7 +124,7 @@ describe('AddressBookStore', () => { expect(() => { addressBookActions.addAddressToContact(contact.id, { address: '0x4444444444444444444444444444444444444444', - chainType: 'ethereum', + label: 'ETH4', }) }).toThrow('Maximum 3 addresses per contact') }) @@ -255,7 +255,7 @@ describe('AddressBookStore', () => { { id: '1', name: 'Alice', - addresses: [{ id: 'a1', address: '0x1111', chainType: 'ethereum' }], + addresses: [{ id: 'a1', address: '0x1111', label: 'ETH' }], createdAt: Date.now(), updatedAt: Date.now(), }, @@ -280,7 +280,7 @@ describe('AddressBookStore', () => { { id: '1', name: 'Alice', - address: '0x1111', + address: '0x1111111111111111111111111111111111111111', chain: 'ethereum', createdAt: Date.now(), updatedAt: Date.now(), @@ -294,8 +294,8 @@ describe('AddressBookStore', () => { expect(state.contacts).toHaveLength(1) expect(state.contacts[0]!.name).toBe('Alice') expect(state.contacts[0]!.addresses).toHaveLength(1) - expect(state.contacts[0]!.addresses[0]?.address).toBe('0x1111') - expect(state.contacts[0]!.addresses[0]?.chainType).toBe('ethereum') + expect(state.contacts[0]!.addresses[0]?.address).toBe('0x1111111111111111111111111111111111111111') + expect(state.contacts[0]!.addresses[0]?.label).toBe('ETHEREUM') }) }) @@ -346,13 +346,13 @@ describe('AddressBookStore', () => { addressBookActions.addContact({ name: 'Alice', addresses: [ - { id: '1', address: '0x1234abcd', chainType: 'ethereum' }, - { id: '2', address: 'b7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', chainType: 'bfmeta' }, + { id: '1', address: '0x1234abcd1234abcd1234abcd1234abcd1234abcd', label: 'ETH' }, + { id: '2', address: 'b7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', label: 'BFMETA' }, ], }) addressBookActions.addContact({ name: 'Bob', - addresses: [{ id: '3', address: '0x1234efgh', chainType: 'ethereum' }], + addresses: [{ id: '3', address: '0x1234efgh1234efgh1234efgh1234efgh1234efgh', label: 'ETH' }], }) const state = addressBookStore.state @@ -366,11 +366,11 @@ describe('AddressBookStore', () => { it('suggestContacts returns all contacts when query is empty', () => { addressBookActions.addContact({ name: 'Alice', - addresses: [{ id: '1', address: '0x1111', chainType: 'ethereum' }], + addresses: [{ id: '1', address: '0x1111111111111111111111111111111111111111', label: 'ETH' }], }) addressBookActions.addContact({ name: 'Bob', - addresses: [{ id: '2', address: '0x2222', chainType: 'ethereum' }], + addresses: [{ id: '2', address: '0x2222222222222222222222222222222222222222', label: 'ETH' }], }) const state = addressBookStore.state @@ -380,38 +380,12 @@ describe('AddressBookStore', () => { expect(suggestions).toHaveLength(2) }) - it('suggestContacts filters by chainType when provided', () => { - addressBookActions.addContact({ - name: 'Alice', - addresses: [ - { id: '1', address: '0x1111', chainType: 'ethereum' }, - { id: '2', address: 'b7ADmv...', chainType: 'bfmeta' }, - ], - }) - addressBookActions.addContact({ - name: 'Bob', - addresses: [{ id: '3', address: 'c7ADmv...', chainType: 'ccchain' }], - }) - - const state = addressBookStore.state - - // Filter by ethereum - const ethSuggestions = addressBookSelectors.suggestContacts(state, '', 'ethereum') - expect(ethSuggestions).toHaveLength(1) - expect(ethSuggestions[0]?.contact.name).toBe('Alice') - - // Filter by bfmeta - const bfmetaSuggestions = addressBookSelectors.suggestContacts(state, '', 'bfmeta') - expect(bfmetaSuggestions).toHaveLength(1) - expect(bfmetaSuggestions[0]?.matchedAddress.chainType).toBe('bfmeta') - }) - it('suggestContacts respects limit parameter', () => { // Add 10 contacts for (let i = 0; i < 10; i++) { addressBookActions.addContact({ name: `Contact ${i}`, - addresses: [{ id: `${i}`, address: `0x${i}000`, chainType: 'ethereum' }], + addresses: [{ id: `${i}`, address: `0x${i}000000000000000000000000000000000000000`, label: 'ETH' }], }) } @@ -422,25 +396,25 @@ describe('AddressBookStore', () => { expect(defaultLimit).toHaveLength(5) // Custom limit - const customLimit = addressBookSelectors.suggestContacts(state, '', undefined, 3) + const customLimit = addressBookSelectors.suggestContacts(state, '', 3) expect(customLimit).toHaveLength(3) }) - it('getContactsByChain filters by chain type', () => { + it('getContactsByChain filters by chain type (using address format detection)', () => { addressBookActions.addContact({ name: 'Alice', addresses: [ - { id: '1', address: '0x1111', chainType: 'ethereum' }, - { id: '2', address: 'b7ADmv...', chainType: 'bfmeta' }, + { id: '1', address: '0x1111111111111111111111111111111111111111', label: 'ETH' }, + { id: '2', address: 'b7ADmvZJJ3n3aDxkvwbXxJX1oGgeiCzL11', label: 'BFMETA' }, ], }) addressBookActions.addContact({ name: 'Bob', - addresses: [{ id: '3', address: '0x2222', chainType: 'ethereum' }], + addresses: [{ id: '3', address: '0x2222222222222222222222222222222222222222', label: 'ETH' }], }) addressBookActions.addContact({ name: 'Charlie', - addresses: [{ id: '4', address: 'c7ADmv...', chainType: 'ccchain' }], + addresses: [{ id: '4', address: 'TJYeasypTe7UMKAMyfX4pjCuj2zPZ9Wzwj', label: 'TRX' }], }) const state = addressBookStore.state @@ -450,6 +424,9 @@ describe('AddressBookStore', () => { const bfmetaContacts = addressBookSelectors.getContactsByChain(state, 'bfmeta') expect(bfmetaContacts).toHaveLength(1) // Alice only + + const tronContacts = addressBookSelectors.getContactsByChain(state, 'tron') + expect(tronContacts).toHaveLength(1) // Charlie only }) }) }) diff --git a/src/stores/address-book.ts b/src/stores/address-book.ts index 469e9137..545fe598 100644 --- a/src/stores/address-book.ts +++ b/src/stores/address-book.ts @@ -7,9 +7,7 @@ export interface ContactAddress { id: string /** 地址 */ address: string - /** 链类型 */ - chainType: ChainType - /** 地址标签(如"主地址"、"交易所") */ + /** 地址标签(如"主地址"、"交易所"),用于显示 */ label?: string | undefined /** 是否默认地址 */ isDefault?: boolean | undefined @@ -81,7 +79,8 @@ function isLegacyContact(contact: unknown): contact is LegacyContact { /** 迁移旧版联系人到新格式 */ function migrateLegacyContact(legacy: LegacyContact): Contact { const detected = detectAddressFormat(legacy.address) - const chainType = legacy.chain ?? detected.chainType ?? 'ethereum' + // 使用检测到的链类型作为 label + const label = legacy.chain ?? detected.chainType ?? undefined return { id: legacy.id, @@ -90,7 +89,7 @@ function migrateLegacyContact(legacy: LegacyContact): Contact { { id: crypto.randomUUID(), address: legacy.address, - chainType, + label: label ? String(label).toUpperCase() : undefined, isDefault: true, }, ], @@ -359,13 +358,11 @@ export const addressBookSelectors = { * 获取联系人建议(用于地址输入) * @param state - 地址簿状态 * @param partialAddress - 部分地址(可为空,空时返回所有联系人) - * @param chainType - 链类型过滤(可选) * @param limit - 返回数量限制(默认 5) */ suggestContacts: ( state: AddressBookState, partialAddress: string, - chainType?: ChainType, limit: number = 5 ): ContactSuggestion[] => { const suggestions: ContactSuggestion[] = [] @@ -378,10 +375,7 @@ export const addressBookSelectors = { ) for (const contact of sortedContacts) { - // 过滤指定链类型的地址 - const relevantAddresses = chainType - ? contact.addresses.filter((a) => a.chainType === chainType) - : contact.addresses + const relevantAddresses = contact.addresses if (relevantAddresses.length === 0) continue @@ -462,17 +456,17 @@ export const addressBookSelectors = { .slice(0, limit) }, - /** 按链类型过滤联系人 */ + /** 按链类型过滤联系人(使用地址格式检测) */ getContactsByChain: (state: AddressBookState, chain: ChainType): Contact[] => { return state.contacts.filter((c) => - c.addresses.some((a) => a.chainType === chain) + c.addresses.some((a) => detectAddressFormat(a.address).chainType === chain) ) }, /** 获取联系人的默认地址 */ getDefaultAddress: (contact: Contact, chainType?: ChainType): ContactAddress | undefined => { const relevantAddresses = chainType - ? contact.addresses.filter((a) => a.chainType === chainType) + ? contact.addresses.filter((a) => detectAddressFormat(a.address).chainType === chainType) : contact.addresses return relevantAddresses.find((a) => a.isDefault) ?? relevantAddresses[0] From 6a727b4b18b826bb8e74d109569bc42c0bcddaa8 Mon Sep 17 00:00:00 2001 From: Gaubee Date: Fri, 26 Dec 2025 14:20:00 +0800 Subject: [PATCH 7/9] feat(contact): improve address UI and validation - Show custom label only (no fallback to chain type) - Multi-address input with label before address (max 3) - ContactPicker: group addresses by contact with better spacing - AddressInput: show matched contact avatar and name - Allow avatar change when editing contact (random seed) - BioForest chains are mutually compatible for address validation - Breaking: storage version 3, no migration from older versions --- src/components/contact/contact-card.tsx | 17 +- src/components/transfer/address-input.tsx | 145 ++++--- src/i18n/locales/en/common.json | 7 +- src/i18n/locales/zh-CN/common.json | 7 +- src/lib/address-format.ts | 17 +- .../activities/sheets/ContactEditJob.tsx | 362 ++++++++++-------- .../activities/sheets/ContactPickerJob.tsx | 219 ++++------- src/stores/address-book.test.ts | 44 +-- src/stores/address-book.ts | 77 +--- 9 files changed, 442 insertions(+), 453 deletions(-) diff --git a/src/components/contact/contact-card.tsx b/src/components/contact/contact-card.tsx index e13c807d..8268a556 100644 --- a/src/components/contact/contact-card.tsx +++ b/src/components/contact/contact-card.tsx @@ -15,13 +15,13 @@ const CHAIN_COLORS: Record = { tron: '#FF0013', }; -/** 获取地址显示标签和颜色 */ -function getAddressDisplay(addr: ContactAddressInfo): { label: string; color: string } { +/** 获取地址显示标签和颜色(只显示自定义 label) */ +function getAddressDisplay(addr: ContactAddressInfo): { label: string; color: string } | null { + if (!addr.label) return null; const detected = detectAddressFormat(addr.address); const chainType = detected.chainType; - const label = addr.label || chainType?.toUpperCase() || ''; const color = chainType ? CHAIN_COLORS[chainType] || '#6B7280' : '#6B7280'; - return { label, color }; + return { label: addr.label, color }; } export interface ContactCardProps { @@ -43,14 +43,15 @@ export function ContactCard({ name, avatar, address, addresses, qrContent }: Con

{name}

{addresses.map((a, i) => { - const { label, color } = getAddressDisplay(a); + const display = getAddressDisplay(a); + if (!display) return null; return ( - {label} + {display.label} ); })} diff --git a/src/components/transfer/address-input.tsx b/src/components/transfer/address-input.tsx index 866d8e02..49b1babc 100644 --- a/src/components/transfer/address-input.tsx +++ b/src/components/transfer/address-input.tsx @@ -2,17 +2,16 @@ import { useState, forwardRef, useId, useMemo, useCallback, useRef, useEffect } import { cn } from '@/lib/utils'; import { useTranslation } from 'react-i18next'; import { useStore } from '@tanstack/react-store'; -import { IconLineScan as ScanLine, IconClipboardCopy as ClipboardPaste, IconUsers } from '@tabler/icons-react'; +import { IconLineScan as ScanLine, IconClipboardCopy as ClipboardPaste, IconUsers, IconX } from '@tabler/icons-react'; import { ContactAvatar } from '@/components/common/contact-avatar'; import { clipboardService } from '@/services/clipboard'; -import { isValidAddressForChain, detectAddressFormat } from '@/lib/address-format'; +import { isValidAddressForChain } from '@/lib/address-format'; +import { generateAvatarFromAddress } from '@/lib/avatar-codec'; import { addressBookStore, addressBookSelectors, type ChainType, type ContactSuggestion, type ContactAddress } from '@/stores'; -/** 获取地址显示标签(优先用自定义 label,否则用检测到的链类型) */ +/** 获取地址显示标签(只显示自定义 label,没有则为空) */ function getAddressDisplayLabel(address: ContactAddress): string { - if (address.label) return address.label; - const detected = detectAddressFormat(address.address); - return detected.chainType?.toUpperCase() || ''; + return address.label || ''; } interface AddressInputProps extends Omit, 'onChange'> { @@ -62,6 +61,12 @@ const AddressInput = forwardRef( const isValid = isValidAddress(currentValue); const hasError = !!(error || (!isValid && currentValue)); + // 检测当前输入是否精确匹配某个联系人的地址 + const matchedContact = useMemo(() => { + if (!currentValue) return null; + return addressBookSelectors.getContactByAddress(addressBookState, currentValue); + }, [addressBookState, currentValue]); + // 获取联系人建议 - 显示所有联系人,用地址合法性验证标记可选地址 const suggestions = useMemo(() => { if (!showSuggestions) return []; @@ -118,6 +123,11 @@ const AddressInput = forwardRef( setShowDropdown(false); }, [onChange]); + const handleClearContact = useCallback(() => { + setInternalValue(''); + onChange?.(''); + }, [onChange]); + const handleKeyDown = (e: React.KeyboardEvent) => { if (!showDropdown || suggestions.length === 0) return; @@ -148,57 +158,84 @@ const AddressInput = forwardRef(
- setFocused(true)} - onBlur={() => setTimeout(() => setFocused(false), 150)} - onKeyDown={handleKeyDown} - className="placeholder:text-muted-foreground min-w-0 flex-1 bg-transparent font-mono text-sm outline-none" - placeholder={t('addressPlaceholder')} - autoComplete="off" - autoCapitalize="off" - autoCorrect="off" - spellCheck={false} - aria-invalid={hasError} - aria-describedby={hasError ? errorId : undefined} - aria-expanded={showDropdown} - aria-controls={showDropdown ? listboxId : undefined} - aria-activedescendant={selectedIndex >= 0 ? `suggestion-${selectedIndex}` : undefined} - role="combobox" - {...props} - /> - -
- {onScan && ( + {/* 匹配到联系人时显示头像和信息 */} + {matchedContact ? ( + <> + +
+

{matchedContact.contact.name}

+

+ {matchedContact.matchedAddress.address} +

+
- )} - -
+ + ) : ( + <> + setFocused(true)} + onBlur={() => setTimeout(() => setFocused(false), 150)} + onKeyDown={handleKeyDown} + className="placeholder:text-muted-foreground min-w-0 flex-1 bg-transparent font-mono text-sm outline-none" + placeholder={t('addressPlaceholder')} + autoComplete="off" + autoCapitalize="off" + autoCorrect="off" + spellCheck={false} + aria-invalid={hasError} + aria-describedby={hasError ? errorId : undefined} + aria-expanded={showDropdown} + aria-controls={showDropdown ? listboxId : undefined} + aria-activedescendant={selectedIndex >= 0 ? `suggestion-${selectedIndex}` : undefined} + role="combobox" + {...props} + /> + +
+ {onScan && ( + + )} + +
+ + )}
{/* Contact suggestions dropdown */} @@ -240,10 +277,12 @@ const AddressInput = forwardRef( isDisabled ? "text-muted-foreground/50" : "text-muted-foreground" )}>{suggestion.matchedAddress.address}

- {getAddressDisplayLabel(suggestion.matchedAddress)} + {getAddressDisplayLabel(suggestion.matchedAddress) && ( + {getAddressDisplayLabel(suggestion.matchedAddress)} + )} ); })} diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 233049a8..0b67412a 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -4,6 +4,7 @@ "appInfo": "App info", "back": "Back", "chainSelector": "Select blockchain network", + "clear": "Clear", "close": "Close", "closeDialog": "Close dialog", "copyAddress": "Copy address", @@ -100,8 +101,10 @@ "namePlaceholder": "Enter contact name", "noContacts": "No contacts", "noValidAddress": "No valid address", - "addressLabel": "Address Label", - "addressLabelPlaceholder": "e.g. Main, Exchange", + "addresses": "Addresses", + "addressLabel": "Label", + "addressLabelPlaceholder": "e.g. Main", + "addAddress": "Add Address", "save": "Save", "selectAddress": "Select address", "selectContact": "Select Contact", diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index df908502..fdaa1465 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -33,6 +33,7 @@ "invalidAddress": "无效的地址格式", "back": "返回", "close": "关闭", + "clear": "清除", "loading": "加载中", "addContact": "添加联系人", "moreActions": "更多操作", @@ -60,8 +61,10 @@ "cancel": "取消", "noContacts": "暂无联系人", "noValidAddress": "无可用地址", - "addressLabel": "地址标签", - "addressLabelPlaceholder": "如:主账户、交易所", + "addresses": "地址", + "addressLabel": "标签", + "addressLabelPlaceholder": "如:主账户", + "addAddress": "添加地址", "viewAll": "查看全部联系人", "selectContact": "选择联系人", "selectAddress": "选择地址" diff --git a/src/lib/address-format.ts b/src/lib/address-format.ts index 695a27e9..8dc8d28e 100644 --- a/src/lib/address-format.ts +++ b/src/lib/address-format.ts @@ -107,7 +107,22 @@ export function isValidAddressForChain(address: string, chainType: ChainType): b const info = detectAddressFormat(address) if (!info.isValid) return false if (info.chainType === null) return false - return info.chainType === chainType + + // 完全匹配 + if (info.chainType === chainType) return true + + // BioForest 链之间互相兼容(共享相同密钥体系) + if (isBioforestChain(info.chainType) && isBioforestChain(chainType)) { + return true + } + + // Ethereum 和 BSC 地址格式相同 + if ((info.chainType === 'ethereum' || info.chainType === 'binance') && + (chainType === 'ethereum' || chainType === 'binance')) { + return true + } + + return false } /** diff --git a/src/stackflow/activities/sheets/ContactEditJob.tsx b/src/stackflow/activities/sheets/ContactEditJob.tsx index 980064b1..3c08af37 100644 --- a/src/stackflow/activities/sheets/ContactEditJob.tsx +++ b/src/stackflow/activities/sheets/ContactEditJob.tsx @@ -4,8 +4,8 @@ import { BottomSheet } from "@/components/layout/bottom-sheet"; import { useTranslation } from "react-i18next"; import { useStore } from "@tanstack/react-store"; import { cn } from "@/lib/utils"; -import { addressBookStore, addressBookActions, addressBookSelectors, type ChainType } from "@/stores"; -import { IconWallet as Wallet, IconFileText as FileText, IconRefresh as Refresh, IconTag as Tag } from "@tabler/icons-react"; +import { addressBookStore, addressBookActions } from "@/stores"; +import { IconFileText as FileText, IconRefresh as Refresh, IconPlus, IconTrash } from "@tabler/icons-react"; import { ContactAvatar } from "@/components/common/contact-avatar"; import { generateAvatarFromAddress } from "@/lib/avatar-codec"; import { useFlow } from "../../stackflow"; @@ -13,97 +13,125 @@ import { ActivityParamsProvider, useActivityParams } from "../../hooks"; type ContactEditJobParams = { contactId?: string; - defaultChain?: string; }; +interface AddressEntry { + id: string; + label: string; + address: string; +} + +const MAX_ADDRESSES = 3; +const MAX_LABEL_LENGTH = 10; + function ContactEditJobContent() { const { t } = useTranslation("common"); const { pop } = useFlow(); - const { contactId, defaultChain } = useActivityParams(); + const { contactId } = useActivityParams(); const contacts = useStore(addressBookStore, (s) => s.contacts); const contact = contactId ? contacts.find((c) => c.id === contactId) : null; const [name, setName] = useState(""); - const [address, setAddress] = useState(""); - const [addressLabel, setAddressLabel] = useState(""); + const [addresses, setAddresses] = useState([{ id: crypto.randomUUID(), label: "", address: "" }]); const [memo, setMemo] = useState(""); - const [avatarSeed, setAvatarSeed] = useState(0); + const [avatarSeed, setAvatarSeed] = useState(() => Math.floor(Math.random() * 10000)); + const [avatarChanged, setAvatarChanged] = useState(false); const isEditing = !!contact; - // Get default address for editing - const defaultAddress = contact - ? addressBookSelectors.getDefaultAddress(contact, defaultChain as ChainType | undefined) - : undefined; - useEffect(() => { if (contact) { setName(contact.name); - setAddress(defaultAddress?.address ?? ""); - setAddressLabel(defaultAddress?.label ?? ""); + setAddresses( + contact.addresses.length > 0 + ? contact.addresses.map((a) => ({ id: a.id, label: a.label || "", address: a.address })) + : [{ id: crypto.randomUUID(), label: "", address: "" }] + ); setMemo(contact.memo ?? ""); + setAvatarChanged(false); } - }, [contact, defaultAddress]); + }, [contact]); - // 切换头像 + // 切换头像(使用随机 seed) const handleChangeAvatar = useCallback(() => { - setAvatarSeed(prev => prev + 1); + setAvatarSeed(Math.floor(Math.random() * 10000)); + setAvatarChanged(true); + }, []); + + // 第一个有效地址用于生成头像 + const firstValidAddress = addresses.find((a) => a.address.trim())?.address.trim(); + // 如果用户修改过头像或者是新建联系人,使用生成的头像;否则使用已保存的头像 + const currentAvatar = (!isEditing || avatarChanged) + ? (firstValidAddress ? generateAvatarFromAddress(firstValidAddress, avatarSeed) : undefined) + : (contact?.avatar || (firstValidAddress ? generateAvatarFromAddress(firstValidAddress, avatarSeed) : undefined)); + + // 添加新地址 + const handleAddAddress = useCallback(() => { + if (addresses.length >= MAX_ADDRESSES) return; + setAddresses((prev) => [...prev, { id: crypto.randomUUID(), label: "", address: "" }]); + }, [addresses.length]); + + // 删除地址 + const handleRemoveAddress = useCallback((id: string) => { + setAddresses((prev) => { + if (prev.length <= 1) return prev; + return prev.filter((a) => a.id !== id); + }); }, []); - // 当前头像 URL - const currentAvatar = contact?.avatar || (address.trim() ? generateAvatarFromAddress(address.trim(), avatarSeed) : undefined); + // 更新地址 + const handleUpdateAddress = useCallback((id: string, field: "label" | "address", value: string) => { + setAddresses((prev) => + prev.map((a) => (a.id === id ? { ...a, [field]: value } : a)) + ); + }, []); const handleSave = useCallback(() => { const trimmedName = name.trim(); - const trimmedAddress = address.trim(); - const trimmedLabel = addressLabel.trim(); const trimmedMemo = memo.trim(); - if (!trimmedName || !trimmedAddress) return; + // 过滤有效地址 + const validAddresses = addresses + .filter((a) => a.address.trim()) + .map((a, i) => ({ + id: a.id, + address: a.address.trim(), + label: a.label.trim() || undefined, + isDefault: i === 0, + })); - // 生成最终头像 - const finalAvatar = contact?.avatar || generateAvatarFromAddress(trimmedAddress, avatarSeed); + if (!trimmedName || validAddresses.length === 0) return; + + // 生成最终头像(如果用户修改过或是新建,使用当前生成的头像) + const finalAvatar = (!isEditing || avatarChanged) + ? (validAddresses[0] ? generateAvatarFromAddress(validAddresses[0].address, avatarSeed) : undefined) + : contact?.avatar; if (isEditing && contact) { - // Update contact name, memo and avatar + // 更新联系人 addressBookActions.updateContact(contact.id, { name: trimmedName, avatar: finalAvatar, - ...(trimmedMemo ? { memo: trimmedMemo } : {}), + addresses: validAddresses, + memo: trimmedMemo || undefined, }); - - // Update address if changed - if (defaultAddress && (defaultAddress.address !== trimmedAddress || defaultAddress.label !== trimmedLabel)) { - // Remove old address and add new one - addressBookActions.removeAddressFromContact(contact.id, defaultAddress.id); - addressBookActions.addAddressToContact(contact.id, { - address: trimmedAddress, - label: trimmedLabel || undefined, - isDefault: true, - }); - } } else { - // Add new contact with single address + // 添加新联系人 addressBookActions.addContact({ name: trimmedName, - addresses: [ - { - id: crypto.randomUUID(), - address: trimmedAddress, - label: trimmedLabel || undefined, - isDefault: true, - }, - ], + addresses: validAddresses, avatar: finalAvatar, - ...(trimmedMemo ? { memo: trimmedMemo } : {}), + memo: trimmedMemo || undefined, }); } pop(); - }, [name, address, addressLabel, memo, avatarSeed, isEditing, contact, defaultAddress, pop]); + }, [name, addresses, memo, avatarSeed, isEditing, contact, pop]); - const canSave = name.trim().length > 0 && address.trim().length > 0; + const hasValidAddress = addresses.some((a) => a.address.trim()); + const canSave = name.trim().length > 0 && hasValidAddress; + const canAddMore = addresses.length < MAX_ADDRESSES; return ( @@ -121,115 +149,143 @@ function ContactEditJobContent() {
{/* Content */} -
- {/* Avatar & Name */} -
- - setName(e.target.value)} - placeholder={t("contact.namePlaceholder")} - maxLength={20} - className={cn( - "flex-1 rounded-xl border border-border bg-background px-4 py-3", - "focus:outline-none focus:ring-2 focus:ring-primary" - )} - /> -
+
+
+ {/* Avatar & Name */} +
+ + setName(e.target.value)} + placeholder={t("contact.namePlaceholder")} + maxLength={20} + className={cn( + "flex-1 rounded-xl border border-border bg-background px-4 py-3", + "focus:outline-none focus:ring-2 focus:ring-primary" + )} + /> +
- {/* Address input */} -
- - setAddress(e.target.value)} - placeholder={t("contact.addressPlaceholder")} - className={cn( - "w-full rounded-xl border border-border bg-background px-4 py-3 font-mono text-sm", - "focus:outline-none focus:ring-2 focus:ring-primary" - )} - /> -
+ {/* Addresses */} +
+
+ {t("contact.addresses")} + {addresses.length}/{MAX_ADDRESSES} +
- {/* Address label input */} -
- - setAddressLabel(e.target.value)} - placeholder={t("contact.addressLabelPlaceholder")} - maxLength={20} - className={cn( - "w-full rounded-xl border border-border bg-background px-4 py-3 text-sm", - "focus:outline-none focus:ring-2 focus:ring-primary" - )} - /> -
+ {addresses.map((addr, index) => ( +
+
+ {/* Label input - before address */} + handleUpdateAddress(addr.id, "label", e.target.value)} + placeholder={t("contact.addressLabelPlaceholder")} + maxLength={MAX_LABEL_LENGTH} + className={cn( + "w-24 shrink-0 rounded-lg border border-border bg-muted/50 px-3 py-2 text-sm", + "focus:outline-none focus:ring-2 focus:ring-primary" + )} + /> + {/* Delete button */} + {addresses.length > 1 && ( + + )} + {index === 0 && ( + + Default + + )} +
+ {/* Address input */} + handleUpdateAddress(addr.id, "address", e.target.value)} + placeholder={t("contact.addressPlaceholder")} + className={cn( + "w-full rounded-lg border border-border bg-background px-3 py-2 font-mono text-sm", + "focus:outline-none focus:ring-2 focus:ring-primary" + )} + /> +
+ ))} - {/* Memo input */} -
- -