import { lazy, Suspense, type ReactNode } from "react"; import type YProvider from "y-partyserver/provider"; import { PageErrorState } from "@/client/components/ui/page-error-state"; import { PageTitleSection } from "@/client/components/ui/page-title-section"; import { Skeleton } from "@/client/components/ui/skeleton"; import { CANVAS_PAGE_BODY_CENTERED_CLASS, CANVAS_PAGE_BODY_STAGE_CLASS, type CanvasStageLayout, PAGE_SHELL_CLASS, PAGE_STAGE_CLASS, PAGE_STAGE_TRACKS_CLASS, } from "@/client/components/ui/page-layout"; import type { CanvasAffordance } from "@/client/lib/affordance/canvas"; import { useCanvasSession } from "./use-canvas-session"; const CANVAS_LOAD_ERROR_MESSAGE = "This canvas didn't load. Your connection might be flaky."; const CanvasSurface = lazy(() => import("./canvas-surface").then((mod) => ({ default: mod.CanvasSurface }))); interface CanvasPageProps { pageId: string; initialTitle: string; onTitleChange?: (title: string) => void; onProvider?: (provider: YProvider | null) => void; shareToken?: string; workspaceId?: string; affordance: CanvasAffordance; layout?: CanvasStageLayout; chrome: ReactNode; } export function CanvasPage({ pageId, initialTitle, onTitleChange, onProvider, shareToken, workspaceId, affordance, layout = "centered", chrome, }: CanvasPageProps) { const session = useCanvasSession({ pageId, initialTitle, onTitleChange, onProvider, shareToken, workspaceId, }); const titleProps = { title: session.title, onInput: session.onTitleInput, disabled: session.kind !== "ready", readOnly: !affordance.canEdit, }; const body = session.kind === "error" ? (
) : session.kind === "ready" ? ( }> ) : (
); return (
{chrome}
{body}
); } function CanvasModuleLoading() { return (
Loading canvas…
); }