"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 (
);
}