UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

105 lines (104 loc) 3.28 kB
"use client"; var _svg; import _pushInstanceProperty from "core-js-pure/stable/instance/push.js"; import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import clsx from 'clsx'; import HeightAnimation from "../height-animation/HeightAnimation.js"; import { UploadContext } from "./UploadContext.js"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; export default function UploadDropzone({ children, className, hideOutline = false, ...rest }) { const props = rest; const context = useContext(UploadContext); const [hover, setHover] = useState(false); const hoverTimeout = useRef(undefined); 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 _jsxs(HeightAnimation, { className: clsx(className, hover && 'dnb-upload--active'), onDrop: dropHandler, onDragOver: dragEnterHandler, onDragLeave: dragLeaveHandler, ...props, children: [children, !hideOutline && (_svg || (_svg = _jsx("svg", { className: "dnb-upload__outline", "aria-hidden": true, xmlns: "http://www.w3.org/2000/svg", fill: "none", children: _jsx("rect", { width: "100%", height: "100%", rx: "0.5rem", ry: "0.5rem", strokeWidth: "3", strokeDashoffset: "4", strokeDasharray: "8 8" }) })))] }); } //# sourceMappingURL=UploadDropzone.js.map