diff --git a/site/src/components/routes/home.tsx b/site/src/components/routes/home.tsx index a7b36dc..68645bb 100644 --- a/site/src/components/routes/home.tsx +++ b/site/src/components/routes/home.tsx @@ -2,20 +2,15 @@ import { useEffect } from 'react' import { $servers, pb } from '@/lib/stores' import { DataTable } from '../server-table/data-table' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card' -import { useStore } from '@nanostores/react' import { SystemRecord } from '@/types' +import { updateServerList } from '@/lib/utils' export function Home() { - const servers = useStore($servers) - // const [systems, setSystems] = useState([] as SystemRecord[]) - useEffect(() => { document.title = 'Home' }, []) - useEffect(() => { - console.log('servers', servers) - }, [servers]) + useEffect(updateServerList, []) useEffect(() => { pb.collection('systems').subscribe('*', (e) => { @@ -52,9 +47,9 @@ export function Home() { <> - All Servers + All Servers - Press{' '} + Updated in real time. Press{' '} K {' '} diff --git a/site/src/components/routes/server.tsx b/site/src/components/routes/server.tsx index 60be6c1..85cb68b 100644 --- a/site/src/components/routes/server.tsx +++ b/site/src/components/routes/server.tsx @@ -1,36 +1,77 @@ -import { pb } from '@/lib/stores' -import { SystemRecord } from '@/types' +import { $servers, pb } from '@/lib/stores' +import { ContainerStatsRecord, SystemRecord } from '@/types' import { useEffect, useState } from 'react' import { useRoute } from 'wouter' import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '../ui/card' +import { useStore } from '@nanostores/react' + +function timestampToBrowserTime(timestamp: string) { + const date = new Date(timestamp) + return date.toLocaleString() +} export function ServerDetail() { + const servers = useStore($servers) const [_, params] = useRoute('/server/:name') const [server, setServer] = useState({} as SystemRecord) + const [containers, setContainers] = useState([] as ContainerStatsRecord[]) + // const [serverId, setServerId] = useState('') useEffect(() => { document.title = params!.name }, []) useEffect(() => { - pb.collection('systems') - .getFirstListItem(`name="${params!.name}"`) - .then((record) => { - setServer(record) + if ($servers.get().length === 0) { + console.log('skipping') + return + } + console.log('running') + const matchingServer = servers.find((s) => s.name === params!.name) as SystemRecord + + setServer(matchingServer) + + console.log('matchingServer', matchingServer) + // pb.collection('systems') + // .getOne(serverId) + // .then((record) => { + // setServer(record) + // }) + + pb.collection('container_stats') + .getList(1, 2, { + filter: `system="${matchingServer.id}"`, + fields: 'created,stats', + sort: '-created', }) - }, []) + .then((records) => { + console.log('records', records) + setContainers(records.items) + }) + }, [servers]) return ( <> {server.name} - 5.342.34.234 + + {server.ip} - last updated: {timestampToBrowserTime(server.updated)} +
{JSON.stringify(server, null, 2)}
+ + + + Containers + + +
{JSON.stringify(containers, null, 2)}
+
+
) } diff --git a/site/src/components/server-table/data-table.tsx b/site/src/components/server-table/data-table.tsx index 169bcd0..8653e54 100644 --- a/site/src/components/server-table/data-table.tsx +++ b/site/src/components/server-table/data-table.tsx @@ -239,7 +239,17 @@ export function DataTable() { {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( - + { + const target = e.target as HTMLElement + if (target.tagName !== 'BUTTON' && !target.hasAttribute('role')) { + navigate(`/server/${row.original.name}`) + } + }} + > {row.getVisibleCells().map((cell) => ( (initialState) export function ThemeProvider({ children, defaultTheme = 'system', - storageKey = 'vite-ui-theme', + storageKey = 'ui-theme', ...props }: ThemeProviderProps) { const [theme, setTheme] = useState( @@ -62,10 +62,4 @@ export function ThemeProvider({ ) } -export const useTheme = () => { - const context = useContext(ThemeProviderContext) - - if (context === undefined) throw new Error('useTheme must be used within a ThemeProvider') - - return context -} +export const useTheme = () => useContext(ThemeProviderContext) diff --git a/site/src/lib/utils.ts b/site/src/lib/utils.ts index 6791bd8..4e4e213 100644 --- a/site/src/lib/utils.ts +++ b/site/src/lib/utils.ts @@ -1,6 +1,8 @@ import { toast } from '@/components/ui/use-toast' import { type ClassValue, clsx } from 'clsx' import { twMerge } from 'tailwind-merge' +import { $servers, pb } from './stores' +import { SystemRecord } from '@/types' export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) @@ -21,3 +23,11 @@ export async function copyToClipboard(content: string) { }) } } + +export const updateServerList = () => { + pb.collection('systems') + .getFullList({ sort: '+name' }) + .then((records) => { + $servers.set(records) + }) +} diff --git a/site/src/main.tsx b/site/src/main.tsx index 9e217cd..12e9e6a 100644 --- a/site/src/main.tsx +++ b/site/src/main.tsx @@ -5,15 +5,14 @@ import { Route, Switch } from 'wouter' import { Home } from './components/routes/home.tsx' import { ThemeProvider } from './components/theme-provider.tsx' import LoginPage from './components/login.tsx' -import { $authenticated, $servers, pb } from './lib/stores.ts' +import { $authenticated } from './lib/stores.ts' import { ServerDetail } from './components/routes/server.tsx' import { ModeToggle } from './components/mode-toggle.tsx' import { CommandPalette } from './components/command-palette.tsx' -import { cn } from './lib/utils.ts' +import { cn, updateServerList } from './lib/utils.ts' import { buttonVariants } from './components/ui/button.tsx' import { Github } from 'lucide-react' import { useStore } from '@nanostores/react' -import { SystemRecord } from './types' import { Toaster } from './components/ui/toaster.tsx' const App = () => { @@ -24,13 +23,7 @@ const App = () => { const Main = () => { // get servers - useEffect(() => { - pb.collection('systems') - .getFullList({ sort: '+name' }) - .then((records) => { - $servers.set(records) - }) - }, []) + useEffect(updateServerList, []) return (
diff --git a/site/src/types.d.ts b/site/src/types.d.ts index 0c3ea2e..1dd5170 100644 --- a/site/src/types.d.ts +++ b/site/src/types.d.ts @@ -17,3 +17,15 @@ export interface SystemStats { memPct: number memUsed: number } + +export interface ContainerStatsRecord extends RecordModel { + system: string + stats: ContainerStats +} + +interface ContainerStats { + name: string + cpu: number + mem: number + mempct: number +}