"use client"; import { CanvasShareDialog } from "./canvas-share-dialog"; import { CanvasRenameDialog } from "./canvas-rename-dialog"; import { Button } from "@kandev/ui/button"; import { controlSizingClassName } from "@kandev/ui/control-sizing"; import { IconPencil } from "@tabler/icons-react"; import { CanvasHostFrame } from "./canvas-host-frame"; import { useTranslation } from "react-i18next"; import { CanvasDesktopActions, CanvasDesktopOverflowActions, CanvasDesktopOverflowMenuItems, CanvasDesktopPrimaryAction, CanvasHostBody, CanvasHostDialogs, CanvasMobileActionsButton, MobileCanvasActions, type CanvasHostState, } from "./canvas-host-components"; import { canvasDataScope, type Canvas } from "@/lib/api/domains/canvas-api"; type CanvasHostRouteViewProps = { canvasId: string; embedded: boolean; isMobile: boolean; canvas: Canvas | null; hostCanvases: Canvas[]; runtimeUrl: string | null; state: CanvasHostState; error: string | null; menuOpen: boolean; promotionOpen: boolean; workspaceDataOpen: boolean; releasesOpen: boolean; shareOpen: boolean; renameOpen: boolean; editing: boolean; setMenuOpen: (open: boolean) => void; setPromotionOpen: (open: boolean) => void; setWorkspaceDataOpen: (open: boolean) => void; setReleasesOpen: (open: boolean) => void; setShareOpen: (open: boolean) => void; setRenameOpen: (open: boolean) => void; onEdit: () => void; onPromote: () => void; onEnableWorkspaceData: () => void; onReleases: () => void; onShare: () => void; onRename: () => void; onSelectCanvas: (canvas: Canvas) => void; onRuntimeReady: () => void; onRuntimeError: () => void; onRetry: () => void; onPromotionCompleted: () => void; onChanged: () => void; }; function CanvasHostRouteDialogs({ canvas, promotionOpen, setPromotionOpen, workspaceDataOpen, setWorkspaceDataOpen, releasesOpen, setReleasesOpen, shareOpen, setShareOpen, renameOpen, setRenameOpen, onPromotionCompleted, onChanged, }: Pick< CanvasHostRouteViewProps, | "canvas" | "promotionOpen" | "setPromotionOpen" | "workspaceDataOpen" | "setWorkspaceDataOpen" | "releasesOpen" | "setReleasesOpen" | "shareOpen" | "setShareOpen" | "renameOpen" | "setRenameOpen" | "onPromotionCompleted" | "onChanged" >) { return ( <> ); } function CanvasHostRouteBody({ canvasId, title, state, runtimeUrl, error, onRuntimeReady, onRuntimeError, onRetry, }: Pick< CanvasHostRouteViewProps, "canvasId" | "runtimeUrl" | "state" | "error" | "onRuntimeReady" | "onRuntimeError" | "onRetry" > & { title: string }) { return ( ); } function CanvasHostRouteMobileActions({ canvas, menuOpen, setMenuOpen, onEdit, onPromote, onEnableWorkspaceData, onReleases, onShare, onRename, editing, hostCanvases, onSelectCanvas, }: Pick< CanvasHostRouteViewProps, | "canvas" | "menuOpen" | "setMenuOpen" | "onEdit" | "onPromote" | "onEnableWorkspaceData" | "onReleases" | "onShare" | "onRename" | "editing" | "onSelectCanvas" > & { hostCanvases: Canvas[] }) { return ( ); } function createCanvasDesktopActions(canvas: Canvas | null, props: CanvasHostRouteViewProps) { if (!canvas) { return { actions: null, overflowActions: null, overflowMenuItems: null, overflowPrimaryAction: null, }; } const actionProps = { canvas, editing: props.editing, onEdit: props.onEdit, onPromote: props.onPromote, onReleases: props.onReleases, onShare: props.onShare, onEnableWorkspaceData: props.onEnableWorkspaceData, }; return { actions: , overflowActions: , overflowMenuItems: , overflowPrimaryAction: , }; } function useCanvasHeaderPresentation(canvas: Canvas | null, isMobile: boolean) { const { t } = useTranslation(); const title = canvas?.title || t("canvases:canvas"); const dataScopeLabel = canvas ? t( canvasDataScope(canvas) === "workspace" ? "canvases:workspaceDataScope" : "canvases:taskDataScope", ) : undefined; const mobileTitleSlot = isMobile && dataScopeLabel ? ( {title} {dataScopeLabel} ) : undefined; return { title, dataScopeLabel, mobileTitleSlot }; } export function CanvasHostRouteView(props: CanvasHostRouteViewProps) { const { canvas, isMobile, menuOpen, setMenuOpen } = props; const { t } = useTranslation(); const { title, dataScopeLabel, mobileTitleSlot } = useCanvasHeaderPresentation(canvas, isMobile); const desktopActions = createCanvasDesktopActions(canvas, props); const renameAction = canvas ? ( ) : null; const mobileActionsButton = isMobile ? ( setMenuOpen(true)} /> ) : null; const canvasBody = ( ); const mobileActions = ( ); const dialogs = ( ); return ( ); }