import { useEffect, useId, useRef, type KeyboardEvent } from "react"; import type { PublicationListItem } from "../../../contracts/studio/contract.ts"; import { defaultPublicationFlowClasses, type PublicationFlowClasses, } from "./publication-flow-classes.ts"; export function UnpublishDialog({ item, pending, error, onDismiss, onConfirm, classes: styles = defaultPublicationFlowClasses, }: { item: PublicationListItem | null; pending: boolean; error: string; onDismiss(): void; onConfirm(): void; classes?: PublicationFlowClasses; }) { const dialogRef = useRef(null); const cancelRef = useRef(null); const titleId = useId(); const descriptionId = useId(); useEffect(() => { const dialog = dialogRef.current; if (!dialog) return; if (item && !dialog.open) { dialog.showModal(); cancelRef.current?.focus(); } else if (!item && dialog.open) { dialog.close(); } }, [item]); useEffect( () => () => { if (dialogRef.current?.open) dialogRef.current.close(); }, [], ); const trapFocus = (event: KeyboardEvent) => { if (event.key !== "Tab") return; const controls = Array.from( event.currentTarget.querySelectorAll( "button:not([disabled])", ), ); if (!controls.length) return; const first = controls[0]; const last = controls.at(-1)!; if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); } else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); } }; return ( { event.preventDefault(); if (!pending) onDismiss(); }} onKeyDown={trapFocus} >

UNPUBLISH

게시를 취소할까요?

{item?.document.title ?? "선택한 기록"}의 Studio 게시 상태를 중단하고 게시 취소 이벤트를 남깁니다.

작업본과 이전 Snapshot은 보존됩니다.

현재 Mock에서는 기존 Public 사이트와 검색 결과를 변경하지 않습니다.

{error ? (

{error}

) : null}
); }