/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { InfoIcon } from '@primer/octicons-react' import { type ActionFunctionArgs, type LoaderFunctionArgs } from '@remix-run/node' import { useLoaderData } from '@remix-run/react' import { Button, Tooltip, TooltipTrigger } from 'react-aria-components' import Code from '~/components/Code' import { type Machine, type Route, User } from '~/types' import { cn } from '~/utils/cn' import { loadContext } from '~/utils/config/headplane' import { loadConfig } from '~/utils/config/headscale' import { pull } from '~/utils/headscale' import { getSession } from '~/utils/sessions' import { useLiveData } from '~/utils/useLiveData' import { menuAction } from './action' import MachineRow from './machine' export async function loader({ request }: LoaderFunctionArgs) { const session = await getSession(request.headers.get('Cookie')) const [machines, routes, users] = await Promise.all([ pull<{ nodes: Machine[] }>('v1/node', session.get('hsApiKey')!), pull<{ routes: Route[] }>('v1/routes', session.get('hsApiKey')!), pull<{ users: User[] }>('v1/user', session.get('hsApiKey')!), ]) const context = await loadContext() let magic: string | undefined if (context.config.read) { const config = await loadConfig() if (config.dns_config.magic_dns) { magic = config.dns_config.base_domain } } return { nodes: machines.nodes, routes: routes.routes, users: users.users, magic, } } export async function action({ request }: ActionFunctionArgs) { return menuAction(request) } export default function Page() { useLiveData({ interval: 3000 }) const data = useLoaderData() return ( <>

Machines

{data.nodes.map(machine => ( route.node.id === machine.id)} users={data.users} magic={data.magic} /> ))}
Name
Addresses {data.magic ? ( Since MagicDNS is enabled, you can access devices based on their name and also at {' '} [name].[user]. {data.magic} ) : undefined}
Last Seen
) }