import React, { useState, useEffect, useRef } from 'react' import { ChevronLeft, ChevronDown, ChevronRight, Search, MessageSquare, Edit, Image, LayoutGrid, Folder, Settings, User, Pin, MoreHorizontal, Archive, Trash2, PanelLeft, PanelRight } from 'lucide-react' const pochiLogo = '/assets/pochi.jpeg' const Sidebar = ({ isOpen, toggleSidebar, conversations = [], currentConversationId, onSelectConversation, onNewChat, onDeleteConversation, onRenameConversation, onTogglePin, onToggleArchive, onSearchClick, onSettingsClick, darkMode, userProfile }) => { const sidebarRef = useRef(null) const [activeMenuId, setActiveMenuId] = React.useState(() => { return sessionStorage.getItem('activeMenuId') || null }) const [isHistoryCollapsed, setIsHistoryCollapsed] = useState(() => { return localStorage.getItem('isHistoryCollapsed') === 'true' }) const [editingId, setEditingId] = useState(() => { return sessionStorage.getItem('editingId') || null }) const [editTitle, setEditTitle] = useState(() => { return sessionStorage.getItem('editTitle') || '' }) const [menuPlacement, setMenuPlacement] = useState(() => { return sessionStorage.getItem('menuPlacement') || 'bottom' }) const pinnedChats = conversations.filter(c => c.isPinned && !c.isArchived) const activeChats = conversations.filter(c => !c.isPinned && !c.isArchived) const handleStartRename = (conv) => { setEditingId(conv.id) setEditTitle(conv.title || 'Đoạn chat mới') setActiveMenuId(null) sessionStorage.setItem('isNewRename', 'true') } const handleSaveRename = (id) => { if (editTitle.trim()) { onRenameConversation(id, editTitle.trim()) } setEditingId(null) } const handleCancelRename = () => { setEditingId(null) } // Close menu when clicking outside React.useEffect(() => { const handleClickOutside = () => setActiveMenuId(null) window.addEventListener('click', handleClickOutside) return () => window.removeEventListener('click', handleClickOutside) }, []) useEffect(() => { localStorage.setItem('isHistoryCollapsed', isHistoryCollapsed) }, [isHistoryCollapsed]) useEffect(() => { if (activeMenuId) { sessionStorage.setItem('activeMenuId', activeMenuId) sessionStorage.setItem('menuPlacement', menuPlacement) } else { sessionStorage.removeItem('activeMenuId') sessionStorage.removeItem('menuPlacement') } }, [activeMenuId, menuPlacement]) useEffect(() => { if (editingId) { sessionStorage.setItem('editingId', editingId) sessionStorage.setItem('editTitle', editTitle) } else { sessionStorage.removeItem('editingId') sessionStorage.removeItem('editTitle') } }, [editingId, editTitle]) const historyScrollRef = useRef(null) // Handle history scroll persistence const handleHistoryScroll = (e) => { if (!isOpen) return // Only save if open sessionStorage.setItem('sidebarScrollTop', e.target.scrollTop) } React.useLayoutEffect(() => { if (!isHistoryCollapsed && historyScrollRef.current) { const savedScroll = sessionStorage.getItem('sidebarScrollTop') if (savedScroll) { historyScrollRef.current.scrollTop = parseInt(savedScroll, 10) } } }, [isHistoryCollapsed, conversations]) // Restore when expanded or conversations change const renderChatItem = (conv) => (