import './index.css' import React, { Suspense, lazy, useEffect } from 'react' import ReactDOM from 'react-dom/client' import Home from './components/routes/home.tsx' import { ThemeProvider } from './components/theme-provider.tsx' import { $authenticated, $router, $servers, navigate, pb } from './lib/stores.ts' import { ModeToggle } from './components/mode-toggle.tsx' import { cn, updateFavicon, updateServerList } from './lib/utils.ts' import { buttonVariants } from './components/ui/button.tsx' import { DatabaseBackupIcon, Github, LogOutIcon, LogsIcon, UserIcon } from 'lucide-react' import { useStore } from '@nanostores/react' import { Toaster } from './components/ui/toaster.tsx' import { Logo } from './components/logo.tsx' import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, } from '@/components/ui/tooltip.tsx' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from './components/ui/dropdown-menu.tsx' import { SystemRecord } from './types' const ServerDetail = lazy(() => import('./components/routes/server.tsx')) const CommandPalette = lazy(() => import('./components/command-palette.tsx')) const LoginPage = lazy(() => import('./components/login.tsx')) const App = () => { const page = useStore($router) const authenticated = useStore($authenticated) const servers = useStore($servers) // get servers useEffect(updateServerList, []) useEffect(() => { pb.collection('systems').subscribe('*', (e) => { const curServers = $servers.get() const newServers = [] // console.log('e', e) if (e.action === 'delete') { for (const server of curServers) { if (server.id !== e.record.id) { newServers.push(server) } } } else { let found = 0 for (const server of curServers) { if (server.id === e.record.id) { found = newServers.push(e.record) } else { newServers.push(server) } } if (!found) { newServers.push(e.record) } } $servers.set(newServers) }) return () => { pb.collection('systems').unsubscribe('*') } }, []) // update favicon useEffect(() => { if (!authenticated || !servers.length) { updateFavicon('/favicon.svg') } else { let up = false for (const server of servers) { if (server.status === 'down') { updateFavicon('/favicon-red.svg') return () => updateFavicon('/favicon.svg') } else if (server.status === 'up') { up = true } } updateFavicon(up ? '/favicon-green.svg' : '/favicon.svg') return () => updateFavicon('/favicon.svg') } return () => { updateFavicon('/favicon.svg') } }, [authenticated, servers]) if (!page) { return

404

} else if (page.path === '/') { return } else if (page.route === 'server') { return ( ) } } const Layout = () => { const authenticated = useStore($authenticated) if (!authenticated) { return } return ( <>
{ e.preventDefault() navigate('/') }} >
pb.authStore.clear()}> Log out Logs Backups

Github Repository

) } ReactDOM.createRoot(document.getElementById('app')!).render( )