From 581a146d2fb1da1b67923973c81f5fe1bd19c348 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 28 Jul 2026 14:07:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor(voice-materials):=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=20MaterialForm=20=E4=B8=BA=E5=AD=90=E7=BB=84=E4=BB=B6=EF=BC=88?= =?UTF-8?q?186=E2=86=92108=E8=A1=8C,=20-42%=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/MaterialForm.tsx | 86 ++----------------- .../material-form/FileUploadField.tsx | 73 ++++++++++++++++ .../material-form/GenderSelector.tsx | 32 +++++++ 3 files changed, 110 insertions(+), 81 deletions(-) mode change 100644 => 100755 apps/web/src/pages/voice-materials/components/MaterialForm.tsx create mode 100755 apps/web/src/pages/voice-materials/components/material-form/FileUploadField.tsx create mode 100755 apps/web/src/pages/voice-materials/components/material-form/GenderSelector.tsx diff --git a/apps/web/src/pages/voice-materials/components/MaterialForm.tsx b/apps/web/src/pages/voice-materials/components/MaterialForm.tsx old mode 100644 new mode 100755 index 17c088460..1d173f688 --- a/apps/web/src/pages/voice-materials/components/MaterialForm.tsx +++ b/apps/web/src/pages/voice-materials/components/MaterialForm.tsx @@ -1,11 +1,10 @@ -import React, { useState, useRef } from "react" -import { UploadOutlined, SoundOutlined, CloseOutlined } from "@ant-design/icons" +import React, { useState } from "react" import { Button, Input } from "@/components/ui" import { type TagItem } from "@/api/tags" import { type VoiceGender, type VoiceMaterial } from "../types" -import { GENDER_OPTIONS } from "../constants" -import { genderClass, formatFileSize } from "../utils/format" import TagSelector from "./TagSelector" +import FileUploadField from "./material-form/FileUploadField" +import GenderSelector from "./material-form/GenderSelector" export interface MaterialFormProps { initial?: VoiceMaterial @@ -33,7 +32,6 @@ const MaterialForm: React.FC = ({ const [gender, setGender] = useState(initial?.gender ?? "female") const [selectedTagIds, setSelectedTagIds] = useState(initial?.tagIds ?? []) const [file, setFile] = useState(undefined) - const fileInputRef = useRef(null) const handleSubmit = () => { if (!name.trim()) return @@ -53,65 +51,10 @@ const MaterialForm: React.FC = ({ return (
- {/* 音频文件上传(编辑模式不显示) */} {!initial && ( -
- -
fileInputRef.current?.click()} - onDragOver={(e) => e.preventDefault()} - onDrop={(e) => { - e.preventDefault() - const f = e.dataTransfer.files[0] - if (f?.type.startsWith("audio/")) setFile(f) - }} - > - { - const f = e.target.files?.[0] - if (f) setFile(f) - }} - /> - {file ? ( -
- - {file.name} - {formatFileSize(file.size)} - -
- ) : ( -
- -

点击或拖拽音频文件到此处

- 支持 MP3、WAV、AAC、FLAC 等格式 -
- )} -
- {/* 上传进度条 */} - {uploadProgress !== null && uploadProgress !== undefined && ( -
-
- {uploadProgress}% -
- )} -
+ )} - {/* 名称 */}
= ({ />
- {/* 音色描述 */}
= ({ />
- {/* 性别 */} -
- -
- {GENDER_OPTIONS.map((opt) => ( - - ))} -
-
+ - {/* 风格标签 */}
= ({ />
- {/* 操作按钮 */}
+
+ ) : ( +
+ +

点击或拖拽音频文件到此处

+ 支持 MP3、WAV、AAC、FLAC 等格式 +
+ )} +
+ {uploadProgress !== null && uploadProgress !== undefined && ( +
+
+ {uploadProgress}% +
+ )} +
+ ) +} + +export default FileUploadField diff --git a/apps/web/src/pages/voice-materials/components/material-form/GenderSelector.tsx b/apps/web/src/pages/voice-materials/components/material-form/GenderSelector.tsx new file mode 100755 index 000000000..15c7c9453 --- /dev/null +++ b/apps/web/src/pages/voice-materials/components/material-form/GenderSelector.tsx @@ -0,0 +1,32 @@ +import React from "react" +import type { VoiceGender } from "../../types" +import { GENDER_OPTIONS } from "../../constants" +import { genderClass } from "../../utils/format" + +interface GenderSelectorProps { + value: VoiceGender + onChange: (value: VoiceGender) => void +} + +const GenderSelector: React.FC = ({ value, onChange }) => { + return ( +
+ +
+ {GENDER_OPTIONS.map((opt) => ( + + ))} +
+
+ ) +} + +export default GenderSelector