import React, { useState } from 'react'; import type { DragEndEvent } from '@dnd-kit/core'; import { DndContext, PointerSensor, closestCenter, useSensor } from '@dnd-kit/core'; import { arrayMove, horizontalListSortingStrategy, SortableContext, useSortable, } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { Tabs } from 'antd'; interface DraggableTabPaneProps extends React.HTMLAttributes { 'data-node-key': string; } const DraggableTabNode = ({ className, ...props }: DraggableTabPaneProps) => { const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: props['data-node-key'], }); const style: React.CSSProperties = { ...props.style, transform: CSS.Translate.toString(transform), transition, cursor: 'move', }; return React.cloneElement(props.children as React.ReactElement, { ref: setNodeRef, style, ...attributes, ...listeners, }); }; const App: React.FC = () => { const [items, setItems] = useState([ { key: '1', label: 'Tab 1', children: 'Content of Tab Pane 1', }, { key: '2', label: 'Tab 2', children: 'Content of Tab Pane 2', }, { key: '3', label: 'Tab 3', children: 'Content of Tab Pane 3', }, ]); const sensor = useSensor(PointerSensor, { activationConstraint: { distance: 10 } }); const onDragEnd = ({ active, over }: DragEndEvent) => { if (active.id !== over?.id) { setItems((prev) => { const activeIndex = prev.findIndex((i) => i.key === active.id); const overIndex = prev.findIndex((i) => i.key === over?.id); return arrayMove(prev, activeIndex, overIndex); }); } }; return ( ( i.key)} strategy={horizontalListSortingStrategy}> {(node) => ( {node} )} )} /> ); }; export default App;