UNPKG

15.4 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.default = exports.styles = void 0;
11
12var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
14var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
16var _extends8 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
17
18var React = _interopRequireWildcard(require("react"));
19
20var _propTypes = _interopRequireDefault(require("prop-types"));
21
22var _clsx = _interopRequireDefault(require("clsx"));
23
24var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
25
26var _transitions = require("../styles/transitions");
27
28var _ClickAwayListener = _interopRequireDefault(require("../ClickAwayListener"));
29
30var _useEventCallback = _interopRequireDefault(require("../utils/useEventCallback"));
31
32var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
33
34var _createChainedFunction = _interopRequireDefault(require("../utils/createChainedFunction"));
35
36var _deprecatedPropType = _interopRequireDefault(require("../utils/deprecatedPropType"));
37
38var _Grow = _interopRequireDefault(require("../Grow"));
39
40var _SnackbarContent = _interopRequireDefault(require("../SnackbarContent"));
41
42var styles = function styles(theme) {
43 var top1 = {
44 top: 8
45 };
46 var bottom1 = {
47 bottom: 8
48 };
49 var right = {
50 justifyContent: 'flex-end'
51 };
52 var left = {
53 justifyContent: 'flex-start'
54 };
55 var top3 = {
56 top: 24
57 };
58 var bottom3 = {
59 bottom: 24
60 };
61 var right3 = {
62 right: 24
63 };
64 var left3 = {
65 left: 24
66 };
67 var center = {
68 left: '50%',
69 right: 'auto',
70 transform: 'translateX(-50%)'
71 };
72 return {
73 /* Styles applied to the root element. */
74 root: {
75 zIndex: theme.zIndex.snackbar,
76 position: 'fixed',
77 display: 'flex',
78 left: 8,
79 right: 8,
80 justifyContent: 'center',
81 alignItems: 'center'
82 },
83
84 /* Styles applied to the root element if `anchorOrigin={{ 'top', 'center' }}`. */
85 anchorOriginTopCenter: (0, _extends8.default)({}, top1, (0, _defineProperty2.default)({}, theme.breakpoints.up('sm'), (0, _extends8.default)({}, top3, center))),
86
87 /* Styles applied to the root element if `anchorOrigin={{ 'bottom', 'center' }}`. */
88 anchorOriginBottomCenter: (0, _extends8.default)({}, bottom1, (0, _defineProperty2.default)({}, theme.breakpoints.up('sm'), (0, _extends8.default)({}, bottom3, center))),
89
90 /* Styles applied to the root element if `anchorOrigin={{ 'top', 'right' }}`. */
91 anchorOriginTopRight: (0, _extends8.default)({}, top1, right, (0, _defineProperty2.default)({}, theme.breakpoints.up('sm'), (0, _extends8.default)({
92 left: 'auto'
93 }, top3, right3))),
94
95 /* Styles applied to the root element if `anchorOrigin={{ 'bottom', 'right' }}`. */
96 anchorOriginBottomRight: (0, _extends8.default)({}, bottom1, right, (0, _defineProperty2.default)({}, theme.breakpoints.up('sm'), (0, _extends8.default)({
97 left: 'auto'
98 }, bottom3, right3))),
99
100 /* Styles applied to the root element if `anchorOrigin={{ 'top', 'left' }}`. */
101 anchorOriginTopLeft: (0, _extends8.default)({}, top1, left, (0, _defineProperty2.default)({}, theme.breakpoints.up('sm'), (0, _extends8.default)({
102 right: 'auto'
103 }, top3, left3))),
104
105 /* Styles applied to the root element if `anchorOrigin={{ 'bottom', 'left' }}`. */
106 anchorOriginBottomLeft: (0, _extends8.default)({}, bottom1, left, (0, _defineProperty2.default)({}, theme.breakpoints.up('sm'), (0, _extends8.default)({
107 right: 'auto'
108 }, bottom3, left3)))
109 };
110};
111
112exports.styles = styles;
113var Snackbar = /*#__PURE__*/React.forwardRef(function Snackbar(props, ref) {
114 var action = props.action,
115 _props$anchorOrigin = props.anchorOrigin;
116 _props$anchorOrigin = _props$anchorOrigin === void 0 ? {
117 vertical: 'bottom',
118 horizontal: 'center'
119 } : _props$anchorOrigin;
120 var vertical = _props$anchorOrigin.vertical,
121 horizontal = _props$anchorOrigin.horizontal,
122 _props$autoHideDurati = props.autoHideDuration,
123 autoHideDuration = _props$autoHideDurati === void 0 ? null : _props$autoHideDurati,
124 children = props.children,
125 classes = props.classes,
126 className = props.className,
127 ClickAwayListenerProps = props.ClickAwayListenerProps,
128 ContentProps = props.ContentProps,
129 _props$disableWindowB = props.disableWindowBlurListener,
130 disableWindowBlurListener = _props$disableWindowB === void 0 ? false : _props$disableWindowB,
131 message = props.message,
132 onClose = props.onClose,
133 onEnter = props.onEnter,
134 onEntered = props.onEntered,
135 onEntering = props.onEntering,
136 onExit = props.onExit,
137 onExited = props.onExited,
138 onExiting = props.onExiting,
139 onMouseEnter = props.onMouseEnter,
140 onMouseLeave = props.onMouseLeave,
141 open = props.open,
142 resumeHideDuration = props.resumeHideDuration,
143 _props$TransitionComp = props.TransitionComponent,
144 TransitionComponent = _props$TransitionComp === void 0 ? _Grow.default : _props$TransitionComp,
145 _props$transitionDura = props.transitionDuration,
146 transitionDuration = _props$transitionDura === void 0 ? {
147 enter: _transitions.duration.enteringScreen,
148 exit: _transitions.duration.leavingScreen
149 } : _props$transitionDura,
150 TransitionProps = props.TransitionProps,
151 other = (0, _objectWithoutProperties2.default)(props, ["action", "anchorOrigin", "autoHideDuration", "children", "classes", "className", "ClickAwayListenerProps", "ContentProps", "disableWindowBlurListener", "message", "onClose", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "onMouseEnter", "onMouseLeave", "open", "resumeHideDuration", "TransitionComponent", "transitionDuration", "TransitionProps"]);
152 var timerAutoHide = React.useRef();
153
154 var _React$useState = React.useState(true),
155 exited = _React$useState[0],
156 setExited = _React$useState[1];
157
158 var handleClose = (0, _useEventCallback.default)(function () {
159 if (onClose) {
160 onClose.apply(void 0, arguments);
161 }
162 });
163 var setAutoHideTimer = (0, _useEventCallback.default)(function (autoHideDurationParam) {
164 if (!onClose || autoHideDurationParam == null) {
165 return;
166 }
167
168 clearTimeout(timerAutoHide.current);
169 timerAutoHide.current = setTimeout(function () {
170 handleClose(null, 'timeout');
171 }, autoHideDurationParam);
172 });
173 React.useEffect(function () {
174 if (open) {
175 setAutoHideTimer(autoHideDuration);
176 }
177
178 return function () {
179 clearTimeout(timerAutoHide.current);
180 };
181 }, [open, autoHideDuration, setAutoHideTimer]); // Pause the timer when the user is interacting with the Snackbar
182 // or when the user hide the window.
183
184 var handlePause = function handlePause() {
185 clearTimeout(timerAutoHide.current);
186 }; // Restart the timer when the user is no longer interacting with the Snackbar
187 // or when the window is shown back.
188
189
190 var handleResume = React.useCallback(function () {
191 if (autoHideDuration != null) {
192 setAutoHideTimer(resumeHideDuration != null ? resumeHideDuration : autoHideDuration * 0.5);
193 }
194 }, [autoHideDuration, resumeHideDuration, setAutoHideTimer]);
195
196 var handleMouseEnter = function handleMouseEnter(event) {
197 if (onMouseEnter) {
198 onMouseEnter(event);
199 }
200
201 handlePause();
202 };
203
204 var handleMouseLeave = function handleMouseLeave(event) {
205 if (onMouseLeave) {
206 onMouseLeave(event);
207 }
208
209 handleResume();
210 };
211
212 var handleClickAway = function handleClickAway(event) {
213 if (onClose) {
214 onClose(event, 'clickaway');
215 }
216 };
217
218 var handleExited = function handleExited() {
219 setExited(true);
220 };
221
222 var handleEnter = function handleEnter() {
223 setExited(false);
224 };
225
226 React.useEffect(function () {
227 if (!disableWindowBlurListener && open) {
228 window.addEventListener('focus', handleResume);
229 window.addEventListener('blur', handlePause);
230 return function () {
231 window.removeEventListener('focus', handleResume);
232 window.removeEventListener('blur', handlePause);
233 };
234 }
235
236 return undefined;
237 }, [disableWindowBlurListener, handleResume, open]); // So we only render active snackbars.
238
239 if (!open && exited) {
240 return null;
241 }
242
243 return /*#__PURE__*/React.createElement(_ClickAwayListener.default, (0, _extends8.default)({
244 onClickAway: handleClickAway
245 }, ClickAwayListenerProps), /*#__PURE__*/React.createElement("div", (0, _extends8.default)({
246 className: (0, _clsx.default)(classes.root, classes["anchorOrigin".concat((0, _capitalize.default)(vertical)).concat((0, _capitalize.default)(horizontal))], className),
247 onMouseEnter: handleMouseEnter,
248 onMouseLeave: handleMouseLeave,
249 ref: ref
250 }, other), /*#__PURE__*/React.createElement(TransitionComponent, (0, _extends8.default)({
251 appear: true,
252 in: open,
253 onEnter: (0, _createChainedFunction.default)(handleEnter, onEnter),
254 onEntered: onEntered,
255 onEntering: onEntering,
256 onExit: onExit,
257 onExited: (0, _createChainedFunction.default)(handleExited, onExited),
258 onExiting: onExiting,
259 timeout: transitionDuration,
260 direction: vertical === 'top' ? 'down' : 'up'
261 }, TransitionProps), children || /*#__PURE__*/React.createElement(_SnackbarContent.default, (0, _extends8.default)({
262 message: message,
263 action: action
264 }, ContentProps)))));
265});
266process.env.NODE_ENV !== "production" ? Snackbar.propTypes = {
267 // ----------------------------- Warning --------------------------------
268 // | These PropTypes are generated from the TypeScript type definitions |
269 // | To update them edit the d.ts file and run "yarn proptypes" |
270 // ----------------------------------------------------------------------
271
272 /**
273 * The action to display. It renders after the message, at the end of the snackbar.
274 */
275 action: _propTypes.default.node,
276
277 /**
278 * The anchor of the `Snackbar`.
279 */
280 anchorOrigin: _propTypes.default.shape({
281 horizontal: _propTypes.default.oneOf(['center', 'left', 'right']).isRequired,
282 vertical: _propTypes.default.oneOf(['bottom', 'top']).isRequired
283 }),
284
285 /**
286 * The number of milliseconds to wait before automatically calling the
287 * `onClose` function. `onClose` should then set the state of the `open`
288 * prop to hide the Snackbar. This behavior is disabled by default with
289 * the `null` value.
290 */
291 autoHideDuration: _propTypes.default.number,
292
293 /**
294 * Replace the `SnackbarContent` component.
295 */
296 children: _propTypes.default.element,
297
298 /**
299 * Override or extend the styles applied to the component.
300 * See [CSS API](#css) below for more details.
301 */
302 classes: _propTypes.default.object,
303
304 /**
305 * @ignore
306 */
307 className: _propTypes.default.string,
308
309 /**
310 * Props applied to the `ClickAwayListener` element.
311 */
312 ClickAwayListenerProps: _propTypes.default.object,
313
314 /**
315 * Props applied to the [`SnackbarContent`](/api/snackbar-content/) element.
316 */
317 ContentProps: _propTypes.default.object,
318
319 /**
320 * If `true`, the `autoHideDuration` timer will expire even if the window is not focused.
321 */
322 disableWindowBlurListener: _propTypes.default.bool,
323
324 /**
325 * When displaying multiple consecutive Snackbars from a parent rendering a single
326 * <Snackbar/>, add the key prop to ensure independent treatment of each message.
327 * e.g. <Snackbar key={message} />, otherwise, the message may update-in-place and
328 * features such as autoHideDuration may be canceled.
329 */
330 key: _propTypes.default.any,
331
332 /**
333 * The message to display.
334 */
335 message: _propTypes.default.node,
336
337 /**
338 * Callback fired when the component requests to be closed.
339 * Typically `onClose` is used to set state in the parent component,
340 * which is used to control the `Snackbar` `open` prop.
341 * The `reason` parameter can optionally be used to control the response to `onClose`,
342 * for example ignoring `clickaway`.
343 *
344 * @param {object} event The event source of the callback.
345 * @param {string} reason Can be: `"timeout"` (`autoHideDuration` expired), `"clickaway"`.
346 */
347 onClose: _propTypes.default.func,
348
349 /**
350 * Callback fired before the transition is entering.
351 * @deprecated Use the `TransitionProps` prop instead.
352 */
353 onEnter: (0, _deprecatedPropType.default)(_propTypes.default.func, 'Use the `TransitionProps` prop instead.'),
354
355 /**
356 * Callback fired when the transition has entered.
357 * @deprecated Use the `TransitionProps` prop instead.
358 */
359 onEntered: (0, _deprecatedPropType.default)(_propTypes.default.func, 'Use the `TransitionProps` prop instead.'),
360
361 /**
362 * Callback fired when the transition is entering.
363 * @deprecated Use the `TransitionProps` prop instead.
364 */
365 onEntering: (0, _deprecatedPropType.default)(_propTypes.default.func, 'Use the `TransitionProps` prop instead.'),
366
367 /**
368 * Callback fired before the transition is exiting.
369 * @deprecated Use the `TransitionProps` prop instead.
370 */
371 onExit: (0, _deprecatedPropType.default)(_propTypes.default.func, 'Use the `TransitionProps` prop instead.'),
372
373 /**
374 * Callback fired when the transition has exited.
375 * @deprecated Use the `TransitionProps` prop instead.
376 */
377 onExited: (0, _deprecatedPropType.default)(_propTypes.default.func, 'Use the `TransitionProps` prop instead.'),
378
379 /**
380 * Callback fired when the transition is exiting.
381 * @deprecated Use the `TransitionProps` prop instead.
382 */
383 onExiting: (0, _deprecatedPropType.default)(_propTypes.default.func, 'Use the `TransitionProps` prop instead.'),
384
385 /**
386 * @ignore
387 */
388 onMouseEnter: _propTypes.default.func,
389
390 /**
391 * @ignore
392 */
393 onMouseLeave: _propTypes.default.func,
394
395 /**
396 * If `true`, `Snackbar` is open.
397 */
398 open: _propTypes.default.bool,
399
400 /**
401 * The number of milliseconds to wait before dismissing after user interaction.
402 * If `autoHideDuration` prop isn't specified, it does nothing.
403 * If `autoHideDuration` prop is specified but `resumeHideDuration` isn't,
404 * we default to `autoHideDuration / 2` ms.
405 */
406 resumeHideDuration: _propTypes.default.number,
407
408 /**
409 * The component used for the transition.
410 * [Follow this guide](/components/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.
411 */
412 TransitionComponent: _propTypes.default.elementType,
413
414 /**
415 * The duration for the transition, in milliseconds.
416 * You may specify a single timeout for all transitions, or individually with an object.
417 */
418 transitionDuration: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
419 appear: _propTypes.default.number,
420 enter: _propTypes.default.number,
421 exit: _propTypes.default.number
422 })]),
423
424 /**
425 * Props applied to the [`Transition`](http://reactcommunity.org/react-transition-group/transition#Transition-props) element.
426 */
427 TransitionProps: _propTypes.default.object
428} : void 0;
429
430var _default = (0, _withStyles.default)(styles, {
431 flip: false,
432 name: 'MuiSnackbar'
433})(Snackbar);
434
435exports.default = _default;
\No newline at end of file