fix(voice): 修复克隆音色弹窗「选文件无反应」死锁(isSubmittingRef 三处误用) #1541

Merged
auto-approve-bot merged 2 commits from fix/clone-modal-submit-lock into develop 2026-08-29 17:36:01 +08:00
Owner

背景

克隆音色弹窗:打开后上传/选择音频无任何反应、无提示。浏览器实测确认。

根因

isSubmittingRefhandleSubmit 的提交防重入锁,但被错误写进了三处不该用的地方:

  1. resetState(弹窗 open 时 useEffect 调用):上锁后永不复位 → 弹窗每次打开即死锁
  2. handleFileChange else 分支(文件校验通过后):检查到锁直接 return → 选文件被静默拦截
  3. handleDrop else 分支:同上,拖拽也被拦截

且这三处上锁后都没有解锁路径。

改动(仅 CloneModal/index.tsx,删 6 行)

  • 三处删除 if (isSubmittingRef.current) return + isSubmittingRef.current = true
  • handleSubmit 内锁逻辑保持原样(入口上锁、成功/catch 复位)
  • isMountedRef、OSS 直传链路、useAudioRecorder 均不动

验收

  • 打开克隆弹窗 → 点击上传选音频 → 选中后文件正常显示
  • 拖拽音频文件正常
  • 提交防重入仍生效(提交中重复点击无效)
## 背景 克隆音色弹窗:打开后上传/选择音频无任何反应、无提示。浏览器实测确认。 ## 根因 `isSubmittingRef` 是 `handleSubmit` 的提交防重入锁,但被错误写进了三处不该用的地方: 1. `resetState`(弹窗 open 时 useEffect 调用):上锁后**永不复位** → 弹窗每次打开即死锁 2. `handleFileChange` else 分支(文件校验通过后):检查到锁直接 return → 选文件被静默拦截 3. `handleDrop` else 分支:同上,拖拽也被拦截 且这三处上锁后都没有解锁路径。 ## 改动(仅 CloneModal/index.tsx,删 6 行) - 三处删除 `if (isSubmittingRef.current) return` + `isSubmittingRef.current = true` - `handleSubmit` 内锁逻辑保持原样(入口上锁、成功/catch 复位) - isMountedRef、OSS 直传链路、useAudioRecorder 均不动 ## 验收 - 打开克隆弹窗 → 点击上传选音频 → 选中后文件正常显示 - 拖拽音频文件正常 - 提交防重入仍生效(提交中重复点击无效)
xiaoxia added 1 commit 2026-08-29 17:10:56 +08:00
fix(voice): 修复克隆音色弹窗选文件无反应死锁——移除三处误用的提交锁
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (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 / Check if frontend-only change (pull_request) Successful in 2m50s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m25s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m29s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m51s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m9s
AI Code Review / AI Code Review (pull_request) Failing after 4m25s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m40s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m53s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m13s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m22s
CI/CD Pipeline / Integration 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 Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (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 26s
1c4eeb3e33
isSubmittingRef 是 handleSubmit 的防重入锁,被错误写进 resetState、
handleFileChange else、handleDrop else:
- resetState 在弹窗打开时执行,上锁后永不复位 → 弹窗一开即死锁
- 选文件/拖拽文件校验通过后先检查锁并 return → 文件被静默拦截
且这三处上锁后都没有对应解锁路径。

移除这三对误用语句;handleSubmit 内的上锁/成功·catch 复位逻辑保持原样。
isMountedRef、OSS 直传、useAudioRecorder 均不动。

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1541 | | 预览链接 | [https://pr-1541.preview.xiaoxiajianji.com](https://pr-1541.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-08-29 17:16:03 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-29 17:16:03 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-29 17:25:56 +08:00
docs(voice): CloneModal 补充提交锁边界注释(回应 AI review)
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m26s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2m42s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m42s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m6s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m7s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m32s
AI Code Review / AI Code Review (pull_request) Successful in 4m28s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m16s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m24s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m16s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m31s
CI/CD Pipeline / Integration 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 Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (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 25s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 3m9s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 4m30s
81fac3a6e8
文件选择/拖拽/弹窗重置均为同步 state 操作无异步竞态,防重入只属于
handleSubmit(isSubmittingRef + isProcessing 双保险);
resetState 此前上锁且无复位路径导致弹窗打开即死锁,故不设锁。
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:0 个

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

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

良好实践

  1. 精准修复死锁Bug:准确识别出 isSubmittingRefresetState 中被错误设置且无复位路径导致弹窗死锁的问题,将锁的作用域严格收窄至 handleSubmit,逻辑修复正确。
  2. 注释详尽:添加的注释清晰地解释了锁的职责边界以及修改原因,这对于维护复杂的状态逻辑非常有帮助。

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-08-29 09:30:23 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:0 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 无 ### ✅ 良好实践 1. **精准修复死锁Bug**:准确识别出 `isSubmittingRef` 在 `resetState` 中被错误设置且无复位路径导致弹窗死锁的问题,将锁的作用域严格收窄至 `handleSubmit`,逻辑修复正确。 2. **注释详尽**:添加的注释清晰地解释了锁的职责边界以及修改原因,这对于维护复杂的状态逻辑非常有帮助。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-29 09:30:23 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit f327171e9b into develop 2026-08-29 17:36:01 +08:00
auto-approve-bot deleted branch fix/clone-modal-submit-lock 2026-08-29 17:36:01 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1541 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.