import { useState } from "react"; import { Link } from "react-router-dom"; import { useTranslation } from "react-i18next"; import type { components } from "../api/schema"; import { useSetVisibility, VisibilityError } from "../api/queries"; import { adjacentTransitions, type Visibility } from "./transitions"; import { Button } from "@/components/ui/button"; import { AlertDialog, AlertDialogTrigger, AlertDialogContent, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, } from "@/components/ui/alert-dialog"; type AdminObjectView = components["schemas"]["AdminObjectView"]; const STEPS: Visibility[] = ["draft", "internal", "public"]; export function PublishControl({ object }: { object: AdminObjectView }) { const { t } = useTranslation(); const current = object.visibility; const { forward, back } = adjacentTransitions(current); const setVisibility = useSetVisibility(); const [confirmOpen, setConfirmOpen] = useState(false); const [errorKind, setErrorKind] = useState<"gate" | "illegal" | "other" | null>(null); const go = (visibility: Visibility) => { setErrorKind(null); setVisibility.mutate( { id: object.id, visibility }, { onSuccess: () => setConfirmOpen(false), onError: (err) => { setConfirmOpen(false); const status = err instanceof VisibilityError ? err.status : 0; setErrorKind(status === 422 ? "gate" : status === 409 ? "illegal" : "other"); }, }, ); }; const currentIndex = STEPS.indexOf(current); return (
{t("publish.heading")}
{STEPS.map((step, i) => (
{t(`visibility.${step}`)}
))}
{back && ( )} {forward === "internal" && ( )} {forward === "public" && ( {t("publish.publish")} } /> {t("publish.confirmTitle")} {t("publish.confirmBody")} {t("form.cancel")} go("public")} > {t("publish.confirm")} )}
{errorKind === "gate" && (

{t("publish.gateError")}{" "} {t("publish.editLink")}

)} {errorKind === "illegal" && (

{t("publish.illegalError")}

)} {errorKind === "other" && (

{t("form.rejected")}

)}
); }