import { motion, AnimatePresence } from 'framer-motion'; import { useState, useMemo } from 'react'; import { useStore } from '@nanostores/react'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import { classNames } from '~/utils/classNames'; import { tabConfigurationStore, resetTabConfiguration } from '~/lib/stores/settings'; import { TAB_LABELS, DEFAULT_TAB_CONFIG, type TabType, type TabVisibilityConfig, } from '~/components/settings/settings.types'; import { toast } from 'react-toastify'; // Define icons for each tab type const TAB_ICONS: Record = { profile: 'i-ph:user-circle-fill', settings: 'i-ph:gear-six-fill', notifications: 'i-ph:bell-fill', features: 'i-ph:sparkle-fill', data: 'i-ph:database-fill', 'cloud-providers': 'i-ph:cloud-fill', 'local-providers': 'i-ph:desktop-fill', connection: 'i-ph:plug-fill', debug: 'i-ph:bug-fill', 'event-logs': 'i-ph:list-bullets-fill', update: 'i-ph:arrow-clockwise-fill', 'task-manager': 'i-ph:activity-fill', 'service-status': 'i-ph:heartbeat-fill', }; interface DraggableTabProps { tab: TabVisibilityConfig; index: number; moveTab: (dragIndex: number, hoverIndex: number) => void; onVisibilityChange: (enabled: boolean) => void; } const DraggableTab = ({ tab, index, moveTab, onVisibilityChange }: DraggableTabProps) => { const [{ isDragging }, drag] = useDrag({ type: 'tab-management', item: { index, id: tab.id }, collect: (monitor) => ({ isDragging: monitor.isDragging(), }), }); const [{ isOver }, drop] = useDrop({ accept: 'tab-management', hover: (item: { index: number; id: string }, monitor) => { if (!monitor.isOver({ shallow: true })) { return; } if (item.id === tab.id) { return; } if (item.index === index) { return; } moveTab(item.index, index); item.index = index; }, collect: (monitor) => ({ isOver: monitor.isOver({ shallow: true }), }), }); return ( drag(drop(node))} layout initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -20 }} style={{ opacity: isDragging ? 0.5 : 1, cursor: 'move', }} className={classNames( 'group relative flex items-center justify-between rounded-lg border px-4 py-3 transition-all', isOver ? 'border-purple-500 bg-purple-50/50 dark:border-purple-500/50 dark:bg-purple-500/10' : 'border-gray-200 bg-white hover:border-purple-200 dark:border-gray-700 dark:bg-gray-800 dark:hover:border-purple-500/30', )} >
{TAB_LABELS[tab.id]}