refactor(voice): 拆分 useCloneModal Hook(215→46行, -79%) #1062

Closed
xiaoxia wants to merge 3 commits from refactor/use-clone-modal into develop
Owner
No description provided.
xiaoxia added 1 commit 2026-07-28 10:22:42 +08:00
refactor(voice): 拆分 useCloneModal Hook
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 18s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m44s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 57s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 58s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 48s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m57s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 2m21s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m16s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 36s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 50s
AI Code Review / AI Code Review (pull_request) Successful in 6m41s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 14s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 46m20s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 21s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
399b1af7ee
三阶段重构:
- Phase 1: 拆分为 2 个子 Hook
  - useCloneFormState: 表单状态管理(字段/录音/文件/验证)
  - useCloneSubmit: 克隆提交流程(上传→克隆→完成)
- Phase 2: 主 Hook 组合子 Hook
- Phase 3: 主文件 215→46 行(-79%)

保持导出签名向后兼容
xiaoxia added 1 commit 2026-07-28 12:45:15 +08:00
fix(useCloneModal): 修复useCloneFormState相对路径层级错误
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 36s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m32s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m22s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m51s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m45s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m13s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m14s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m31s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m0s
AI Code Review / AI Code Review (pull_request) Failing after 2m17s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 7m49s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 37s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Successful in 45s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 17m0s
5648ccbd76
auto-approve-bot approved these changes 2026-07-28 12:54:47 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-28 12:54:48 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。

🚀 预览环境已部署

项目 详情
PR号 #1062
预览链接 https://pr-1062.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1062 | | 预览链接 | [https://pr-1062.preview.xiaoxiajianji.com](https://pr-1062.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-07-28 13:04:23 +08:00
test(CloneModal): 补充Hook拆分说明注释
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 41s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m43s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m52s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 3m1s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m14s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m39s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 45s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m25s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m28s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m4s
AI Code Review / AI Code Review (pull_request) Successful in 5m16s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 8m18s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 44s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 17s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 11m31s
1b2b65506d
xiaoxia closed this pull request 2026-07-28 13:10:11 +08:00
Collaborator

代码审查结果 - PR #1062

⚠️ 问题(1个需要修改)

  1. apps/web/src/components/voice/hooks/useCloneFormState.ts 第60行resetState 依赖导致的计数器双重递增逻辑错误
    • 问题描述useEffect 监听 open 变化时会调用 resetState,而 handleClose(通常在关闭弹窗时调用)内部也调用了 resetStateresetState 内部会调用 getNextDefaultName() 递增计数器。这导致每次“打开-关闭”周期,计数器会增加 2 次(例如:打开显示“我的声音 1”,关闭后再打开显示“我的声音 3”)。
    • 后果:默认名称序号不连续,跳过数字,虽然不影响核心功能但属于明显的逻辑错误。
    • 修改建议:调整逻辑,仅在弹窗真正“打开”时生成新名称。可以将 getNextDefaultName() 的调用从 resetState 中移除,仅在 useEffectif (open) 分支中显式调用 setVoiceName(getNextDefaultName()),或者修改 handleClose 使其仅清理数据而不生成新名称。

💡 建议(2个可选)

  1. apps/web/src/components/voice/hooks/useCloneFormState.ts 第60行useEffect 依赖项存在潜在的无限循环风险
    • 具体内容useEffect 的依赖数组包含了 resetState,而 resetState 依赖于 resetRecording(来自 useAudioRecorder)。如果 useAudioRecorder 返回的 resetRecording 引用不稳定(每次渲染都变化),会导致 useEffectopen=true 时不断触发 resetState,进而导致组件不断重渲染甚至死循环。建议确保 useAudioRecorder 对返回函数进行了正确的 useCallback 包装,或者此处使用 useRef 来存储 resetState 的最新引用以打破依赖循环。
  2. apps/web/src/components/voice/hooks/useCloneSubmit.ts 第68行:定时器清理逻辑依赖于组件卸载
    • 具体内容:当前代码在 useEffect 的 cleanup 函数中清理定时器,这意味着只有在组件卸载时定时器才会被清除。如果父组件通过控制 open 属性来隐藏弹窗而保持组件挂载,用户手动关闭弹窗后,2秒后的定时器仍会触发,导致 onSuccessonClose 被重复调用。建议在 handleCloseopen 变化时也主动清理定时器。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 05:14:01 | 模型:

## 代码审查结果 - PR #1062 ### ⚠️ 问题(1个需要修改) 1. **apps/web/src/components/voice/hooks/useCloneFormState.ts 第60行**:`resetState` 依赖导致的计数器双重递增逻辑错误 - **问题描述**:`useEffect` 监听 `open` 变化时会调用 `resetState`,而 `handleClose`(通常在关闭弹窗时调用)内部也调用了 `resetState`。`resetState` 内部会调用 `getNextDefaultName()` 递增计数器。这导致每次“打开-关闭”周期,计数器会增加 2 次(例如:打开显示“我的声音 1”,关闭后再打开显示“我的声音 3”)。 - **后果**:默认名称序号不连续,跳过数字,虽然不影响核心功能但属于明显的逻辑错误。 - **修改建议**:调整逻辑,仅在弹窗真正“打开”时生成新名称。可以将 `getNextDefaultName()` 的调用从 `resetState` 中移除,仅在 `useEffect` 的 `if (open)` 分支中显式调用 `setVoiceName(getNextDefaultName())`,或者修改 `handleClose` 使其仅清理数据而不生成新名称。 ### 💡 建议(2个可选) 1. **apps/web/src/components/voice/hooks/useCloneFormState.ts 第60行**:`useEffect` 依赖项存在潜在的无限循环风险 - **具体内容**:`useEffect` 的依赖数组包含了 `resetState`,而 `resetState` 依赖于 `resetRecording`(来自 `useAudioRecorder`)。如果 `useAudioRecorder` 返回的 `resetRecording` 引用不稳定(每次渲染都变化),会导致 `useEffect` 在 `open=true` 时不断触发 `resetState`,进而导致组件不断重渲染甚至死循环。建议确保 `useAudioRecorder` 对返回函数进行了正确的 `useCallback` 包装,或者此处使用 `useRef` 来存储 `resetState` 的最新引用以打破依赖循环。 2. **apps/web/src/components/voice/hooks/useCloneSubmit.ts 第68行**:定时器清理逻辑依赖于组件卸载 - **具体内容**:当前代码在 `useEffect` 的 cleanup 函数中清理定时器,这意味着只有在组件卸载时定时器才会被清除。如果父组件通过控制 `open` 属性来隐藏弹窗而保持组件挂载,用户手动关闭弹窗后,2秒后的定时器仍会触发,导致 `onSuccess` 和 `onClose` 被重复调用。建议在 `handleClose` 或 `open` 变化时也主动清理定时器。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 05:14:01 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🗑️ 预览环境已清理

PR #1062 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1062 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 41s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m43s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m52s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 3m1s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m14s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m39s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 45s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m25s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m28s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m4s
AI Code Review / AI Code Review (pull_request) Successful in 5m16s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 8m18s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 44s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 17s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 11m31s

Pull request closed

Sign in to join this conversation.