"use client"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { PanelRight, PanelRightClose } from "lucide-react"; import dynamic from "next/dynamic"; import { startTransition, useEffect } from "react"; import { closeHitlEditPanelAtom, hitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom"; import { closeReportPanelAtom, reportPanelAtom } from "@/atoms/chat/report-panel.atom"; import { documentsSidebarOpenAtom } from "@/atoms/documents/ui.atoms"; import { closeEditorPanelAtom, editorPanelAtom } from "@/atoms/editor/editor-panel.atom"; import { rightPanelCollapsedAtom, rightPanelTabAtom } from "@/atoms/layout/right-panel.atom"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { DocumentsSidebar } from "../sidebar"; const EditorPanelContent = dynamic( () => import("@/components/editor-panel/editor-panel").then((m) => ({ default: m.EditorPanelContent, })), { ssr: false, loading: () => null } ); const HitlEditPanelContent = dynamic( () => import("@/components/hitl-edit-panel/hitl-edit-panel").then((m) => ({ default: m.HitlEditPanelContent, })), { ssr: false, loading: () => } ); const ReportPanelContent = dynamic( () => import("@/components/report-panel/report-panel").then((m) => ({ default: m.ReportPanelContent, })), { ssr: false, loading: () => } ); interface RightPanelProps { documentsPanel?: { open: boolean; onOpenChange: (open: boolean) => void; }; } function CollapseButton({ onClick }: { onClick: () => void }) { return ( Collapse panel ); } /** * Absolutely positioned expand button — renders at top-right of the main * container so it occupies the same screen position as the collapse button * inside the Documents header. */ export function RightPanelExpandButton() { const [collapsed, setCollapsed] = useAtom(rightPanelCollapsedAtom); const documentsOpen = useAtomValue(documentsSidebarOpenAtom); const reportState = useAtomValue(reportPanelAtom); const editorState = useAtomValue(editorPanelAtom); const hitlEditState = useAtomValue(hitlEditPanelAtom); const reportOpen = reportState.isOpen && !!reportState.reportId; const editorOpen = editorState.isOpen && !!editorState.documentId; const hitlEditOpen = hitlEditState.isOpen && !!hitlEditState.onSave; const hasContent = documentsOpen || reportOpen || editorOpen || hitlEditOpen; if (!collapsed || !hasContent) return null; return (
Expand panel
); } const PANEL_WIDTHS = { sources: 420, report: 640, editor: 640, "hitl-edit": 640 } as const; export function RightPanel({ documentsPanel }: RightPanelProps) { const [activeTab] = useAtom(rightPanelTabAtom); const reportState = useAtomValue(reportPanelAtom); const closeReport = useSetAtom(closeReportPanelAtom); const editorState = useAtomValue(editorPanelAtom); const closeEditor = useSetAtom(closeEditorPanelAtom); const hitlEditState = useAtomValue(hitlEditPanelAtom); const closeHitlEdit = useSetAtom(closeHitlEditPanelAtom); const [collapsed, setCollapsed] = useAtom(rightPanelCollapsedAtom); const documentsOpen = documentsPanel?.open ?? false; const reportOpen = reportState.isOpen && !!reportState.reportId; const editorOpen = editorState.isOpen && !!editorState.documentId; const hitlEditOpen = hitlEditState.isOpen && !!hitlEditState.onSave; useEffect(() => { if (!reportOpen && !editorOpen && !hitlEditOpen) return; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { if (hitlEditOpen) closeHitlEdit(); else if (editorOpen) closeEditor(); else if (reportOpen) closeReport(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [reportOpen, editorOpen, hitlEditOpen, closeReport, closeEditor, closeHitlEdit]); const isVisible = (documentsOpen || reportOpen || editorOpen || hitlEditOpen) && !collapsed; let effectiveTab = activeTab; if (effectiveTab === "hitl-edit" && !hitlEditOpen) { effectiveTab = editorOpen ? "editor" : reportOpen ? "report" : "sources"; } else if (effectiveTab === "editor" && !editorOpen) { effectiveTab = reportOpen ? "report" : "sources"; } else if (effectiveTab === "report" && !reportOpen) { effectiveTab = editorOpen ? "editor" : "sources"; } else if (effectiveTab === "sources" && !documentsOpen) { effectiveTab = hitlEditOpen ? "hitl-edit" : editorOpen ? "editor" : reportOpen ? "report" : "sources"; } const targetWidth = PANEL_WIDTHS[effectiveTab]; const collapseButton = setCollapsed(true)} />; if (!isVisible) return null; return ( ); }