diff --git a/src/components/chat-view/AssistantMessageActions.tsx b/src/components/chat-view/AssistantMessageActions.tsx index e01c9bb..f7b21a5 100644 --- a/src/components/chat-view/AssistantMessageActions.tsx +++ b/src/components/chat-view/AssistantMessageActions.tsx @@ -1,6 +1,6 @@ import * as Tooltip from '@radix-ui/react-tooltip' import { Check, CopyIcon } from 'lucide-react' -import { useMemo, useState } from 'react' +import { useEffect, useState } from 'react' import { ChatAssistantMessage } from '../../types/chat' import { calculateLLMCost } from '../../utils/price-calculator' @@ -44,15 +44,23 @@ function CopyButton({ message }: { message: ChatAssistantMessage }) { } function LLMResponesInfoButton({ message }: { message: ChatAssistantMessage }) { - const cost = useMemo(() => { - if (!message.metadata?.model || !message.metadata?.usage) { - return 0 + const [cost, setCost] = useState(0); + + useEffect(() => { + async function calculateCost() { + if (!message.metadata?.model || !message.metadata?.usage) { + setCost(0); + return; + } + const calculatedCost = await calculateLLMCost({ + model: message.metadata.model, + usage: message.metadata.usage, + }); + setCost(calculatedCost); } - return calculateLLMCost({ - model: message.metadata.model, - usage: message.metadata.usage, - }) - }, [message]) + + calculateCost(); + }, [message]); return ( diff --git a/src/components/chat-view/chat-input/ModelSelect.tsx b/src/components/chat-view/chat-input/ModelSelect.tsx index 6596a6c..0fc24a8 100644 --- a/src/components/chat-view/chat-input/ModelSelect.tsx +++ b/src/components/chat-view/chat-input/ModelSelect.tsx @@ -1,17 +1,31 @@ import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import { ChevronDown, ChevronUp } from 'lucide-react' -import { useMemo, useState } from 'react' +import { useEffect, useState } from 'react' import { useSettings } from '../../../contexts/SettingsContext' import { GetProviderModelIds } from "../../../utils/api" + export function ModelSelect() { const { settings, setSettings } = useSettings() const [isOpen, setIsOpen] = useState(false) + const [chatModelId, setChatModelId] = useState(settings.chatModelId) + const [providerModels, setProviderModels] = useState([]) + const [isLoading, setIsLoading] = useState(true) - const[chatModelId, setChatModelId] = useState(settings.chatModelId) - - const currProviderModels = useMemo(() => { - return GetProviderModelIds(settings.chatModelProvider) + useEffect(() => { + const fetchModels = async () => { + setIsLoading(true) + try { + const models = await GetProviderModelIds(settings.chatModelProvider) + setProviderModels(models) + } catch (error) { + console.error('Failed to fetch provider models:', error) + } finally { + setIsLoading(false) + } + } + + fetchModels() }, [settings.chatModelProvider]) return ( @@ -29,21 +43,25 @@ export function ModelSelect() {
    - {currProviderModels.map((modelId) => ( - { - setChatModelId(modelId) - setSettings({ - ...settings, - chatModelId: modelId, - }) - }} - asChild - > -
  • {modelId}
  • -
    - ))} + {isLoading ? ( +
  • Loading...
  • + ) : ( + providerModels.map((modelId) => ( + { + setChatModelId(modelId) + setSettings({ + ...settings, + chatModelId: modelId, + }) + }} + asChild + > +
  • {modelId}
  • +
    + )) + )}
diff --git a/src/components/inline-edit/InlineEdit.tsx b/src/components/inline-edit/InlineEdit.tsx index e00cf06..69e38e8 100644 --- a/src/components/inline-edit/InlineEdit.tsx +++ b/src/components/inline-edit/InlineEdit.tsx @@ -58,14 +58,19 @@ const ControlArea: React.FC = ({ onModelChange, isSubmitting, }) => { - const currProviderModels = useMemo(() => { - return GetProviderModelIds(settings.chatModelProvider) - .map((modelId) => ( - - )) - }, [settings]) + const [providerModels, setProviderModels] = useState([]); + + useEffect(() => { + const fetchModels = async () => { + try { + const models = await GetProviderModelIds(settings.chatModelProvider); + setProviderModels(models); + } catch (error) { + console.error("Failed to fetch provider models:", error); + } + }; + fetchModels(); + }, [settings]); return (
@@ -75,7 +80,11 @@ const ControlArea: React.FC = ({ onChange={(e) => onModelChange(e.target.value)} disabled={isSubmitting} > - {currProviderModels} + {providerModels.map((modelId) => ( + + ))}