import { useState, useCallback } from 'react' import ThemeProvider from '@/components/ThemeProvider' import MessageAlert from '@/components/MessageAlert' import ApiKeyAlert from '@/components/ApiKeyAlert' import StatusIndicator from '@/components/graph/StatusIndicator' import { healthCheckInterval } from '@/lib/constants' import { useBackendState } from '@/stores/state' import { useSettingsStore } from '@/stores/settings' import { useEffect } from 'react' import { Toaster } from 'sonner' import SiteHeader from '@/features/SiteHeader' import { InvalidApiKeyError, RequireApiKeError } from '@/api/lightrag' import GraphViewer from '@/features/GraphViewer' import DocumentManager from '@/features/DocumentManager' import RetrievalTesting from '@/features/RetrievalTesting' import ApiSite from '@/features/ApiSite' import { Tabs, TabsContent } from '@/components/ui/Tabs' function App() { const message = useBackendState.use.message() const enableHealthCheck = useSettingsStore.use.enableHealthCheck() const [currentTab] = useState(() => useSettingsStore.getState().currentTab) const [apiKeyInvalid, setApiKeyInvalid] = useState(false) // Health check useEffect(() => { if (!enableHealthCheck) return // Check immediately useBackendState.getState().check() const interval = setInterval(async () => { await useBackendState.getState().check() }, healthCheckInterval * 1000) return () => clearInterval(interval) }, [enableHealthCheck]) const handleTabChange = useCallback( (tab: string) => useSettingsStore.getState().setCurrentTab(tab as any), [] ) useEffect(() => { if (message) { if (message.includes(InvalidApiKeyError) || message.includes(RequireApiKeError)) { setApiKeyInvalid(true) return } } setApiKeyInvalid(false) }, [message, setApiKeyInvalid]) return (
{enableHealthCheck && } {message !== null && !apiKeyInvalid && } {apiKeyInvalid && }
) } export default App