import { StoryTemplateEntity, RoleEntity } from "../domain/Entities"; import { TemplateStoryUseCase } from "../usecase/templateStoryUseCase"; import { getUploadToken, uploadToQiniu } from "@/api/common"; import { useState, useCallback, useMemo } from "react"; interface UseTemplateStoryService { /** 模板列表 */ templateStoryList: StoryTemplateEntity[]; /** 当前选中要使用的模板 */ selectedTemplate: StoryTemplateEntity | null; /** 当前选中的活跃的角色 */ activeRole: RoleEntity | null; /** 加载状态 */ isLoading: boolean; /** 获取模板列表函数 */ getTemplateStoryList: () => Promise; /** action 生成电影函数 */ actionStory: () => Promise; /** 设置选中的模板 */ setSelectedTemplate: (template: StoryTemplateEntity | null) => void; /** 设置活跃角色 */ setActiveRole: (role: RoleEntity | null) => void; } export const useTemplateStoryServiceHook = (): UseTemplateStoryService => { const [templateStoryList, setTemplateStoryList] = useState([]); const [selectedTemplate, setSelectedTemplate] = useState(null); const [activeRole, setActiveRole] = useState(null); const [isLoading, setIsLoading] = useState(false); /** 模板故事用例实例 */ const templateStoryUseCase = useMemo(() => new TemplateStoryUseCase(), []); /** * 获取模板列表函数 */ const getTemplateStoryList = useCallback(async (): Promise => { try { setIsLoading(true); const templates = await templateStoryUseCase.getTemplateStoryList(); setTemplateStoryList(templates); } catch (err) { console.error('获取模板列表失败:', err); } finally { setIsLoading(false); } }, [templateStoryUseCase]); /** * action 生成电影函数 */ const actionStory = useCallback(async (): Promise => { if (!selectedTemplate) { throw new Error('请先选择一个故事模板'); } try { setIsLoading(true); const projectId = await templateStoryUseCase.actionStory(selectedTemplate); return projectId; } catch (err) { console.error('生成电影失败:', err); throw err; } finally { setIsLoading(false); } }, [selectedTemplate, templateStoryUseCase]); return { templateStoryList, selectedTemplate, activeRole, isLoading, getTemplateStoryList, actionStory, setSelectedTemplate, setActiveRole, }; };