@gravity-ui/uikit
Version:
Gravity UI base styling and components
134 lines (133 loc) • 4.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useFileZoneContext = exports.FileDropZoneProvider = void 0;
const tslib_1 = require("tslib");
const jsx_runtime_1 = require("react/jsx-runtime");
const React = tslib_1.__importStar(require("react"));
const hooks_1 = require("../../../hooks/index.js");
const useDropZone_1 = require("../../../hooks/lab/useDropZone/index.js");
const utils_1 = require("./utils.js");
const FileDropZoneContext = React.createContext(null);
const FileDropZoneProvider = ({ accept = [], onUpdate, onUpdateAccepted, onUpdateRejected, title, description, buttonText, icon, errorIcon, disabled, errorMessage, validationState, children, multiple, }) => {
const [isInvalidDrag, setIsInvalidDrag] = React.useState(false);
const handleUpdate = React.useCallback((acceptedItems, rejectedItems) => {
onUpdate?.(acceptedItems, rejectedItems);
if (acceptedItems.length > 0) {
onUpdateAccepted?.(acceptedItems);
}
if (rejectedItems.length > 0) {
onUpdateRejected?.(rejectedItems);
}
}, [onUpdate, onUpdateAccepted, onUpdateRejected]);
const getFilesFromItems = React.useCallback((items) => {
const files = [];
for (const item of items) {
const file = item.getAsFile();
if (!file) {
continue;
}
files.push(file);
}
return files;
}, []);
const getFileRejections = React.useCallback((items) => {
const fileRejections = [];
for (const rejectionObject of items) {
const { item, reasons } = rejectionObject;
const file = item.getAsFile();
if (!file) {
continue;
}
fileRejections.push({ file, reasons });
}
return fileRejections;
}, []);
const handleDragEnter = React.useCallback((event) => {
const dataTransfer = event.dataTransfer;
if (!dataTransfer?.items) {
return;
}
const { accepted } = (0, utils_1.getSeparatedItems)(dataTransfer, {
accept,
multiple,
});
setIsInvalidDrag(accepted.length < 1);
}, [accept, multiple]);
const handleDropEvent = React.useCallback((event) => {
const dataTransfer = event.dataTransfer;
setIsInvalidDrag(false);
if (!dataTransfer?.items) {
return;
}
const { accepted, rejected } = (0, utils_1.getSeparatedItems)(dataTransfer, {
accept,
multiple,
});
const acceptedItems = getFilesFromItems(accepted);
const rejectedItems = getFileRejections(rejected);
if (acceptedItems.length > 0 || rejectedItems.length > 0) {
handleUpdate(acceptedItems, rejectedItems);
}
}, [accept, getFileRejections, getFilesFromItems, handleUpdate, multiple]);
const { isDraggingOver, getDroppableProps } = (0, useDropZone_1.useDropZone)({
disabled,
onDragEnter: handleDragEnter,
onDrop: handleDropEvent,
});
React.useEffect(() => {
if (!isDraggingOver) {
setIsInvalidDrag(false);
}
}, [isDraggingOver]);
const handleFileInputUpdate = React.useCallback((files) => {
handleUpdate(files, []);
}, [handleUpdate]);
const { controlProps, triggerProps } = (0, hooks_1.useFileInput)({ onUpdate: handleFileInputUpdate });
const { onKeyDown } = (0, hooks_1.useActionHandlers)(disabled ? undefined : triggerProps.onClick);
const contextValue = React.useMemo(() => ({
accept,
title,
description,
buttonText,
multiple,
disabled,
icon,
errorIcon,
errorMessage,
validationState,
controlProps,
triggerProps,
isDraggingOver,
isInvalidDrag,
getDroppableProps,
onKeyDown,
}), [
accept,
title,
description,
buttonText,
multiple,
disabled,
icon,
errorIcon,
errorMessage,
validationState,
controlProps,
triggerProps,
isDraggingOver,
isInvalidDrag,
getDroppableProps,
onKeyDown,
]);
return ((0, jsx_runtime_1.jsx)(FileDropZoneContext.Provider, { value: contextValue, children: children }));
};
exports.FileDropZoneProvider = FileDropZoneProvider;
const useFileZoneContext = () => {
const contextValue = React.useContext(FileDropZoneContext);
if (contextValue === null) {
throw new Error('FileDropZone context not found');
}
return contextValue;
};
exports.useFileZoneContext = useFileZoneContext;
//# sourceMappingURL=FileDropZone.Provider.js.map