import { useCallback, useEffect, useState } from 'react' import { InferenceEngine, Model } from '@janhq/core' import { Button, Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Tooltip, TooltipContent, TooltipTrigger, TooltipArrow, Input, } from '@janhq/uikit' import { atom, useAtomValue, useSetAtom } from 'jotai' import { MonitorIcon } from 'lucide-react' import { twMerge } from 'tailwind-merge' import { MainViewState } from '@/constants/screens' import { useEngineSettings } from '@/hooks/useEngineSettings' import { useMainViewState } from '@/hooks/useMainViewState' import useRecommendedModel from '@/hooks/useRecommendedModel' import { toGigabytes } from '@/utils/converter' import { activeThreadAtom, threadStatesAtom } from '@/helpers/atoms/Thread.atom' export const selectedModelAtom = atom(undefined) export default function DropdownListSidebar() { const setSelectedModel = useSetAtom(selectedModelAtom) const threadStates = useAtomValue(threadStatesAtom) const activeThread = useAtomValue(activeThreadAtom) const [selected, setSelected] = useState() const { setMainViewState } = useMainViewState() const [openAISettings, setOpenAISettings] = useState< { api_key: string } | undefined >(undefined) const { readOpenAISettings, saveOpenAISettings } = useEngineSettings() useEffect(() => { readOpenAISettings().then((settings) => { setOpenAISettings(settings) }) }, []) const { recommendedModel, downloadedModels } = useRecommendedModel() useEffect(() => { setSelected(recommendedModel) setSelectedModel(recommendedModel) }, [recommendedModel, setSelectedModel]) const onValueSelected = useCallback( (modelId: string) => { const model = downloadedModels.find((m) => m.id === modelId) setSelected(model) setSelectedModel(model) }, [downloadedModels, setSelectedModel] ) if (!activeThread) { return null } const finishInit = threadStates[activeThread.id].isFinishInit ?? true return ( {finishInit && ( To change model, please start a new thread )} {selected?.engine === InferenceEngine.openai && (
{ saveOpenAISettings({ apiKey: e.target.value }) }} />
)}
) }