UNPKG

@kubit-ui-web/react-components

Version:

Kubit React Components is a customizable, accessible library of React web components, designed to enhance your application's user experience

100 lines 4.19 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Snackbar = exports.SnackbarUnControlled = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = __importDefault(require("react")); const focusHandlers_1 = require("../../utils/focusHandlers/focusHandlers"); const snackbarControlled_1 = require("./snackbarControlled"); const SnackbarUnControlledComponent = ({ open = false, variant, closeTimeout = 7000, onMouseEnter, onMouseLeave, onFocus, onBlur, ...props }, ref) => { const closeSnackbarTimeOut = react_1.default.useRef(null); const hover = react_1.default.useRef(false); const focus = react_1.default.useRef(false); const innerRef = react_1.default.useRef(null); const lastFocusedElement = react_1.default.useRef(null); react_1.default.useImperativeHandle(ref, () => innerRef?.current, []); /** * Only start timeout if closeTimeOut is defined, and if the snackbar is not hovered or focused * @returns */ const startCloseSnackbarTimeout = () => { if (!closeTimeout || hover.current || focus.current) { return; } closeSnackbarTimeOut.current = setTimeout(() => { props.onOpenClose?.(false); }, closeTimeout); }; const clearCloseSnackbarTimeout = () => { if (closeSnackbarTimeOut.current) { clearTimeout(closeSnackbarTimeOut.current); } }; react_1.default.useEffect(() => { if (open) { lastFocusedElement.current = document.activeElement; startCloseSnackbarTimeout(); } else { clearCloseSnackbarTimeout(); } return () => { clearCloseSnackbarTimeout(); }; }, [open]); const handleCloseButton = _open => event => { props.onOpenClose?.(_open, event); if (props.onCloseButton) { props.onCloseButton(event); return; } // After manually closing the popover, focus the last focused element // If the last focused element is not available, focus the first focusable element if (lastFocusedElement.current instanceof HTMLElement && document.contains(lastFocusedElement.current) && document.body !== lastFocusedElement.current) { lastFocusedElement.current.focus(); return; } (0, focusHandlers_1.focusFirstDescendantV2)({ element: document.body, elementsToOmit: innerRef.current ? [innerRef.current] : [], }); }; const handleMouseEnter = (event) => { onMouseEnter?.(event); hover.current = true; clearCloseSnackbarTimeout(); }; const handleMouseLeave = (event) => { onMouseLeave?.(event); hover.current = false; startCloseSnackbarTimeout(); }; const handleFocus = (event) => { onFocus?.(event); // There is not need of calling clear timeout if already focused if (focus.current) { return; } focus.current = true; clearCloseSnackbarTimeout(); }; const handleBlur = (event) => { onBlur?.(event); // If already focus and the next focusable element is an inner child, // there is no need of calling to start timeout again if (focus.current && event.currentTarget.contains(event.relatedTarget)) { return; } focus.current = false; startCloseSnackbarTimeout(); }; return ((0, jsx_runtime_1.jsx)(snackbarControlled_1.SnackbarControlled, { ...props, ref: innerRef, open: open, variant: variant, onBlur: handleBlur, onCloseButtonClick: handleCloseButton, onFocus: handleFocus, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave })); }; const SnackbarUnControlled = react_1.default.forwardRef(SnackbarUnControlledComponent); exports.SnackbarUnControlled = SnackbarUnControlled; exports.Snackbar = SnackbarUnControlled; //# sourceMappingURL=snackbarUnControlled.js.map