"use client"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { PanelRight } 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 { citationPanelAtom, closeCitationPanelAtom } from "@/atoms/citation/citation-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 { 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 CitationPanelContent = dynamic( () => import("@/components/citation-panel/citation-panel").then((m) => ({ default: m.CitationPanelContent, })), { ssr: false, loading: () => null } ); const HitlEditPanelContent = dynamic( () => import("@/components/hitl-edit-panel/hitl-edit-panel").then((m) => ({ default: m.HitlEditPanelContent, })), { ssr: false, loading: () => null } ); const ReportPanelContent = dynamic( () => import("@/components/report-panel/report-panel").then((m) => ({ default: m.ReportPanelContent, })), { ssr: false, loading: () => null } ); 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 citationState = useAtomValue(citationPanelAtom); const reportOpen = reportState.isOpen && !!reportState.reportId; const editorOpen = editorState.isOpen && (editorState.kind === "document" ? !!editorState.documentId : !!editorState.localFilePath); const hitlEditOpen = hitlEditState.isOpen && !!hitlEditState.onSave; const citationOpen = citationState.isOpen && citationState.chunkId != null; const hasContent = documentsOpen || reportOpen || editorOpen || hitlEditOpen || citationOpen; if (!collapsed || !hasContent) return null; return (
Expand panel
); } const PANEL_WIDTHS = { sources: 420, report: 640, editor: 640, "hitl-edit": 640, citation: 560, } 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 citationState = useAtomValue(citationPanelAtom); const closeCitation = useSetAtom(closeCitationPanelAtom); const [collapsed, setCollapsed] = useAtom(rightPanelCollapsedAtom); const documentsOpen = documentsPanel?.open ?? false; const reportOpen = reportState.isOpen && !!reportState.reportId; const editorOpen = editorState.isOpen && (editorState.kind === "document" ? !!editorState.documentId : !!editorState.localFilePath); const hitlEditOpen = hitlEditState.isOpen && !!hitlEditState.onSave; const citationOpen = citationState.isOpen && citationState.chunkId != null; useEffect(() => { if (!reportOpen && !editorOpen && !hitlEditOpen && !citationOpen) return; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { if (hitlEditOpen) closeHitlEdit(); else if (citationOpen) closeCitation(); else if (editorOpen) closeEditor(); else if (reportOpen) closeReport(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [ reportOpen, editorOpen, hitlEditOpen, citationOpen, closeReport, closeEditor, closeHitlEdit, closeCitation, ]); const isVisible = (documentsOpen || reportOpen || editorOpen || hitlEditOpen || citationOpen) && !collapsed; let effectiveTab = activeTab; if (effectiveTab === "hitl-edit" && !hitlEditOpen) { effectiveTab = citationOpen ? "citation" : editorOpen ? "editor" : reportOpen ? "report" : "sources"; } else if (effectiveTab === "citation" && !citationOpen) { effectiveTab = editorOpen ? "editor" : reportOpen ? "report" : "sources"; } else if (effectiveTab === "editor" && !editorOpen) { effectiveTab = citationOpen ? "citation" : reportOpen ? "report" : "sources"; } else if (effectiveTab === "report" && !reportOpen) { effectiveTab = citationOpen ? "citation" : editorOpen ? "editor" : "sources"; } else if (effectiveTab === "sources" && !documentsOpen) { effectiveTab = hitlEditOpen ? "hitl-edit" : citationOpen ? "citation" : editorOpen ? "editor" : reportOpen ? "report" : "sources"; } const targetWidth = PANEL_WIDTHS[effectiveTab]; const collapseButton = setCollapsed(true)} />; if (!isVisible) return null; return ( ); }