@edgex-web/components
Version:
EdgeX Universal UI Components Library - Reusable React components for deposit, withdraw and other common UI patterns
326 lines (259 loc) • 7.48 kB
Markdown
# @edgex-web/components
> ⚠️ **Beta 版本警告**: 这是一个 Beta 版本,功能还在完善中,仅用于测试和开发环境。
EdgeX Universal UI Components Library - Reusable React components for deposit, withdraw and other common UI patterns
## 🎯 项目概述
基于 RFC FE-01 设计,EdgeX Components 是一个独立的 npm 包,旨在解决 EdgeX 项目中 deposit/withdraw 组件 70% 代码重复的问题。采用事件驱动架构,支持全局调用能力。
## ✨ 特性
- 🚀 **现代化技术栈**: TypeScript + React + Vite
- 📦 **独立 npm 包**: 可在任何 React 项目中使用
- 🎪 **事件驱动**: 支持全局调用 `openDeposit()` / `openWithdraw()`
- 🔗 **MPC 钱包支持**: 链-代币关联,智能代币切换
- 🎨 **主题配置**: 支持 light/dark 主题切换
- 🌍 **国际化**: 多语言支持
- 🧪 **高测试覆盖**: 目标 85%+ 测试覆盖率
- 📚 **完整文档**: API 文档和使用指南
## 📦 安装
### Beta 版本 (推荐用于测试)
```bash
# 使用 npm
npm install @edgex-web/components@beta
# 使用 yarn
yarn add @edgex-web/components@beta
# 使用 pnpm
pnpm add @edgex-web/components@beta
```
### 稳定版本 (暂未发布)
```bash
# 使用 npm
npm install @edgex-web/components
# 使用 yarn
yarn add @edgex-web/components
# 使用 pnpm
pnpm add @edgex-web/components
```
## 🏗️ 技术架构
```
edgex-components/
├── src/
│ ├── components/ # React 组件
│ │ ├── Provider/ # 全局配置提供者
│ │ ├── Deposit/ # 充值组件
│ │ └── Withdraw/ # 提现组件
│ ├── hooks/ # React Hooks
│ ├── types/ # TypeScript 类型定义
│ └── test/ # 测试配置
├── dev/ # 开发环境
└── dist/ # 构建输出
```
## 🚀 快速开始
### 安装依赖
```bash
# 使用 yarn (推荐)
yarn install
# 或使用 npm
npm install
```
### 开发模式
```bash
# 启动开发服务器
yarn dev
# 访问 http://localhost:5173 查看组件演示
```
### 构建
```bash
# 构建生产版本
yarn build
# 类型检查
yarn type-check
# 运行测试
yarn test
# 测试覆盖率
yarn test:coverage
# 代码检查
yarn lint
# 代码格式化
yarn format
```
## 📖 使用方法
### 基本用法
```tsx
import React from 'react'
import { ComponentProvider, useDeposit, useWithdraw } from '@edgex-web/components'
// 1. 在应用根组件配置 Provider
const App = () => {
const config = {
theme: 'light',
locale: 'en',
apiBaseUrl: 'https://api.edgex.com',
debug: true
}
return (
<ComponentProvider config={config}>
<YourApp />
</ComponentProvider>
)
}
// 2. 在任意组件中使用
const TradeComponent = () => {
const { openDeposit } = useDeposit()
const { openWithdraw } = useWithdraw()
const handleDeposit = () => {
openDeposit({
type: 'trade',
symbol: 'USDT',
onSuccess: (result) => console.log('Success:', result),
onError: (error) => console.error('Error:', error),
onCancel: () => console.log('Cancelled')
})
}
return <button onClick={handleDeposit}>充值</button>
}
```
### 事件驱动 API (推荐)
```tsx
import React from 'react'
import {
DepositManager,
openDeposit,
closeDeposit,
MPCChainTokenSelector
} from '@edgex-web/components'
// 1. 在应用根组件添加 DepositManager
function App() {
return (
<div>
<YourAppContent />
<DepositManager />
</div>
)
}
// 2. 在任意位置调用
function MyComponent() {
const handleDeposit = () => {
openDeposit({
curSelectToken: 'USDT',
depositAmount: '100',
onDeposit: async () => {
console.log('Deposit initiated!')
}
})
}
return <button onClick={handleDeposit}>Open Deposit</button>
}
```
### MPC 钱包链-代币关联
```tsx
import React, { useState } from 'react'
import { MPCChainTokenSelector, type ChainWithTokens } from '@edgex-web/components'
// 定义链-代币关联数据
const mpcChainList: ChainWithTokens[] = [
{
chainId: 1,
chain: 'Ethereum',
chainIconUrl: 'https://static.edgex.exchange/icons/logo/ethereum.svg',
allowDeposit: true,
blockTime: 12,
txConfirm: 12,
tokenList: [
{
token: 'USDT',
symbol: 'USDT',
iconUrl: 'https://static.edgex.exchange/icons/coin/USDT.svg',
decimals: 6,
tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
},
],
},
{
chainId: 42161,
chain: 'Arbitrum',
chainIconUrl: 'https://static.edgex.exchange/icons/logo/arbitrum.svg',
allowDeposit: true,
blockTime: 1,
txConfirm: 1,
tokenList: [
{
token: 'USDT',
symbol: 'USDT',
iconUrl: 'https://static.edgex.exchange/icons/coin/USDT.svg',
decimals: 6,
tokenAddress: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',
},
{
token: 'USDC',
symbol: 'USDC',
iconUrl: 'https://static.edgex.exchange/icons/coin/USDC.svg',
decimals: 6,
tokenAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
},
],
},
]
function MPCWalletComponent() {
const [currentChainId, setCurrentChainId] = useState(1)
const [currentToken, setCurrentToken] = useState('USDT')
const currentActiveChain = mpcChainList.find(
chain => chain.chainId === currentChainId
) || mpcChainList[0]
return (
<MPCChainTokenSelector
currentActiveChain={currentActiveChain}
chainList={mpcChainList}
onChainChange={setCurrentChainId}
curSelectToken={currentToken}
onTokenChange={setCurrentToken}
t={(key) => key} // 翻译函数
/>
)
}
```
## 🛠️ 开发工具链
### 已配置的工具
- **构建工具**: Vite 5.x + Rollup
- **类型系统**: TypeScript 5.x
- **测试框架**: Vitest + Testing Library
- **代码质量**: ESLint + Prettier
- **Git Hooks**: Husky + lint-staged
- **包管理**: 支持 npm/yarn/pnpm
### 脚本命令
| 命令 | 描述 |
|------|------|
| `yarn dev` | 启动开发服务器 |
| `yarn build` | 构建生产版本 |
| `yarn test` | 运行测试 |
| `yarn test:coverage` | 生成测试覆盖率报告 |
| `yarn lint` | 代码检查 |
| `yarn format` | 代码格式化 |
| `yarn type-check` | TypeScript 类型检查 |
## 📋 开发状态
### ✅ 已完成
- [x] 项目基础架构搭建
- [x] TypeScript 配置
- [x] 构建工具配置 (Vite + Rollup)
- [x] 测试框架配置 (Vitest + Testing Library)
- [x] 代码质量工具 (ESLint + Prettier + Husky)
- [x] 基础组件结构
- [x] 开发环境设置
- [x] 核心组件开发 (Deposit/Withdraw)
- [x] 事件驱动系统实现
- [x] MPC 钱包链-代币关联功能
- [x] 智能代币切换逻辑
- [x] 完整测试覆盖
- [x] npm 包发布配置
### 🚧 进行中
- [ ] API 文档完善
- [ ] 集成指南编写
- [ ] 性能优化
### 📅 计划中
- [ ] Storybook 集成
- [ ] 更多钱包类型支持
- [ ] 主题系统增强
- [ ] 国际化完善
## 🎯 RFC FE-01 目标
- **减少代码重复**: 从 70% 降至 <10%
- **提升测试覆盖**: 达到 85%+
- **统一用户体验**: 一致的 UI 和交互
- **全局调用能力**: 支持任意位置唤起弹框
- **开发效率**: 降低维护成本 60-80%
## 📄 许可证
MIT License - 详见 [LICENSE](./LICENSE) 文件