"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 { cn } from "@/lib/utils" export function DocsEditorWorkspace({ editor, pageLayout, zoom, editable, showLayout, showRuler, showNonPrintableChars, editorMode, outlineExpanded, onToggleOutline, onPageCountChange, onCurrentPageChange, toolbar, toolbarShellClassName, onRegionContentChange, onPageSetupChange, onRegionEditorChange, }: { 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 }) { const canvasRef = useRef(null) const rulerTrackRef = useRef(null) const [pageCount, setPageCount] = useState(1) const [narrowViewport, setNarrowViewport] = useState(false) const rulersVisible = showLayout && showRuler const scale = docsZoomToScale(zoom) const showToolbarShell = Boolean(toolbar) || rulersVisible const marginsEditable = editable && editorMode !== "view" 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]) return (
{showToolbarShell ? (
{toolbar} {rulersVisible ? ( ) : null}
) : null}
{rulersVisible ? ( ) : null}
{ setPageCount(count) onPageCountChange?.(count) }} onNarrowViewportChange={setNarrowViewport} onRegionContentChange={onRegionContentChange} onPageSetupChange={onPageSetupChange} onRegionEditorChange={onRegionEditorChange} />
) }