UNPKG

@amaui/ui-react

Version:
208 lines 8.96 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; const _excluded = ["id", "tonal", "color", "size", "elevation", "open", "primary", "end", "position", "alignment", "autoHide", "autoHideDuration", "fixed", "resumeFromStart", "closeButton", "onMouseEnter", "onMouseLeave", "onClose", "IconClose", "TransitionComponent", "IconProps", "IconButtonProps", "TransitionComponentProps", "Component", "className", "children"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React from 'react'; import { is, getID, isEnvironment } from '@amaui/utils'; import { classNames, style as styleMethod, useAmauiTheme } from '@amaui/style-react'; import IconMaterialClose from '@amaui/icons-material-rounded-react/IconMaterialCloseW100'; import GrowElement from '../Grow'; import TypeElement from '../Type'; import SurfaceElement from '../Surface'; import IconButtonElement from '../IconButton'; import LineElement from '../Line'; import { staticClassName } from '../utils'; const useStyle = styleMethod(theme => ({ root: { minWidth: '340px', minHeight: '50px', borderRadius: `${theme.shape.radius.unit}px`, boxShadow: 'rgb(0 0 0 / 1%) 0px 4px 5px 0px, rgb(0 0 0 / 1%) 0px 1px 10px 0px, rgb(0 0 0 / 1%) 0px 2px 4px -1px' }, end: { marginInlineStart: 'auto' }, size_small: { padding: `${theme.methods.space.value(0.5, 'px')} ${theme.methods.space.value(2, 'px')}` }, size_regular: { padding: `${theme.methods.space.value(1, 'px')} ${theme.methods.space.value(2.5, 'px')}` }, size_large: { padding: `${theme.methods.space.value(1.5, 'px')} ${theme.methods.space.value(3, 'px')}` }, fixed: { position: 'fixed', zIndex: theme.z_index.modal }, position_top: { top: '24px' }, position_bottom: { bottom: '24px' }, alignment_left: { left: '24px', right: 'auto' }, alignment_start: { insetInlineStart: '24px', insetInlineEnd: 'auto' }, alignment_center: { left: '50%', right: 'auto', transform: 'translateX(-50%)' }, alignment_right: { right: '24px', left: 'auto' }, alignment_end: { insetInlineEnd: '24px', insetInlineStart: 'auto' } }), { name: 'amaui-Snackbar' }); const timeouts = {}; const Snackbar = /*#__PURE__*/React.forwardRef((props_, ref) => { const theme = useAmauiTheme(); const props = React.useMemo(() => _objectSpread(_objectSpread(_objectSpread({}, theme?.ui?.elements?.all?.props?.default), theme?.ui?.elements?.amauiSnackbar?.props?.default), props_), [props_]); const Line = React.useMemo(() => theme?.elements?.Line || LineElement, [theme]); const Grow = React.useMemo(() => theme?.elements?.Grow || GrowElement, [theme]); const Type = React.useMemo(() => theme?.elements?.Type || TypeElement, [theme]); const Surface = React.useMemo(() => theme?.elements?.Surface || SurfaceElement, [theme]); const IconButton = React.useMemo(() => theme?.elements?.IconButton || IconButtonElement, [theme]); const { id = getID(), tonal = true, color = 'primary', size = 'regular', elevation = 0, open = true, primary, end: end_, position = 'bottom', alignment = 'start', autoHide = true, autoHideDuration = 4000, fixed = props.open !== undefined, resumeFromStart = true, closeButton = true, onMouseEnter: onMouseEnter_, onMouseLeave: onMouseLeave_, onClose: onClose_, IconClose = IconMaterialClose, TransitionComponent = Grow, IconProps, IconButtonProps, TransitionComponentProps, Component = 'div', className, children } = props, other = _objectWithoutProperties(props, _excluded); const { classes } = useStyle(); const refs = { root: React.useRef(undefined), timeoutStart: React.useRef(undefined), timeoutLeftOver: React.useRef(undefined), autoHideDuration: React.useRef(undefined) }; refs.autoHideDuration.current = autoHideDuration; const end = React.Children.toArray(end_); const onClose = React.useCallback(() => { if (is('function', onClose_)) onClose_(); }, [onClose_]); const addTimeout = React.useCallback(function () { let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : autoHideDuration; clearTimeout(timeouts[id]); timeouts[id] = setTimeout(() => onClose(), value); refs.timeoutStart.current = new Date().getTime(); }, [autoHideDuration, timeouts, onClose]); const removeTimeout = React.useCallback(() => { clearTimeout(timeouts[id]); const start = resumeFromStart ? refs.autoHideDuration.current : refs.timeoutLeftOver.current !== undefined ? refs.timeoutLeftOver.current : refs.autoHideDuration.current; refs.timeoutLeftOver.current = start - (new Date().getTime() - refs.timeoutStart.current); }, [resumeFromStart]); const onMouseEnter = React.useCallback(event => { if (timeouts[id] !== undefined) removeTimeout(); if (is('function', onMouseEnter_)) onMouseEnter_(event); }, [onMouseEnter_]); const onMouseLeave = React.useCallback(event => { if (refs.timeoutLeftOver.current !== undefined) addTimeout(refs.timeoutLeftOver.current); if (is('function', onMouseLeave_)) onMouseLeave_(event); }, [onMouseLeave_]); React.useEffect(() => { const onTabFocus = () => { if (refs.timeoutLeftOver.current !== undefined) addTimeout(refs.timeoutLeftOver.current); }; const onTabBlur = () => { if (timeouts[id] !== undefined) removeTimeout(); }; const rootDocument = isEnvironment('browser') ? refs.root.current?.ownerDocument || window.document : undefined; rootDocument.addEventListener('focus', onTabFocus); rootDocument.addEventListener('blur', onTabBlur); return () => { rootDocument.removeEventListener('focus', onTabFocus); rootDocument.removeEventListener('blur', onTabBlur); }; }, []); React.useEffect(() => { if (open) { if (autoHide && props.open !== undefined) addTimeout(); } else { clearTimeout(timeouts[id]); timeouts[id] = refs.timeoutStart.current = refs.timeoutLeftOver.current = undefined; } }, [open, autoHide]); if (props.open !== undefined) { if (closeButton) { end.push( /*#__PURE__*/React.createElement(IconButton, _extends({ version: "text", color: "inherit", onClick: onClose }, IconButtonProps), /*#__PURE__*/React.createElement(IconClose, IconProps))); } } return /*#__PURE__*/React.createElement(TransitionComponent, _extends({ in: open }, TransitionComponentProps), /*#__PURE__*/React.createElement(Surface, _extends({ ref: item => { if (ref) { if (is('function', ref)) ref(item);else ref.current = item; } refs.root.current = item; }, tonal: tonal, color: color, elevation: elevation, gap: 2, wrap: "wrap", direction: "row", align: "center", justify: "space-between", onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, Component: Line, className: classNames([staticClassName('Snackbar', theme) && [`amaui-Snackbar-root`, `amaui-Snackbar-size-${size}`], className, classes.root, classes[`size_${size}`], fixed && [classes.fixed, classes[`position_${position}`], classes[`alignment_${alignment}`]]]) }, other), (children !== undefined || primary !== undefined) && /*#__PURE__*/React.createElement("div", { className: classNames([staticClassName('Snackbar', theme) && [`amaui-Snackbar-primary`], classes.primary]) }, is('string', primary) ? /*#__PURE__*/React.createElement(Type, { version: "b2" }, primary) : primary, children), !!end.length && /*#__PURE__*/React.createElement(Line, { gap: 0, direction: "row", wrap: "wrap", align: "center", justify: "flex-end", className: classNames([staticClassName('Snackbar', theme) && [`amaui-Snackbar-end`], classes.end]) }, end))); }); Snackbar.displayName = 'amaui-Snackbar'; export default Snackbar;