UNPKG

react-portal-dialog

Version:

React Portal Dialog is an Awesome Customizable and Draggable Modal.

178 lines (152 loc) 5.41 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var React = require('react'); var React__default = _interopDefault(React); var ReactDOM = _interopDefault(require('react-dom')); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var ReactPortalDialog__Overlay = { position: 'fixed', inset: '0', zIndex: '1000' }; var ReactPortalDialog__Body = { position: 'fixed', top: '50%', left: '50%', maxHeight: '200px', width: '400px', backgroundColor: 'rgb(223, 221, 221)', zIndex: '1000', transform: 'translate(-50%, -50%)' }; var ReactPortalDialog__Move = { backgroundColor: 'salmon', textAlign: 'center', padding: '5px', cursor: 'move' }; var Draggable = function Draggable(_ref) { var children = _ref.children, bodyStyle = _ref.bodyStyle; var boxRef = React.useRef(null); var dragRef = React.useRef(null); var _useState = React.useState(false), isDragActive = _useState[0], setIsDragActive = _useState[1]; var initialPosition = React.useRef({ x: 0, y: 0 }); var dragStartHandler = React.useCallback(function (event) { if (dragRef.current === event.target) { setIsDragActive(true); initialPosition.current = { x: event.x, y: event.y }; } }, []); var draggingHandler = React.useCallback(function (event) { if (isDragActive) { var _initialPosition$curr = initialPosition.current, x = _initialPosition$curr.x, y = _initialPosition$curr.y; if (boxRef.current) { var _boxRef$current = boxRef.current, offsetLeft = _boxRef$current.offsetLeft, offsetTop = _boxRef$current.offsetTop; boxRef.current.style.left = offsetLeft - (x - event.x) + "px"; boxRef.current.style.top = offsetTop - (y - event.y) + "px"; } initialPosition.current = { x: event.x, y: event.y }; } }, [isDragActive]); var dragEndHandler = React.useCallback(function () { setIsDragActive(false); window.removeEventListener('mousemove', draggingHandler); window.removeEventListener('mouseup', dragEndHandler); }, [draggingHandler]); React.useEffect(function () { var _dragRef$current; (_dragRef$current = dragRef.current) == null ? void 0 : _dragRef$current.addEventListener('mousedown', dragStartHandler); window.addEventListener('mousemove', draggingHandler); window.addEventListener('mouseup', dragEndHandler); }, [dragEndHandler, dragStartHandler, draggingHandler]); return React__default.createElement("div", { ref: boxRef, style: bodyStyle, className: "ReactPortalDialog__Body" }, React__default.createElement("div", { ref: dragRef, style: ReactPortalDialog__Move, className: "ReactPortalDialog__Move" }, "Move Here"), children); }; var Modal = function Modal(_ref) { var children = _ref.children, isOpen = _ref.isOpen, onClose = _ref.onClose, customStyles = _ref.customStyles, _ref$isOverlay = _ref.isOverlay, isOverlay = _ref$isOverlay === void 0 ? true : _ref$isOverlay, _ref$isDraggable = _ref.isDraggable, isDraggable = _ref$isDraggable === void 0 ? false : _ref$isDraggable; var bodyRef = React.useRef(null); var divRef = React.useRef(null); var _useState = React.useState(false), divCreated = _useState[0], setDivCreated = _useState[1]; React.useEffect(function () { if (isOpen) { var _bodyRef$current; bodyRef.current = document.querySelector('body'); divRef.current = document.createElement('div'); divRef.current.classList.add('ReactPortalDialog'); (_bodyRef$current = bodyRef.current) == null ? void 0 : _bodyRef$current.append(divRef.current); setDivCreated(true); } return function () { var _divRef$current; (_divRef$current = divRef.current) == null ? void 0 : _divRef$current.remove(); setDivCreated(false); }; }, [isOpen]); var closeHandler = function closeHandler() { var _divRef$current2; onClose(); (_divRef$current2 = divRef.current) == null ? void 0 : _divRef$current2.remove(); }; var overlayStyle = _extends({}, ReactPortalDialog__Overlay, { backgroundColor: isOverlay ? 'rgba(0, 0, 0, 0.5)' : 'transparent' }); var bodyStyle = customStyles || ReactPortalDialog__Body; return divCreated && divRef.current ? ReactDOM.createPortal(React__default.createElement(React__default.Fragment, null, React__default.createElement("div", { style: overlayStyle, className: "ReactPortalDialog__Overlay", onClick: closeHandler }), isDraggable ? React__default.createElement(Draggable, { bodyStyle: bodyStyle }, children) : React__default.createElement("div", { style: bodyStyle, className: "ReactPortalDialog__Body" }, children)), divRef.current) : null; }; exports.default = Modal; //# sourceMappingURL=react-portal-dialog.cjs.development.js.map