import { createFileRoute } from "@tanstack/react-router"; import { deleteIssueType, listIssueTypes, saveIssueType } from "~/fns/milestones"; import { listDiscussions } from "~/fns/discussions"; import { deleteDiscussionCategory, saveDiscussionCategory } from "~/fns/discussion-admin"; import { useAction } from "~/hooks/use-action"; import { EmptyState } from "~/ui/EmptyState"; import { LabelChip } from "~/ui/LabelChip"; import { Panel } from "~/ui/Panel"; import { Button } from "~/ui/Button"; import { CheckboxField, TextField } from "~/ui/Field"; import { ErrorBanner } from "~/ui/Callout"; const DEFAULT_COLOR = "f6821f"; export const Route = createFileRoute("/$owner/$repo/settings/planning")({ loader: async ({ params }) => { const ref = { owner: params.owner, repo: params.repo }; const [types, discussions] = await Promise.all([ listIssueTypes({ data: ref }), listDiscussions({ data: { ...ref, page: 1 } }), ]); return { types, categories: discussions.categories }; }, component: PlanningSettings, }); function IssueTypes() { const { types } = Route.useLoaderData(); const params = Route.useParams(); const save = useAction(saveIssueType); const remove = useAction(deleteIssueType); return (
{ event.preventDefault(); const element = event.currentTarget; const form = new FormData(element); const description = String(form.get("description") ?? "").trim(); const ok = await save.run({ data: { ...params, id: null, name: String(form.get("name") ?? ""), color: String(form.get("color") ?? DEFAULT_COLOR).replace("#", ""), description: description || null, }, }); if (ok) element.reset(); }} >
{types.length === 0 ? ( ) : (
    {types.map((type) => (
  • {type.description}
  • ))}
)}
); } function Categories() { const { categories } = Route.useLoaderData(); const params = Route.useParams(); const save = useAction(saveDiscussionCategory); const remove = useAction(deleteDiscussionCategory); return (
{ event.preventDefault(); const element = event.currentTarget; const form = new FormData(element); const ok = await save.run({ data: { ...params, id: null, emoji: String(form.get("emoji") ?? ""), name: String(form.get("name") ?? ""), description: String(form.get("description") ?? ""), answerable: form.get("answerable") === "on", }, }); if (ok) element.reset(); }} >
    {categories.map((category) => (
  • {category.emoji} {category.name} {category.description} {category.answerable && answers}
  • ))}
); } function PlanningSettings() { return ( <> ); }