-
Notifications
You must be signed in to change notification settings - Fork 181
feat: Add unsign status #1480
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
feat: Add unsign status #1480
Conversation
🦋 Changeset detectedLatest commit: fa42cd9 The changes in this PR will be included in the next version bump. This PR includes changesets to release 15 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters (1)
CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including You can disable this status message by setting the 📝 WalkthroughWalkthrough升级 vitest 相关开发依赖;大量测试用例中 async/await 与 vi.waitFor 用法规范化;为 wagmi provider 暴露并测试 Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor U as 用户
participant CB as ConnectButton
participant CBI as ConnectButtonInner
participant S as sign (provider)
participant M as message
rect rgba(200,235,250,0.25)
note right of CB: needSign=true 且 account 未 Signed(显示 Badge)
U->>CB: 点击主按钮
alt 已 Signed
CB-->>CB: 忽略重复签入
else 未 Signed
CB->>S: signIn(address?)
alt 成功
S-->>CB: resolve
CB-->>CB: setSigned(true)
else 失败
S-->>CB: reject(error)
CB->>M: message.error(error.message)
end
end
end
rect rgba(220,250,220,0.2)
note right of CBI: 下拉菜单:Profile / Disconnect
U->>CBI: 选择菜单项
alt Profile
CBI-->>CBI: onOpenProfileClick()
else Disconnect
CBI-->>CBI: onDisconnectClick()
end
end
sequenceDiagram
autonumber
actor U as 用户
participant D as Demo(DisconnectBtn)
participant PR as useProvider().sign
participant CN as useConnection().disconnect
U->>D: 点击 Sign Out
alt sign.signOut 存在
D->>PR: signOut()
PR-->>D: 完成
else 不存在
D-->>U: 无操作
end
U->>D: 点击 Disconnect
D->>CN: disconnect()
CN-->>D: 完成
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Demo: Ethereum - SIWE |
0fce69c
to
b5f8fe0
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1480 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 875 875
Lines 18856 18915 +59
Branches 1702 1710 +8
=========================================
+ Hits 18856 18915 +59 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/web3/src/connect-button/connect-button.tsx (1)
100-108
: 重复触发 signIn(外层 onClick + 内层 onSignInClick),可能导致双弹窗/两次请求当前点击一次会在这里执行一次签入,内层
Dropdown.Button
再次触发onSignInClick
又执行一次。对外部签名/会话后端这类非幂等操作风险较大,易出现重复签名提示或状态错乱。建议移除外层的签入调用,仅在
onSignInClick
内统一处理:- try { - if (needSign) { - await sign?.signIn?.(account?.address); - setSigned(true); - } - } catch (error: any) { - messageApi.error(error.message); - } + // 签入流程统一在 ConnectButtonInner 的 onSignInClick 中处理另外建议在内层增加“签入中”防重入锁,见下方 onSignInClick 建议。
🧹 Nitpick comments (19)
packages/solana/src/solana-provider/__tests__/standard-wallet.test.tsx (1)
138-140
: 优化:移除不必要的 async 关键字waitFor 回调函数中没有使用
await
,所有断言都是同步的。移除async
关键字简化了代码,且不会改变测试行为。Also applies to: 195-200
packages/solana/src/solana-provider/__tests__/wallet-connect.test.tsx (1)
169-171
: 优化:移除不必要的 async 关键字这三处 waitFor 回调函数都是同步的(仅包含
expect
断言),无需使用async
关键字。此改动提升了代码可读性。Also applies to: 176-178, 209-211
packages/solana/src/solana-provider/__tests__/connect.test.tsx (1)
331-333
: 优化:移除不必要的 async 关键字waitFor 回调中仅包含同步的
expect
调用,移除async
关键字使代码更简洁清晰。packages/solana/src/solana-provider/__tests__/mobile-wallet-adapter.test.tsx (1)
186-193
: 优化:移除不必要的 async 关键字waitFor 回调函数内的所有断言都是同步执行的,不需要
async
关键字。此修改与其他测试文件保持一致,提升了代码整体的清晰度。packages/web3/src/token-select/__tests__/index.test.tsx (1)
34-45
: 考虑移除或调整重复的测试用例。该测试用例与 lines 21-32 的测试 "should display the token list when clicked" 几乎完全重复。两个测试都:
- 渲染相同的组件
<TokenSelect options={mockTokens} />
- 触发相同的交互(点击选择器)
- 验证相同的结果(选项数量为 2,内容包含 'Ethereum' 和 'Tether USD')
建议移除此测试用例以减少代码重复,或者调整测试重点以验证不同的行为(例如,如果需要对比
tokenList
和options
的行为差异,可以保留一个使用已弃用tokenList
属性的测试)。packages/web3/src/ethereum/demos/siwe/index.tsx (1)
20-47
: 建议显式指定 Space 的方向属性。
DisconnectBtn
组件的实现逻辑正确,使用 hooks 获取disconnect
和sign
功能是更清晰的模式。可选链式调用 (?.
) 的使用也很安全。不过,
Space
组件默认是水平布局,建议显式指定direction="horizontal"
以提高代码可读性和维护性,避免依赖隐式默认值。应用此差异以显式指定方向:
- <Space> + <Space direction="horizontal"> <Buttonpackages/wagmi/src/wagmi-provider/config-provider.tsx (1)
241-243
: 实现正确,可考虑简化。
signOut
函数实现正确,将状态从Signed
恢复到Connected
符合预期行为。不过当前函数没有异步操作,可以移除async
关键字以简化代码。如果保留async
是为了与signIn
保持一致性或为将来扩展预留空间,则现有实现也是可接受的。应用此差异以移除不必要的 async 关键字(可选):
- const signOut = async () => { + const signOut = () => { setStatus(ConnectStatus.Connected); };packages/web3/src/browser-link/__tests__/index.test.tsx (1)
79-113
: 测试逻辑改进,但 mock 设置可能多余。测试现在正确地验证了不支持链和支持链两种场景。不过,第 81-83 行的
console.error
mock 设置似乎是不必要的,因为测试在第 96 行期望抛出异常而不是记录错误。如果实际实现确实抛出异常而非调用console.error
,则可以移除这个 mock 设置以简化测试代码。应用此差异以移除不必要的 console.error mock(如果实现确实抛出异常):
it('support get chain from provider', async () => { - // Test with unsupported chain (no browser.getBrowserLink) - const originalConsoleError = console.error; - const mockConsoleError = vi.fn(); - console.error = mockConsoleError; - expect(() => { render( <Web3ConfigProvider chain={{ id: ChainIds.Arbitrum, name: 'Arbitrum', }} > <BrowserLink address="0x21CDf0974d53a6e96eF05d7B324a9803735fFd3B" />, </Web3ConfigProvider>, ); }).toThrow('getBrowserLink unsupported chain 42161'); - console.error = originalConsoleError; - // Test with supported chain (override with Mainnet which has browser.getBrowserLink) expect(() => {packages/web3/src/connector/__tests__/basic.test.tsx (1)
15-17
: 考虑简化 FakeButton 辅助组件。
FakeButton
组件接受ConnectButtonProps
类型但只使用children
属性。如果目的仅是为了类型检查,可以考虑使用更简单的类型定义或直接使用Button
。如果只需要类型检查,可以简化为:
- function FakeButton({ children }: ConnectButtonProps) { + function FakeButton({ children }: { children?: React.ReactNode }) { return <Button>{children}</Button>; }packages/web3/src/connect-button/connect-button.tsx (3)
64-64
: 简化 needSign 判定表达式末尾
&& account
冗余(前面已判定account?.status === Connected
)。- const needSign = !!(sign?.signIn && account?.status === ConnectStatus.Connected && account); + const needSign = Boolean(sign?.signIn && account?.status === ConnectStatus.Connected);
241-267
: defaultMenuItems useMemo 依赖缺失,国际化变更时不会更新
intl
未纳入依赖,语言切换时菜单文本可能不更新。- ); -}, [account?.address, messageApi, onDisconnectClick], + ); +}, [account?.address, messageApi, onDisconnectClick, intl],
167-172
: 徽标可读性/无障碍小建议
<Badge status="error" />
无文字说明。可考虑加title
或在文本上附带状态说明以利于可访问性与屏幕阅读器。例如:
{needSign && account.status !== ConnectStatus.Signed && ( <Badge status="error" title={intl.getMessage(intl.messages.needSign)} /> )}packages/web3/src/connect-button/__tests__/sign.test.tsx (3)
659-669
: 断言菜单项文本使用硬编码中文,建议通过语义或测试 ID 定位直接断言“我的资料/断开”在多语言或文案变更时脆弱。建议:
- 使用角色/名称组合(例如通过 aria-label/i18n 文本)。
- 或给菜单项加 data-testid 再断言。
示例:
// 给菜单项增加 data-testid="menu-profile" / "menu-disconnect" // 测试中用 baseElement.querySelector('[data-testid="menu-profile"]')
185-189
: 依赖内部样式类选择器(.ant-btn-compact-*)定位元素较脆弱这类类名属于 antd 内部实现,版本升级可能变化。建议改为通过可见文本、角色、或 data-testid 选择。
使用
getByRole('button', { name: /.../ })
或显式data-testid
。Also applies to: 203-210
46-49
: 统一使用 Testing Library 的 waitFor 替换 vi.waitFor
仓库中多处测试依赖 Vitest 的vi.waitFor
,建议从@testing-library/react
导入waitFor
并替换所有vi.waitFor
调用,以保证与 Testing Library 的兼容性。示例:
-import { render, fireEvent } from '@testing-library/react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; … - await vi.waitFor(() => { … }); + await waitFor(() => { … });packages/web3/src/connect-button/connect-button-inner.tsx (4)
110-113
: useEffect 依赖缺失,可能导致回调与文案不更新
generateQuickConnectItems
中使用了onConnectClick
与intl
,但依赖列表仅有availableWallets, showQuickConnect
,会导致菜单项回调/多语言文案在变更后不刷新。-useEffect(() => { - generateQuickConnectItems(availableWallets); -}, [availableWallets, showQuickConnect]); +useEffect(() => { + generateQuickConnectItems(availableWallets); +}, [availableWallets, showQuickConnect, onConnectClick, intl]);或将
onConnectClick/intl
作为参数传入generateQuickConnectItems
并相应纳入依赖。
114-135
: 遗留注释与分支可读性
// if ( account?.status === ConnectStatus.Connected) {
为遗留注释,建议删除;needSign 已足够表达分支意图。移除无用注释,保持代码简洁。
168-177
: useMemo 依赖缺失,可能导致渲染不一致
buttonContent
使用了children / className / getWalletIcon / prefixCls / restProps
等,但未在依赖中声明,可能导致 UI、尺寸、图标不随 props 变化更新。-}, [ - firstInstallWallet, - items, - needSign, - onClick, - onConnectClick, - onOpenProfileClick, - onDisconnectClick, - showQuickConnect, -]); +}, [ + firstInstallWallet, + items, + needSign, + onClick, + onConnectClick, + onOpenProfileClick, + onDisconnectClick, + showQuickConnect, + children, + className, + getWalletIcon, + prefixCls, + // 若 restProps 常变化,可考虑避免放入 useMemo 或挑选关键字段(如 size/type) +]);
60-109
: Quick Connect 菜单项闭包捕获旧 onConnectClick 的风险菜单项的
onClick
在setItems
时已经闭包绑定onConnectClick
,但外层变更不会刷新 items(除非 availableWallets/showQuickConnect 变化)。上文已建议把onConnectClick
纳入依赖;或在此函数入参显式传递并在依赖中声明。将
onConnectClick
纳入useEffect
依赖或在generateQuickConnectItems
参数中传入,确保回调最新。
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (9)
packages/icons/src/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/address/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-button/__tests__/__snapshots__/profile-modal.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-button/__tests__/__snapshots__/tooltip.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-modal/__tests__/__snapshots__/basic.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-modal/__tests__/__snapshots__/simple.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/nft-image/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/web3-config-provider/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (29)
package.json
(2 hunks)packages/common/src/types.ts
(1 hunks)packages/common/src/utils/__tests__/request.test.ts
(1 hunks)packages/ethers-v5/src/hooks/use-ethers-provider.ts
(1 hunks)packages/ethers/src/hooks/use-ethers-provider.ts
(1 hunks)packages/solana/src/solana-provider/__tests__/connect.test.tsx
(1 hunks)packages/solana/src/solana-provider/__tests__/mobile-wallet-adapter.test.tsx
(1 hunks)packages/solana/src/solana-provider/__tests__/standard-wallet.test.tsx
(2 hunks)packages/solana/src/solana-provider/__tests__/wallet-connect.test.tsx
(2 hunks)packages/sui/src/sui-provider/__tests__/balance.test.tsx
(3 hunks)packages/ton/src/ton-provider/__tests__/sdk.test.tsx
(1 hunks)packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx
(12 hunks)packages/wagmi/src/wagmi-provider/config-provider.tsx
(2 hunks)packages/web3/src/address/__tests__/index.test.tsx
(1 hunks)packages/web3/src/browser-link/__tests__/index.test.tsx
(3 hunks)packages/web3/src/connect-button/__tests__/menu.test.tsx
(3 hunks)packages/web3/src/connect-button/__tests__/profile-modal.test.tsx
(2 hunks)packages/web3/src/connect-button/__tests__/sign.test.tsx
(1 hunks)packages/web3/src/connect-button/__tests__/tooltip.test.tsx
(3 hunks)packages/web3/src/connect-button/connect-button-inner.tsx
(5 hunks)packages/web3/src/connect-button/connect-button.tsx
(5 hunks)packages/web3/src/connect-button/interface.ts
(1 hunks)packages/web3/src/connect-button/style/index.ts
(1 hunks)packages/web3/src/connector/__tests__/basic.test.tsx
(6 hunks)packages/web3/src/ethereum/demos/siwe/index.tsx
(3 hunks)packages/web3/src/nft-image/__tests__/index.test.tsx
(1 hunks)packages/web3/src/theme/useStyle/index.ts
(3 hunks)packages/web3/src/token-select/__tests__/index.test.tsx
(1 hunks)packages/web3/src/utils/__tests__/browser.test.ts
(1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
**/__tests__/**
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
Place unit test code in tests folders
Files:
packages/solana/src/solana-provider/__tests__/wallet-connect.test.tsx
packages/web3/src/token-select/__tests__/index.test.tsx
packages/web3/src/address/__tests__/index.test.tsx
packages/solana/src/solana-provider/__tests__/mobile-wallet-adapter.test.tsx
packages/web3/src/connect-button/__tests__/tooltip.test.tsx
packages/web3/src/nft-image/__tests__/index.test.tsx
packages/web3/src/connect-button/__tests__/profile-modal.test.tsx
packages/solana/src/solana-provider/__tests__/standard-wallet.test.tsx
packages/web3/src/browser-link/__tests__/index.test.tsx
packages/sui/src/sui-provider/__tests__/balance.test.tsx
packages/web3/src/utils/__tests__/browser.test.ts
packages/solana/src/solana-provider/__tests__/connect.test.tsx
packages/web3/src/connector/__tests__/basic.test.tsx
packages/web3/src/connect-button/__tests__/menu.test.tsx
packages/web3/src/connect-button/__tests__/sign.test.tsx
packages/common/src/utils/__tests__/request.test.ts
packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx
packages/ton/src/ton-provider/__tests__/sdk.test.tsx
packages/web3/**
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
Keep project-wide styles and documentation under packages/web3
Files:
packages/web3/src/token-select/__tests__/index.test.tsx
packages/web3/src/connect-button/interface.ts
packages/web3/src/address/__tests__/index.test.tsx
packages/web3/src/connect-button/__tests__/tooltip.test.tsx
packages/web3/src/nft-image/__tests__/index.test.tsx
packages/web3/src/connect-button/__tests__/profile-modal.test.tsx
packages/web3/src/browser-link/__tests__/index.test.tsx
packages/web3/src/utils/__tests__/browser.test.ts
packages/web3/src/connector/__tests__/basic.test.tsx
packages/web3/src/connect-button/__tests__/menu.test.tsx
packages/web3/src/ethereum/demos/siwe/index.tsx
packages/web3/src/connect-button/__tests__/sign.test.tsx
packages/web3/src/connect-button/style/index.ts
packages/web3/src/connect-button/connect-button.tsx
packages/web3/src/theme/useStyle/index.ts
packages/web3/src/connect-button/connect-button-inner.tsx
packages/web3/**/style/index.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
packages/web3/**/style/index.{ts,tsx}
: Place each component’s styles in style/index.ts or style/index.tsx within the component’s folder
Implement styles using @ant-design/cssinjs and Ant Design Design Tokens
Files:
packages/web3/src/connect-button/style/index.ts
🧠 Learnings (1)
📚 Learning: 2025-08-13T08:59:54.489Z
Learnt from: CR
PR: ant-design/ant-design-web3#0
File: .cursor/rules/basic.mdc:0-0
Timestamp: 2025-08-13T08:59:54.489Z
Learning: Applies to packages/web3/**/style/index.{ts,tsx} : Implement styles using ant-design/cssinjs and Ant Design Design Tokens
Applied to files:
packages/web3/src/connect-button/style/index.ts
packages/web3/src/theme/useStyle/index.ts
🧬 Code graph analysis (13)
packages/web3/src/token-select/__tests__/index.test.tsx (1)
packages/web3/src/token-select/index.tsx (1)
TokenSelect
(55-125)
packages/web3/src/connect-button/__tests__/tooltip.test.tsx (1)
packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/web3/src/connect-button/__tests__/profile-modal.test.tsx (1)
packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/web3/src/utils/__tests__/browser.test.ts (2)
packages/web3/src/utils/browser.ts (1)
writeCopyText
(20-22)packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/web3/src/connector/__tests__/basic.test.tsx (1)
packages/web3/src/connect-button/interface.ts (1)
ConnectButtonProps
(23-48)
packages/web3/src/connect-button/__tests__/menu.test.tsx (1)
packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/web3/src/ethereum/demos/siwe/index.tsx (2)
packages/web3/src/hooks/useProvider.ts (1)
useProvider
(20-23)packages/solana/src/wallet-connect-adapter.ts (1)
disconnect
(140-156)
packages/web3/src/connect-button/__tests__/sign.test.tsx (1)
packages/web3/src/connect-button/connect-button.tsx (1)
ConnectButton
(26-340)
packages/common/src/utils/__tests__/request.test.ts (2)
packages/common/src/utils/test-utils.ts (1)
mockFetch
(1-10)packages/common/src/utils/request.ts (1)
requestWeb3Asset
(12-17)
packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx (2)
packages/web3/src/hooks/useProvider.ts (1)
useProvider
(20-23)packages/wagmi/src/wagmi-provider/config-provider.tsx (1)
AntDesignWeb3ConfigProvider
(48-306)
packages/ethers-v5/src/hooks/use-ethers-provider.ts (2)
packages/ethers/src/hooks/use-ethers-provider.ts (1)
clientToProvider
(7-23)packages/common/src/types.ts (1)
Chain
(77-89)
packages/web3/src/connect-button/connect-button.tsx (1)
packages/common/src/types.ts (1)
Wallet
(137-145)
packages/web3/src/connect-button/connect-button-inner.tsx (1)
packages/common/src/types.ts (1)
Wallet
(137-145)
🔇 Additional comments (26)
packages/ton/src/ton-provider/__tests__/sdk.test.tsx (1)
42-42
: 改进:正确等待 Promise 拒绝断言添加
await
确保 Promise 拒绝断言在测试继续执行前完成,这是 Jest/Vitest 中使用.rejects
匹配器的推荐做法。此更改提高了测试可靠性,防止潜在的误报。packages/common/src/utils/__tests__/request.test.ts (1)
11-16
: LGTM!改进了异步测试的可读性。将测试函数改为 async 并在 promise 断言前显式添加 await 是一个良好的实践。这使得异步操作更加清晰明确,并与代码库中其他测试的模式保持一致。
packages/ethers-v5/src/hooks/use-ethers-provider.ts (1)
6-21
: 注释位置调整合理仅扩大覆盖率忽略范围,函数行为保持不变,赞同此次修改。
packages/ethers/src/hooks/use-ethers-provider.ts (1)
6-22
: 注释统一性良好与 v5 版本保持一致,未触及运行逻辑,改动合理。
packages/web3/src/token-select/__tests__/index.test.tsx (1)
14-142
: 测试用例已正确更新为使用新的options
属性。所有测试用例都已统一使用新的
options
属性而非已弃用的tokenList
属性,这与组件 API 的演进保持一致。测试覆盖了组件的各种使用场景,包括基本渲染、交互、过滤、边缘情况和多选模式。packages/web3/src/ethereum/demos/siwe/index.tsx (2)
1-2
: 代码改进很好!使用
import type
进行类型导入是 TypeScript 最佳实践,能够在编译时优化包体积。新增的useConnection
和useProvider
hooks 为断开连接和签出功能提供了清晰的 API。
86-95
: 布局调整合理!使用
direction="vertical"
的Space
组件包裹主要内容,将连接按钮和断开连接按钮垂直排列,使演示页面的布局更加清晰和易于理解。这与 PR 目标中添加连接/断开连接状态指示器的需求相符。packages/web3/src/theme/useStyle/index.ts (2)
9-9
: 代码改进,LGTM!以下改进提升了代码质量:
- 使用类型导入(
import type
)减少运行时开销- 完善了注释说明,提高了代码可读性
- JSDoc 文档从中文更新为英文,便于国际化协作
Also applies to: 53-53, 59-59, 68-69
63-63
: ConnectModal token 已在样式文件中正确消费
已在 packages/web3/src/connect-modal/style/index.tsx:609 行展开应用,无需额外操作。packages/sui/src/sui-provider/__tests__/balance.test.tsx (1)
1-1
: 代码变更正确,保持了一致性。将 React hooks 的引用方式从解构导入改为命名空间引用(
React.useState
、React.useEffect
)是有效的重构模式。这些变更:
- 在运行时行为上完全等价
- 提升了代码一致性
- mock 的逻辑保持不变,状态管理和异步行为模拟仍然正确
Also applies to: 44-44, 58-58
packages/common/src/types.ts (1)
155-156
: LGTM!ESLint 指令的添加是合理的。
string & {}
模式是一个有效的 TypeScript 习惯用法,用于在保留字符串字面量类型自动完成功能的同时允许接受任意字符串值。package.json (1)
81-81
: LGTM!测试工具依赖的常规版本更新,补丁版本升级应该是安全的,可能包含错误修复和性能改进。
Also applies to: 99-99
packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx (3)
1-1
: LGTM!Mock 结构更新合理,使用
mockSignMessageAsync
替代之前的 mock 方式,使测试更加清晰和准确。Also applies to: 14-14, 31-31
80-80
: LGTM!选择器从
.ant-web3-connect-button
更改为.ant-btn-compact-first-item
,这与组件结构的更新保持一致。Also applies to: 140-140, 197-197
331-383
: LGTM!新增的
signOut
函数测试实现完善:
- 正确使用
useProvider
钩子访问sign
对象- 验证
signOut
函数可以被成功调用- 通过
fakeSignout
回调确认副作用被触发- 测试结构清晰,覆盖了 signOut 功能的核心场景
packages/web3/src/nft-image/__tests__/index.test.tsx (1)
41-46
: 测试更改看起来正确。移除
async
关键字是合理的,因为waitFor
回调内的所有断言都是同步的。这使代码更简洁。packages/web3/src/address/__tests__/index.test.tsx (1)
87-98
: 测试更改看起来正确。与其他测试文件保持一致,移除不必要的
async
关键字。回调内的断言都是同步的。packages/web3/src/connect-button/style/index.ts (1)
25-27
: 样式添加符合规范。为 Badge 组件添加右边距符合 Ant Design 的设计规范,使用了设计 token (
token.marginXS
),这与编码指南一致。Based on coding guidelines
packages/web3/src/connect-button/__tests__/profile-modal.test.tsx (1)
149-173
: 异步测试模式正确。测试函数改为
async
并在waitFor
中使用await expect(readCopyText()).resolves.toBe(...)
是正确的模式,可以正确处理异步的复制文本操作。packages/web3/src/connector/__tests__/basic.test.tsx (1)
405-407
: waitFor 更改正确。移除不必要的
async
关键字,因为回调内的操作都是同步的。packages/web3/src/connect-button/__tests__/tooltip.test.tsx (3)
123-127
: 异步测试模式正确。在
waitFor
中使用async
回调并配合await expect().resolves.toBe()
正确处理了异步的readCopyText()
操作。这个模式在整个测试套件中保持一致。
140-146
: 测试模式与其他测试保持一致。使用相同的异步测试模式来验证复制功能,代码清晰且正确。
163-169
: 格式化地址的复制测试正确。即使地址被格式化显示,复制的仍然是原始地址,这是正确的行为。测试正确验证了这一点。
packages/web3/src/connect-button/__tests__/menu.test.tsx (3)
56-60
: 异步断言模式正确。使用
async waitFor
配合await expect().resolves.toBe()
正确验证了复制地址功能和消息显示。
101-107
: 同步 waitFor 使用正确。由于回调内的断言都是同步的,正确地移除了
async
关键字。
152-157
: 测试逻辑清晰正确。在有额外菜单项的场景下,正确验证了自定义菜单项和默认复制地址功能都能正常工作。
it('should call signIn twice when button is clicked (once in buttonProps.onClick and once in onSignInClick)', async () => { | ||
const signInMock = vi.fn().mockResolvedValue(undefined); | ||
const { baseElement } = render( | ||
<ConnectButton | ||
account={{ | ||
address: '0x21CDf0974d53a6e96eF05d7B324a9803735fFd3B', | ||
status: ConnectStatus.Connected, | ||
}} | ||
sign={{ | ||
signIn: signInMock, | ||
}} | ||
/>, | ||
); | ||
|
||
const button = baseElement.querySelector('.ant-btn-compact-first-item')!; | ||
|
||
// First click to sign | ||
fireEvent.click(button); | ||
|
||
await vi.waitFor(() => { | ||
// Called twice: once in buttonProps.onClick, once in onSignInClick | ||
expect(signInMock).toHaveBeenCalledTimes(2); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
测试将“双次调用 signIn”固化为预期,不利于真实用户体验
当前实现会在外层 onClick 与内层 onSignInClick 重复触发签入。更合理的是单次调用并防抖。建议在实现中去重后,将本用例期望从 2 次改为 1 次。
变更方向:
- 代码侧:移除外层 onClick 的 signIn(见上文组件建议)。
- 测试侧:将
toHaveBeenCalledTimes(2)
调整为toHaveBeenCalledTimes(1)
或toHaveBeenCalled()
。
🤖 Prompt for AI Agents
packages/web3/src/connect-button/__tests__/sign.test.tsx lines 27-50: the test
currently asserts signIn is called twice, but the component should only call
signIn once; update the test expectation to expect a single call (e.g.,
toHaveBeenCalledTimes(1) or toHaveBeenCalled()) and, in the component
implementation, remove the duplicate signIn invocation from the outer onClick
(or add a guard/debounce so only the inner onSignInClick triggers signIn) so
user interactions result in a single signIn call.
const { wrapSSR, hashId } = useStyle(prefixCls); | ||
const [messageApi, contextHolder] = message.useMessage(); | ||
const [showMenu, setShowMenu] = useState(false); | ||
const [signed, setSigned] = useState(false); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
本地 signed 状态未与 account 同步重置,可能导致误判已签入
当账户地址或状态变更、或 sign 配置移除时未重置 signed
,会出现提前 return、不再触发签入的情况。建议在账户/状态/签入能力变化时重置。
应用以下变更:
- import React, { useContext, useMemo, useState } from 'react';
+ import React, { useContext, useMemo, useState, useEffect } from 'react';
const [signed, setSigned] = useState(false);
+
+// 账户或签入能力变更时重置本地签入态
+useEffect(() => {
+ if (!account || account.status !== ConnectStatus.Signed) {
+ setSigned(false);
+ }
+}, [account?.address, account?.status, sign?.signIn]);
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const [signed, setSigned] = useState(false); | |
import React, { useContext, useMemo, useState, useEffect } from 'react'; | |
… | |
const [signed, setSigned] = useState(false); | |
// 账户或签入能力变更时重置本地签入态 | |
useEffect(() => { | |
if (!account || account.status !== ConnectStatus.Signed) { | |
setSigned(false); | |
} | |
}, [account?.address, account?.status, sign?.signIn]); | |
… |
onSignInClick={() => { | ||
/* v8 ignore start */ | ||
if (!sign?.signIn) { | ||
return; | ||
} | ||
|
||
if (signed) { | ||
return; | ||
} | ||
|
||
if (account?.status === ConnectStatus.Signed) { | ||
setSigned(true); | ||
return; | ||
} | ||
|
||
// If account is not connected, we need to sign in | ||
// If account is connected but not signed, we also need to sign in | ||
if (account?.status === ConnectStatus.Connected && signed) { | ||
return; | ||
} | ||
|
||
/* v8 ignore stop */ | ||
|
||
// If account is not connected, we need to sign in | ||
// If account is connected but not signed, we also need to sign in | ||
if (account && needSign) { | ||
sign | ||
.signIn?.(account.address!) | ||
.then(() => { | ||
setSigned(true); | ||
}) | ||
.catch((error) => { | ||
messageApi.error(error.message); | ||
}); | ||
} | ||
}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
onSignInClick 分支复杂且缺少并发防抖;错误信息处理不够稳健
- 缺少“签入中”防重复点击保护,容易并发多次调用。
- 多处早退条件可收敛,逻辑更清晰。
- 错误提示建议兜底为字符串。
可按如下方式精简与防抖(保持 then/catch 以兼容现有类型):
- onSignInClick={() => {
+ onSignInClick={() => {
+ // 防抖:签入中直接忽略(新增 signing 状态,见上文建议在组件内 useState)
+ if (signing) return;
/* v8 ignore start */
if (!sign?.signIn) {
return;
}
if (signed) {
return;
}
if (account?.status === ConnectStatus.Signed) {
setSigned(true);
return;
}
- // If account is not connected, we need to sign in
- // If account is connected but not signed, we also need to sign in
if (account?.status === ConnectStatus.Connected && signed) {
return;
}
/* v8 ignore stop */
- // If account is not connected, we need to sign in
- // If account is connected but not signed, we also need to sign in
if (account && needSign) {
- sign
+ setSigning(true);
+ sign
.signIn?.(account.address!)
.then(() => {
setSigned(true);
})
.catch((error) => {
- messageApi.error(error.message);
+ const msg = (error && (error as any).message) || String(error);
+ messageApi.error(msg);
+ })
+ .finally(() => {
+ setSigning(false);
});
}
}}
并在上文 state 处补充:
- const [signed, setSigned] = useState(false);
+ const [signed, setSigned] = useState(false);
+ const [signing, setSigning] = useState(false);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
packages/common/src/types.ts (1)
155-155
: 建议补充禁用规则的原因说明。ESLint 禁用指令缺少具体的解释说明。根据最佳实践,应在注释中说明为何需要禁用此规则。
可以这样改进:
- // eslint-disable-next-line @typescript-eslint/ban-types + // eslint-disable-next-line @typescript-eslint/ban-types -- Allow string & {} pattern for autocomplete with custom strings key: 'Chrome' | 'Firefox' | 'Edge' | 'Safari' | (string & {});
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
packages/common/src/locale/en_US.ts
(1 hunks)packages/common/src/locale/zh_CN.ts
(1 hunks)packages/common/src/types.ts
(2 hunks)packages/web3/src/connect-button/connect-button-inner.tsx
(5 hunks)packages/web3/src/connect-button/index.md
(1 hunks)packages/web3/src/connect-button/index.zh-CN.md
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- packages/web3/src/connect-button/connect-button-inner.tsx
🧰 Additional context used
📓 Path-based instructions (1)
packages/web3/**
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
Keep project-wide styles and documentation under packages/web3
Files:
packages/web3/src/connect-button/index.md
packages/web3/src/connect-button/index.zh-CN.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: prepare preview
- GitHub Check: ci
- GitHub Check: ci
🔇 Additional comments (5)
packages/common/src/locale/en_US.ts (1)
12-12
: 变更符合预期!新增的
profile
本地化文本与类型定义保持一致,且文本清晰准确。packages/common/src/types.ts (1)
280-280
: 类型定义正确!新增的
profile
字段与本地化文件的变更保持一致。packages/common/src/locale/zh_CN.ts (1)
12-12
: 本地化文本恰当!中文翻译"我的资料"准确表达了 profile 的含义,与英文版本保持一致。
packages/web3/src/connect-button/index.md (1)
73-73
: API 文档更新正确!
onMenuItemClick
类型签名的更新使其与 Ant Design Menu 组件的onClick
保持一致,提高了类型的准确性和一致性。packages/web3/src/connect-button/index.zh-CN.md (1)
74-74
: 文档更新与英文版保持一致!中文 API 文档的更新与英文版本同步,正确反映了
onMenuItemClick
的类型变更。
# Conflicts: # pnpm-lock.yaml
f88cfbf
to
d5ac0f1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
packages/web3/src/connect-button/connect-button.tsx (2)
61-65
: 缺少在账号/签入能力变化时重置 signed,导致误判已签入
signed
只在成功签入后置为 true,从未在账号地址、账号状态或sign.signIn
发生变化时复位。若用户换钱包、状态从 Signed 退回 Connected,或 sign 功能被移除,signed
仍为 true,使后续onSignInClick
直接早退(Lines 205-212),无法触发必要的重新签入。请在account?.address
、account?.status
、sign?.signIn
等依赖变化时调用setSigned(false)
进行同步重置。
100-107
: 外层 onClick 再次触发 signIn,造成双重签名调用
buttonProps.onClick
在needSign
时直接执行sign.signIn
,而ConnectButtonInner
的onSignInClick
也会调用同一方法。这样一次点击会发出两次签名请求,既影响用户体验也可能导致串行/并发问题。请移除外层调用,改为仅由内层受控触发,并结合“签入中”状态做防抖。packages/web3/src/connect-button/connect-button-inner.tsx (1)
114-186
: useMemo 依赖列表缺失导致属性更新失效
buttonContent
使用useMemo
,却未将children
、restProps
、className
、intl
、getWalletIcon
、onSignInClick
等加入依赖。只要这些值变化(例如 loading/size 切换、国际化文案切换、回调替换),memo 化的元素就不会更新,按钮会继续使用旧配置。请补齐依赖或直接移除useMemo
,保证 UI 与行为与最新 props 保持一致。
♻️ Duplicate comments (2)
packages/web3/src/utils/__tests__/browser.test.ts (1)
16-22
: 过去的评审意见仍然有效:必须等待writeCopyText
完成。第 18 行调用
writeCopyText(test)
时仍然没有使用await
。虽然vi.waitFor
会轮询直到readCopyText()
返回预期值,但这并不能解决根本问题:
- 浮动的 Promise 可能导致未处理的 rejection 警告
writeCopyText
的返回值(Promise)被忽略,无法检测写入失败- 代码不够明确,不符合测试最佳实践
应用以下修复:
it('writeCopyText & readCopyText', async () => { const test = 'test copy text'; - writeCopyText(test); + await writeCopyText(test); await vi.waitFor(async () => { await expect(readCopyText()).resolves.toBe(test); }); });packages/web3/src/connect-button/__tests__/sign.test.tsx (1)
27-49
: 断言双重签入调用会固化实现缺陷该用例仍要求一次点击触发两次
signIn
(buttonProps 与 onSignInClick 各执行一次)。在修复组件避免重复签入后,此断言应更新为只调用一次(或至少toHaveBeenCalled()
)。请调整用例,确保行为符合单次签名的正确期望。
🧹 Nitpick comments (3)
packages/web3/src/token-select/__tests__/index.test.tsx (1)
34-45
: 此测试用例与前面的测试用例重复。更新为使用
options
属性后,此测试用例(第 34-45 行)与前面的测试用例(第 21-32 行)在功能上完全相同:两者都使用options={mockTokens}
渲染组件,打开下拉列表,并验证相同的内容。建议:
- 方案 1(推荐):删除此重复的测试用例。
- 方案 2:如果目的是测试向后兼容性,可以保留此测试但改用已弃用的
tokenList
属性,以确保旧 API 仍然有效。应用此 diff 删除重复的测试用例:
- it('should display correct token list when use options property', () => { - const { baseElement } = render(<TokenSelect options={mockTokens} />); - - fireEvent.mouseDown(baseElement.querySelector('.ant-select-selector') as Element); - - const selectOptions = baseElement.querySelectorAll('.ant-select-item'); - - expect(selectOptions.length).toBe(2); - - expect(selectOptions[0].textContent).includes('Ethereum'); - expect(selectOptions[1].textContent).includes('Tether USD'); - }); -packages/web3/src/nft-image/__tests__/index.test.tsx (1)
41-46
: 代码简化合理。移除
vi.waitFor
回调中的async
是正确的,因为回调内部只包含同步操作(DOM 查询和断言),不需要使用async/await
。这使代码更加简洁明了。packages/sui/src/sui-provider/__tests__/balance.test.tsx (1)
1-1
: 代码风格统一。将 React hooks 的使用方式从命名导入改为通过
React
命名空间访问(如React.useState
、React.useEffect
)是一个有效的风格选择,使代码风格更加一致。两种方式在功能上等价。Also applies to: 44-44, 58-58
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (9)
packages/icons/src/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/address/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-button/__tests__/__snapshots__/profile-modal.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-button/__tests__/__snapshots__/tooltip.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-modal/__tests__/__snapshots__/basic.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/connect-modal/__tests__/__snapshots__/simple.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/nft-image/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
packages/web3/src/web3-config-provider/__tests__/__snapshots__/index.test.tsx.snap
is excluded by!**/*.snap
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (33)
package.json
(2 hunks)packages/common/src/locale/en_US.ts
(1 hunks)packages/common/src/locale/zh_CN.ts
(1 hunks)packages/common/src/types.ts
(2 hunks)packages/common/src/utils/__tests__/request.test.ts
(1 hunks)packages/ethers-v5/src/hooks/use-ethers-provider.ts
(1 hunks)packages/ethers/src/hooks/use-ethers-provider.ts
(1 hunks)packages/solana/src/solana-provider/__tests__/connect.test.tsx
(1 hunks)packages/solana/src/solana-provider/__tests__/mobile-wallet-adapter.test.tsx
(1 hunks)packages/solana/src/solana-provider/__tests__/standard-wallet.test.tsx
(2 hunks)packages/solana/src/solana-provider/__tests__/wallet-connect.test.tsx
(2 hunks)packages/sui/src/sui-provider/__tests__/balance.test.tsx
(3 hunks)packages/ton/src/ton-provider/__tests__/sdk.test.tsx
(1 hunks)packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx
(12 hunks)packages/wagmi/src/wagmi-provider/config-provider.tsx
(2 hunks)packages/web3/src/address/__tests__/index.test.tsx
(1 hunks)packages/web3/src/browser-link/__tests__/index.test.tsx
(3 hunks)packages/web3/src/connect-button/__tests__/menu.test.tsx
(3 hunks)packages/web3/src/connect-button/__tests__/profile-modal.test.tsx
(2 hunks)packages/web3/src/connect-button/__tests__/sign.test.tsx
(1 hunks)packages/web3/src/connect-button/__tests__/tooltip.test.tsx
(3 hunks)packages/web3/src/connect-button/connect-button-inner.tsx
(5 hunks)packages/web3/src/connect-button/connect-button.tsx
(5 hunks)packages/web3/src/connect-button/index.md
(1 hunks)packages/web3/src/connect-button/index.zh-CN.md
(1 hunks)packages/web3/src/connect-button/interface.ts
(1 hunks)packages/web3/src/connect-button/style/index.ts
(1 hunks)packages/web3/src/connector/__tests__/basic.test.tsx
(6 hunks)packages/web3/src/ethereum/demos/siwe/index.tsx
(3 hunks)packages/web3/src/nft-image/__tests__/index.test.tsx
(1 hunks)packages/web3/src/theme/useStyle/index.ts
(3 hunks)packages/web3/src/token-select/__tests__/index.test.tsx
(1 hunks)packages/web3/src/utils/__tests__/browser.test.ts
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (9)
- packages/solana/src/solana-provider/tests/mobile-wallet-adapter.test.tsx
- packages/common/src/types.ts
- packages/ton/src/ton-provider/tests/sdk.test.tsx
- packages/web3/src/connect-button/tests/profile-modal.test.tsx
- packages/web3/src/browser-link/tests/index.test.tsx
- packages/web3/src/address/tests/index.test.tsx
- packages/web3/src/connector/tests/basic.test.tsx
- packages/common/src/locale/en_US.ts
- packages/ethers-v5/src/hooks/use-ethers-provider.ts
🧰 Additional context used
📓 Path-based instructions (3)
packages/web3/**
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
Keep project-wide styles and documentation under packages/web3
Files:
packages/web3/src/utils/__tests__/browser.test.ts
packages/web3/src/connect-button/index.md
packages/web3/src/connect-button/interface.ts
packages/web3/src/connect-button/index.zh-CN.md
packages/web3/src/connect-button/__tests__/sign.test.tsx
packages/web3/src/ethereum/demos/siwe/index.tsx
packages/web3/src/connect-button/__tests__/menu.test.tsx
packages/web3/src/nft-image/__tests__/index.test.tsx
packages/web3/src/connect-button/style/index.ts
packages/web3/src/connect-button/__tests__/tooltip.test.tsx
packages/web3/src/connect-button/connect-button.tsx
packages/web3/src/connect-button/connect-button-inner.tsx
packages/web3/src/token-select/__tests__/index.test.tsx
packages/web3/src/theme/useStyle/index.ts
**/__tests__/**
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
Place unit test code in tests folders
Files:
packages/web3/src/utils/__tests__/browser.test.ts
packages/solana/src/solana-provider/__tests__/connect.test.tsx
packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx
packages/sui/src/sui-provider/__tests__/balance.test.tsx
packages/common/src/utils/__tests__/request.test.ts
packages/web3/src/connect-button/__tests__/sign.test.tsx
packages/web3/src/connect-button/__tests__/menu.test.tsx
packages/solana/src/solana-provider/__tests__/wallet-connect.test.tsx
packages/web3/src/nft-image/__tests__/index.test.tsx
packages/solana/src/solana-provider/__tests__/standard-wallet.test.tsx
packages/web3/src/connect-button/__tests__/tooltip.test.tsx
packages/web3/src/token-select/__tests__/index.test.tsx
packages/web3/**/style/index.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/basic.mdc)
packages/web3/**/style/index.{ts,tsx}
: Place each component’s styles in style/index.ts or style/index.tsx within the component’s folder
Implement styles using @ant-design/cssinjs and Ant Design Design Tokens
Files:
packages/web3/src/connect-button/style/index.ts
🧠 Learnings (2)
📚 Learning: 2025-08-13T08:59:54.489Z
Learnt from: CR
PR: ant-design/ant-design-web3#0
File: .cursor/rules/basic.mdc:0-0
Timestamp: 2025-08-13T08:59:54.489Z
Learning: Use Vitest as the unit testing framework
Applied to files:
packages/web3/src/utils/__tests__/browser.test.ts
📚 Learning: 2025-08-13T08:59:54.489Z
Learnt from: CR
PR: ant-design/ant-design-web3#0
File: .cursor/rules/basic.mdc:0-0
Timestamp: 2025-08-13T08:59:54.489Z
Learning: Applies to packages/web3/**/style/index.{ts,tsx} : Implement styles using ant-design/cssinjs and Ant Design Design Tokens
Applied to files:
packages/web3/src/connect-button/style/index.ts
packages/web3/src/theme/useStyle/index.ts
🧬 Code graph analysis (10)
packages/web3/src/utils/__tests__/browser.test.ts (2)
packages/web3/src/utils/browser.ts (1)
writeCopyText
(20-22)packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx (2)
packages/web3/src/hooks/useProvider.ts (1)
useProvider
(20-23)packages/wagmi/src/wagmi-provider/config-provider.tsx (1)
AntDesignWeb3ConfigProvider
(48-306)
packages/common/src/utils/__tests__/request.test.ts (2)
packages/common/src/utils/test-utils.ts (1)
mockFetch
(1-10)packages/common/src/utils/request.ts (1)
requestWeb3Asset
(12-17)
packages/web3/src/connect-button/__tests__/sign.test.tsx (1)
packages/web3/src/connect-button/connect-button.tsx (1)
ConnectButton
(26-340)
packages/web3/src/ethereum/demos/siwe/index.tsx (1)
packages/web3/src/hooks/useProvider.ts (1)
useProvider
(20-23)
packages/web3/src/connect-button/__tests__/menu.test.tsx (1)
packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/web3/src/connect-button/__tests__/tooltip.test.tsx (1)
packages/web3/src/utils/test-utils.ts (1)
readCopyText
(3-6)
packages/web3/src/connect-button/connect-button.tsx (1)
packages/common/src/types.ts (1)
Wallet
(137-145)
packages/web3/src/connect-button/connect-button-inner.tsx (1)
packages/common/src/types.ts (1)
Wallet
(137-145)
packages/web3/src/token-select/__tests__/index.test.tsx (1)
packages/web3/src/token-select/index.tsx (1)
TokenSelect
(55-125)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: prepare preview
- GitHub Check: ci
- GitHub Check: ci
🔇 Additional comments (15)
packages/common/src/utils/__tests__/request.test.ts (1)
11-15
: LGTM!测试异步模式更新符合最佳实践。测试函数正确地转换为
async
函数,并在 Promise 匹配器 (.rejects
和.resolves
) 前使用await
。这种写法是 Vitest 推荐的现代异步测试模式,提升了代码可读性和一致性。测试逻辑保持不变:
- 第 14 行:验证空 URL 时抛出错误
- 第 15 行:验证成功请求返回预期结果
packages/solana/src/solana-provider/__tests__/connect.test.tsx (1)
331-333
: 优化:移除不必要的 async 关键字
vi.waitFor
回调函数中没有异步操作,移除async
关键字是正确的改进,使代码更简洁清晰。packages/solana/src/solana-provider/__tests__/standard-wallet.test.tsx (1)
138-140
: 优化:统一移除不必要的 async 关键字两处
vi.waitFor
回调函数都只包含同步的expect
断言,移除async
关键字使代码更规范。Also applies to: 195-200
packages/solana/src/solana-provider/__tests__/wallet-connect.test.tsx (1)
169-171
: 优化:统一移除不必要的 async 关键字三处
vi.waitFor
回调函数都只执行同步断言,移除async
关键字是正确的代码改进,提高了测试代码的可读性和准确性。Also applies to: 176-178, 209-211
packages/ethers/src/hooks/use-ethers-provider.ts (1)
6-6
: LGTM!覆盖率指令调整合理。将 v8 ignore 指令移至函数顶部统一管理是个好做法,简化了覆盖率配置。此更改仅影响测试覆盖率报告,不会改变运行时行为。
package.json (1)
81-81
: Vitest 版本升级合理。将
@vitest/coverage-v8
和vitest
升级到更新的版本与 PR 中的测试模式更改(如vi.waitFor
的使用)保持一致。补丁和小版本更新通常向后兼容。Also applies to: 99-99
packages/web3/src/connect-button/style/index.ts (1)
25-27
: 样式添加正确!为 badge 元素添加的右边距样式符合 Ant Design 设计规范,使用了
token.marginXS
实现了与其他组件一致的间距设计。此样式支持了新增的登录/个人资料 UI 功能。packages/web3/src/theme/useStyle/index.ts (2)
9-9
: 类型导入优化正确!使用 type-only 导入
ConnectModalComponentToken
符合 TypeScript 最佳实践,可以避免不必要的运行时代码,优化打包体积。
53-53
: 文档国际化改进良好!将注释从中文更新为英文提高了代码库的国际化一致性,便于更广泛的开发者理解和维护。
Also applies to: 59-59, 68-69
packages/web3/src/connect-button/interface.ts (1)
31-31
: 类型简化已正确实施!将
onMenuItemClick
的类型更改为MenuProps['onClick']
使 API 更加灵活,与 Ant Design 的 Menu 组件保持一致。此更改已在之前的审查中被标记为已处理,文档也已同步更新。packages/common/src/locale/zh_CN.ts (1)
12-12
: 本地化添加正确!新增的
profile: '我的资料'
翻译准确,支持新的个人资料 UI 功能,与英文版本的 locale 保持一致。packages/web3/src/connect-button/__tests__/tooltip.test.tsx (1)
123-127
: 测试异步处理改进正确!将
waitFor
回调改为异步函数,并使用await expect(readCopyText()).resolves.toBe(...)
模式正确处理了 Promise 断言。这确保了异步操作在waitFor
块内正确完成,符合现代测试最佳实践。Also applies to: 140-146, 163-169
packages/web3/src/connect-button/index.md (1)
73-73
: 文档更新正确!
onMenuItemClick
的类型描述已更新为MenuProps['onClick']
,与interface.ts
中的类型定义保持一致,修复了之前审查中指出的文档不一致问题。packages/web3/src/connect-button/index.zh-CN.md (1)
74-74
: 中文文档更新正确!中文文档中
onMenuItemClick
的类型描述已更新为MenuProps['onClick']
,与英文文档和代码实现保持一致,确保了多语言文档的准确性。packages/web3/src/connect-button/__tests__/menu.test.tsx (1)
56-60
: 测试异步处理改进一致!菜单测试中的异步处理更新与
tooltip.test.tsx
保持一致,正确使用了async waitFor
和await expect().resolves
模式来处理readCopyText()
等异步操作,提高了测试的可靠性。Also applies to: 101-107, 152-157
@yutingzhao1991 @LCJove 这个可以先看一下 |
💡 Background and solution
🔗 Related issue link
close #640
Summary by CodeRabbit
新功能
重大变更
UI/样式
测试 / 杂务