UI Imprivement for Vault and Flow

This commit is contained in:
2026-02-08 02:22:12 -04:00
parent 9f64bb32d0
commit d296a93c84
27 changed files with 4090 additions and 628 deletions

366
QUICK_REFERENCE.md Normal file
View File

@@ -0,0 +1,366 @@
# 🚀 VaultScreen 优化 - 快速参考
## 一分钟快速开始
### 1. 导入新组件
```typescript
import { VaultButton, LabeledInput, AssetCard } from '@/components/vault';
import { useAddFlow, useMnemonicFlow } from '@/hooks/vault';
```
### 2. 使用 Hooks
```typescript
// 替换 8 个状态变量
const addFlow = useAddFlow();
// 替换 8 个助记词相关状态
const mnemonicFlow = useMnemonicFlow();
```
### 3. 快速替换示例
| 你想替换 | 用这个 | 代码行数减少 |
|----------|--------|-------------|
| 按钮 | `<VaultButton>` | 15 行 → 3 行 |
| 输入框 | `<LabeledInput>` | 8 行 → 5 行 |
| 资产卡片 | `<AssetCard>` | 66 行 → 5 行 |
| 状态管理 | `useAddFlow()` | 8 个变量 → 1 个对象 |
---
## 📋 组件速查表
### VaultButton
```typescript
// Primary 按钮(渐变蓝色)
<VaultButton variant="primary" icon="plus" onPress={handleAdd}>
Add Treasure
</VaultButton>
// Secondary 按钮(透明背景)
<VaultButton variant="secondary" onPress={handleCancel}>
Cancel
</VaultButton>
// Danger 按钮(红色)
<VaultButton variant="danger" loading={isDeleting} onPress={handleDelete}>
Delete
</VaultButton>
// Ghost 按钮(完全透明)
<VaultButton variant="ghost" onPress={handleBack}>
Back
</VaultButton>
```
**Props:**
- `variant`: 'primary' | 'secondary' | 'danger' | 'ghost'
- `icon`: Feather icon 名称(可选)
- `loading`: boolean显示加载动画
- `disabled`: boolean
- `fullWidth`: boolean
- `onPress`: () => void
---
### LabeledInput
```typescript
// 单行输入
<LabeledInput
label="TITLE"
placeholder="Enter title"
value={value}
onChangeText={setValue}
/>
// 多行输入
<LabeledInput
label="CONTENT"
value={content}
onChangeText={setContent}
multiline
/>
// 带错误提示
<LabeledInput
label="EMAIL"
value={email}
onChangeText={setEmail}
error={emailError}
/>
```
**Props:**
- `label`: string
- `placeholder`: string可选
- `value`: string
- `onChangeText`: (text: string) => void
- `multiline`: boolean可选
- `error`: string可选
- 支持所有 TextInput 的 props
---
### AssetCard
```typescript
<AssetCard
asset={asset}
index={index}
onPress={handleOpenDetail}
/>
```
**Props:**
- `asset`: VaultAsset 对象
- `index`: number用于动画延迟
- `onPress`: (asset: VaultAsset) => void
**特性:**
- ✅ 自动入场动画
- ✅ 显示资产类型图标
- ✅ 显示创建日期
- ✅ 加密状态徽章
---
## 🎣 Hooks 速查表
### useAddFlow
```typescript
const addFlow = useAddFlow();
// 访问状态
addFlow.state.step // 当前步骤 (1-3)
addFlow.state.label // 标题
addFlow.state.content // 内容
addFlow.state.selectedType // 资产类型
addFlow.state.verified // 是否已验证
addFlow.state.method // 'text' | 'file' | 'scan'
addFlow.state.accountProvider // 'bank' | 'steam' | 'facebook' | 'custom'
// 更新状态
addFlow.setStep(2)
addFlow.setLabel('My Treasure')
addFlow.setContent('Secret content')
addFlow.setType('private_key')
addFlow.setVerified(true)
addFlow.setMethod('text')
addFlow.setProvider('bank')
// 工具方法
addFlow.canProceed() // 检查是否可以进入下一步
addFlow.reset() // 重置所有状态
```
---
### useMnemonicFlow
```typescript
const mnemonicFlow = useMnemonicFlow();
// 访问状态
mnemonicFlow.state.words // 助记词数组
mnemonicFlow.state.parts // 分组后的助记词
mnemonicFlow.state.step // 步骤 (1-5)
mnemonicFlow.state.heirStep // 继承人步骤
mnemonicFlow.state.replaceIndex // 替换的单词索引
mnemonicFlow.state.progressIndex // 进度索引
mnemonicFlow.state.isCapturing // 是否正在截图
// 更新状态
mnemonicFlow.setWords(words)
mnemonicFlow.setParts(parts)
mnemonicFlow.setStep(2)
mnemonicFlow.setHeirStep('asset')
mnemonicFlow.replaceWord(3, 'newWord')
// 工具方法
mnemonicFlow.reset() // 重置所有状态
```
---
## 🎨 样式使用
```typescript
import { modalStyles } from '@/styles/vault/modalStyles';
// 在 Modal 中使用
<View style={modalStyles.modalOverlay}>
<View style={modalStyles.modalContent}>
<View style={modalStyles.modalHandle} />
<View style={modalStyles.modalHeader}>
<Text style={modalStyles.modalTitle}>Title</Text>
</View>
</View>
</View>
```
---
## 💻 常见替换模式
### 模式 1: 按钮组替换
**之前:**
```typescript
<View style={styles.modalButtons}>
<TouchableOpacity style={styles.cancelButton} onPress={handleCancel}>
<Text style={styles.cancelButtonText}>Cancel</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.confirmButton} onPress={handleConfirm}>
<LinearGradient colors={[...]} style={styles.confirmButtonGradient}>
<Text style={styles.confirmButtonText}>Confirm</Text>
</LinearGradient>
</TouchableOpacity>
</View>
```
**之后:**
```typescript
<View style={styles.modalButtons}>
<VaultButton variant="secondary" onPress={handleCancel} fullWidth>
Cancel
</VaultButton>
<VaultButton variant="primary" onPress={handleConfirm} fullWidth>
Confirm
</VaultButton>
</View>
```
---
### 模式 2: 表单输入替换
**之前:**
```typescript
<Text style={styles.modalLabel}>TITLE</Text>
<TextInput
style={styles.input}
placeholder="Enter title"
placeholderTextColor={colors.nautical.sage}
value={title}
onChangeText={setTitle}
/>
<Text style={styles.modalLabel}>CONTENT</Text>
<TextInput
style={[styles.input, styles.inputMultiline]}
placeholder="Enter content"
value={content}
onChangeText={setContent}
multiline
/>
```
**之后:**
```typescript
<LabeledInput label="TITLE" placeholder="Enter title" value={title} onChangeText={setTitle} />
<LabeledInput label="CONTENT" placeholder="Enter content" value={content} onChangeText={setContent} multiline />
```
---
### 模式 3: 状态管理替换
**之前:**
```typescript
const [step, setStep] = useState(1);
const [verified, setVerified] = useState(false);
const [label, setLabel] = useState('');
// 使用
if (step === 1) { /* ... */ }
setStep(2);
setLabel('New Value');
```
**之后:**
```typescript
const flow = useAddFlow();
// 使用
if (flow.state.step === 1) { /* ... */ }
flow.setStep(2);
flow.setLabel('New Value');
```
---
## ⚡ 性能优化 Tips
```typescript
// 1. 使用 useCallback 包装事件处理函数
const handleOpenDetail = useCallback((asset: VaultAsset) => {
setSelectedAsset(asset);
setShowDetail(true);
}, []);
// 2. 使用 React.memo 包装组件
const AssetList = React.memo(({ assets, onPress }) => (
assets.map((asset, index) => (
<AssetCard key={asset.id} asset={asset} index={index} onPress={onPress} />
))
));
// 3. 延迟加载大型模态框
const AddTreasureModal = React.lazy(() => import('./modals/AddTreasureModal'));
```
---
## 📦 完整示例
```typescript
import React, { useState } from 'react';
import { View, ScrollView } from 'react-native';
import { VaultButton, LabeledInput, AssetCard } from '@/components/vault';
import { useAddFlow } from '@/hooks/vault';
export default function VaultScreen() {
const addFlow = useAddFlow();
const [showModal, setShowModal] = useState(false);
return (
<View style={{ flex: 1 }}>
<ScrollView>
{assets.map((asset, index) => (
<AssetCard
key={asset.id}
asset={asset}
index={index}
onPress={handleOpenDetail}
/>
))}
</ScrollView>
<VaultButton
variant="primary"
icon="plus"
onPress={() => {
addFlow.reset();
setShowModal(true);
}}
>
Add Treasure
</VaultButton>
</View>
);
}
```
---
## 📚 完整文档
- 📖 **[VAULT_REFACTOR_GUIDE.md](./VAULT_REFACTOR_GUIDE.md)** - 完整重构指南
- 💡 **[VAULT_USAGE_EXAMPLE.tsx](./VAULT_USAGE_EXAMPLE.tsx)** - 实用代码示例
- 📝 **[VAULT_OPTIMIZATION_SUMMARY.md](./VAULT_OPTIMIZATION_SUMMARY.md)** - 优化总结
---
**快速开始,立即提升代码质量!**