import { useMemo } from 'preact/hooks'; import type { RefObject } from 'preact'; import { Archive, ArrowUpDown, Check, Copy, CreditCard, Folder as FolderIcon, FolderPlus, FolderX, Globe, KeyRound, LayoutGrid, Pencil, ShieldUser, Star, StickyNote, Trash2, X, } from 'lucide-preact'; import type { Folder } from '@/lib/types'; import { t } from '@/lib/i18n'; import { getFolderSortOptions, type SidebarFilter, type VaultSortMode } from '@/components/vault/vault-page-helpers'; interface VaultSidebarProps { folders: Folder[]; sidebarFilter: SidebarFilter; busy: boolean; isMobileLayout: boolean; mobileSidebarOpen: boolean; folderSortMode: VaultSortMode; folderSortMenuOpen: boolean; folderSortMenuRef: RefObject; onCloseMobileSidebar: () => void; onChangeFilter: (filter: SidebarFilter) => void; onOpenDeleteAllFolders: () => void; onOpenCreateFolder: () => void; onOpenRenameFolder: (folder: Folder) => void; onOpenDeleteFolder: (folder: Folder) => void; onToggleFolderSortMenu: () => void; onSelectFolderSortMode: (value: VaultSortMode) => void; } export default function VaultSidebar(props: VaultSidebarProps) { const folderSortOptions = getFolderSortOptions(); const nameCollator = useMemo( () => new Intl.Collator(undefined, { sensitivity: 'base', numeric: true }), [] ); const sortedFolders = useMemo(() => { const sorted = [...props.folders]; sorted.sort((a, b) => { if (props.folderSortMode === 'edited') { const aTime = new Date(String(a.revisionDate || a.creationDate || '')).getTime(); const bTime = new Date(String(b.revisionDate || b.creationDate || '')).getTime(); const aValid = Number.isFinite(aTime); const bValid = Number.isFinite(bTime); if (aValid && bValid) { const diff = bTime - aTime; if (diff !== 0) return diff; } if (aValid !== bValid) return aValid ? -1 : 1; } else if (props.folderSortMode === 'created') { const aTime = new Date(String(a.creationDate || '')).getTime(); const bTime = new Date(String(b.creationDate || '')).getTime(); const aValid = Number.isFinite(aTime); const bValid = Number.isFinite(bTime); if (aValid && bValid) { const diff = bTime - aTime; if (diff !== 0) return diff; } if (aValid !== bValid) return aValid ? -1 : 1; } const nameDiff = nameCollator.compare( String(a.decName || a.name || ''), String(b.decName || b.name || '') ); if (nameDiff !== 0) return nameDiff; return String(a.id || '').localeCompare(String(b.id || '')); }); return sorted; }, [props.folders, props.folderSortMode, nameCollator]); return ( ); }