import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { fetchReadiness, readyQueryKey } from '@/api/health'; import { fetchMeta, metaQueryKey } from '@/api/meta'; import { Badge, Button, Card } from '@/components/ui/primitives'; import { StatBytes, StatRow } from '@/components/ui/StatRow'; import { errorCode } from '@/lib/format'; import { supportedLanguages, type SupportedLanguage } from '@/i18n'; import { useUiStore } from '@/stores/ui'; export function App() { const { t, i18n } = useTranslation(); const theme = useUiStore((state) => state.theme); const toggleTheme = useUiStore((state) => state.toggleTheme); const locale = i18n.resolvedLanguage ?? 'ru'; const meta = useQuery({ queryKey: metaQueryKey, queryFn: ({ signal }) => fetchMeta(signal), retry: 1, }); const readiness = useQuery({ queryKey: readyQueryKey, queryFn: ({ signal }) => fetchReadiness(signal), retry: 1, refetchInterval: 30_000, }); const online = readiness.isSuccess || meta.isSuccess; const schemaReady = readiness.data?.checks['database'] === 'ok'; const errorMessage = (error: unknown): string => { const code = errorCode(error); const key = `errors.${code}`; const translated = t(key); return translated === key ? t('errors.unknown', { code }) : translated; }; const changeLanguage = (language: SupportedLanguage): void => { window.localStorage.setItem('glchat.language', language); void i18n.changeLanguage(language); }; return (

{t('app.name')}

{t('app.tagline')}

{t('status.title')}

{t('status.description')}

{meta.isPending ? (

{t('status.connecting')}

) : null} {meta.isError ? (

{errorMessage(meta.error)}

) : null} {meta.data ? (
} />
) : null}
); }