"use client" import { useEffect, useRef, useState, type ReactNode } from "react" import type { Editor } from "@tiptap/react" import { DocsPageView } from "@/components/drive/richtext/docs-page-view" import { DocsRulerToolbarRow, DocsRulersLeftRail, } from "@/components/drive/richtext/docs-rulers-chrome" import type { DocPageLayout } from "@/lib/drive/doc-page-setup" import { DOCS_VERTICAL_RULER_WIDTH_PX } from "@/lib/drive/docs-page-layout-constants" import { docsZoomToScale } from "@/lib/drive/docs-ruler-scale" import { useDocsRulerSync } from "@/lib/drive/use-docs-ruler-sync" import { useDocsRulerMarginDrag } from "@/components/drive/richtext/use-docs-ruler-margin-drag" import { DocsRulerMarginDragTooltip } from "@/components/drive/richtext/docs-ruler-markers" import { DocsGraphicFloatingToolbar } from "@/components/drive/richtext/docs-graphic-floating-toolbar" import { DocsTableFloatingToolbar } from "@/components/drive/richtext/docs-table-floating-toolbar" import { DOCS_GRAPHIC_DRAW_EVENT, DocsGraphicDrawModal, } from "@/components/drive/richtext/docs-graphic-draw-modal" import { DOCS_GRAPHIC_OPTIONS_EVENT, DOCS_GRAPHIC_OPTIONS_SIDEBAR_WIDTH_PX, DocsGraphicOptionsSidebar, } from "@/components/drive/richtext/docs-graphic-options-sidebar" import { cn } from "@/lib/utils" export function DocsEditorWorkspace({ editor, pageLayout, zoom, editable, showLayout, showRuler, showNonPrintableChars, editorMode, outlineExpanded, onToggleOutline, onPageCountChange, onCurrentPageChange, toolbar, toolbarShellClassName, onRegionContentChange, onPageSetupChange, onRegionEditorChange, onPageStackReady, }: { editor: Editor pageLayout: DocPageLayout zoom: number editable: boolean showLayout: boolean showRuler: boolean showNonPrintableChars: boolean editorMode: "edit" | "suggest" | "view" outlineExpanded?: boolean onToggleOutline?: () => void onPageCountChange?: (count: number) => void onCurrentPageChange?: (page: number) => void toolbar?: ReactNode toolbarShellClassName?: string onRegionContentChange?: ( region: "header" | "footer", content: Record, meta: { pageIndex: number; contentHeightPx: number } ) => void onPageSetupChange?: ( patch: Partial, options?: { immediate?: boolean } ) => void onRegionEditorChange?: (editor: import("@tiptap/react").Editor | null) => void onPageStackReady?: (getPageStack: () => HTMLElement | null) => void }) { const canvasRef = useRef(null) const rulerTrackRef = useRef(null) const [pageCount, setPageCount] = useState(1) const [narrowViewport, setNarrowViewport] = useState(false) const [graphicOptionsOpen, setGraphicOptionsOpen] = useState(false) const [graphicOptionsSection, setGraphicOptionsSection] = useState(null) const [graphicDrawOpen, setGraphicDrawOpen] = useState(false) useEffect(() => { const onOpenOptions = (event: Event) => { const detail = (event as CustomEvent<{ section?: import("@/lib/drive/docs-graphic-ui").DocsGraphicOptionsSection }>).detail setGraphicOptionsSection(detail?.section ?? null) setGraphicOptionsOpen(true) } const onOpenDraw = () => setGraphicDrawOpen(true) window.addEventListener(DOCS_GRAPHIC_OPTIONS_EVENT, onOpenOptions) window.addEventListener(DOCS_GRAPHIC_DRAW_EVENT, onOpenDraw) return () => { window.removeEventListener(DOCS_GRAPHIC_OPTIONS_EVENT, onOpenOptions) window.removeEventListener(DOCS_GRAPHIC_DRAW_EVENT, onOpenDraw) } }, []) const rulersVisible = showLayout && showRuler const scale = docsZoomToScale(zoom) const showToolbarShell = Boolean(toolbar) || rulersVisible const marginsEditable = editable && editorMode !== "view" const graphicOptionsSidebarOpen = graphicOptionsOpen && editable && editorMode !== "view" const graphicOptionsSidebarInset = graphicOptionsSidebarOpen ? DOCS_GRAPHIC_OPTIONS_SIDEBAR_WIDTH_PX : 0 const { pageLayoutWithMargins, beginMarginDrag, moveMarginDrag, endMarginDrag, dragTooltip, } = useDocsRulerMarginDrag({ pageLayout, editable: marginsEditable, onPageSetupChange, }) const rulerSync = useDocsRulerSync({ canvasRef, rulerTrackRef, editor, pageLayout: pageLayoutWithMargins, zoom, pageCount, narrowViewport, }) useEffect(() => { onCurrentPageChange?.(rulerSync.currentPage + 1) }, [onCurrentPageChange, rulerSync.currentPage]) useEffect(() => { onPageStackReady?.( () => canvasRef.current?.querySelector("[data-docs-page-stack]") ?? null ) }, [onPageStackReady, pageCount, showLayout, zoom]) return (
setGraphicDrawOpen(false)} /> {showToolbarShell ? (
{toolbar} {rulersVisible ? ( ) : null}
) : null}
{rulersVisible ? ( ) : null}
{ setPageCount(count) onPageCountChange?.(count) }} onNarrowViewportChange={setNarrowViewport} onRegionContentChange={onRegionContentChange} onPageSetupChange={onPageSetupChange} onRegionEditorChange={onRegionEditorChange} />
{ setGraphicOptionsOpen(false) setGraphicOptionsSection(null) }} />
) }