Spaces:
Build error
Build error
import { useQuery } from "@tanstack/react-query"; | |
import React from "react"; | |
import posthog from "posthog-js"; | |
import OpenHands from "#/api/open-hands"; | |
import { DEFAULT_SETTINGS } from "#/services/settings"; | |
import { useIsOnTosPage } from "#/hooks/use-is-on-tos-page"; | |
import { Settings } from "#/types/settings"; | |
import { useIsAuthed } from "./use-is-authed"; | |
const getSettingsQueryFn = async (): Promise<Settings> => { | |
const apiSettings = await OpenHands.getSettings(); | |
return { | |
LLM_MODEL: apiSettings.llm_model, | |
LLM_BASE_URL: apiSettings.llm_base_url, | |
AGENT: apiSettings.agent, | |
LANGUAGE: apiSettings.language, | |
CONFIRMATION_MODE: apiSettings.confirmation_mode, | |
SECURITY_ANALYZER: apiSettings.security_analyzer, | |
LLM_API_KEY_SET: apiSettings.llm_api_key_set, | |
SEARCH_API_KEY_SET: apiSettings.search_api_key_set, | |
REMOTE_RUNTIME_RESOURCE_FACTOR: apiSettings.remote_runtime_resource_factor, | |
PROVIDER_TOKENS_SET: apiSettings.provider_tokens_set, | |
ENABLE_DEFAULT_CONDENSER: apiSettings.enable_default_condenser, | |
ENABLE_SOUND_NOTIFICATIONS: apiSettings.enable_sound_notifications, | |
ENABLE_PROACTIVE_CONVERSATION_STARTERS: | |
apiSettings.enable_proactive_conversation_starters, | |
USER_CONSENTS_TO_ANALYTICS: apiSettings.user_consents_to_analytics, | |
SEARCH_API_KEY: apiSettings.search_api_key || "", | |
EMAIL: apiSettings.email || "", | |
EMAIL_VERIFIED: apiSettings.email_verified, | |
MCP_CONFIG: apiSettings.mcp_config, | |
IS_NEW_USER: false, | |
}; | |
}; | |
export const useSettings = () => { | |
const isOnTosPage = useIsOnTosPage(); | |
const { data: userIsAuthenticated } = useIsAuthed(); | |
const query = useQuery({ | |
queryKey: ["settings"], | |
queryFn: getSettingsQueryFn, | |
// Only retry if the error is not a 404 because we | |
// would want to show the modal immediately if the | |
// settings are not found | |
retry: (_, error) => error.status !== 404, | |
refetchOnWindowFocus: false, | |
staleTime: 1000 * 60 * 5, // 5 minutes | |
gcTime: 1000 * 60 * 15, // 15 minutes | |
enabled: !isOnTosPage && !!userIsAuthenticated, | |
meta: { | |
disableToast: true, | |
}, | |
}); | |
React.useEffect(() => { | |
if (query.isFetched && query.data?.LLM_API_KEY_SET) { | |
posthog.capture("user_activated"); | |
} | |
}, [query.data?.LLM_API_KEY_SET, query.isFetched]); | |
// We want to return the defaults if the settings aren't found so the user can still see the | |
// options to make their initial save. We don't set the defaults in `initialData` above because | |
// that would prepopulate the data to the cache and mess with expectations. Read more: | |
// https://tanstack.com/query/latest/docs/framework/react/guides/initial-query-data#using-initialdata-to-prepopulate-a-query | |
if (query.error?.status === 404) { | |
// Create a new object with only the properties we need, avoiding rest destructuring | |
return { | |
data: DEFAULT_SETTINGS, | |
error: query.error, | |
isError: query.isError, | |
isLoading: query.isLoading, | |
isFetching: query.isFetching, | |
isFetched: query.isFetched, | |
isSuccess: query.isSuccess, | |
status: query.status, | |
fetchStatus: query.fetchStatus, | |
refetch: query.refetch, | |
}; | |
} | |
return query; | |
}; | |