/* eslint-disable unicorn/filename-case */ import { ClipboardIcon, UserIcon } from '@heroicons/react/24/outline' import { type LoaderFunctionArgs } from '@remix-run/node' import { useLoaderData } from '@remix-run/react' import { toast } from 'react-hot-toast/headless' import Attribute from '~/components/Attribute' import StatusCircle from '~/components/StatusCircle' import { type Machine, type User } from '~/types' import { pull } from '~/utils/headscale' import { getSession } from '~/utils/sessions' import { useLiveData } from '~/utils/useLiveData' export async function loader({ request }: LoaderFunctionArgs) { const session = await getSession(request.headers.get('Cookie')) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const data = await pull<{ nodes: Machine[] }>('v1/node', session.get('hsApiKey')!) const users = new Map() for (const machine of data.nodes) { const { user } = machine if (!users.has(user.id)) { users.set(user.id, []) } users.get(user.id)?.push(machine) } return [...users.values()].map(machines => { const { user } = machines[0] return { ...user, machines } }) } export default function Page() { const data = useLoaderData() useLiveData({ interval: 3000 }) return (
{data.map(user => (
{user.name}
{user.machines.map(machine => (
))}
))}
) }