UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

102 lines (101 loc) 3.26 kB
"use client"; import _extends from "@babel/runtime-corejs3/helpers/esm/extends"; var _svg; import _pushInstanceProperty from "core-js-pure/stable/instance/push.js"; import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import classnames from 'classnames'; import HeightAnimation from "../height-animation/HeightAnimation.js"; import { UploadContext } from "./UploadContext.js"; export default function UploadDropzone({ children, className, hideOutline = false, ...rest }) { const props = rest; const context = useContext(UploadContext); const [hover, setHover] = useState(false); const hoverTimeout = useRef(); const { onInputUpload, id } = context; const getFiles = useCallback(event => { const fileData = event.dataTransfer; const files = []; Array.from(fileData.files).forEach(file => { _pushInstanceProperty(files).call(files, { file }); }); return files; }, []); const clearTimers = useCallback(() => { clearTimeout(hoverTimeout.current); }, []); const hoverHandler = useCallback((event, state) => { event.stopPropagation(); event.preventDefault(); clearTimers(); setHover(state); }, [clearTimers]); const dropHandler = useCallback(event => { const files = getFiles(event); onInputUpload(files); hoverHandler(event, false); }, [getFiles, onInputUpload, hoverHandler]); const dragEnterHandler = useCallback(event => { hoverHandler(event, true); }, [hoverHandler]); const dragLeaveHandler = useCallback(event => { hoverHandler(event, false); }, [hoverHandler]); useEffect(() => { const elem = document.body; const execute = () => { try { if (!elem.hasAttribute('data-upload-drop-zone')) { const add = elem.addEventListener; add('drop', dropHandler); add('dragover', dragEnterHandler); add('dragleave', dragLeaveHandler); elem.setAttribute('data-upload-drop-zone', id); } } catch (e) {} }; const timeoutId = setTimeout(execute, 10); return () => { clearTimers(); clearTimeout(timeoutId); try { if (elem.getAttribute('data-upload-drop-zone') === id) { const remove = elem.removeEventListener; remove('drop', dropHandler); remove('dragover', dragEnterHandler); remove('dragleave', dragLeaveHandler); elem.removeAttribute('data-upload-drop-zone'); } } catch (e) {} }; }, [clearTimers, dragEnterHandler, dragLeaveHandler, dropHandler, id]); return React.createElement(HeightAnimation, _extends({ className: classnames(className, hover && 'dnb-upload--active'), onDrop: dropHandler, onDragOver: dragEnterHandler, onDragLeave: dragLeaveHandler }, props), children, !hideOutline && (_svg || (_svg = React.createElement("svg", { className: "dnb-upload__outline", "aria-hidden": true, xmlns: "http://www.w3.org/2000/svg", fill: "none" }, React.createElement("rect", { width: "100%", height: "100%", rx: "0.5rem", ry: "0.5rem", strokeWidth: "3", strokeDashoffset: "4", strokeDasharray: "8 8" }))))); } //# sourceMappingURL=UploadDropzone.js.map