UNPKG

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