From d681a2080a527242c046ee436fd13dc9db148e6c Mon Sep 17 00:00:00 2001 From: sabaimran Date: Mon, 20 Jan 2025 10:59:02 -0800 Subject: [PATCH] Centralize use of useUserConfig and use that to retrieve default model and chat model options --- src/interface/web/app/agents/page.tsx | 2 +- src/interface/web/app/common/auth.ts | 11 ++++--- .../web/app/common/modelSelector.tsx | 32 +++++++++++-------- src/interface/web/app/page.tsx | 2 +- src/interface/web/app/settings/page.tsx | 2 +- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/interface/web/app/agents/page.tsx b/src/interface/web/app/agents/page.tsx index 0d8e4b72..9a854d4d 100644 --- a/src/interface/web/app/agents/page.tsx +++ b/src/interface/web/app/agents/page.tsx @@ -171,7 +171,7 @@ export default function Agents() { error: authenticationError, isLoading: authenticationLoading, } = useAuthenticatedData(); - const { userConfig } = useUserConfig(true); + const { data: userConfig } = useUserConfig(true); const [showLoginPrompt, setShowLoginPrompt] = useState(false); const isMobileWidth = useIsMobileWidth(); diff --git a/src/interface/web/app/common/auth.ts b/src/interface/web/app/common/auth.ts index e00caa25..917fa7da 100644 --- a/src/interface/web/app/common/auth.ts +++ b/src/interface/web/app/common/auth.ts @@ -90,15 +90,16 @@ export interface UserConfig { export function useUserConfig(detailed: boolean = false) { const url = `/api/settings?detailed=${detailed}`; const { - data: userConfig, + data, error, - isLoading: isLoadingUserConfig, + isLoading, } = useSWR(url, fetcher, { revalidateOnFocus: false }); - if (error || !userConfig || userConfig?.detail === "Forbidden") - return { userConfig: null, isLoadingUserConfig }; + if (error || !data || data?.detail === "Forbidden") { + return { data: null, error, isLoading }; + } - return { userConfig, isLoadingUserConfig }; + return { data, error, isLoading }; } export function useChatModelOptions() { diff --git a/src/interface/web/app/common/modelSelector.tsx b/src/interface/web/app/common/modelSelector.tsx index ece4709f..bf837ea1 100644 --- a/src/interface/web/app/common/modelSelector.tsx +++ b/src/interface/web/app/common/modelSelector.tsx @@ -17,14 +17,13 @@ import { CommandItem, CommandList, } from "@/components/ui/command"; -import { Label } from "@/components/ui/label"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; -import { ModelOptions, useChatModelOptions, useUserConfig } from "./auth"; +import { ModelOptions, useUserConfig } from "./auth"; import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card"; import { Skeleton } from "@/components/ui/skeleton"; @@ -36,34 +35,39 @@ interface ModelSelectorProps extends PopoverProps { export function ModelSelector({ ...props }: ModelSelectorProps) { const [open, setOpen] = React.useState(false) - const { models, isLoading, error } = useChatModelOptions(); const [peekedModel, setPeekedModel] = useState(undefined); const [selectedModel, setSelectedModel] = useState(undefined); - const { userConfig } = useUserConfig(); + const { data: userConfig, error, isLoading: isLoadingUserConfig } = useUserConfig(true); + const [models, setModels] = useState([]); useEffect(() => { - if (!models?.length) return; + if (isLoadingUserConfig) return; - if (props.selectedModel) { - const model = models.find(model => model.name === props.selectedModel); - setSelectedModel(model || models[0]); - return; - } else if (userConfig) { - const model = models.find(model => model.id === userConfig.selected_chat_model_config); - setSelectedModel(model || models[0]); + if (userConfig) { + setModels(userConfig.chat_model_options); + const selectedChatModelOption = userConfig.chat_model_options.find(model => model.id === userConfig.selected_chat_model_config); + setSelectedModel(selectedChatModelOption); return; + } else { + setSelectedModel(models[0]); } - setSelectedModel(models[0]); }, [models, props.selectedModel, userConfig]); + useEffect(() => { + if (props.selectedModel) { + const model = models.find(model => model.name === props.selectedModel); + setSelectedModel(model); + } + }, [props.selectedModel]); + useEffect(() => { if (selectedModel) { props.onSelect(selectedModel); } }, [selectedModel]); - if (isLoading) { + if (isLoadingUserConfig) { return ( ); diff --git a/src/interface/web/app/page.tsx b/src/interface/web/app/page.tsx index e2d18569..f0a3ee1e 100644 --- a/src/interface/web/app/page.tsx +++ b/src/interface/web/app/page.tsx @@ -486,7 +486,7 @@ export default function Home() { const [uploadedFiles, setUploadedFiles] = useState(null); const isMobileWidth = useIsMobileWidth(); - const { userConfig: initialUserConfig, isLoadingUserConfig } = useUserConfig(true); + const { data: initialUserConfig, isLoading: isLoadingUserConfig } = useUserConfig(true); const [userConfig, setUserConfig] = useState(null); const { diff --git a/src/interface/web/app/settings/page.tsx b/src/interface/web/app/settings/page.tsx index 38481ad5..f19c53dd 100644 --- a/src/interface/web/app/settings/page.tsx +++ b/src/interface/web/app/settings/page.tsx @@ -595,7 +595,7 @@ enum PhoneNumberValidationState { } export default function SettingsView() { - const { userConfig: initialUserConfig } = useUserConfig(true); + const { data: initialUserConfig } = useUserConfig(true); const [userConfig, setUserConfig] = useState(null); const [name, setName] = useState(undefined); const [notionToken, setNotionToken] = useState(null);