UNPKG

12.8 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports.default = void 0;
7
8var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
9
10var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
12var _classnames = _interopRequireDefault(require("classnames"));
13
14var _addEventListener = _interopRequireDefault(require("dom-helpers/addEventListener"));
15
16var _canUseDOM = _interopRequireDefault(require("dom-helpers/canUseDOM"));
17
18var _ownerDocument = _interopRequireDefault(require("dom-helpers/ownerDocument"));
19
20var _removeEventListener = _interopRequireDefault(require("dom-helpers/removeEventListener"));
21
22var _scrollbarSize = _interopRequireDefault(require("dom-helpers/scrollbarSize"));
23
24var _useCallbackRef2 = _interopRequireDefault(require("@restart/hooks/useCallbackRef"));
25
26var _useEventCallback = _interopRequireDefault(require("@restart/hooks/useEventCallback"));
27
28var _useWillUnmount = _interopRequireDefault(require("@restart/hooks/useWillUnmount"));
29
30var _transitionEnd = _interopRequireDefault(require("dom-helpers/transitionEnd"));
31
32var _react = _interopRequireWildcard(require("react"));
33
34var _Modal = _interopRequireDefault(require("react-overlays/Modal"));
35
36var _warning = _interopRequireDefault(require("warning"));
37
38var _BootstrapModalManager = _interopRequireDefault(require("./BootstrapModalManager"));
39
40var _Fade = _interopRequireDefault(require("./Fade"));
41
42var _ModalBody = _interopRequireDefault(require("./ModalBody"));
43
44var _ModalContext = _interopRequireDefault(require("./ModalContext"));
45
46var _ModalDialog = _interopRequireDefault(require("./ModalDialog"));
47
48var _ModalFooter = _interopRequireDefault(require("./ModalFooter"));
49
50var _ModalHeader = _interopRequireDefault(require("./ModalHeader"));
51
52var _ModalTitle = _interopRequireDefault(require("./ModalTitle"));
53
54var _ThemeProvider = require("./ThemeProvider");
55
56var _excluded = ["bsPrefix", "className", "style", "dialogClassName", "contentClassName", "children", "dialogAs", "aria-labelledby", "show", "animation", "backdrop", "keyboard", "onEscapeKeyDown", "onShow", "onHide", "container", "autoFocus", "enforceFocus", "restoreFocus", "restoreFocusOptions", "onEntered", "onExit", "onExiting", "onEnter", "onEntering", "onExited", "backdropClassName", "manager"];
57
58function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
59
60function _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; }
61
62var manager;
63var defaultProps = {
64 show: false,
65 backdrop: true,
66 keyboard: true,
67 autoFocus: true,
68 enforceFocus: true,
69 restoreFocus: true,
70 animation: true,
71 dialogAs: _ModalDialog.default
72};
73/* eslint-disable no-use-before-define, react/no-multi-comp */
74
75function DialogTransition(props) {
76 return /*#__PURE__*/_react.default.createElement(_Fade.default, (0, _extends2.default)({}, props, {
77 timeout: null
78 }));
79}
80
81function BackdropTransition(props) {
82 return /*#__PURE__*/_react.default.createElement(_Fade.default, (0, _extends2.default)({}, props, {
83 timeout: null
84 }));
85}
86/* eslint-enable no-use-before-define */
87
88
89var Modal = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
90 var bsPrefix = _ref.bsPrefix,
91 className = _ref.className,
92 style = _ref.style,
93 dialogClassName = _ref.dialogClassName,
94 contentClassName = _ref.contentClassName,
95 children = _ref.children,
96 Dialog = _ref.dialogAs,
97 ariaLabelledby = _ref['aria-labelledby'],
98 show = _ref.show,
99 animation = _ref.animation,
100 backdrop = _ref.backdrop,
101 keyboard = _ref.keyboard,
102 onEscapeKeyDown = _ref.onEscapeKeyDown,
103 onShow = _ref.onShow,
104 onHide = _ref.onHide,
105 container = _ref.container,
106 autoFocus = _ref.autoFocus,
107 enforceFocus = _ref.enforceFocus,
108 restoreFocus = _ref.restoreFocus,
109 restoreFocusOptions = _ref.restoreFocusOptions,
110 onEntered = _ref.onEntered,
111 onExit = _ref.onExit,
112 onExiting = _ref.onExiting,
113 onEnter = _ref.onEnter,
114 onEntering = _ref.onEntering,
115 onExited = _ref.onExited,
116 backdropClassName = _ref.backdropClassName,
117 propsManager = _ref.manager,
118 props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
119
120 var _useState = (0, _react.useState)({}),
121 modalStyle = _useState[0],
122 setStyle = _useState[1];
123
124 var _useState2 = (0, _react.useState)(false),
125 animateStaticModal = _useState2[0],
126 setAnimateStaticModal = _useState2[1];
127
128 var waitingForMouseUpRef = (0, _react.useRef)(false);
129 var ignoreBackdropClickRef = (0, _react.useRef)(false);
130 var removeStaticModalAnimationRef = (0, _react.useRef)(null); // TODO: what's this type
131
132 var _useCallbackRef = (0, _useCallbackRef2.default)(),
133 modal = _useCallbackRef[0],
134 setModalRef = _useCallbackRef[1];
135
136 var handleHide = (0, _useEventCallback.default)(onHide);
137 bsPrefix = (0, _ThemeProvider.useBootstrapPrefix)(bsPrefix, 'modal');
138 (0, _react.useImperativeHandle)(ref, function () {
139 return {
140 get _modal() {
141 process.env.NODE_ENV !== "production" ? (0, _warning.default)(false, 'Accessing `_modal` is not supported and will be removed in a future release') : void 0;
142 return modal;
143 }
144
145 };
146 }, [modal]);
147 var modalContext = (0, _react.useMemo)(function () {
148 return {
149 onHide: handleHide
150 };
151 }, [handleHide]);
152
153 function getModalManager() {
154 if (propsManager) return propsManager;
155 if (!manager) manager = new _BootstrapModalManager.default();
156 return manager;
157 }
158
159 function updateDialogStyle(node) {
160 if (!_canUseDOM.default) return;
161 var containerIsOverflowing = getModalManager().isContainerOverflowing(modal);
162 var modalIsOverflowing = node.scrollHeight > (0, _ownerDocument.default)(node).documentElement.clientHeight;
163 setStyle({
164 paddingRight: containerIsOverflowing && !modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined,
165 paddingLeft: !containerIsOverflowing && modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined
166 });
167 }
168
169 var handleWindowResize = (0, _useEventCallback.default)(function () {
170 if (modal) {
171 updateDialogStyle(modal.dialog);
172 }
173 });
174 (0, _useWillUnmount.default)(function () {
175 (0, _removeEventListener.default)(window, 'resize', handleWindowResize);
176
177 if (removeStaticModalAnimationRef.current) {
178 removeStaticModalAnimationRef.current();
179 }
180 }); // We prevent the modal from closing during a drag by detecting where the
181 // the click originates from. If it starts in the modal and then ends outside
182 // don't close.
183
184 var handleDialogMouseDown = function handleDialogMouseDown() {
185 waitingForMouseUpRef.current = true;
186 };
187
188 var handleMouseUp = function handleMouseUp(e) {
189 if (waitingForMouseUpRef.current && modal && e.target === modal.dialog) {
190 ignoreBackdropClickRef.current = true;
191 }
192
193 waitingForMouseUpRef.current = false;
194 };
195
196 var handleStaticModalAnimation = function handleStaticModalAnimation() {
197 setAnimateStaticModal(true);
198 removeStaticModalAnimationRef.current = (0, _transitionEnd.default)(modal.dialog, function () {
199 setAnimateStaticModal(false);
200 });
201 };
202
203 var handleStaticBackdropClick = function handleStaticBackdropClick(e) {
204 if (e.target !== e.currentTarget) {
205 return;
206 }
207
208 handleStaticModalAnimation();
209 };
210
211 var handleClick = function handleClick(e) {
212 if (backdrop === 'static') {
213 handleStaticBackdropClick(e);
214 return;
215 }
216
217 if (ignoreBackdropClickRef.current || e.target !== e.currentTarget) {
218 ignoreBackdropClickRef.current = false;
219 return;
220 }
221
222 onHide == null ? void 0 : onHide();
223 };
224
225 var handleEscapeKeyDown = function handleEscapeKeyDown(e) {
226 if (!keyboard && backdrop === 'static') {
227 // Call preventDefault to stop modal from closing in react-overlays,
228 // then play our animation.
229 e.preventDefault();
230 handleStaticModalAnimation();
231 } else if (keyboard && onEscapeKeyDown) {
232 onEscapeKeyDown(e);
233 }
234 };
235
236 var handleEnter = function handleEnter(node, isAppearing) {
237 if (node) {
238 node.style.display = 'block';
239 updateDialogStyle(node);
240 }
241
242 onEnter == null ? void 0 : onEnter(node, isAppearing);
243 };
244
245 var handleExit = function handleExit(node) {
246 removeStaticModalAnimationRef.current == null ? void 0 : removeStaticModalAnimationRef.current();
247 onExit == null ? void 0 : onExit(node);
248 };
249
250 var handleEntering = function handleEntering(node, isAppearing) {
251 onEntering == null ? void 0 : onEntering(node, isAppearing); // FIXME: This should work even when animation is disabled.
252
253 (0, _addEventListener.default)(window, 'resize', handleWindowResize);
254 };
255
256 var handleExited = function handleExited(node) {
257 if (node) node.style.display = ''; // RHL removes it sometimes
258
259 onExited == null ? void 0 : onExited(node); // FIXME: This should work even when animation is disabled.
260
261 (0, _removeEventListener.default)(window, 'resize', handleWindowResize);
262 };
263
264 var renderBackdrop = (0, _react.useCallback)(function (backdropProps) {
265 return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, backdropProps, {
266 className: (0, _classnames.default)(bsPrefix + "-backdrop", backdropClassName, !animation && 'show')
267 }));
268 }, [animation, backdropClassName, bsPrefix]);
269 var baseModalStyle = (0, _extends2.default)({}, style, modalStyle); // Sets `display` always block when `animation` is false
270
271 if (!animation) {
272 baseModalStyle.display = 'block';
273 }
274
275 var renderDialog = function renderDialog(dialogProps) {
276 return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
277 role: "dialog"
278 }, dialogProps, {
279 style: baseModalStyle,
280 className: (0, _classnames.default)(className, bsPrefix, animateStaticModal && bsPrefix + "-static"),
281 onClick: backdrop ? handleClick : undefined,
282 onMouseUp: handleMouseUp,
283 "aria-labelledby": ariaLabelledby
284 }), /*#__PURE__*/_react.default.createElement(Dialog, (0, _extends2.default)({}, props, {
285 onMouseDown: handleDialogMouseDown,
286 className: dialogClassName,
287 contentClassName: contentClassName
288 }), children));
289 };
290
291 return /*#__PURE__*/_react.default.createElement(_ModalContext.default.Provider, {
292 value: modalContext
293 }, /*#__PURE__*/_react.default.createElement(_Modal.default, {
294 show: show,
295 ref: setModalRef,
296 backdrop: backdrop,
297 container: container,
298 keyboard: true // Always set true - see handleEscapeKeyDown
299 ,
300 autoFocus: autoFocus,
301 enforceFocus: enforceFocus,
302 restoreFocus: restoreFocus,
303 restoreFocusOptions: restoreFocusOptions,
304 onEscapeKeyDown: handleEscapeKeyDown,
305 onShow: onShow,
306 onHide: onHide,
307 onEnter: handleEnter,
308 onEntering: handleEntering,
309 onEntered: onEntered,
310 onExit: handleExit,
311 onExiting: onExiting,
312 onExited: handleExited,
313 manager: getModalManager(),
314 containerClassName: bsPrefix + "-open",
315 transition: animation ? DialogTransition : undefined,
316 backdropTransition: animation ? BackdropTransition : undefined,
317 renderBackdrop: renderBackdrop,
318 renderDialog: renderDialog
319 }));
320});
321
322Modal.displayName = 'Modal';
323Modal.defaultProps = defaultProps;
324Modal.Body = _ModalBody.default;
325Modal.Header = _ModalHeader.default;
326Modal.Title = _ModalTitle.default;
327Modal.Footer = _ModalFooter.default;
328Modal.Dialog = _ModalDialog.default;
329Modal.TRANSITION_DURATION = 300;
330Modal.BACKDROP_TRANSITION_DURATION = 150;
331var _default = Modal;
332exports.default = _default;
333module.exports = exports["default"];
\No newline at end of file