'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 (
);
});
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);