import { ImageStoryEntity } from "../domain/Entities"; import { ImageStoryUseCase } from "../usecase/imageStoryUseCase"; import { useState, useCallback, useMemo } from "react"; interface UseImageStoryService { /** 当前图片故事数据 */ imageStory: Partial; /** 当前活跃的图片地址 */ activeImageUrl: string; /** 当前活跃的文本信息 */ activeTextContent: string; /** 当前选中的分类 */ selectedCategory: string; /** 是否正在分析图片 */ isAnalyzing: boolean; /** 是否正在上传 */ isUploading: boolean; /** 故事类型选项 */ storyTypeOptions: Array<{ key: string; label: string }>; /** 上传图片并分析 */ uploadAndAnalyzeImage: (imageUrl: string) => Promise; /** 触发生成剧本函数 */ generateScript: () => Promise; /** 更新故事类型 */ updateStoryType: (storyType: string) => void; /** 更新故事内容 */ updateStoryContent: (content: string) => void; /** 重置图片故事数据 */ resetImageStory: () => void; } export const useImageStoryServiceHook = (): UseImageStoryService => { const [imageStory, setImageStory] = useState>({ imageUrl: "", imageStory: "", storyType: "auto", }); const [isAnalyzing, setIsAnalyzing] = useState(false); const [isUploading, setIsUploading] = useState(false); /** 图片故事用例实例 */ const imageStoryUseCase = useMemo(() => new ImageStoryUseCase(), []); /** 当前活跃的图片地址 */ const activeImageUrl = imageStory.imageUrl || ""; /** 当前活跃的文本信息 */ const activeTextContent = imageStory.imageStory || ""; /** 当前选中的分类 */ const selectedCategory = imageStory.storyType || "auto"; /** 故事类型选项 */ const storyTypeOptions = useMemo(() => imageStoryUseCase.getStoryTypeOptions(), [imageStoryUseCase]); /** * 上传图片并分析 * @param {string} imageUrl - 已上传的图片URL */ const uploadAndAnalyzeImage = useCallback(async (imageUrl: string): Promise => { try { setIsUploading(true); setIsAnalyzing(true); // 调用用例处理图片上传和分析 await imageStoryUseCase.handleImageUpload(imageUrl); // 获取更新后的数据 const updatedStory = imageStoryUseCase.getImageStory(); setImageStory(updatedStory); } catch (error) { console.error('图片上传分析失败:', error); throw error; } finally { setIsUploading(false); setIsAnalyzing(false); } }, [imageStoryUseCase]); /** * 触发生成剧本函数 * @returns {Promise} 生成的剧本ID或内容 */ const generateScript = useCallback(async (): Promise => { if (!activeImageUrl) { throw new Error('请先上传图片'); } if (!activeTextContent) { throw new Error('请先输入或生成故事内容'); } try { setIsAnalyzing(true); // 这里可以调用后端API生成剧本 // 暂时返回一个模拟的剧本ID const scriptId = `script_${Date.now()}`; // TODO: 实现实际的剧本生成逻辑 // const response = await generateScriptFromImage(imageStory); // return response.scriptId; return scriptId; } catch (error) { console.error('生成剧本失败:', error); throw error; } finally { setIsAnalyzing(false); } }, [activeImageUrl, activeTextContent, imageStory]); /** * 更新故事类型 * @param {string} storyType - 新的故事类型 */ const updateStoryType = useCallback((storyType: string): void => { imageStoryUseCase.updateStoryType(storyType); setImageStory(prev => ({ ...prev, storyType })); }, [imageStoryUseCase]); /** * 更新故事内容 * @param {string} content - 新的故事内容 */ const updateStoryContent = useCallback((content: string): void => { imageStoryUseCase.updateStoryContent(content); setImageStory(prev => ({ ...prev, imageStory: content })); }, [imageStoryUseCase]); /** * 重置图片故事数据 */ const resetImageStory = useCallback((): void => { imageStoryUseCase.resetImageStory(); setImageStory({ imageUrl: "", imageStory: "", storyType: "auto", }); setIsAnalyzing(false); setIsUploading(false); }, [imageStoryUseCase]); return { imageStory, activeImageUrl, activeTextContent, selectedCategory, isAnalyzing, isUploading, storyTypeOptions, uploadAndAnalyzeImage, generateScript, updateStoryType, updateStoryContent, resetImageStory, }; };