59c127806c
# Conflicts: # app/hooks/dify-chat-apps/useChatApps.ts
194 lines
7.3 KiB
TypeScript
194 lines
7.3 KiB
TypeScript
/**
|
||
* 对话应用管理钩子
|
||
*
|
||
* 提供对话应用的加载、切换和状态管理功能
|
||
*/
|
||
|
||
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<ChatApp[]>([]);
|
||
// 加载状态
|
||
const [loadingChatApps, setLoadingChatApps] = useState(true);
|
||
// 加载默认应用状态
|
||
const [loadingDefault, setLoadingDefault] = useState(true);
|
||
// 当前选中的应用
|
||
const [currentChatApp, setCurrentChatApp] = useState<ChatApp | null>(null);
|
||
// 错误信息
|
||
const [error, setError] = useState<string | null>(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,
|
||
};
|
||
}
|