'use client'; import { useEffect, useCallback, memo, useState } from 'react'; import { GitCommitHorizontal, GitCommitVertical, Maximize2, Minimize2 } from 'lucide-react'; import { useAtom } from 'jotai'; import { cn } from './utils'; import { rightOpenAtom, rightExpandedAtom, isMobileAtom, anyMobileSidebarOpenAtom, isChatFullscreenModeAtom, toggleRightSidebarAtom, toggleRightExpandedAtom, } from './store'; // Sidebar content component for memoization const SidebarRightContent = memo(({ rightExpanded, isMobile, isResizing }: { rightExpanded: boolean; isMobile: boolean; isResizing: boolean }) => { return (

tt

); }); SidebarRightContent.displayName = 'SidebarRightContent'; const SidebarRight = () => { const [rightOpen, setRightOpen] = useAtom(rightOpenAtom); const [rightExpanded, setRightExpanded] = useAtom(rightExpandedAtom); const [isMobile, setIsMobile] = useAtom(isMobileAtom); const [anyMobileSidebarOpen] = useAtom(anyMobileSidebarOpenAtom); const [isChatFullscreenMode] = useAtom(isChatFullscreenModeAtom); const [, toggleRightSidebar] = useAtom(toggleRightSidebarAtom); const [, toggleRightExpanded] = useAtom(toggleRightExpandedAtom); const [isResizing, setIsResizing] = useState(false); // Detect mobile screen size useEffect(() => { const handleResize = () => { setIsMobile(window.innerWidth < 768); }; // Initial check handleResize(); // Add event listener with passive option for better performance window.addEventListener('resize', handleResize, { passive: true }); // Clean up on unmount return () => window.removeEventListener('resize', handleResize); }, [setIsMobile]); // Handler for toggling sidebar const handleToggleSidebar = useCallback(() => { if (isMobile) { toggleRightSidebar(); } else { setRightOpen(!rightOpen); // Reset expanded state when closing if (rightOpen) { setRightExpanded(false); } } }, [isMobile, rightOpen, setRightOpen, toggleRightSidebar, setRightExpanded]); // Handler for toggling expanded state const handleToggleExpanded = useCallback(() => { setIsResizing(true); toggleRightExpanded(); // Show loading state for a short time to allow the SplineScene to adjust setTimeout(() => { setIsResizing(false); }, 800); }, [toggleRightExpanded]); // If any mobile sidebar is open but not this one, don't render // Or if chat is in fullscreen mode, don't render if ( (isMobile && anyMobileSidebarOpen && !rightOpen) || isChatFullscreenMode ) { return null; } return (
{rightOpen && (

Helpi

{!isMobile && (
)}
)}
); }; export default memo(SidebarRight);