import {Dispatch, ReactElement, RefObject, SetStateAction, useRef} from "react"; import Draggable from "react-draggable"; export interface RackInput { id: string, objects: [ReactElement[], Dispatch>], canDetach: (ref: RefObject) => boolean, onElementDetached: (ref: RefObject, el: ReactElement) => void, } interface RackItemInput { item: ReactElement, onTryDetach: (ref: RefObject, el: ReactElement) => void } /** * A container of draggable objects * */ export function Rack({id, objects, canDetach, onElementDetached}: RackInput) { const [rackObjects, setRackObjects] = objects return (
{rackObjects.map(element => ( { if (!canDetach(ref)) return setRackObjects(objects => { const index = objects.findIndex(o => o.key === element.key) return objects.toSpliced(index, 1); }) onElementDetached(ref, element) }}/> ))}
) } function RackItem({item, onTryDetach}: RackItemInput) { const divRef = useRef(null); return ( onTryDetach(divRef, item)}>
{item}
) }