'use client'; import React 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 { GripVertical, Eye, EyeOff, 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, hasUnsavedChanges, reorderItems, toggleItemVisibility, updateShortcuts, updateShowIcons, applyChanges, discardChanges, } = useSidebarLayout(); 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); } }; 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) => ( ))}
{/* Apply/Discard Changes */} {hasUnsavedChanges() && (
)}
); }