import React, { createElement, FC, useCallback, useMemo, useState } from 'react'; import { closestCenter, DndContext, DragOverlay, DragStartEvent, MouseSensor, TouchSensor, useSensor, useSensors, } from '@dnd-kit/core'; import { DragEndEvent } from '@dnd-kit/core/dist/types'; import { rectSortingStrategy, SortableContext } from '@dnd-kit/sortable'; import classNames from 'classnames'; import { DragOverlayItem } from '~/components/sortable/DragOverlayItem'; import { useSortableActions } from '~/hooks/sortable'; import { moveArrItem } from '~/utils/fn'; import { DivProps } from '~/utils/types'; import { SortableImageGridItem } from '../SortableGridItem'; import styles from './styles.module.scss'; interface SortableGridProps { items: T[]; locked: R[]; getID: (item: T) => number | string; getLockedID: (locked: R) => number | string; renderItem: FC<{ item: T }>; renderLocked: FC<{ locked: R }>; onSortEnd: (newVal: T[]) => void; className?: string; size?: number; } const SortableGrid = ({ items, locked, getID, getLockedID, className, renderItem, renderLocked, onSortEnd, size, }: SortableGridProps) => { const { sensors, onDragEnd, onDragStart, draggingItem, ids } = useSortableActions( items, getID, onSortEnd ); const gridStyle = useMemo( () => size ? { gridTemplateColumns: size && `repeat(auto-fill, minmax(${size}px, 1fr))` } : undefined, [size] ); return (
{items.map(item => ( {createElement(renderItem, { item })} ))} {locked.map(item => createElement(renderLocked, { locked: item, key: getLockedID(item) }) )} {draggingItem ? ( {createElement(renderItem, { item: draggingItem })} ) : null}
); }; export { SortableGrid };