import React, { createElement, FC, useMemo } from "react"; import { closestCenter, DndContext, DragOverlay } from "@dnd-kit/core"; import { rectSortingStrategy, SortableContext } from "@dnd-kit/sortable"; import classNames from "classnames"; import { DragOverlayItem } from "~/components/sortable/DragOverlayItem"; import { useSortableActions } from "~/hooks/sortable"; import { DivProps } from "~/utils/types"; import { SortableItem } from "../SortableItem"; 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 };