@hello-pangea/dnd
Version:
Beautiful and accessible drag and drop for lists with React
38 lines (31 loc) • 1.18 kB
text/typescript
import type { DraggableId, ContextId } from '../../types';
import { dragHandle as dragHandleAttr } from '../data-attributes';
import { warning } from '../../dev-warning';
import { querySelectorAll } from '../../query-selector-all';
import isHtmlElement from '../is-type-of-element/is-html-element';
export default function findDragHandle(
contextId: ContextId,
draggableId: DraggableId,
): HTMLElement | null {
// cannot create a selector with the draggable id as it might not be a valid attribute selector
const selector = `[${dragHandleAttr.contextId}="${contextId}"]`;
const possible = querySelectorAll(document, selector);
if (!possible.length) {
warning(`Unable to find any drag handles in the context "${contextId}"`);
return null;
}
const handle = possible.find((el): boolean => {
return el.getAttribute(dragHandleAttr.draggableId) === draggableId;
});
if (!handle) {
warning(
`Unable to find drag handle with id "${draggableId}" as no handle with a matching id was found`,
);
return null;
}
if (!isHtmlElement(handle)) {
warning('drag handle needs to be a HTMLElement');
return null;
}
return handle;
}