UNPKG

10.7 kBJavaScriptView Raw
1"use strict";
2"use client";
3
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5exports.__esModule = true;
6exports.default = void 0;
7var _classnames = _interopRequireDefault(require("classnames"));
8var _addEventListener = _interopRequireDefault(require("dom-helpers/addEventListener"));
9var _canUseDOM = _interopRequireDefault(require("dom-helpers/canUseDOM"));
10var _ownerDocument = _interopRequireDefault(require("dom-helpers/ownerDocument"));
11var _removeEventListener = _interopRequireDefault(require("dom-helpers/removeEventListener"));
12var _scrollbarSize = _interopRequireDefault(require("dom-helpers/scrollbarSize"));
13var _useCallbackRef = _interopRequireDefault(require("@restart/hooks/useCallbackRef"));
14var _useEventCallback = _interopRequireDefault(require("@restart/hooks/useEventCallback"));
15var _useMergedRefs = _interopRequireDefault(require("@restart/hooks/useMergedRefs"));
16var _useWillUnmount = _interopRequireDefault(require("@restart/hooks/useWillUnmount"));
17var _transitionEnd = _interopRequireDefault(require("dom-helpers/transitionEnd"));
18var React = _interopRequireWildcard(require("react"));
19var _Modal = _interopRequireDefault(require("@restart/ui/Modal"));
20var _BootstrapModalManager = require("./BootstrapModalManager");
21var _Fade = _interopRequireDefault(require("./Fade"));
22var _ModalBody = _interopRequireDefault(require("./ModalBody"));
23var _ModalContext = _interopRequireDefault(require("./ModalContext"));
24var _ModalDialog = _interopRequireDefault(require("./ModalDialog"));
25var _ModalFooter = _interopRequireDefault(require("./ModalFooter"));
26var _ModalHeader = _interopRequireDefault(require("./ModalHeader"));
27var _ModalTitle = _interopRequireDefault(require("./ModalTitle"));
28var _ThemeProvider = require("./ThemeProvider");
29var _jsxRuntime = require("react/jsx-runtime");
30function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
32/* eslint-disable no-use-before-define, react/no-multi-comp */
33function DialogTransition(props) {
34 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Fade.default, {
35 ...props,
36 timeout: null
37 });
38}
39function BackdropTransition(props) {
40 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Fade.default, {
41 ...props,
42 timeout: null
43 });
44}
45
46/* eslint-enable no-use-before-define */
47const Modal = /*#__PURE__*/React.forwardRef(({
48 bsPrefix,
49 className,
50 style,
51 dialogClassName,
52 contentClassName,
53 children,
54 dialogAs: Dialog = _ModalDialog.default,
55 'aria-labelledby': ariaLabelledby,
56 'aria-describedby': ariaDescribedby,
57 'aria-label': ariaLabel,
58 /* BaseModal props */
59
60 show = false,
61 animation = true,
62 backdrop = true,
63 keyboard = true,
64 onEscapeKeyDown,
65 onShow,
66 onHide,
67 container,
68 autoFocus = true,
69 enforceFocus = true,
70 restoreFocus = true,
71 restoreFocusOptions,
72 onEntered,
73 onExit,
74 onExiting,
75 onEnter,
76 onEntering,
77 onExited,
78 backdropClassName,
79 manager: propsManager,
80 ...props
81}, ref) => {
82 const [modalStyle, setStyle] = (0, React.useState)({});
83 const [animateStaticModal, setAnimateStaticModal] = (0, React.useState)(false);
84 const waitingForMouseUpRef = (0, React.useRef)(false);
85 const ignoreBackdropClickRef = (0, React.useRef)(false);
86 const removeStaticModalAnimationRef = (0, React.useRef)(null);
87 const [modal, setModalRef] = (0, _useCallbackRef.default)();
88 const mergedRef = (0, _useMergedRefs.default)(ref, setModalRef);
89 const handleHide = (0, _useEventCallback.default)(onHide);
90 const isRTL = (0, _ThemeProvider.useIsRTL)();
91 bsPrefix = (0, _ThemeProvider.useBootstrapPrefix)(bsPrefix, 'modal');
92 const modalContext = (0, React.useMemo)(() => ({
93 onHide: handleHide
94 }), [handleHide]);
95 function getModalManager() {
96 if (propsManager) return propsManager;
97 return (0, _BootstrapModalManager.getSharedManager)({
98 isRTL
99 });
100 }
101 function updateDialogStyle(node) {
102 if (!_canUseDOM.default) return;
103 const containerIsOverflowing = getModalManager().getScrollbarWidth() > 0;
104 const modalIsOverflowing = node.scrollHeight > (0, _ownerDocument.default)(node).documentElement.clientHeight;
105 setStyle({
106 paddingRight: containerIsOverflowing && !modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined,
107 paddingLeft: !containerIsOverflowing && modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined
108 });
109 }
110 const handleWindowResize = (0, _useEventCallback.default)(() => {
111 if (modal) {
112 updateDialogStyle(modal.dialog);
113 }
114 });
115 (0, _useWillUnmount.default)(() => {
116 (0, _removeEventListener.default)(window, 'resize', handleWindowResize);
117 removeStaticModalAnimationRef.current == null ? void 0 : removeStaticModalAnimationRef.current();
118 });
119
120 // We prevent the modal from closing during a drag by detecting where the
121 // click originates from. If it starts in the modal and then ends outside
122 // don't close.
123 const handleDialogMouseDown = () => {
124 waitingForMouseUpRef.current = true;
125 };
126 const handleMouseUp = e => {
127 if (waitingForMouseUpRef.current && modal && e.target === modal.dialog) {
128 ignoreBackdropClickRef.current = true;
129 }
130 waitingForMouseUpRef.current = false;
131 };
132 const handleStaticModalAnimation = () => {
133 setAnimateStaticModal(true);
134 removeStaticModalAnimationRef.current = (0, _transitionEnd.default)(modal.dialog, () => {
135 setAnimateStaticModal(false);
136 });
137 };
138 const handleStaticBackdropClick = e => {
139 if (e.target !== e.currentTarget) {
140 return;
141 }
142 handleStaticModalAnimation();
143 };
144 const handleClick = e => {
145 if (backdrop === 'static') {
146 handleStaticBackdropClick(e);
147 return;
148 }
149 if (ignoreBackdropClickRef.current || e.target !== e.currentTarget) {
150 ignoreBackdropClickRef.current = false;
151 return;
152 }
153 onHide == null ? void 0 : onHide();
154 };
155 const handleEscapeKeyDown = e => {
156 if (keyboard) {
157 onEscapeKeyDown == null ? void 0 : onEscapeKeyDown(e);
158 } else {
159 // Call preventDefault to stop modal from closing in @restart/ui.
160 e.preventDefault();
161 if (backdrop === 'static') {
162 // Play static modal animation.
163 handleStaticModalAnimation();
164 }
165 }
166 };
167 const handleEnter = (node, isAppearing) => {
168 if (node) {
169 updateDialogStyle(node);
170 }
171 onEnter == null ? void 0 : onEnter(node, isAppearing);
172 };
173 const handleExit = node => {
174 removeStaticModalAnimationRef.current == null ? void 0 : removeStaticModalAnimationRef.current();
175 onExit == null ? void 0 : onExit(node);
176 };
177 const handleEntering = (node, isAppearing) => {
178 onEntering == null ? void 0 : onEntering(node, isAppearing);
179
180 // FIXME: This should work even when animation is disabled.
181 (0, _addEventListener.default)(window, 'resize', handleWindowResize);
182 };
183 const handleExited = node => {
184 if (node) node.style.display = ''; // RHL removes it sometimes
185 onExited == null ? void 0 : onExited(node);
186
187 // FIXME: This should work even when animation is disabled.
188 (0, _removeEventListener.default)(window, 'resize', handleWindowResize);
189 };
190 const renderBackdrop = (0, React.useCallback)(backdropProps => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
191 ...backdropProps,
192 className: (0, _classnames.default)(`${bsPrefix}-backdrop`, backdropClassName, !animation && 'show')
193 }), [animation, backdropClassName, bsPrefix]);
194 const baseModalStyle = {
195 ...style,
196 ...modalStyle
197 };
198
199 // If `display` is not set to block, autoFocus inside the modal fails
200 // https://github.com/react-bootstrap/react-bootstrap/issues/5102
201 baseModalStyle.display = 'block';
202 const renderDialog = dialogProps => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
203 role: "dialog",
204 ...dialogProps,
205 style: baseModalStyle,
206 className: (0, _classnames.default)(className, bsPrefix, animateStaticModal && `${bsPrefix}-static`, !animation && 'show'),
207 onClick: backdrop ? handleClick : undefined,
208 onMouseUp: handleMouseUp,
209 "aria-label": ariaLabel,
210 "aria-labelledby": ariaLabelledby,
211 "aria-describedby": ariaDescribedby,
212 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Dialog, {
213 ...props,
214 onMouseDown: handleDialogMouseDown,
215 className: dialogClassName,
216 contentClassName: contentClassName,
217 children: children
218 })
219 });
220 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ModalContext.default.Provider, {
221 value: modalContext,
222 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Modal.default, {
223 show: show,
224 ref: mergedRef,
225 backdrop: backdrop,
226 container: container,
227 keyboard: true // Always set true - see handleEscapeKeyDown
228 ,
229 autoFocus: autoFocus,
230 enforceFocus: enforceFocus,
231 restoreFocus: restoreFocus,
232 restoreFocusOptions: restoreFocusOptions,
233 onEscapeKeyDown: handleEscapeKeyDown,
234 onShow: onShow,
235 onHide: onHide,
236 onEnter: handleEnter,
237 onEntering: handleEntering,
238 onEntered: onEntered,
239 onExit: handleExit,
240 onExiting: onExiting,
241 onExited: handleExited,
242 manager: getModalManager(),
243 transition: animation ? DialogTransition : undefined,
244 backdropTransition: animation ? BackdropTransition : undefined,
245 renderBackdrop: renderBackdrop,
246 renderDialog: renderDialog
247 })
248 });
249});
250Modal.displayName = 'Modal';
251var _default = Object.assign(Modal, {
252 Body: _ModalBody.default,
253 Header: _ModalHeader.default,
254 Title: _ModalTitle.default,
255 Footer: _ModalFooter.default,
256 Dialog: _ModalDialog.default,
257 TRANSITION_DURATION: 300,
258 BACKDROP_TRANSITION_DURATION: 150
259});
260exports.default = _default;
261module.exports = exports.default;
\No newline at end of file