refactor: VoiceMaterialLibrary Phase 1 - 抽离类型/常量/工具函数 #846

Merged
xiaoxia merged 4 commits from refactor/voice-material-library-phase1 into develop 2026-07-24 23:57:24 +08:00
Owner

VoiceMaterialLibrary 拆分 Phase 1

第二个巨无霸页面 VoiceMaterialLibrary(1966行)拆分启动。Phase 1 纯抽离,零逻辑变化。

改动内容

  • types.ts:类型定义 + 数据映射函数(mapAssetToMaterial / buildMetadata)
  • constants.tsx:常量 + 性别选项配置
  • utils/format.ts:格式化工具函数(genderLabel/genderIcon/genderClass/formatDuration/formatFileSize/formatDate)
  • utils/audio.ts:音频工具函数(getAudioDuration)
  • 主文件清理未使用的 icon import

行数变化

  • 主文件:1966 → 1854 行(-112行, -5.7%
  • 新增文件:5个

后续Phase

  • Phase 2:抽离4个内联子组件(TagSelector/MaterialForm/VoiceMaterialCard/VoiceMaterialRow)
  • Phase 3:业务逻辑抽Hook(素材/播放器/批量操作/TTS)
  • Phase 4:UI组件细化(工具栏/弹窗/空状态等)
## VoiceMaterialLibrary 拆分 Phase 1 第二个巨无霸页面 VoiceMaterialLibrary(1966行)拆分启动。Phase 1 纯抽离,零逻辑变化。 ### 改动内容 - `types.ts`:类型定义 + 数据映射函数(mapAssetToMaterial / buildMetadata) - `constants.tsx`:常量 + 性别选项配置 - `utils/format.ts`:格式化工具函数(genderLabel/genderIcon/genderClass/formatDuration/formatFileSize/formatDate) - `utils/audio.ts`:音频工具函数(getAudioDuration) - 主文件清理未使用的 icon import ### 行数变化 - 主文件:1966 → 1854 行(**-112行, -5.7%**) - 新增文件:5个 ### 后续Phase - Phase 2:抽离4个内联子组件(TagSelector/MaterialForm/VoiceMaterialCard/VoiceMaterialRow) - Phase 3:业务逻辑抽Hook(素材/播放器/批量操作/TTS) - Phase 4:UI组件细化(工具栏/弹窗/空状态等)
xiaoxia added 1 commit 2026-07-24 20:32:27 +08:00
refactor: VoiceMaterialLibrary Phase 1 - 抽离类型/常量/工具函数
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 5s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m11s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 21s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m4s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m1s
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 Worker Image (pull_request) Successful in 16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 45s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 49s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 20s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m12s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 3m30s
AI Code Review / AI Code Review (pull_request) Successful in 2m34s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 15s
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 cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
894bb06b5c
- types.ts: VoiceGender/ViewMode/VoiceMaterial/VoiceAssetMetadata + mapAssetToMaterial/buildMetadata
- constants.tsx: MAX_CARD_TAGS/MAX_ROW_TAGS/TAG_VARIANTS/GENDER_OPTIONS
- utils/format.ts: genderLabel/genderIcon/genderClass/formatDuration/formatFileSize/formatDate
- utils/audio.ts: getAudioDuration
- 主文件从 1966 行 → 1854 行 (-112行, -5.7%)
- 清理未使用的 icon import (ManOutlined/WomanOutlined/UserOutlined)
xiaoxia added 1 commit 2026-07-24 21:05:04 +08:00
fix: remove unused type imports causing lint/ts errors
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 7s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 59s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m0s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 19s
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 Worker Image (pull_request) Successful in 22s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 59s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m6s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 21s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m50s
AI Code Review / AI Code Review (pull_request) Successful in 3m2s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m8s
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) Failing after 36s
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 / 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
6c01f975f9
xiaoxia added 1 commit 2026-07-24 22:16:13 +08:00
fix: prettier formatting + import order
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 15s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 35s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m25s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m27s
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 Worker Image (pull_request) Successful in 22s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m35s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 44s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 40s
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 / 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
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 37s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 32s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m45s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m12s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 2m47s
aa04f2e3e6
xiaoxia added 1 commit 2026-07-24 22:30:05 +08:00
fix: 修复 lint 警告 + 添加 format 工具函数单元测试
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 31s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 54s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 37s
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 - Migration (alembic) (pull_request) Successful in 55s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 36s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m0s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m45s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 27s
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 / 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 / Frontend Unit Tests (pull_request) Successful in 32s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m34s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m42s
AI Code Review / AI Code Review (pull_request) Successful in 3m5s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 47m4s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 12s
13d1207011
- constants.tsx: 添加 react-refresh/only-export-components 禁用注释
- 新增 format.test.ts: 为 format 工具函数添加单元测试(8 个用例)
auto-approve-bot approved these changes 2026-07-24 22:34:52 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-24 22:34:52 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
Collaborator

代码审查结果 - PR #846

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

  1. VoiceMaterialLibrary.tsx 文件模式:文件权限从 100644 变更为 100755(可执行)。源代码文件不应具备可执行权限,这通常是由于开发者本地文件系统配置错误(如 core.filemode 设置)导致的。这会污染 Git 历史,并可能导致 CI/CD 环境中的安全策略拦截。
  2. apps/web/src/pages/voice-materials/types.ts 第33行mapAssetToMaterial 函数中 gender 的赋值逻辑存在类型安全隐患。代码 (meta.gender as VoiceGender) || "neutral" 使用类型断言强制转换后,如果后端返回了一个非空但不在 VoiceGender 联合类型中的值(例如 "robot"),由于该值是 truthy,|| "neutral" 不会生效,导致最终数据违反类型契约,可能引发后续 Switch 语句处理缺失。

💡 建议(2个可选)

  1. apps/web/src/pages/voice-materials/utils/audio.ts 第7-19行getAudioDuration 函数存在潜在的内存泄漏和悬挂 Promise 风险。如果音频元数据加载失败且未触发 error 事件(极端情况),或者加载超时,Promise 将永远不会 resolve。建议增加 setTimeout 超时机制,并在超时后清理 URL 并 resolve(0)。
  2. apps/web/src/pages/voice-materials/utils/format.ts 第18行formatDuration 函数未处理 NaN 输入。当 audio.duration 不可用时(如流式音频或加载未完成),传入的 seconds 可能为 NaN,导致输出 "NaN:NaN"。建议增加 Number.isNaN 检查并返回默认值(如 "0:00")。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 14:36:53 | 模型:

## 代码审查结果 - PR #846 ### ⚠️ 问题(2个需要修改) 1. **VoiceMaterialLibrary.tsx 文件模式**:文件权限从 `100644` 变更为 `100755`(可执行)。源代码文件不应具备可执行权限,这通常是由于开发者本地文件系统配置错误(如 `core.filemode` 设置)导致的。这会污染 Git 历史,并可能导致 CI/CD 环境中的安全策略拦截。 2. **apps/web/src/pages/voice-materials/types.ts 第33行**:`mapAssetToMaterial` 函数中 `gender` 的赋值逻辑存在类型安全隐患。代码 `(meta.gender as VoiceGender) || "neutral"` 使用类型断言强制转换后,如果后端返回了一个非空但不在 `VoiceGender` 联合类型中的值(例如 "robot"),由于该值是 truthy,`|| "neutral"` 不会生效,导致最终数据违反类型契约,可能引发后续 Switch 语句处理缺失。 ### 💡 建议(2个可选) 1. **apps/web/src/pages/voice-materials/utils/audio.ts 第7-19行**:`getAudioDuration` 函数存在潜在的内存泄漏和悬挂 Promise 风险。如果音频元数据加载失败且未触发 `error` 事件(极端情况),或者加载超时,Promise 将永远不会 resolve。建议增加 `setTimeout` 超时机制,并在超时后清理 URL 并 resolve(0)。 2. **apps/web/src/pages/voice-materials/utils/format.ts 第18行**:`formatDuration` 函数未处理 `NaN` 输入。当 `audio.duration` 不可用时(如流式音频或加载未完成),传入的 `seconds` 可能为 `NaN`,导致输出 "NaN:NaN"。建议增加 `Number.isNaN` 检查并返回默认值(如 "0:00")。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-24 14:36:53 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 745c851758 into develop 2026-07-24 23:57:24 +08:00
xiaoxia deleted branch refactor/voice-material-library-phase1 2026-07-24 23:57:24 +08:00

🗑️ 预览环境已清理

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

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

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