UNPKG

react-simple-game-engine

Version:

[WIP] not able to use in currently. <!-- Document cumming soon... -->

77 lines (76 loc) 3.66 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime"; import { useMemo, useEffect, useState, useCallback, forwardRef, cloneElement, useImperativeHandle, useRef, memo, } from "react"; import * as ReactDOM from "react-dom"; import { getClassName } from "../utils"; export var Modal = forwardRef(function (_a, ref) { var _b; var backgroundStyle = _a.backgroundStyle, trigger = _a.children, content = _a.content, _c = _a.defaultOpen, defaultOpen = _c === void 0 ? false : _c, onClose = _a.onClose, _d = _a.event, event = _d === void 0 ? "onClick" : _d; var _e = useState(defaultOpen), isOpen = _e[0], setOpen = _e[1]; var container = useMemo(function () { var c = document.createElement("div"); c.className = getClassName("game-modal"); return c; }, []); useEffect(function () { var stack = document.getElementById("scene-modal-stack"); stack.appendChild(container); return function () { stack.removeChild(container); }; }, [container]); var handleOpen = useCallback(function () { setOpen(true); }, []); var handleClose = useCallback(function () { setOpen(false); onClose === null || onClose === void 0 ? void 0 : onClose(); }, [onClose]); useImperativeHandle(ref, function () { return ({ open: handleOpen, close: handleClose, }); }, [handleOpen, handleClose]); return (_jsxs(_Fragment, { children: [trigger ? cloneElement(trigger, (_b = {}, _b[event] = handleOpen, _b), trigger.props.children) : null, ReactDOM.createPortal(isOpen ? (_jsx(ModalWrap, { content: content, backgroundStyle: backgroundStyle, handleClose: handleClose })) : null, container)] })); }); var ModalWrap = memo(function (_a) { var content = _a.content, backgroundStyle = _a.backgroundStyle, handleClose = _a.handleClose; var refModal = useRef(null); useEffect(function () { var handleClickClose = function () { setTimeout(function () { handleClose(); }, 0); }; var buttons = refModal.current.querySelectorAll('[data-role="close"]'); for (var _i = 0, _a = Array.from(buttons); _i < _a.length; _i++) { var btn = _a[_i]; btn.addEventListener("click", handleClickClose); } return function () { for (var _i = 0, _a = Array.from(buttons); _i < _a.length; _i++) { var btn = _a[_i]; btn.removeEventListener("click", handleClickClose); } }; }, [handleClose]); var el = useMemo(function () { return cloneElement(content, { close: handleClose, }, content.props.children); }, [content]); return (_jsx("div", __assign({ className: getClassName("modal-content-wrap") }, { children: _jsxs("div", __assign({ className: getClassName("modal-content-centered"), ref: refModal }, { children: [_jsx("div", { className: getClassName("modal-content-closer"), style: __assign({}, backgroundStyle), onClick: handleClose }), _jsx("main", __assign({ className: getClassName("modal-content-main") }, { children: el }))] })) }))); });