UNPKG

@tamagui/react-native-web-lite

Version:
64 lines (63 loc) 2.46 kB
import * as React from "react"; import ModalAnimation from "./ModalAnimation.mjs"; import ModalContent from "./ModalContent.mjs"; import ModalFocusTrap from "./ModalFocusTrap.mjs"; import ModalPortal from "./ModalPortal.mjs"; var uniqueModalIdentifier = 0, activeModalStack = [], activeModalListeners = {}; function notifyActiveModalListeners() { if (activeModalStack.length !== 0) { var activeModalId = activeModalStack[activeModalStack.length - 1]; activeModalStack.forEach(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((props, forwardedRef) => { const { animationType, children, onDismiss, onRequestClose, onShow, transparent, visible = !0, ...rest } = props; var modalId = React.useMemo(() => uniqueModalIdentifier++, []), _React$useState = React.useState(!1), isActive = _React$useState[0], setIsActive = _React$useState[1], onDismissCallback = React.useCallback(() => { removeActiveModal(modalId), onDismiss && onDismiss(); }, [modalId, onDismiss]), onShowCallback = React.useCallback(() => { addActiveModal(modalId, setIsActive), onShow && onShow(); }, [modalId, onShow]); return React.useEffect(() => () => 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.mjs.map