@hello-pangea/dnd
Version:
Beautiful and accessible drag and drop for lists with React
53 lines (42 loc) • 1.25 kB
text/typescript
import type { ContextId, DraggableId } from '../../types';
import * as attributes from '../data-attributes';
import isElement from '../is-type-of-element/is-element';
import isHtmlElement from '../is-type-of-element/is-html-element';
import closest from './closest';
import { warning } from '../../dev-warning';
function getSelector(contextId: ContextId): string {
return `[${attributes.dragHandle.contextId}="${contextId}"]`;
}
function findClosestDragHandleFromEvent(
contextId: ContextId,
event: Event,
): Element | null {
const target = event.target;
if (!isElement(target)) {
warning('event.target must be a Element');
return null;
}
const selector: string = getSelector(contextId);
const handle = closest(target, selector);
if (!handle) {
return null;
}
if (!isHtmlElement(handle)) {
warning('drag handle must be a HTMLElement');
return null;
}
return handle;
}
export default function tryGetClosestDraggableIdFromEvent(
contextId: ContextId,
event: Event,
): DraggableId | null {
const handle: Element | null = findClosestDragHandleFromEvent(
contextId,
event,
);
if (!handle) {
return null;
}
return handle.getAttribute(attributes.dragHandle.draggableId);
}