/** * 对话应用管理钩子 * * 提供对话应用的加载、切换和状态管理功能 */ import { useState, useCallback, useEffect } from 'react'; import { getMyChatApps, getDefaultChatApp } from '~/api/dify-chat-apps/chatAppsApi'; import type { ChatApp } from '~/api/dify-chat-apps/types'; export function useChatApps() { // 对话应用列表 const [chatApps, setChatApps] = useState([]); // 加载状态 const [loadingChatApps, setLoadingChatApps] = useState(true); // 加载默认应用状态 const [loadingDefault, setLoadingDefault] = useState(true); // 当前选中的应用 const [currentChatApp, setCurrentChatApp] = useState(null); // 错误信息 const [error, setError] = useState(null); // 初始化完成状态 const [inited, setInited] = useState(false); /** * 加载我的对话应用列表 */ const loadChatApps = useCallback(async () => { setLoadingChatApps(true); setError(null); try { const response = await getMyChatApps(); setChatApps(response.data); return response.data; } catch (err: any) { console.error('[useChatApps] 加载对话应用列表失败:', err); setChatApps([]); return []; } finally { setLoadingChatApps(false); } }, []); /** * 加载默认对话应用 */ const loadDefaultChatApp = useCallback(async () => { setLoadingDefault(true); setError(null); try { const response = await getDefaultChatApp(); // 如果加载所有应用失败,但成功加载了默认应用,将默认应用添加到chatApps数组中 setChatApps(prev => [...prev, response.data]); setCurrentChatApp(response.data); return response.data; } catch (err: any) { console.error('[useChatApps] 加载默认对话应用失败:', err); setError(err.message || '加载默认对话应用失败'); return null; } finally { setLoadingDefault(false); } }, []); /** * 切换对话应用 * @param appId 应用ID * @param onAppChanged 切换完成后的回调函数 */ const handleChatAppChange = useCallback((appId: string, onAppChanged?: (app: ChatApp) => void) => { const app = chatApps.find(chatApp => chatApp.app_id === appId); if (app) { console.log('[useChatApps] 切换对话应用:', app.app_name, app.app_id); setCurrentChatApp(app); // 切换应用后,调用回调函数 if (onAppChanged) { onAppChanged(app); } } }, [chatApps]); /** * 初始化对话应用 */ const initializeChatApps = useCallback(async () => { setLoadingChatApps(true); setLoadingDefault(true); setError(null); try { try { // 尝试加载可用应用列表 const apps = await loadChatApps(); if (apps.length > 0) { // 查找默认应用 const defaultApp = apps.find((item) => item.is_default) || apps[0]; setCurrentChatApp(defaultApp); } else { // 如果没有配置应用,尝试获取默认应用 await loadDefaultChatApp(); } } catch (err) { // 加载应用列表失败,尝试获取默认应用 console.warn('[useChatApps] 加载应用列表失败,尝试获取默认应用:', err); await loadDefaultChatApp(); } } catch (err: any) { console.error('[useChatApps] 初始化失败:', err); setError(err.message || '加载对话应用失败'); } finally { setLoadingChatApps(false); setLoadingDefault(false); setInited(true); } }, [loadChatApps, loadDefaultChatApp]); // 初始化 useEffect(() => { initializeChatApps(); }, [initializeChatApps]); return { // 状态 chatApps, loadingChatApps, currentChatApp, error, inited, // 方法 loadChatApps, loadDefaultChatApp, handleChatAppChange, }; }