'use client'; import { useState, useRef, useEffect, useCallback } from 'react'; import { useAtom } from 'jotai'; import { cn } from './utils'; import { topOpenAtom, isMobileAtom, anyMobileSidebarOpenAtom, isChatFullscreenModeAtom } from './store'; // Simple SVG icons to replace Lucide React icons const UserRoundIcon = ({ size = 20, className = '' }) => ( ); const SearchIcon = ({ size = 20, className = '' }) => ( ); const ShoppingCartIcon = ({ size = 20, className = '' }) => ( ); const HeartIcon = ({ size = 20, className = '' }) => ( ); const GitCommitHorizontalIcon = ({ size = 16 }) => ( ); const GitCommitVerticalIcon = ({ size = 16 }) => ( ); // Simple dropdown component const SelectDropdown = ({ options = ['default'] }: { options?: string[] }) => { return ( ); }; const SidebarTop = () => { const [topOpen, setTopOpen] = useAtom(topOpenAtom); const [searchOpen, setSearchOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const searchRef = useRef(null); const [isMobile, setIsMobile] = useAtom(isMobileAtom); const [anyMobileSidebarOpen] = useAtom(anyMobileSidebarOpenAtom); const [isChatFullscreenMode] = useAtom(isChatFullscreenModeAtom); // Detect mobile screen size useEffect(() => { const handleResize = () => { setIsMobile(typeof window !== 'undefined' && window.innerWidth < 768); }; // Initial check handleResize(); // Add event listener with passive option for better performance if (typeof window !== 'undefined') { window.addEventListener('resize', handleResize, { passive: true }); } // Clean up on unmount return () => { if (typeof window !== 'undefined') { window.removeEventListener('resize', handleResize); } }; }, [setIsMobile]); // Close search when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( searchRef.current && !searchRef.current.contains(event.target as Node) ) { setSearchOpen(false); } }; if (typeof document !== 'undefined') { document.addEventListener('mousedown', handleClickOutside, { passive: true }); } return () => { if (typeof document !== 'undefined') { document.removeEventListener('mousedown', handleClickOutside); } }; }, []); // Focus input when search opens useEffect(() => { if (searchOpen && searchRef.current) { const input = searchRef.current.querySelector('input'); if (input) input.focus(); } }, [searchOpen]); // Toggle sidebar handler const handleToggleSidebar = useCallback(() => { setTopOpen(!topOpen); }, [topOpen, setTopOpen]); // Clear search handler const handleClearSearch = useCallback(() => { setSearchQuery(''); }, []); // Toggle search handler const handleToggleSearch = useCallback(() => { setSearchOpen(!searchOpen); }, [searchOpen]); // Hide in mobile if any sidebar is open or in desktop when chat detail is open if ((isMobile && anyMobileSidebarOpen) || isChatFullscreenMode) { return null; } return (
{topOpen && (
{/* User Icon */} {/* Search */}
{searchOpen ? (
setSearchQuery(e.target.value)} className="px-4 py-2 pl-10 rounded-lg border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition duration-200 w-64 shadow-sm" />
{searchQuery && ( )}
) : ( )}
{/* Shopping Cart */} {/* Favorites */}
)}
); }; export default SidebarTop;