refactor(TtsPanel): 提取音色选择器组件

This commit is contained in:
2026-07-30 09:15:25 +08:00
parent 3630907ea4
commit 194eab7296
@@ -0,0 +1,45 @@
import React from "react"
import type { TTSVoice } from "@/api/tts"
import { VOICE_CATEGORY_MAP } from "../constants"
export interface VoiceSelectorProps {
voices: TTSVoice[]
selectedVoiceId: string
loading: boolean
onSelect: (voiceId: string) => void
}
export const VoiceSelector: React.FC<VoiceSelectorProps> = ({
voices,
selectedVoiceId,
loading,
onSelect,
}) => {
const voiceCategories = Object.entries(VOICE_CATEGORY_MAP)
return (
<div className="tts-voice-section">
<div className="tts-voice-label">
选择音色
{loading && <span className="tts-voice-loading">加载中...</span>}
</div>
<div className="tts-voice-grid">
{voiceCategories.map(([cat, info]) => {
const voice = voices.find((v) => v.category === cat)
const isSelected = voice && selectedVoiceId === voice.id
return (
<button
key={cat}
className={`tts-voice-card${isSelected ? " active" : ""}`}
onClick={() => voice && onSelect(voice.id)}
disabled={!voice || loading}
>
<span className="tts-voice-card-icon">{info.icon}</span>
<span className="tts-voice-card-name">{voice?.name || info.label}</span>
</button>
)
})}
</div>
</div>
)
}