import "./index.css" import { i18n } from "@lingui/core" import { I18nProvider } from "@lingui/react" import { useStore } from "@nanostores/react" import { DirectionProvider } from "@radix-ui/react-direction" // import { Suspense, lazy, useEffect, StrictMode } from "react" import { lazy, memo, Suspense, useEffect } from "react" import ReactDOM from "react-dom/client" import Navbar from "@/components/navbar.tsx" import { $router } from "@/components/router.tsx" import Settings from "@/components/routes/settings/layout.tsx" import { ThemeProvider } from "@/components/theme-provider.tsx" import { Toaster } from "@/components/ui/toaster.tsx" import { alertManager } from "@/lib/alerts" import { pb, updateUserSettings } from "@/lib/api.ts" import { dynamicActivate, getLocale } from "@/lib/i18n" import { $authenticated, $copyContent, $direction, $publicKey } from "@/lib/stores.ts" import * as systemsManager from "@/lib/systemsManager.ts" const LoginPage = lazy(() => import("@/components/login/login.tsx")) const Home = lazy(() => import("@/components/routes/home.tsx")) const SystemDetail = lazy(() => import("@/components/routes/system.tsx")) const CopyToClipboardDialog = lazy(() => import("@/components/copy-to-clipboard.tsx")) const App = memo(() => { const page = useStore($router) useEffect(() => { // change auth store on auth change pb.authStore.onChange(() => { $authenticated.set(pb.authStore.isValid) }) // get version / public key pb.send("/api/beszel/getkey", {}).then((data) => { $publicKey.set(data.key) }) // get user settings updateUserSettings() // need to get system list before alerts systemsManager.init() systemsManager // get current systems list .refresh() // subscribe to new system updates .then(systemsManager.subscribe) // get current alerts .then(alertManager.refresh) // subscribe to new alert updates .then(alertManager.subscribe) return () => { // updateFavicon("favicon.svg") alertManager.unsubscribe() systemsManager.unsubscribe() } }, []) if (!page) { return

404

} else if (page.route === "home") { return } else if (page.route === "system") { return } else if (page.route === "settings") { return } }) const Layout = () => { const authenticated = useStore($authenticated) const copyContent = useStore($copyContent) const direction = useStore($direction) useEffect(() => { document.documentElement.dir = direction }, [direction]) // biome-ignore lint/correctness/useExhaustiveDependencies: only run on mount useEffect(() => { // refresh auth if not authenticated (required for trusted auth header) if (!authenticated) { pb.collection("users") .authRefresh() .then((res) => { pb.authStore.save(res.token, res.record) $authenticated.set(!!pb.authStore.isValid) }) } }, []) return ( {!authenticated ? ( ) : ( <>
{copyContent && ( )}
)}
) } const I18nApp = () => { useEffect(() => { dynamicActivate(getLocale()) }, []) return ( ) } ReactDOM.createRoot(document.getElementById("app") as HTMLElement).render( // strict mode in dev mounts / unmounts components twice // and breaks the clipboard dialog // // )