import { KeyboardSensor, PointerSensor, useSensor, useSensors, DragEndEvent, } from '@dnd-kit/core'; import { arrayMove, sortableKeyboardCoordinates } from '@dnd-kit/sortable'; import { RtListItem, RtListProps } from '../types/rt-list.types'; import { getDefaultRenderItem } from '../utils/default-render-item'; import { RtUse } from '@dpa/react-frame-intro'; const defaultGetId = (item: RtListItem) => item.id; export const useDndList = ( items: RtListProps['items'], onReorder: RtListProps['onReorder'], getId: RtListProps['getId'], renderItem: RtListProps['renderItem'] ) => { const idGetter = getId || defaultGetId; const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, }) ); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (!over || active.id === over.id) return; const oldIndex = items.findIndex((item) => idGetter(item) === active.id); const newIndex = items.findIndex((item) => idGetter(item) === over.id); const newItems = arrayMove(items, oldIndex, newIndex); onReorder?.(newItems); }; return { sensors, handleDragEnd, idGetter, getRenderItemFn: renderItem ? (use: RtUse) => renderItem : getDefaultRenderItem, }; };