/** * 对话应用管理钩子 * * 提供对话应用的加载、切换和状态管理功能 */ 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 { console.log('[useChatApps] 开始加载对话应用列表...'); const response = await getMyChatApps(); console.log('[useChatApps] 加载完成,返回数据:', response); console.log('[useChatApps] 应用列表:', response.data.map(app => ({ app_id: app.app_id, app_name: app.app_name, is_default: app.is_default }))); 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 { console.log('[useChatApps] 开始加载默认对话应用...'); const response = await getDefaultChatApp(); const defaultApp = response.data; console.log('[useChatApps] 默认应用加载完成:', { app_id: defaultApp.app_id, app_name: defaultApp.app_name, is_default: defaultApp.is_default }); // 检查是否已经存在相同的应用 setChatApps(prev => { console.log('[useChatApps] 准备添加默认应用,当前列表长度:', prev.length); console.log('[useChatApps] 当前列表应用ID:', prev.map(app => app.app_id)); console.log('[useChatApps] 要添加的默认应用ID:', defaultApp.app_id); const exists = prev.some(app => app.app_id === defaultApp.app_id); console.log('[useChatApps] 应用是否存在检查结果:', exists); if (!exists) { console.log('[useChatApps] 应用不存在,添加到列表'); const newList = [...prev, defaultApp]; console.log('[useChatApps] 添加后的列表长度:', newList.length); return newList; } console.log('[useChatApps] 应用已存在,返回原列表'); return prev; }); console.log('[useChatApps] 设置当前应用为默认应用'); setCurrentChatApp(defaultApp); return defaultApp; } 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) => { console.log('[useChatApps] 开始切换对话应用,目标ID:', appId); const app = chatApps.find(chatApp => chatApp.app_id === appId); console.log('[useChatApps] 查找应用结果:', app ? { app_id: app.app_id, app_name: app.app_name, found: true } : { found: false }); if (app) { console.log('[useChatApps] 找到应用,准备切换:', app.app_name, app.app_id); setCurrentChatApp(app); console.log('[useChatApps] 设置currentChatApp完成'); // 切换应用后,调用回调函数 if (onAppChanged) { console.log('[useChatApps] 调用onAppChanged回调'); onAppChanged(app); } } else { console.warn('[useChatApps] 未找到应用ID:', appId, '可用应用:', chatApps.map(a => ({ id: a.app_id, name: a.app_name }))); } }, [chatApps]); /** * 初始化对话应用 */ const initializeChatApps = useCallback(async () => { setLoadingChatApps(true); setLoadingDefault(true); setError(null); try { try { console.log('[useChatApps] ==================== 开始初始化对话应用 ===================='); // 尝试加载可用应用列表 console.log('[useChatApps] 步骤1: 调用loadChatApps()加载我的应用列表...'); const apps = await loadChatApps(); console.log('[useChatApps] 步骤1完成: 加载到', apps.length, '个应用'); if (apps.length > 0) { // 查找默认应用 const defaultApp = apps.find((item) => item.is_default) || apps[0]; // console.log('[useChatApps] 默认对话应用:', apps); setCurrentChatApp(defaultApp); console.log('[useChatApps] ==================== 初始化完成(路径1) ===================='); } else { // 如果没有配置应用,尝试获取默认应用 console.log('[useChatApps] 应用列表为空,调用loadDefaultChatApp()...'); await loadDefaultChatApp(); console.log('[useChatApps] ==================== 初始化完成(路径2) ===================='); } } catch (err) { // 加载应用列表失败,尝试获取默认应用 console.warn('[useChatApps] 加载应用列表失败,尝试获取默认应用:', err); await loadDefaultChatApp(); console.log('[useChatApps] ==================== 初始化完成(路径3) ===================='); } } 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, }; }