Files
leaudit-platform-frontend/app/hooks/dify-chat-apps/useChatApps.ts
T
LiangShiyong 59c127806c Merge branch 'Wren' into shiy-login
# Conflicts:
#	app/hooks/dify-chat-apps/useChatApps.ts
2025-12-08 21:41:29 +08:00

194 lines
7.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 对话应用管理钩子
*
* 提供对话应用的加载、切换和状态管理功能
*/
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,
};
}