import { ALL_NAV_ITEMS } from '../../config/navItems'; import type { SidebarItemConfig } from '../../store/sidebarStore'; export type SidebarNavSection = 'library' | 'system'; export type SidebarNavDropTarget = { idx: number; before: boolean; section: SidebarNavSection; }; export function getLibraryItemsForReorder( items: SidebarItemConfig[], randomNavMode: 'hub' | 'separate', ): SidebarItemConfig[] { return items.filter(cfg => { if (!ALL_NAV_ITEMS[cfg.id] || ALL_NAV_ITEMS[cfg.id].section !== 'library') return false; if (randomNavMode === 'hub' && (cfg.id === 'randomMix' || cfg.id === 'randomAlbums' || cfg.id === 'luckyMix')) return false; if (randomNavMode === 'separate' && cfg.id === 'randomPicker') return false; return true; }); } export function getSystemItemsForReorder(items: SidebarItemConfig[]): SidebarItemConfig[] { return items.filter(cfg => ALL_NAV_ITEMS[cfg.id]?.section === 'system'); } /** Same entries as in Settings toggles — safe to hide via drag-out. */ export function isSidebarNavItemUserHideable(id: string): boolean { return Boolean(ALL_NAV_ITEMS[id]); } /** * Reorders one sidebar section (library or system) like the Settings customizer. * Returns a new `items` array, or null if nothing changes. */ export function applySidebarDropReorder( allItems: SidebarItemConfig[], section: SidebarNavSection, fromIdx: number, target: SidebarNavDropTarget | null, randomNavMode: 'hub' | 'separate', ): SidebarItemConfig[] | null { if (!target || target.section !== section) return null; const sectionItems = section === 'library' ? [...getLibraryItemsForReorder(allItems, randomNavMode)] : [...getSystemItemsForReorder(allItems)]; const insertBefore = target.before ? target.idx : target.idx + 1; if (insertBefore === fromIdx || insertBefore === fromIdx + 1) return null; const [moved] = sectionItems.splice(fromIdx, 1); sectionItems.splice(insertBefore > fromIdx ? insertBefore - 1 : insertBefore, 0, moved); const visibleIds = new Set(sectionItems.map(c => c.id)); const next = [...allItems]; const positions = next .map((cfg, i) => ({ cfg, i })) .filter(({ cfg }) => visibleIds.has(cfg.id)) .map(({ i }) => i); positions.forEach((pos, i) => { next[pos] = sectionItems[i]; }); return next; }