"use client"; import { useEffect, useRef, useState } from "react"; import { BookOpen, X } from "lucide-react"; import { RichText } from "@payloadcms/richtext-lexical/react"; import { Button } from "@/components/ui/button"; import { BeatReadMarker } from "@/components/frontend/story/BeatReadMarker"; import type { StoryBeat } from "@/payload-types"; import { cn } from "@/lib/utils"; import { READER_BODY_CLASSES } from "@/lib/story/richtextClasses"; export type StoryViewerBeat = { readonly id: number; readonly title: string; readonly chapter: number; readonly dateLabel: string | null; readonly body: StoryBeat["body"]; readonly initialRead: boolean; }; export function StoryViewer({ beats }: { readonly beats: readonly StoryViewerBeat[] }) { const [open, setOpen] = useState(false); const triggerRef = useRef(null); const closeButtonRef = useRef(null); useEffect(() => { if (!open) return; const previousOverflow = document.body.style.overflow; const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") setOpen(false); }; document.body.style.overflow = "hidden"; document.addEventListener("keydown", handleKeyDown); closeButtonRef.current?.focus(); return () => { document.body.style.overflow = previousOverflow; document.removeEventListener("keydown", handleKeyDown); triggerRef.current?.focus(); }; }, [open]); if (beats.length === 0) return null; return ( <> {open && (

The Unit Chronicle

    {beats.map((beat) => (
  1. Chapter {beat.chapter}

    {beat.title}

    {beat.dateLabel && (

    {beat.dateLabel}

    )}
  2. ))}
)} ); }