"use client"; import { type ComponentProps, useCallback, useEffect, useRef } from "react"; import { X } from "lucide-react"; import type { AgentState } from "@/features/agents/state/store"; import { TaskBoardView } from "@/features/office/tasks/TaskBoardView"; import type { TaskBoardCard, TaskBoardStatus } from "@/features/office/tasks/types"; import type { CronJobSummary } from "@/lib/cron/types"; export function KanbanImmersiveScreen({ agents, cardsByStatus, selectedCard, activeRuns, cronJobs, cronLoading, cronError, taskCaptureDebug, onCreateCard, onMoveCard, onSelectCard, onUpdateCard, onDeleteCard, onRefreshCronJobs, onClose, }: { agents: AgentState[]; cardsByStatus: Record; selectedCard: TaskBoardCard | null; activeRuns: Array<{ runId: string; agentId: string; label: string }>; cronJobs: CronJobSummary[]; cronLoading: boolean; cronError: string | null; taskCaptureDebug?: ComponentProps["taskCaptureDebug"]; onCreateCard: () => void; onMoveCard: (cardId: string, status: TaskBoardStatus) => void; onSelectCard: (cardId: string | null) => void; onUpdateCard: (cardId: string, patch: Partial) => void; onDeleteCard: (cardId: string) => void; onRefreshCronJobs: () => void; onClose: () => void; }) { const dialogRef = useRef(null); const handleKeyDown = useCallback( (event: KeyboardEvent) => { if (event.key === "Escape") { event.stopPropagation(); onClose(); } }, [onClose] ); useEffect(() => { document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [handleKeyDown]); useEffect(() => { const dialog = dialogRef.current; if (!dialog) return; const previouslyFocused = document.activeElement as HTMLElement | null; dialog.focus(); const trapFocus = (event: FocusEvent) => { if (!dialog.contains(event.target as Node)) { event.stopPropagation(); dialog.focus(); } }; document.addEventListener("focusin", trapFocus); return () => { document.removeEventListener("focusin", trapFocus); previouslyFocused?.focus?.(); }; }, []); return (
{ if (e.target === e.currentTarget) onClose(); }} >
); }