import { useEffect, useState } from "react"; import type { StudioDashboard as StudioDashboardData } from "../../../contracts/studio/contract.ts"; import type { components } from "../../../contracts/studio/generated.ts"; import { useStudio } from "../use-studio.ts"; import { GuardedStudioLink } from "./guarded-studio-link.tsx"; type DocumentSummary = components["schemas"]["DocumentSummary"]; const kindLabel = { CASE: "Case", REFERENCE: "Reference", QUESTION: "Question", } as const; const actionLabel = { CONTINUE_EDITING: "작성 계속", VALIDATE: "검증하기", FIX_VALIDATION: "오류 수정", CREATE_PREVIEW: "미리보기 만들기", PUBLISH: "게시하기", NONE: "게시 완료", } as const; function WorkRow({ item }: Readonly<{ item: DocumentSummary }>) { return (

{kindLabel[item.kind]}

{item.title || "제목 없는 작업본"}

{item.project?.label ?? "프로젝트 미지정"} · {actionLabel[item.nextAction]}

); } function WorkSection({ title, items, href, empty, }: Readonly<{ title: string; items: DocumentSummary[]; href: string; empty: string; }>) { return (

{title}

전체 보기
{items.length ? ( items.map((item) => ) ) : (

{empty}

)}
); } function isAbortError(error: unknown): boolean { return error instanceof DOMException && error.name === "AbortError"; } export function StudioDashboard() { const { gateway } = useStudio(); const [dashboard, setDashboard] = useState(null); const [error, setError] = useState(""); useEffect(() => { const controller = new AbortController(); void gateway.getDashboard({ signal: controller.signal }).then( (value) => setDashboard(value), (reason: unknown) => { if (!isAbortError(reason)) setError("작업 흐름을 불러오지 못했습니다."); }, ); return () => controller.abort(); }, [gateway]); const validationItems = dashboard?.continueWriting.filter((item) => ["VALIDATE", "FIX_VALIDATION", "CREATE_PREVIEW"].includes(item.nextAction), ) ?? []; return (

WORKSPACE

작업 흐름

작성 중인 기록을 이어서 정리하고 검증·게시 흐름으로 연결합니다.

새 문서
{error ? (

{error}

) : null} {!dashboard && !error ? (

Studio 요약을 불러오는 중입니다.

) : null} {dashboard ? ( <>
전체 작업본 {dashboard.totals.documents}
검증할 기록 {validationItems.length}
게시 준비 {dashboard.totals.readyToPublish}
게시 기록 {dashboard.totals.publications}

최근 게시

게시 기록 보기
{dashboard.recentPublications.length ? ( dashboard.recentPublications.map((item) => (

{item.event.type === "UNPUBLISHED" ? "게시 취소" : item.event.type === "REPUBLISHED" ? "재게시" : "게시"}

{item.document.title}

{item.document.project?.label ?? "프로젝트 미지정"}

)) ) : (

아직 게시 기록이 없습니다.

)}
) : null}
); }