forked from 77media/video-flow
83 lines
2.5 KiB
TypeScript
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,
|
|
};
|
|
};
|