fix(voices): 配音库「配音素材」tab 补删除按钮 #1538
Reference in New Issue
Block a user
Delete Branch "fix/voice-material-tab-delete-btn"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
配音库页面第三个 tab「配音素材」的卡片纯展示无删除入口,上传错误的素材无法清理。
改动
MaterialVoiceTab卡片右上角 hover 显示 danger 删除按钮(DeleteOutlined,stopPropagation 防误触),对齐「我的克隆」tab 删除体验useMaterialDeletehook:Modal.confirm 二次确认(确定删除配音素材「xx」吗?删除后不可恢复)→deleteAsset,成功 toast「素材已删除」并 invalidatevoice-materials+assets/voice列表,失败 toast 报错voices.css补.vmat-card-actions/.vmat-card-action-btn样式(对齐 voice-materials.css),.vmat-card加position: relative验收
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #1538
⚠️ 问题(3个需要修改)
apps/web/src/pages/voices/hooks/useMaterialDelete.ts 第37行:冗余的查找逻辑与闭包陷阱风险
handleMaterialDelete接收的asset参数本身即为待删除对象,但代码却在传入的materials列表中再次执行find查找。这不仅逻辑冗余,还将materials列表加入了依赖项。当列表数据刷新时,handleMaterialDelete引用会变更,导致子组件不必要的重渲染。更严重的是,如果Modal.confirm弹窗期间列表数据发生了变化(如其他操作刷新了列表),闭包中的materials可能已过期,导致find返回undefined,从而静默取消删除操作。asset对象,移除materials参数及其依赖,删除find判断逻辑。apps/web/src/pages/voices/hooks/useMaterialDelete.ts 第24-28行:删除素材未同步停止播放状态
onSuccess回调,或者在VoiceLibrary.tsx中调用删除逻辑前先判断并停止播放。apps/web/src/pages/voices/VoiceLibrary.tsx 第74行:不安全的类型断言
materials as AssetItem[]进行强制类型转换。如果useVoicesData返回的数据结构与AssetItem不完全一致(例如缺少字段或类型不匹配),这种断言会掩盖类型错误,导致运行时访问属性时出现undefined错误。useVoicesData返回正确的类型,或使用运行时校验/类型守卫进行安全转换。💡 建议(1个可选)
28px * 28px。虽然 CSS 中针对触摸屏做了常驻显示处理,但 28px 的点击区域对于手指触摸来说偏小(建议至少 44x44px)。建议增加按钮的padding或使用伪元素扩大点击热区,提升移动端体验。❌ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-08-29 07:03:42 | 模型:
🗑️ 预览环境已清理
PR #1538 已关闭或合并,对应的预览环境已被清理。