Skip to content

Conversation

gin-lsl
Copy link
Collaborator

@gin-lsl gin-lsl commented Jun 25, 2025

💡 Background and solution

🔗 Related issue link

close #640

Summary by CodeRabbit

  • 新功能

    • ConnectButton 支持登录流程:needSign 徽章提示、下拉菜单(个人资料/断开连接)及回调(onSignInClick/onOpenProfileClick/onDisconnectClick)。
    • 提供端点暴露 signOut,用于登出操作。
    • 增加 ConnectButton locale 文案键:profile。
  • 重大变更

    • ConnectButton 菜单点击回调类型对齐为 Menu onClick(文档与类型更新)。
    • TokenSelect 测试示例改用 options 属性。
  • UI/样式

    • 徽章右侧间距新增;needSign 时显示错误状态徽章。
  • 测试 / 杂务

    • 大量测试调整为 async/await、等待时机改写及 mock 更新;升级测试工具相关依赖与覆盖率插件。

Copy link

changeset-bot bot commented Jun 25, 2025

🦋 Changeset detected

Latest commit: fa42cd9

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 15 packages
Name Type
@ant-design/web3-common Minor
@ant-design/web3-wagmi Minor
@ant-design/web3 Minor
@ant-design/web3-assets Patch
@ant-design/web3-bitcoin Patch
@ant-design/web3-eth-web3js Patch
@ant-design/web3-ethers-v5 Patch
@ant-design/web3-ethers Patch
@ant-design/web3-solana Patch
@ant-design/web3-sui Patch
@ant-design/web3-ton Patch
@ant-design/web3-tron Patch
@example/eth-web3js Patch
@example/ethers-v5 Patch
@example/ethers Patch

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

Copy link

vercel bot commented Jun 25, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
ant-design-web3 Ready Ready Preview Comment Oct 15, 2025 10:08am

Copy link

github-actions bot commented Jun 25, 2025

Preview is ready

Copy link

coderabbitai bot commented Jun 25, 2025

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

升级 vitest 相关开发依赖;大量测试用例中 async/await 与 vi.waitFor 用法规范化;为 wagmi provider 暴露并测试 signOut;扩展 ConnectButton/Inner 支持 needSign、签入/个人资料/断开回调、Badge、样式、类型与本地化;若干示例、注释与文档调整。

Changes

Cohort / File(s) Summary
Dev deps bump
package.json
升级 @vitest/coverage-v8vitest 开发依赖版本。
Locale 增添
packages/common/src/locale/en_US.ts, packages/common/src/locale/zh_CN.ts
为 ConnectButton 添加 profile 本地化条目(英/中)。
ConnectButton 行为与样式扩展
packages/web3/src/connect-button/connect-button.tsx, packages/web3/src/connect-button/connect-button-inner.tsx, packages/web3/src/connect-button/style/index.ts, packages/web3/src/connect-button/interface.ts, packages/web3/src/connect-button/index.md, packages/web3/src/connect-button/index.zh-CN.md
新增 props: needSign?, onDisconnectClick?, onOpenProfileClick?, onSignInClick?;引入 internal signed 状态与 Badge 显示;在 needSign 模式下渲染带 Profile/Disconnect 菜单的 Dropdown.Button;样式增加 badge 间距;文档与类型将 onMenuItemClick 改为 MenuProps['onClick']
Wagmi: signOut 暴露与测试
packages/wagmi/src/wagmi-provider/config-provider.tsx, packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx, packages/web3/src/ethereum/demos/siwe/index.tsx
在 provider 的 sign 对象中新增 signOut 并补充测试与示例按钮(Demo 中展示条件渲染 Sign Out)。
测试 async/waitFor 与断言规范化
多个测试文件(示例:packages/common/src/utils/__tests__/request.test.ts, packages/ton/src/ton-provider/__tests__/sdk.test.tsx, packages/web3/src/utils/__tests__/browser.test.ts, packages/web3/src/address/__tests__/index.test.tsx, packages/web3/src/nft-image/__tests__/index.test.tsx, packages/web3/src/connect-button/__tests__/*, packages/solana/src/solana-provider/__tests__/*, packages/wagmi/src/wagmi-provider/__tests__/siwe.test.tsx, ...)
将若干顶层测试或 vi.waitFor 回调在 async/sync 之间调整以正确 await Promise 断言,或把 waitFor 回调从 async -> 同步以匹配断言语义,统一异步断言风格。
示例/类型注释/小改动
packages/web3/src/connector/__tests__/basic.test.tsx, packages/web3/src/theme/useStyle/index.ts, packages/common/src/types.ts, packages/ethers*/src/hooks/use-ethers-provider.ts, packages/web3/src/token-select/__tests__/index.test.tsx, ...
新增 FakeButton 测试助手并使用 ConnectButtonProps 类型;将若干导入改为 type-only 或使用 React.命名空间;调整 v8-ignore 注释位置(非功能性);文档注释改为英文;测试参数变更(TokenSelect 等)。
Changeset
.changeset/blue-games-live.md
新增 changeset,说明 minor 版本变更与 feature: support sign and unsign。

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
Loading
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: 完成
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

小兔跳到连接旁,
红点提示未签章。
下拉分路资料放,
一键断连云自凉。
测试整齐草更香。 🐇✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Out of Scope Changes Check ⚠️ Warning 该 PR 包含了大量与新增断连状态无关的依赖升级和测试用例重构改动,如多处 vitest waitFor 回调签名调整及其他模块的测试样式更新,影响范围远超 #640 目标。 建议将与断连状态无关的测试重构和依赖版本更新拆分到独立 PR,仅保留与断连状态功能相关的改动,以提高审查效率并聚焦核心需求。
Title Check ❓ Inconclusive 标题“feat: Add unsign status”虽提到新增“unsign”状态,但该术语不够常见且不直观,审阅者难以第一时间理解实际新增的断连状态和红点提示功能核心。 建议将标题修改为更具描述性的表述,例如“feat: 增加断开连接红点提示”或“feat: 支持断连状态指示”,以便一目了然地传达主要改动内容。
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues Check ✅ Passed 本次 PR 在 ConnectButton 组件中新增 needSign 属性并使用 Badge 展示红点断连状态,同时在 wagmi 配置、文档与演示示例中暴露并演示了 signOut 功能,完全满足 #640 中对断开后异常状态提示和视觉指示的需求。
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gin-lsl
Copy link
Collaborator Author

gin-lsl commented Jun 25, 2025

Demo: Ethereum - SIWE

Copy link

codecov bot commented Oct 9, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (4c58121) to head (06b2714).

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@gin-lsl gin-lsl marked this pull request as ready for review October 10, 2025 07:45
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Oct 10, 2025
@dosubot dosubot bot added the feature Independent new features label Oct 10, 2025
@coderabbitai coderabbitai bot added lgtm This PR has been approved by a maintainer size:L This PR changes 100-499 lines, ignoring generated files. labels Oct 10, 2025
Copy link

@coderabbitai coderabbitai bot left a 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')

建议移除此测试用例以减少代码重复,或者调整测试重点以验证不同的行为(例如,如果需要对比 tokenListoptions 的行为差异,可以保留一个使用已弃用 tokenList 属性的测试)。

packages/web3/src/ethereum/demos/siwe/index.tsx (1)

20-47: 建议显式指定 Space 的方向属性。

DisconnectBtn 组件的实现逻辑正确,使用 hooks 获取 disconnectsign 功能是更清晰的模式。可选链式调用 (?.) 的使用也很安全。

不过,Space 组件默认是水平布局,建议显式指定 direction="horizontal" 以提高代码可读性和维护性,避免依赖隐式默认值。

应用此差异以显式指定方向:

-    <Space>
+    <Space direction="horizontal">
       <Button
packages/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 中使用了 onConnectClickintl,但依赖列表仅有 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 的风险

菜单项的 onClicksetItems 时已经闭包绑定 onConnectClick,但外层变更不会刷新 items(除非 availableWallets/showQuickConnect 变化)。上文已建议把 onConnectClick 纳入依赖;或在此函数入参显式传递并在依赖中声明。

onConnectClick 纳入 useEffect 依赖或在 generateQuickConnectItems 参数中传入,确保回调最新。

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bc42189 and e4a1a92.

⛔ 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 最佳实践,能够在编译时优化包体积。新增的 useConnectionuseProvider 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.useStateReact.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: 测试逻辑清晰正确。

在有额外菜单项的场景下,正确验证了自定义菜单项和默认复制地址功能都能正常工作。

Comment on lines +27 to +50
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);
});
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

测试将“双次调用 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);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

本地 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.

Suggested change
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]);

Comment on lines +199 to +234
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);
});
}
}}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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);

@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. size:XXL This PR changes 1000+ lines, ignoring generated files. labels Oct 10, 2025
@coderabbitai coderabbitai bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Oct 10, 2025
@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. size:XXL This PR changes 1000+ lines, ignoring generated files. labels Oct 10, 2025
Copy link

@coderabbitai coderabbitai bot left a 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

📥 Commits

Reviewing files that changed from the base of the PR and between e4a1a92 and 070b5a0.

📒 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 的类型变更。

Copy link

@coderabbitai coderabbitai bot left a 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?.addressaccount?.statussign?.signIn 等依赖变化时调用 setSigned(false) 进行同步重置。


100-107: 外层 onClick 再次触发 signIn,造成双重签名调用

buttonProps.onClickneedSign 时直接执行 sign.signIn,而 ConnectButtonInneronSignInClick 也会调用同一方法。这样一次点击会发出两次签名请求,既影响用户体验也可能导致串行/并发问题。请移除外层调用,改为仅由内层受控触发,并结合“签入中”状态做防抖。

packages/web3/src/connect-button/connect-button-inner.tsx (1)

114-186: useMemo 依赖列表缺失导致属性更新失效

buttonContent 使用 useMemo,却未将 childrenrestPropsclassNameintlgetWalletIcononSignInClick 等加入依赖。只要这些值变化(例如 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() 返回预期值,但这并不能解决根本问题:

  1. 浮动的 Promise 可能导致未处理的 rejection 警告
  2. writeCopyText 的返回值(Promise)被忽略,无法检测写入失败
  3. 代码不够明确,不符合测试最佳实践

应用以下修复:

   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.useStateReact.useEffect)是一个有效的风格选择,使代码风格更加一致。两种方式在功能上等价。

Also applies to: 44-44, 58-58

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f88cfbf and d5ac0f1.

⛔ 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-v8vitest 升级到更新的版本与 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 waitForawait expect().resolves 模式来处理 readCopyText() 等异步操作,提高了测试的可靠性。

Also applies to: 101-107, 152-157

@gin-lsl
Copy link
Collaborator Author

gin-lsl commented Oct 15, 2025

@yutingzhao1991 @LCJove 这个可以先看一下

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Independent new features lgtm This PR has been approved by a maintainer size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add connect and disconnect status

1 participant