114 lines
3.0 KiB
TypeScript
114 lines
3.0 KiB
TypeScript
import { useState, useCallback } from "react"
|
|
import { useNavigate } from "react-router-dom"
|
|
import { message } from "antd"
|
|
import { useQuery, useMutation } from "@tanstack/react-query"
|
|
import { saveTtsToLibrary } from "@/api/tts"
|
|
import { getTags, createTag } from "@/api/tags"
|
|
|
|
/**
|
|
* 存为素材(配音库)弹窗逻辑
|
|
*/
|
|
export function useSaveToLibrary(completedTtsJobId: string | null, resetTtsState: () => void) {
|
|
const navigate = useNavigate()
|
|
|
|
const [saveModalOpen, setSaveModalOpen] = useState(false)
|
|
const [saveName, setSaveName] = useState("")
|
|
const [saveTagIds, setSaveTagIds] = useState<string[]>([])
|
|
const [saveNewTag, setSaveNewTag] = useState("")
|
|
|
|
const { data: allTags = [] } = useQuery({
|
|
queryKey: ["generate-save-tags"],
|
|
queryFn: getTags,
|
|
staleTime: 30_000,
|
|
})
|
|
|
|
const handleGoToLibrary = useCallback(() => {
|
|
navigate("/app/voice-materials")
|
|
}, [navigate])
|
|
|
|
const saveToLibraryMutation = useMutation({
|
|
mutationFn: (params: { name?: string; tag_ids?: string[] }) =>
|
|
saveTtsToLibrary(completedTtsJobId!, params),
|
|
onSuccess: () => {
|
|
message.success({
|
|
content: (
|
|
<span>
|
|
已保存到配音库!{" "}
|
|
<a
|
|
onClick={handleGoToLibrary}
|
|
style={{
|
|
color: "var(--primary-500, #6366f1)",
|
|
cursor: "pointer",
|
|
}}
|
|
>
|
|
去视频库查看
|
|
</a>
|
|
</span>
|
|
),
|
|
duration: 5,
|
|
})
|
|
setSaveModalOpen(false)
|
|
setSaveName("")
|
|
setSaveTagIds([])
|
|
setSaveNewTag("")
|
|
resetTtsState()
|
|
},
|
|
onError: (err: Error) => {
|
|
message.error(`保存失败:${err.message || "请重试"}`)
|
|
},
|
|
})
|
|
|
|
const handleOpenSaveModal = useCallback(() => {
|
|
setSaveName("")
|
|
setSaveTagIds([])
|
|
setSaveNewTag("")
|
|
setSaveModalOpen(true)
|
|
}, [])
|
|
|
|
const handleConfirmSave = useCallback(() => {
|
|
if (!completedTtsJobId) return
|
|
saveToLibraryMutation.mutate({
|
|
name: saveName.trim() || undefined,
|
|
tag_ids: saveTagIds.length > 0 ? saveTagIds : undefined,
|
|
})
|
|
}, [completedTtsJobId, saveName, saveTagIds, saveToLibraryMutation])
|
|
|
|
const handleAddTagInModal = useCallback(
|
|
async (tagName: string) => {
|
|
const trimmed = tagName.trim()
|
|
if (!trimmed) return
|
|
const existing = allTags.find((t) => t.name === trimmed)
|
|
if (existing) {
|
|
if (!saveTagIds.includes(existing.id)) {
|
|
setSaveTagIds((prev) => [...prev, existing.id])
|
|
}
|
|
return
|
|
}
|
|
try {
|
|
const created = await createTag(trimmed)
|
|
setSaveTagIds((prev) => [...prev, created.id])
|
|
setSaveNewTag("")
|
|
} catch {
|
|
message.error(`创建标签"${trimmed}"失败`)
|
|
}
|
|
},
|
|
[allTags, saveTagIds],
|
|
)
|
|
|
|
return {
|
|
saveModalOpen,
|
|
setSaveModalOpen,
|
|
saveName,
|
|
setSaveName,
|
|
saveTagIds,
|
|
setSaveTagIds,
|
|
saveNewTag,
|
|
setSaveNewTag,
|
|
allTags,
|
|
saveToLibraryMutation,
|
|
handleOpenSaveModal,
|
|
handleConfirmSave,
|
|
handleAddTagInModal,
|
|
}
|
|
}
|