'use client'; import React, { useState } from 'react'; import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, DragEndEvent, } from '@dnd-kit/core'; import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { useSortable, } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Switch } from '@/components/ui/switch'; import { Input } from '@/components/ui/input'; import { GripVertical, Eye, EyeOff, Download, Upload, RotateCcw, Search, Home, List, Radio, Users, Disc, Music, Heart, Grid3X3, Clock, Settings } from 'lucide-react'; import { useSidebarLayout, SidebarItem, SidebarItemType } from '@/hooks/use-sidebar-layout'; // Icon mapping const iconMap: Record = { search: , home: , queue: , radio: , artists: , albums: , playlists: , favorites: , browse: , songs: , history: , settings: , }; interface SortableItemProps { item: SidebarItem; onToggleVisibility: (id: SidebarItemType) => void; showIcons: boolean; } function SortableItem({ item, onToggleVisibility, showIcons }: SortableItemProps) { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id: item.id }); const style = { transform: CSS.Transform.toString(transform), transition, opacity: isDragging ? 0.5 : 1, }; return (
{showIcons && (
{iconMap[item.icon] ||
}
)} {item.label}
); } export function SidebarCustomization() { const { settings, reorderItems, toggleItemVisibility, updateShortcuts, updateShowIcons, exportSettings, importSettings, resetToDefaults, } = useSidebarLayout(); const [importFile, setImportFile] = useState(null); const [importing, setImporting] = useState(false); const [importError, setImportError] = useState(null); const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }) ); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { reorderItems(active.id as string, over.id as string); } }; const handleImportFile = async () => { if (!importFile) return; setImporting(true); setImportError(null); try { await importSettings(importFile); setImportFile(null); // Reset file input const fileInput = document.getElementById('settings-import') as HTMLInputElement; if (fileInput) fileInput.value = ''; } catch (error) { setImportError(error instanceof Error ? error.message : 'Failed to import settings'); } finally { setImporting(false); } }; return ( Sidebar Customization Customize the sidebar layout, reorder items, and manage visibility settings. {/* Show Icons Toggle */}
Display icons next to navigation items
{/* Shortcut Type */}
updateShortcuts(value)} >
{/* Navigation Items Order */}
Drag to reorder, click the eye icon to show/hide items
item.id)} strategy={verticalListSortingStrategy}>
{settings.items.map((item) => ( ))}
{/* Settings Import/Export */}
setImportFile(e.target.files?.[0] || null)} className="hidden" /> {importFile && ( )}
{importFile && (
Selected: {importFile.name}
)} {importError && (
Error: {importError}
)}
); }