import { useMemo, useState, type Dispatch, type SetStateAction } from "react"; import Search from "@/src/components/twui/elements/Search"; import Loading from "@/src/components/twui/elements/Loading"; import AdminCard from "@/src/components/general/admin-card"; import ClientRow from "@/src/components/general/client-row"; import H2 from "@/src/components/twui/layout/H2"; import Span from "@/src/components/twui/layout/Span"; import Row from "@/src/components/twui/layout/Row"; import Stack from "@/src/components/twui/layout/Stack"; import ClientFormModal from "../(partials)/client-form-modal"; import { useAdminCrudGet } from "@/src/hooks/use-admin-crud-get"; import type { BUN_SQLITE_WGUI_CLIENTS, BUN_SQLITE_WGUI_CLIENT_RULES, } from "@/db/types/db"; type Props = { addOpen: boolean; setAddOpen: Dispatch>; }; const thClass = "px-4 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.08em] " + "text-foreground-light/40 dark:text-foreground-dark/40 whitespace-nowrap"; const thRightClass = `${thClass} text-right`; export default function ClientsTableSection({ addOpen, setAddOpen }: Props) { const [query, setQuery] = useState(""); const { res } = useAdminCrudGet({ table: "clients", sql_query: { order: { field: "created_at", strategy: "DESC" }, limit: 100, }, }); const { res: client_rules } = useAdminCrudGet({ table: "client_rules", sql_query: { limit: 500, }, }); const rules_by_client_id = useMemo(() => { const map = new Map(); for (let i = 0; i < (client_rules || []).length; i++) { const rule = client_rules?.[i]; const client_id = Number(rule?.client_id); if (!rule || !client_id) { continue; } const existing = map.get(client_id) || []; existing.push(rule); map.set(client_id, existing); } return map; }, [client_rules]); const filtered = useMemo(() => { const clients = res || []; const q = query.trim().toLowerCase(); if (!q) { return clients; } return clients.filter((client) => [client.name, client.wg_ip_address, client.allowed_ips].some( (value) => (value || "").toLowerCase().includes(q), ), ); }, [res, query]); return (

Clients {String(filtered.length)}

setQuery(value || "")} inputProps={{ className: "!text-[13.5px]", wrapperProps: { className: "!py-[5px] !min-h-[30px] w-[220px] bg-foreground-light/[0.02] dark:bg-foreground-dark/[0.03]", }, }} />
{res === undefined ? ( ) : filtered.length ? (
{filtered.map((client) => ( ))}
Client Host Tunnel IP Allowed IPs Access Public key Created Actions
) : ( {query ? "No clients found" : "No clients yet"} {query ? "Try adjusting your search terms" : "Add a client to get started"} )}
); }