import { useState } from "react"; import { addProjectField, addProjectItem, deleteProjectField } from "~/fns/projects"; import { useAction } from "~/hooks/use-action"; import type { ProjectData } from "./ItemTitle"; import { Button } from "~/ui/Button"; import { InlineSelect, inputClass } from "~/ui/Field"; import { cn } from "~/utils/cn"; const KINDS = [ { value: "text", label: "Text" }, { value: "number", label: "Number" }, { value: "date", label: "Date" }, { value: "single_select", label: "Single select" }, ] as const; type Kind = (typeof KINDS)[number]["value"]; function isKind(value: string): value is Kind { return KINDS.some((kind) => kind.value === value); } function FieldEditor({ data }: { data: ProjectData }) { const add = useAction(addProjectField); const remove = useAction(deleteProjectField); const [kind, setKind] = useState("text"); const ref = { owner: data.project.owner, number: data.project.number }; return (
{ event.preventDefault(); const element = event.currentTarget; const form = new FormData(element); const options = String(form.get("options") ?? "") .split(",") .map((option) => option.trim()) .filter(Boolean); if (await add.run({ data: { ...ref, name: String(form.get("name") ?? ""), kind, options } })) element.reset(); }} > isKind(value) && setKind(value)} className="w-36" options={KINDS} /> {kind === "single_select" && ( )} {(add.error ?? remove.error) &&

{add.error ?? remove.error}

}
); } /** Add items (an `owner/repo#123` reference or a draft note) and manage custom fields. */ export function ProjectToolbar({ data }: { data: ProjectData }) { const [reference, setReference] = useState(""); const [fieldsOpen, setFieldsOpen] = useState(false); const add = useAction(addProjectItem); return (
{ event.preventDefault(); const ok = await add.run({ data: { owner: data.project.owner, number: data.project.number, reference }, }); if (ok) setReference(""); }} > setReference(event.target.value)} placeholder="owner/repo#123 or a draft note" className={cn(inputClass, "h-8 flex-1")} />
{add.error &&

{add.error}

} {fieldsOpen && }
); }