import { useEffect, useState, useRef, useCallback } from "react"; import { ChevronDownIcon, RefreshCw, Check } from "lucide-react"; import { useTranslation } from "react-i18next"; import { useAppStore } from "@/stores/appStore"; import logoImg from "@/assets/icon.svg"; import platformAdapter from "@/utils/platformAdapter"; import { useClickAway } from "@/hooks/useClickAway"; import VisibleKey from "@/components/Common/VisibleKey"; import { useConnectStore } from "@/stores/connectStore"; import FontIcon from "@/components/Common/Icons/FontIcon"; import { useChatStore } from "@/stores/chatStore"; import { AI_ASSISTANT_PANEL_ID } from "@/constants"; import { useShortcutsStore } from "@/stores/shortcutsStore"; import { Get } from "@/api/axiosRequest"; interface AssistantListProps { assistantIDs?: string[]; } export function AssistantList({ assistantIDs = [] }: AssistantListProps) { const { t } = useTranslation(); const { connected } = useChatStore(); const isTauri = useAppStore((state) => state.isTauri); const currentService = useConnectStore((state) => state.currentService); const currentAssistant = useConnectStore((state) => state.currentAssistant); const setCurrentAssistant = useConnectStore( (state) => state.setCurrentAssistant ); const aiAssistant = useShortcutsStore((state) => state.aiAssistant); const [isOpen, setIsOpen] = useState(false); const [isRefreshing, setIsRefreshing] = useState(false); const menuRef = useRef(null); useClickAway(menuRef, () => setIsOpen(false)); const [assistants, setAssistants] = useState([]); const fetchAssistant = useCallback(async (serverId?: string) => { let response: any; if (isTauri) { if (!serverId) return; try { response = await platformAdapter.commands("assistant_search", { serverId, }); response = response ? JSON.parse(response) : null; } catch (err) { setAssistants([]); setCurrentAssistant(null); console.error("assistant_search", err); } } else { const [error, res] = await Get(`/assistant/_search`); if (error) { setAssistants([]); setCurrentAssistant(null); console.error("assistant_search", error); return; } console.log("/assistant/_search", res); response = res; } console.log("assistant_search", response); let assistantList = response?.hits?.hits || []; assistantList = assistantIDs.length > 0 ? assistantList.filter((item: any) => assistantIDs.includes(item._id)) : assistantList; setAssistants(assistantList); if (assistantList.length > 0) { const assistant = assistantList.find( (item: any) => item._id === currentAssistant?._id ); if (assistant) { setCurrentAssistant(assistant); } else { setCurrentAssistant(assistantList[0]); } } }, []); useEffect(() => { connected && fetchAssistant(currentService?.id); }, [connected, currentService?.id]); const handleRefresh = useCallback(async () => { setIsRefreshing(true); await fetchAssistant(currentService?.id); setTimeout(() => setIsRefreshing(false), 1000); }, [currentService?.id]); return (
{isOpen && (
AI Assistant
{assistants.map((assistant) => ( ))}
)}
); }