- 用途:通用按钮组件
- 变体:default, destructive, outline, secondary, ghost, link
- 尺寸:default, sm, lg, icon
- 特性:支持图标、加载状态、禁用状态
- 用途:卡片容器
- 子组件:
CardHeader- 卡片头部CardTitle- 标题CardDescription- 描述CardContent- 内容区域CardFooter- 底部
- 用途:表格组件
- 子组件:
TableHeader- 表头TableHead- 表头单元格TableBody- 表体TableRow- 行TableCell- 单元格
- 用途:下拉选择组件
- 子组件:
SelectTrigger- 触发器SelectContent- 下拉内容SelectItem- 选项项SelectValue- 显示值
- 用途:输入框组件
- 特性:支持各种类型、占位符、禁用状态
- 用途:开关组件
- 特性:支持受控/非受控模式
- 用途:标签页组件
- 子组件:
TabsList- 标签列表TabsTrigger- 标签触发器TabsContent- 标签内容
- 用途:下拉菜单组件
- 用途:主题切换菜单
功能:显示总资产估值
Props:
{
assets: Asset[];
loading: boolean;
}特性:
- 支持货币切换(USD/CNY/BTC)
- 自动获取汇率和 BTC 价格
- 缓存汇率数据(30分钟)
- 显示资产数量
- 货币偏好持久化
状态:
currency: 当前选择的货币btcPrice: BTC 价格usdToCny: USD 到 CNY 汇率loadingRates: 汇率加载状态
功能:显示资产列表表格
Props:
{
assets: Asset[];
}列:
- 币种(Symbol)
- 数量(Amount)
- 单价(Price USD)
- 总值(Value USD)
- 来源(Source)
特性:
- 支持空状态显示
- 响应式设计
- 悬停效果
功能:饼状图显示资产分布
Props:
{
assets: Asset[];
}特性:
- 使用 Recharts 库
- 显示前 6 个资产 + Others
- 自定义 Tooltip
- 显示百分比
- 支持空状态
数据处理:
- 按币种聚合资产
- 按价值排序
- 计算百分比
功能:标签页切换不同账户的资产视图
Props:
{
assets: Asset[];
loading: boolean;
}特性:
- "全部汇总"标签显示所有资产
- 每个交易所/钱包有独立标签
- 每个标签显示对应的 SummaryCard 和 AssetTable
功能:管理 CEX API 配置
功能:
- 添加交易所(Binance/OKX)
- 删除交易所
- 显示已添加的交易所列表
- 表单验证
表单字段:
- 交易所类型(Select)
- 备注名称(Input)
- API Key(Input, password)
- Secret Key(Input, password)
- Passphrase(Input, password, 仅 OKX)
功能:管理链上钱包地址
功能:
- 添加钱包地址
- 删除钱包地址
- 显示已添加的钱包列表
- 地址格式验证(EVM 地址)
表单字段:
- 备注名称(Input)
- 钱包地址(Input)
验证:
- 地址必须以
0x开头 - 地址长度必须为 42 字符
功能:通用应用设置
设置项:
- 语言选择(中文/English)
- 隐藏小额资产(Switch)
- 小额资产阈值(Input, 仅在启用隐藏时显示)
功能:全局状态管理
管理的数据:
- 交易所配置列表
- 钱包配置列表
- 应用设置
提供的方法:
addExchange- 添加交易所removeExchange- 删除交易所addWallet- 添加钱包removeWallet- 删除钱包updateSettings- 更新设置
持久化:
- 自动保存到 Chrome Storage
- 自动加载到 Context
功能:主题管理
特性:
- 使用 next-themes 库
- 支持浅色、深色、跟随系统
- 持久化主题选择
功能:主题切换按钮
特性:
- 下拉菜单选择主题
- 图标根据当前主题变化
- 支持国际化
功能:抑制开发环境错误
用途:在开发环境中隐藏某些已知错误
import { useAssetStore } from '@/components/providers/asset-provider';
function MyComponent() {
const { exchanges, wallets, settings, updateSettings } = useAssetStore();
// 使用状态和方法
}import { useI18n } from '@/hooks/use-i18n';
function MyComponent() {
const { t } = useI18n();
return <div>{t('dashboard.title')}</div>;
}import { useTheme } from 'next-themes';
function MyComponent() {
const { theme, setTheme } = useTheme();
// 使用主题
}