react-beautiful-dnd-next
Version:
Beautiful and accessible drag and drop for lists with React
63 lines (55 loc) • 1.71 kB
JavaScript
// @flow
import { useEffect } from 'react';
import invariant from 'tiny-invariant';
import type { Props } from './droppable-types';
import { warning } from '../../dev-warning';
import checkIsValidInnerRef from '../check-is-valid-inner-ref';
function checkOwnProps(props: Props) {
invariant(props.droppableId, 'A Droppable requires a droppableId prop');
invariant(
typeof props.isDropDisabled === 'boolean',
'isDropDisabled must be a boolean',
);
invariant(
typeof props.isCombineEnabled === 'boolean',
'isCombineEnabled must be a boolean',
);
invariant(
typeof props.ignoreContainerClipping === 'boolean',
'ignoreContainerClipping must be a boolean',
);
}
function checkPlaceholderRef(props: Props, placeholderEl: ?HTMLElement) {
if (!props.placeholder) {
return;
}
if (placeholderEl) {
return;
}
warning(`
Droppable setup issue [droppableId: "${props.droppableId}"]:
DroppableProvided > placeholder could not be found.
Please be sure to add the {provided.placeholder} React Node as a child of your Droppable.
More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/droppable.md
`);
}
type Args = {|
props: Props,
getDroppableRef: () => ?HTMLElement,
getPlaceholderRef: () => ?HTMLElement,
|};
export default function useValidation({
props,
getDroppableRef,
getPlaceholderRef,
}: Args) {
// Running on every update
useEffect(() => {
// wrapping entire block for better minification
if (process.env.NODE_ENV !== 'production') {
checkOwnProps(props);
checkIsValidInnerRef(getDroppableRef());
checkPlaceholderRef(props, getPlaceholderRef());
}
});
}