import { useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as stylex from "@stylexjs/stylex"; import InlineError from "@/lib/InlineError"; import { upstreamCreateMutation, upstreamDeleteMutation, upstreamUpdateMutation, upstreamsQuery } from "@/lib/queries"; import type { Upstream, UpstreamInput } from "@/lib/types"; import ConfirmDialog from "@/ui/ConfirmDialog"; import { styles as shared } from "@/ui/styles"; import { colors } from "@/ui/tokens.stylex"; import AuthorityGate from "./AuthorityGate"; import FileModeNote from "./FileModeNote"; import QueryPanel from "./QueryPanel"; import UpstreamForm from "./UpstreamForm"; import { styles as config } from "./styles"; const INTRO = "The pool builds its clients at startup, so an edit here takes effect at the next restart."; const styles = stylex.create({ url: { display: "block", maxWidth: "18rem", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontWeight: 500, }, actions: { display: "flex", gap: "0.75rem", }, dimWhenDisabled: { opacity: { default: 1, ":disabled": 0.5 }, }, absent: { color: colors.textMuted, }, }); export default function UpstreamsTab() { const upstreams = useQuery(upstreamsQuery()); return ( {(status) => (

{INTRO}

{status.authority === "managed_file" && } {(rows) => status.authority === "managed_file" ? ( ) : ( ) }
)}
); } function UpstreamsReadOnly({ upstreams }: { upstreams: Upstream[] }) { return (

Upstream pool upstreams

{upstreams.length === 0 ? (

The file declares no upstreams.

) : (
{upstreams.map((u) => ( ))}
URL Priority Enabled TLS name
{u.url} {u.priority} {String(u.enabled)} {u.tls_name === "" ? ( empty ) : ( u.tls_name )}
)}
); } function UpstreamsEditor({ upstreams }: { upstreams: Upstream[] }) { const queryClient = useQueryClient(); const [editing, setEditing] = useState(null); const [pendingDelete, setPendingDelete] = useState(null); const create = useMutation(upstreamCreateMutation(queryClient)); const save = useMutation(upstreamUpdateMutation(queryClient)); const toggle = useMutation(upstreamUpdateMutation(queryClient)); const remove = useMutation(upstreamDeleteMutation(queryClient)); async function submitForm(input: UpstreamInput) { if (editing === null) { await create.mutateAsync(input); } else { await save.mutateAsync({ id: editing.id, input }); setEditing(null); } } function toggleEnabled(u: Upstream) { toggle.mutate({ id: u.id, input: { url: u.url, priority: u.priority, enabled: !u.enabled, tls_name: u.tls_name }, }); } function confirmDelete() { if (pendingDelete === null) return; remove.mutate(pendingDelete.id); setPendingDelete(null); } const formError = editing === null ? create.error : save.error; const tableError = remove.error ?? toggle.error; return (
{upstreams.length === 0 ? (

No upstreams yet. Add one below.

) : (
{upstreams.map((u) => ( ))}
URL Priority Enabled TLS name Actions
{u.url} {u.priority} toggleEnabled(u)} {...stylex.props(shared.focusRing)} /> {u.tls_name === "" ? "—" : u.tls_name}
)} setEditing(null)} /> setPendingDelete(null)} />
); }