@hello-pangea/dnd
Version: 
Beautiful and accessible drag and drop for lists with React
29 lines (24 loc) • 983 B
text/typescript
import type { State, DraggableId } from '../types';
export default (state: State, id: DraggableId): boolean => {
  // Ready to go!
  if (state.phase === 'IDLE') {
    return true;
  }
  // Can lift depending on the type of drop animation
  if (state.phase !== 'DROP_ANIMATING') {
    return false;
  }
  // - For a user drop we allow the user to drag other Draggables
  //   immediately as items are most likely already in their home
  // - For a cancel items will be moving back to their original position
  //   as such it is a cleaner experience to block them from dragging until
  //   the drop animation is complete. Otherwise they will be grabbing
  //   items not in their original position which can lead to bad visuals
  // Not allowing dragging of the dropping draggable
  if (state.completed.result.draggableId === id) {
    return false;
  }
  // if dropping - allow lifting
  // if cancelling - disallow lifting
  return state.completed.result.reason === 'DROP';
};