import { type MouseEvent, type DragEvent, useState } from 'react';
import { Box, ActionIcon, Text } from '@mantine/core';
import { X } from 'lucide-react';
import { useNotepadStore } from '@/stores/notepad';
import { usePreferencesStore } from '@/stores/preferences';
interface TabProps {
id: string;
index: number;
isActive: boolean;
title: string;
onSelect: () => void;
onClose: (e: MouseEvent) => void;
onDragStart: (e: DragEvent, index: number) => void;
onDragOver: (e: DragEvent) => void;
onDrop: (e: DragEvent, index: number) => void;
isDragOver: boolean;
}
const Tab = ({
index,
isActive,
title,
onSelect,
onClose,
onDragStart,
onDragOver,
onDrop,
isDragOver,
}: TabProps) => {
const { resolvedColorScheme } = usePreferencesStore();
return (
onDragStart(e, index)}
onDragOver={onDragOver}
onDrop={(e) => onDrop(e, index)}
style={{
padding: '6px 8px',
backgroundColor: isActive
? resolvedColorScheme === 'dark'
? 'var(--mantine-color-dark-4)'
: 'var(--mantine-color-gray-1)'
: isDragOver
? resolvedColorScheme === 'dark'
? 'var(--mantine-color-dark-5)'
: 'var(--mantine-color-gray-2)'
: 'transparent',
borderRight: `1px solid ${
resolvedColorScheme === 'dark'
? 'var(--mantine-color-dark-4)'
: 'var(--mantine-color-gray-3)'
}`,
cursor: 'pointer',
display: 'flex',
alignItems: 'center',
gap: '4px',
minWidth: 0,
maxWidth: 120,
opacity: isDragOver ? 0.5 : 1,
}}
>
{title}
);
};
export const NotepadTabs = () => {
const { tabs, activeTabId, setActiveTab, removeTab, reorderTabs } =
useNotepadStore();
const { resolvedColorScheme } = usePreferencesStore();
const [draggedTabIndex, setDraggedTabIndex] = useState(null);
const [dragOverIndex, setDragOverIndex] = useState(null);
const handleTabSelect = (tabId: string) => {
setActiveTab(tabId);
};
const handleTabClose = (e: MouseEvent, tabId: string) => {
e.stopPropagation();
removeTab(tabId);
};
const handleDragStart = (e: DragEvent, index: number) => {
setDraggedTabIndex(index);
e.dataTransfer.effectAllowed = 'move';
};
const handleDragOver = (e: DragEvent) => {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
};
const handleDragEnter = (index: number) => {
setDragOverIndex(index);
};
const handleDragLeave = () => {
setDragOverIndex(null);
};
const handleDrop = (e: DragEvent, dropIndex: number) => {
e.preventDefault();
if (draggedTabIndex !== null && draggedTabIndex !== dropIndex) {
reorderTabs(draggedTabIndex, dropIndex);
}
setDraggedTabIndex(null);
setDragOverIndex(null);
};
if (tabs.length === 0) return null;
return (
{tabs.map((tab, index) => (
handleDragEnter(index)}
onDragLeave={handleDragLeave}
>
handleTabSelect(tab.id)}
onClose={(e) => handleTabClose(e, tab.id)}
onDragStart={handleDragStart}
onDragOver={handleDragOver}
onDrop={handleDrop}
isDragOver={dragOverIndex === index}
/>
))}
);
};