"use client"; import { IconArrowsMaximize, IconX } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { useAppStore } from "@/components/state-provider"; import type { UseEnsureTaskSessionResult } from "@/hooks/domains/session/use-ensure-task-session"; import type { Task } from "./kanban-card"; import { PreviewSessionTabs } from "./task/preview-session-tabs"; import { TaskMoveErrorBanner } from "./task/task-move-error-banner"; import { MinimalWorkflowStepper, type WorkflowStepperStep } from "./task/workflow-step-disclosure"; import { useTranslation } from "react-i18next"; interface TaskPreviewPanelProps { task: Task | null; sessionId?: string | null; ensureSession?: UseEnsureTaskSessionResult; onClose: () => void; onMaximize?: (task: Task) => void; onSessionChange?: (sessionId: string | null) => void; workflowSteps?: WorkflowStepperStep[]; currentStepId?: string | null; taskWorkflowId?: string | null; isArchived?: boolean; movingToStepId?: string | null; onMoveStep?: (stepId: string) => Promise; onDisclosureOpenChange?: (open: boolean) => void; moveError?: unknown; } interface PreviewPanelHeaderProps { task: Task | null; onClose: () => void; onMaximize?: (task: Task) => void; workflowSteps: WorkflowStepperStep[]; currentStepId: string | null; taskWorkflowId: string | null; isArchived: boolean; movingToStepId: string | null; onMoveStep?: (stepId: string) => Promise; onDisclosureOpenChange?: (open: boolean) => void; } function PreviewPanelHeader({ task, onClose, onMaximize, workflowSteps, currentStepId, taskWorkflowId, isArchived, movingToStepId, onMoveStep, onDisclosureOpenChange, }: PreviewPanelHeaderProps) { const { t } = useTranslation(); const currentIndex = workflowSteps.findIndex((step) => step.id === currentStepId); const handleMoveStep = task && workflowSteps.length > 0 ? onMoveStep : undefined; return (

{task?.title ?? t("task:taskChat")}

{handleMoveStep && (
normally sizes to its content regardless of `display`, // so without an explicit width it overflows this shrink-capped // wrapper instead of shrinking to it (defeating truncation). className="min-w-0 max-w-[50%] shrink [&>button]:w-full" >
)}
{onMaximize && task && ( )}
); } export function TaskPreviewPanel({ task, sessionId = null, ensureSession, onClose, onMaximize, onSessionChange, workflowSteps = [], currentStepId = null, taskWorkflowId = null, isArchived = false, movingToStepId = null, onMoveStep, onDisclosureOpenChange, moveError = null, }: TaskPreviewPanelProps) { const { t } = useTranslation(); const activeWorkspaceId = useAppStore((s) => s.workspaces.activeId); return (
{moveError !== null && } {/* Content */}
{task ? ( ) : (
{t("task:selectATaskToStartChatting")}
)}
); }