UNPKG

@tamagui/react-native-web-lite

Version:
70 lines (69 loc) 2.62 kB
import * as React from "react"; import ModalAnimation from "./ModalAnimation.native.js"; import ModalContent from "./ModalContent.native.js"; import ModalFocusTrap from "./ModalFocusTrap.native.js"; import ModalPortal from "./ModalPortal.native.js"; var uniqueModalIdentifier = 0, activeModalStack = [], activeModalListeners = {}; function notifyActiveModalListeners() { if (activeModalStack.length !== 0) { var activeModalId = activeModalStack[activeModalStack.length - 1]; activeModalStack.forEach(function (modalId) { modalId in activeModalListeners && activeModalListeners[modalId](modalId === activeModalId); }); } } function removeActiveModal(modalId) { modalId in activeModalListeners && (activeModalListeners[modalId](!1), delete activeModalListeners[modalId]); var index = activeModalStack.indexOf(modalId); index !== -1 && (activeModalStack.splice(index, 1), notifyActiveModalListeners()); } function addActiveModal(modalId, listener) { removeActiveModal(modalId), activeModalStack.push(modalId), activeModalListeners[modalId] = listener, notifyActiveModalListeners(); } var Modal = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) { var { animationType, children, onDismiss, onRequestClose, onShow, transparent, visible = !0, ...rest } = props, modalId = React.useMemo(function () { return uniqueModalIdentifier++; }, []), _React$useState = React.useState(!1), isActive = _React$useState[0], setIsActive = _React$useState[1], onDismissCallback = React.useCallback(function () { removeActiveModal(modalId), onDismiss && onDismiss(); }, [modalId, onDismiss]), onShowCallback = React.useCallback(function () { addActiveModal(modalId, setIsActive), onShow && onShow(); }, [modalId, onShow]); return React.useEffect(function () { return function () { return removeActiveModal(modalId); }; }, [modalId]), /* @__PURE__ */React.createElement(ModalPortal, null, /* @__PURE__ */React.createElement(ModalAnimation, { animationType, onDismiss: onDismissCallback, onShow: onShowCallback, visible }, /* @__PURE__ */React.createElement(ModalFocusTrap, { active: isActive }, /* @__PURE__ */React.createElement(ModalContent, { ...rest, active: isActive, onRequestClose, ref: forwardedRef, transparent }, children)))); }), Modal_default = Modal; export { Modal_default as default }; //# sourceMappingURL=index.native.js.map