| import React, { useMemo, useEffect, useRef } from 'react'; | |
| import { isAgentsEndpoint, isAssistantsEndpoint, LocalStorageKeys } from 'librechat-data-provider'; | |
| import type * as t from 'librechat-data-provider'; | |
| import type { SelectedValues } from '~/common'; | |
| import useSetIndexOptions from '~/hooks/Conversations/useSetIndexOptions'; | |
| export default function useSelectorEffects({ | |
| index = 0, | |
| agentsMap, | |
| conversation, | |
| assistantsMap, | |
| setSelectedValues, | |
| }: { | |
| index?: number; | |
| agentsMap: t.TAgentsMap | undefined; | |
| assistantsMap: t.TAssistantsMap | undefined; | |
| conversation: t.TConversation | null; | |
| setSelectedValues: React.Dispatch<React.SetStateAction<SelectedValues>>; | |
| }) { | |
| const { setOption } = useSetIndexOptions(); | |
| const agents: t.Agent[] = useMemo(() => { | |
| return Object.values(agentsMap ?? {}) as t.Agent[]; | |
| }, [agentsMap]); | |
| const { | |
| agent_id: selectedAgentId = null, | |
| assistant_id: selectedAssistantId = null, | |
| endpoint, | |
| } = conversation ?? {}; | |
| const assistants: t.Assistant[] = useMemo(() => { | |
| if (!isAssistantsEndpoint(endpoint)) { | |
| return []; | |
| } | |
| return Object.values(assistantsMap?.[endpoint ?? ''] ?? {}) as t.Assistant[]; | |
| }, [assistantsMap, endpoint]); | |
| useEffect(() => { | |
| if (!isAgentsEndpoint(endpoint as string)) { | |
| return; | |
| } | |
| if (selectedAgentId == null && agents.length > 0) { | |
| let agent_id = localStorage.getItem(`${LocalStorageKeys.AGENT_ID_PREFIX}${index}`); | |
| if (agent_id == null) { | |
| agent_id = agents[0]?.id; | |
| } | |
| const agent = agentsMap?.[agent_id]; | |
| if (agent !== undefined) { | |
| setOption('model')(''); | |
| setOption('agent_id')(agent_id); | |
| } | |
| } | |
| }, [index, agents, selectedAgentId, agentsMap, endpoint, setOption]); | |
| useEffect(() => { | |
| if (!isAssistantsEndpoint(endpoint as string)) { | |
| return; | |
| } | |
| if (selectedAssistantId == null && assistants.length > 0) { | |
| let assistant_id = localStorage.getItem(`${LocalStorageKeys.ASST_ID_PREFIX}${index}`); | |
| if (assistant_id == null) { | |
| assistant_id = assistants[0]?.id; | |
| } | |
| const assistant = assistantsMap?.[endpoint ?? '']?.[assistant_id]; | |
| if (assistant !== undefined) { | |
| setOption('model')(assistant.model); | |
| setOption('assistant_id')(assistant_id); | |
| } | |
| } | |
| }, [index, assistants, selectedAssistantId, assistantsMap, endpoint, setOption]); | |
| const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null); | |
| const debouncedSetSelectedValues = (values: SelectedValues) => { | |
| if (debounceTimeoutRef.current) { | |
| clearTimeout(debounceTimeoutRef.current); | |
| } | |
| debounceTimeoutRef.current = setTimeout(() => { | |
| setSelectedValues(values); | |
| }, 150); | |
| }; | |
| useEffect(() => { | |
| if (!conversation?.endpoint) { | |
| return; | |
| } | |
| if ( | |
| conversation?.assistant_id || | |
| conversation?.agent_id || | |
| conversation?.model || | |
| conversation?.spec | |
| ) { | |
| if (isAgentsEndpoint(conversation?.endpoint)) { | |
| debouncedSetSelectedValues({ | |
| endpoint: conversation.endpoint || '', | |
| model: conversation.agent_id ?? '', | |
| modelSpec: conversation.spec || '', | |
| }); | |
| return; | |
| } else if (isAssistantsEndpoint(conversation?.endpoint)) { | |
| debouncedSetSelectedValues({ | |
| endpoint: conversation.endpoint || '', | |
| model: conversation.assistant_id || '', | |
| modelSpec: conversation.spec || '', | |
| }); | |
| return; | |
| } | |
| debouncedSetSelectedValues({ | |
| endpoint: conversation.endpoint || '', | |
| model: conversation.model || '', | |
| modelSpec: conversation.spec || '', | |
| }); | |
| } | |
| return () => { | |
| if (debounceTimeoutRef.current) { | |
| clearTimeout(debounceTimeoutRef.current); | |
| } | |
| }; | |
| }, [ | |
| conversation?.spec, | |
| conversation?.model, | |
| conversation?.endpoint, | |
| conversation?.agent_id, | |
| conversation?.assistant_id, | |
| ]); | |
| } | |