Files
leaudit-platform-frontend/app/hooks/dify-chat-apps/useChatApps.ts
T
PingChuan 5bee9288b9 feat:替换 Dify 为自建 RAG去实现
1、修复了若干无权限时的失败提示语
2、新增了一个生成后续建议问题的功能
3、重构了知识问答部分的权限管理模块
4、修复了若干渲染不恰当的样式渲染
2026-04-10 16:20:32 +08:00

191 lines
6.8 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);
let resolved = false; // 用局部变量跟踪,避免 React state 异步读取的问题
try {
try {
const apps = await loadChatApps();
if (apps.length > 0) {
const defaultApp = apps.find((item) => item.is_default) || apps[0];
setCurrentChatApp(defaultApp);
resolved = true;
} else {
const app = await loadDefaultChatApp();
if (app) resolved = true;
}
} catch (err) {
const app = await loadDefaultChatApp();
if (app) resolved = true;
}
} catch (err: any) {
console.warn('[useChatApps] 初始化异常:', err.message);
} finally {
if (!resolved) {
// 权限不足等情况,构造占位应用让页面能渲染(输入框会被禁用)
const fallbackApp = { app_id: '_fallback', app_name: '法务问答', description: '', is_default: true } as any;
setChatApps([fallbackApp]);
setCurrentChatApp(fallbackApp);
setError(null);
}
setLoadingChatApps(false);
setLoadingDefault(false);
setInited(true);
}
}, [loadChatApps, loadDefaultChatApp]);
// 初始化
useEffect(() => {
initializeChatApps();
}, [initializeChatApps]);
return {
// 状态
chatApps,
loadingChatApps,
currentChatApp,
error,
inited,
// 方法
loadChatApps,
loadDefaultChatApp,
handleChatAppChange,
};
}