UNPKG

@mantine/modals

Version:

Modals manager based on Mantine components

200 lines (199 loc) 5.27 kB
"use client"; const require_context = require("./context.cjs"); const require_ConfirmModal = require("./ConfirmModal.cjs"); const require_events = require("./events.cjs"); const require_reducer = require("./reducer.cjs"); let react = require("react"); let _mantine_core = require("@mantine/core"); let _mantine_hooks = require("@mantine/hooks"); let react_jsx_runtime = require("react/jsx-runtime"); //#region packages/@mantine/modals/src/ModalsProvider.tsx function separateConfirmModalProps(props) { if (!props) return { confirmProps: {}, modalProps: {} }; const { id, children, onCancel, onConfirm, closeOnConfirm, closeOnCancel, cancelProps, confirmProps, groupProps, labels, ...others } = props; return { confirmProps: { id, children, onCancel, onConfirm, closeOnConfirm, closeOnCancel, cancelProps, confirmProps, groupProps, labels }, modalProps: { id, ...others } }; } function ModalsProvider({ children, modalProps, labels, modals }) { const [state, dispatch] = (0, react.useReducer)(require_reducer.modalsReducer, { modals: [], current: null }); const stateRef = (0, react.useRef)(state); stateRef.current = state; const closingRef = (0, react.useRef)(false); const closeAll = (0, react.useCallback)((canceled) => { if (!closingRef.current) { closingRef.current = true; stateRef.current.modals.concat().reverse().forEach((modal) => { require_reducer.handleCloseModal(modal, canceled); }); closingRef.current = false; } dispatch({ type: "CLOSE_ALL", canceled }); }, [stateRef, dispatch]); const openModal = (0, react.useCallback)(({ modalId, ...props }) => { const id = modalId || (0, _mantine_hooks.randomId)(); dispatch({ type: "OPEN", modal: { id, type: "content", props } }); return id; }, [dispatch]); const openConfirmModal = (0, react.useCallback)(({ modalId, ...props }) => { const id = modalId || (0, _mantine_hooks.randomId)(); dispatch({ type: "OPEN", modal: { id, type: "confirm", props } }); return id; }, [dispatch]); const openContextModal = (0, react.useCallback)((modal, { modalId, ...props }) => { const id = modalId || (0, _mantine_hooks.randomId)(); dispatch({ type: "OPEN", modal: { id, type: "context", props, ctx: modal } }); return id; }, [dispatch]); const closeModal = (0, react.useCallback)((id, canceled) => { if (!closingRef.current) { const modal = stateRef.current.modals.find((m) => m.id === id); if (modal) { closingRef.current = true; require_reducer.handleCloseModal(modal, canceled); closingRef.current = false; } } dispatch({ type: "CLOSE", modalId: id, canceled }); }, [stateRef, dispatch]); const updateModal = (0, react.useCallback)(({ modalId, ...newProps }) => { dispatch({ type: "UPDATE", modalId, newProps }); }, [dispatch]); const updateContextModal = (0, react.useCallback)(({ modalId, ...newProps }) => { dispatch({ type: "UPDATE", modalId, newProps }); }, [dispatch]); require_events.useModalsEvents({ openModal, openConfirmModal, openContextModal: ({ modal, ...payload }) => openContextModal(modal, payload), closeModal, closeContextModal: closeModal, closeAllModals: closeAll, updateModal, updateContextModal }); const ctx = { modalProps: modalProps || {}, modals: state.modals, openModal, openConfirmModal, openContextModal, closeModal, closeContextModal: closeModal, closeAll, updateModal, updateContextModal }; const getCurrentModal = () => { const currentModal = stateRef.current.current; switch (currentModal?.type) { case "context": { const { innerProps, ...rest } = currentModal.props; const ContextModal = modals[currentModal.ctx]; return { modalProps: rest, content: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ContextModal, { innerProps, context: ctx, id: currentModal.id }) }; } case "confirm": { const { modalProps: separatedModalProps, confirmProps: separatedConfirmProps } = separateConfirmModalProps(currentModal.props); return { modalProps: separatedModalProps, content: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ConfirmModal.ConfirmModal, { ...separatedConfirmProps, id: currentModal.id, labels: currentModal.props.labels || labels }) }; } case "content": { const { children: currentModalChildren, ...rest } = currentModal.props; return { modalProps: rest, content: currentModalChildren }; } default: return { modalProps: {}, content: null }; } }; const { modalProps: currentModalProps, content } = getCurrentModal(); return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_context.ModalsContext, { value: ctx, children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Modal, { zIndex: (0, _mantine_core.getDefaultZIndex)("modal") + 1, ...modalProps, ...currentModalProps, opened: state.modals.length > 0, onClose: () => closeModal(state.current?.id), children: content }), children] }); } //#endregion exports.ModalsProvider = ModalsProvider; //# sourceMappingURL=ModalsProvider.cjs.map