@mantine/modals
Version:
Modals manager based on Mantine components
200 lines (199 loc) • 5.27 kB
JavaScript
"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