fluid-dnd
Version:
An agnostic drag and drop library to sort all kind of lists. With current support for vue, react and svelte
66 lines (65 loc) • 3.27 kB
JavaScript
import { getSiblings } from '../utils/GetStyles';
import { moveTranslate, removeTranslateWhitoutTransition, setTranistion } from '../utils/SetStyles';
import getTranslationByDragging from './dragAndDrop/getTranslationByDraggingAndEvent';
import { addTempChild, removeTempChild } from '../tempChildren';
import { useChangeDraggableStyles } from './changeDraggableStyles';
import { addClass, removeClass } from '../utils/dom/classList';
import { draggableTargetTimingFunction } from '../utils';
export default function useRemoveEvents(currentConfig, parent, handlerPublisher, endDraggingAction) {
const { animationDuration } = currentConfig;
const [removeElementDraggingStyles] = useChangeDraggableStyles(currentConfig, handlerPublisher, endDraggingAction);
const emitRemoveEventToSiblings = (targetIndex, draggedElement, droppableConfig, onFinishRemoveEvent) => {
if (!droppableConfig || !droppableConfig.droppable || !droppableConfig.config) {
return;
}
const { droppable, config } = droppableConfig;
let [siblings] = getSiblings(draggedElement, droppable);
siblings = [draggedElement, ...siblings].toReversed();
const translation = getTranslationByDragging(draggedElement, 'remove', config.direction, droppable);
for (const [index, sibling] of siblings.entries()) {
if (index >= targetIndex) {
moveTranslate(sibling, translation);
setTimeout(() => {
onFinishRemoveEvent(sibling);
}, animationDuration);
}
}
};
const emitFinishRemoveEventToSiblings = (draggedElement) => {
removeTempChild(parent, animationDuration, true);
setTimeout(() => {
removeElementDraggingStyles(draggedElement);
removeTranslateFromSiblings(draggedElement, parent);
}, animationDuration);
};
const removeTranslateFromSiblings = (element, parent) => {
const [siblings] = getSiblings(element, parent);
for (const sibling of [...siblings, element]) {
removeTranslateWhitoutTransition(sibling);
}
};
const removeAt = (index, targetIndex, draggableElement, config) => {
const { removingClass, delayBeforeRemove } = currentConfig;
if (targetIndex == index) {
addClass(draggableElement, removingClass);
setTimeout(() => {
removeAfterRemovingClass(index, targetIndex, draggableElement, config);
}, delayBeforeRemove);
}
};
const removeAfterRemovingClass = (index, targetIndex, draggableElement, config) => {
const { removingClass, onRemoveAtEvent } = currentConfig;
removeClass(draggableElement, removingClass);
addTempChild(draggableElement, parent, false, config);
emitRemoveEventToSiblings(targetIndex, draggableElement, config, (sibling) => {
removeDraggingStyles(sibling);
emitFinishRemoveEventToSiblings(draggableElement);
});
onRemoveAtEvent(index, true);
};
const removeDraggingStyles = (element) => {
setTranistion(element, animationDuration, draggableTargetTimingFunction);
moveTranslate(element);
};
return [removeAt];
}