import React, {useRef, useState} from 'react';
import {DragDropProvider} from '@dnd-kit/react';
import {useSortable} from '@dnd-kit/react/sortable';
import {move} from '@dnd-kit/helpers';
function SortableItem({id, index}: {id: number; index: number}) {
const [element, setElement] = useState<Element | null>(null);
const handleRef = useRef<HTMLButtonElement | null>(null);
const {isDragging} = useSortable({
id,
index,
element,
handle: handleRef,
});
return (
<li
ref={setElement}
className="item"
data-shadow={isDragging || undefined}
style={{
padding: '16px',
margin: '8px 0',
backgroundColor: isDragging ? '#f0f0f0' : 'white',
border: '1px solid #ddd',
borderRadius: '4px',
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
}}
>
<span>Item {id}</span>
<button
ref={handleRef}
className="handle"
style={{
cursor: 'grab',
padding: '8px',
border: 'none',
background: 'transparent',
}}
>
⋮⋮
</button>
</li>
);
}
export default function App() {
const [items, setItems] = useState(() =>
Array.from({length: 100}, (_, i) => i + 1)
);
return (
<DragDropProvider
onDragEnd={(event) => {
setItems((items) => move(items, event));
}}
>
<ul
style={{
listStyle: 'none',
padding: '20px',
maxWidth: '600px',
margin: '0 auto',
}}
>
{items.map((id, index) => (
<SortableItem key={id} id={id} index={index} />
))}
</ul>
</DragDropProvider>
);
}