video-flow-b/app/service/Interaction/templateStoryService.ts
2025-08-16 21:38:05 +08:00

83 lines
2.5 KiB
TypeScript

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<void>;
/** action 生成电影函数 */
actionStory: () => Promise<string>;
/** 设置选中的模板 */
setSelectedTemplate: (template: StoryTemplateEntity | null) => void;
/** 设置活跃角色 */
setActiveRole: (role: RoleEntity | null) => void;
}
export const useTemplateStoryServiceHook = (): UseTemplateStoryService => {
const [templateStoryList, setTemplateStoryList] = useState<StoryTemplateEntity[]>([]);
const [selectedTemplate, setSelectedTemplate] = useState<StoryTemplateEntity | null>(null);
const [activeRole, setActiveRole] = useState<RoleEntity | null>(null);
const [isLoading, setIsLoading] = useState(false);
/** 模板故事用例实例 */
const templateStoryUseCase = useMemo(() => new TemplateStoryUseCase(), []);
/**
* 获取模板列表函数
*/
const getTemplateStoryList = useCallback(async (): Promise<void> => {
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<string> => {
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,
};
};