refactor(generate): 拆分 useStep2Materials Hook(205→79行, -61%) #1063

Closed
xiaoxia wants to merge 4 commits from refactor/use-step2-materials into develop
Owner
No description provided.
xiaoxia added 2 commits 2026-07-28 10:25: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%)

保持导出签名向后兼容
refactor(generate): 拆分 useStep2Materials Hook
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 14s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m10s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m4s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 57s
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 3m5s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 2m25s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m16s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 38s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 50s
AI Code Review / AI Code Review (pull_request) Successful in 3m52s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 46m18s
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
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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 10s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
98cb613f82
三阶段重构:
- Phase 1: 拆分为 2 个子 Hook
  - useMaterialLibrary: 素材库加载(库列表 + 选中库 + 素材列表)
  - useSmartMatch: 智能素材匹配(AI匹配/换一批/全选/清空)
- Phase 2: 主 Hook 组合子 Hook + 手动选择逻辑
- Phase 3: 主文件 205→79 行(-61%)

保持导出签名向后兼容
xiaoxia added 1 commit 2026-07-28 12:48:19 +08:00
fix(useStep2Materials): 修复继承的useCloneFormState路径问题
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 52s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m10s
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 - Type Check (mypy) (pull_request) Successful in 2m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m16s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 3m7s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m19s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m6s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m21s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m22s
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 / Frontend Unit Tests (pull_request) Failing after 24s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m52s
AI Code Review / AI Code Review (pull_request) Successful in 5m19s
CI/CD Pipeline / Integration Tests (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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1m3s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 13m2s
242d46359b
auto-approve-bot approved these changes 2026-07-28 12:58:33 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1063 | | 预览链接 | [https://pr-1063.preview.xiaoxiajianji.com](https://pr-1063.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-07-28 13:06:38 +08:00
test(generate): 补充Step2Materials拆分说明注释
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 28s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m37s
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 - Type Check (mypy) (pull_request) Successful in 2m15s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m45s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m8s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m11s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m0s
AI Code Review / AI Code Review (pull_request) Failing after 2m2s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m10s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 26s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 39s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m53s
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 / Frontend Unit Tests (pull_request) Successful in 21s
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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 23s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 7m10s
d9a6808d24
xiaoxia closed this pull request 2026-07-28 13:10:11 +08:00
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:是
  • 阻塞级问题数量:1 个

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:3 个

🔴 阻塞级问题(必须修复)

  1. [apps/web/src/components/voice/hooks/useCloneSubmit.ts: 88] 异步操作竞态条件导致回调泄漏
    • 问题类型:逻辑bug
    • 问题描述:在 handleSubmit 中设置了 2 秒的定时器来调用 onSuccessonClose。如果用户在定时器触发前手动关闭了弹窗(调用 handleClose),定时器并不会被清除。这会导致 2 秒后 onSuccess 仍然被执行。如果 onSuccess 包含页面跳转或 Toast 提示,会在用户已取消操作后触发,造成用户体验混乱或逻辑错误。
    • 修改建议:需要在 useCloneSubmit 中暴露一个 cancelreset 函数,或者在 onClose 被调用时能够清理定时器。由于当前架构 useCloneSubmituseCloneFormState 是分离的,建议将 timerRef 的清理逻辑通过 useEffect 监听 open 状态(如果传入)或者修改 onClose 的调用方式确保清理。最简单的修复是在 useCloneSubmit 内部增加一个 cleanup 函数并返回给父组件,在父组件的 handleClose 中调用它。

💡 改进建议(不阻塞合并)

  1. [apps/web/src/components/voice/hooks/useCloneSubmit.ts: 66] 非空断言使用风险

    • 具体内容:代码使用了 recordedBlob! 进行非空断言。虽然前面有 validateForm 检查,但在异步流中,依赖隐式断言存在隐患。建议改为显式检查或抛出错误,例如:if (!recordedBlob) throw new Error('No recorded blob found');
  2. [apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts: 80] 智能匹配边界条件处理不足

    • 具体内容:在 handleRefreshMatch 中,当剩余素材不足时,会返回空数组,用户会看到列表突然变空且没有提示。建议增加判断:如果 remaining.length === 0,则重置 smartMatchedResults(允许循环选择)或者提示用户“已展示所有素材”。
  3. [apps/web/src/components/voice/hooks/useCloneModal.ts: 45-62] Hook 返回值引用稳定性

    • 具体内容:useCloneModal 每次渲染都返回一个新的对象字面量。这会导致使用该 Hook 的组件在每次父组件渲染时都发生不必要的重渲染。建议使用 useMemo 包裹返回对象,或直接将两个子 Hook 的返回值平铺返回(如果组件能解构接收)。

良好实践

  • 代码拆分逻辑清晰,将表单状态、提交逻辑、素材库逻辑和智能匹配逻辑进行了有效的解耦,提高了代码的可维护性和复用性。
  • useMaterialLibrary 中利用 enabled 选项控制 Query 的执行,避免了不必要的请求。
  • useCloneFormState 中的 resetState 逻辑封装得当,利用 useEffect 响应 open 状态进行自动重置,符合 React 模式。

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

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:1 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:3 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/components/voice/hooks/useCloneSubmit.ts: 88] 异步操作竞态条件导致回调泄漏** - 问题类型:逻辑bug - 问题描述:在 `handleSubmit` 中设置了 2 秒的定时器来调用 `onSuccess` 和 `onClose`。如果用户在定时器触发前手动关闭了弹窗(调用 `handleClose`),定时器并不会被清除。这会导致 2 秒后 `onSuccess` 仍然被执行。如果 `onSuccess` 包含页面跳转或 Toast 提示,会在用户已取消操作后触发,造成用户体验混乱或逻辑错误。 - 修改建议:需要在 `useCloneSubmit` 中暴露一个 `cancel` 或 `reset` 函数,或者在 `onClose` 被调用时能够清理定时器。由于当前架构 `useCloneSubmit` 和 `useCloneFormState` 是分离的,建议将 `timerRef` 的清理逻辑通过 `useEffect` 监听 `open` 状态(如果传入)或者修改 `onClose` 的调用方式确保清理。最简单的修复是在 `useCloneSubmit` 内部增加一个 `cleanup` 函数并返回给父组件,在父组件的 `handleClose` 中调用它。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/components/voice/hooks/useCloneSubmit.ts: 66] 非空断言使用风险** - 具体内容:代码使用了 `recordedBlob!` 进行非空断言。虽然前面有 `validateForm` 检查,但在异步流中,依赖隐式断言存在隐患。建议改为显式检查或抛出错误,例如:`if (!recordedBlob) throw new Error('No recorded blob found');`。 2. **[apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts: 80] 智能匹配边界条件处理不足** - 具体内容:在 `handleRefreshMatch` 中,当剩余素材不足时,会返回空数组,用户会看到列表突然变空且没有提示。建议增加判断:如果 `remaining.length === 0`,则重置 `smartMatchedResults`(允许循环选择)或者提示用户“已展示所有素材”。 3. **[apps/web/src/components/voice/hooks/useCloneModal.ts: 45-62] Hook 返回值引用稳定性** - 具体内容:`useCloneModal` 每次渲染都返回一个新的对象字面量。这会导致使用该 Hook 的组件在每次父组件渲染时都发生不必要的重渲染。建议使用 `useMemo` 包裹返回对象,或直接将两个子 Hook 的返回值平铺返回(如果组件能解构接收)。 ### ✅ 良好实践 - 代码拆分逻辑清晰,将表单状态、提交逻辑、素材库逻辑和智能匹配逻辑进行了有效的解耦,提高了代码的可维护性和复用性。 - `useMaterialLibrary` 中利用 `enabled` 选项控制 Query 的执行,避免了不必要的请求。 - `useCloneFormState` 中的 `resetState` 逻辑封装得当,利用 `useEffect` 响应 `open` 状态进行自动重置,符合 React 模式。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 05:15:06 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1063 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 28s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m37s
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 - Type Check (mypy) (pull_request) Successful in 2m15s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m45s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m8s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m11s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m0s
AI Code Review / AI Code Review (pull_request) Failing after 2m2s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m10s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 26s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 39s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m53s
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 / Frontend Unit Tests (pull_request) Successful in 21s
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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 23s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 7m10s

Pull request closed

Sign in to join this conversation.