feat: 添加对话应用选择和知识库切换功能
- 新增对话应用管理模块(dify-chat-apps),支持获取和切换对话应用 - 优化对话应用切换后自动刷新会话列表功能 - 知识库管理页面新增下拉选择器,支持切换不同知识库 - API 层支持 app_id 参数传递,实现多应用会话隔离 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
/**
|
||||
* 对话应用管理钩子
|
||||
*
|
||||
* 提供对话应用的加载、切换和状态管理功能
|
||||
*/
|
||||
|
||||
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 {
|
||||
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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user