UNPKG

@intility/bifrost-react

Version:

React library for Intility's design system, Bifrost.

288 lines (287 loc) 7.78 kB
"use client"; import { c as _c } from "react-compiler-runtime"; import { createRef, useCallback, useEffect, useRef, useState } from "react"; import { TransitionGroup, CSSTransition } from "react-transition-group"; import classNames from "classnames"; import Message from "../Message/Message.js"; import FloatingMessageContext from "./FloatingMessageContext.internal.js"; import useAnimationDuration from "../../hooks/useAnimationDuration.js"; import useFloatingMessage from "../../hooks/useFloatingMessage.js"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; /** * Provider for stacking floating notifications (aka toast or snackbar) via * `useFloatingMessage()` hook * * @see https://bifrost.intility.com/react/floatingMessage */ export default function FloatingMessage(t0) { const $ = _c(17); const { children, max: t1, timeout: t2, top: t3, left: t4 } = t0; const max = t1 === undefined ? 3 : t1; const timeout = t2 === undefined ? 7000 : t2; const top = t3 === undefined ? false : t3; const left = t4 === undefined ? false : t4; let t5; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t5 = []; $[0] = t5; } else { t5 = $[0]; } const [messages, setMessages] = useState(t5); let t6; if ($[1] === Symbol.for("react.memo_cache_sentinel")) { t6 = message => { setMessages(messages_0 => messages_0.filter(m => m !== message)); }; $[1] = t6; } else { t6 = $[1]; } const removeMessageByReference = t6; let t7; if ($[2] !== max || $[3] !== timeout) { t7 = (message_0, options) => { const floatingMessage = { id: performance.now(), message: message_0, options }; setMessages(messages_1 => max === 1 ? [floatingMessage] : [...messages_1.slice((max - 1) * -1), floatingMessage]); if (timeout) { setTimeout(() => removeMessageByReference(floatingMessage), timeout); } }; $[2] = max; $[3] = timeout; $[4] = t7; } else { t7 = $[4]; } const showFloatingMessage = t7; let t8; if ($[5] !== left || $[6] !== messages || $[7] !== timeout || $[8] !== top) { t8 = { top, left, timeout, messages, setMessages, removeMessageByReference }; $[5] = left; $[6] = messages; $[7] = timeout; $[8] = top; $[9] = t8; } else { t8 = $[9]; } let t9; if ($[10] !== showFloatingMessage || $[11] !== t8) { t9 = { showFloatingMessage, _stack: t8 }; $[10] = showFloatingMessage; $[11] = t8; $[12] = t9; } else { t9 = $[12]; } let t10; if ($[13] === Symbol.for("react.memo_cache_sentinel")) { t10 = /*#__PURE__*/_jsx(FloatingMessageStack, {}); $[13] = t10; } else { t10 = $[13]; } let t11; if ($[14] !== children || $[15] !== t9) { t11 = /*#__PURE__*/_jsxs(FloatingMessageContext.Provider, { value: t9, children: [children, t10] }); $[14] = children; $[15] = t9; $[16] = t11; } else { t11 = $[16]; } return t11; } export function FloatingMessageStack() { const $ = _c(30); const stackRef = useRef(null); const animationDuration = useAnimationDuration(); const { showFloatingMessage, _stack } = useFloatingMessage(); if (!_stack) { throw new Error("Cannot instantiate <FloatingMessageStack> outside of <FloatingMessage> context"); } const { top, left, timeout, messages, setMessages, removeMessageByReference } = _stack; const isVisible = messages.length > 0; let t0; let t1; if ($[0] !== animationDuration || $[1] !== isVisible) { t0 = () => { if (!stackRef.current) { return; } const stackElement = stackRef.current; if (!isVisible && stackElement.matches(":popover-open")) { const closeTimer = setTimeout(() => stackElement.hidePopover?.(), animationDuration); return () => clearTimeout(closeTimer); } if (isVisible && !stackElement.matches(":popover-open")) { stackElement.showPopover?.(); } }; t1 = [isVisible, animationDuration]; $[0] = animationDuration; $[1] = isVisible; $[2] = t0; $[3] = t1; } else { t0 = $[2]; t1 = $[3]; } useEffect(t0, t1); let t2; if ($[4] !== setMessages) { t2 = message => { setMessages(messages_0 => { if (!messages_0.includes(message)) { return messages_0; } return messages_0.map(m => m === message ? { ...message } : m); }); }; $[4] = setMessages; $[5] = t2; } else { t2 = $[5]; } const handleMouseEnter = t2; let t3; if ($[6] !== removeMessageByReference || $[7] !== timeout) { t3 = message_0 => { if (timeout) { setTimeout(() => removeMessageByReference(message_0), timeout); } }; $[6] = removeMessageByReference; $[7] = timeout; $[8] = t3; } else { t3 = $[8]; } const handleMouseLeave = t3; let t4; if ($[9] !== left || $[10] !== top) { t4 = classNames("bf-floatingmessage-stack", { "bf-floatingmessage-stack-top": top, "bf-floatingmessage-stack-left": left }); $[9] = left; $[10] = top; $[11] = t4; } else { t4 = $[11]; } let t5; if ($[12] !== animationDuration || $[13] !== handleMouseEnter || $[14] !== handleMouseLeave || $[15] !== messages || $[16] !== removeMessageByReference || $[17] !== showFloatingMessage) { let t6; if ($[19] !== animationDuration || $[20] !== handleMouseEnter || $[21] !== handleMouseLeave || $[22] !== removeMessageByReference || $[23] !== showFloatingMessage) { t6 = message_1 => { const transitionNodeRef = /*#__PURE__*/createRef(); return /*#__PURE__*/_jsx(CSSTransition, { timeout: animationDuration, classNames: "bf-floatingmessage", nodeRef: transitionNodeRef, children: /*#__PURE__*/_jsx("div", { ref: transitionNodeRef, className: "bf-stack-element", children: /*#__PURE__*/_jsx("div", { children: /*#__PURE__*/_jsx(FloatingMessageContext.Provider, { value: { showFloatingMessage, removeFloatingMessage: () => removeMessageByReference(message_1) }, children: /*#__PURE__*/_jsx(Message, { "aria-live": "polite", onClose: () => removeMessageByReference(message_1), onMouseEnter: () => handleMouseEnter(message_1), onMouseLeave: () => handleMouseLeave(message_1), ...message_1.options, header: message_1.message }) }) }) }) }, message_1.id); }; $[19] = animationDuration; $[20] = handleMouseEnter; $[21] = handleMouseLeave; $[22] = removeMessageByReference; $[23] = showFloatingMessage; $[24] = t6; } else { t6 = $[24]; } t5 = messages.map(t6); $[12] = animationDuration; $[13] = handleMouseEnter; $[14] = handleMouseLeave; $[15] = messages; $[16] = removeMessageByReference; $[17] = showFloatingMessage; $[18] = t5; } else { t5 = $[18]; } let t6; if ($[25] !== t5) { t6 = /*#__PURE__*/_jsx(TransitionGroup, { component: null, children: t5 }); $[25] = t5; $[26] = t6; } else { t6 = $[26]; } let t7; if ($[27] !== t4 || $[28] !== t6) { t7 = /*#__PURE__*/_jsx("div", { className: t4, popover: "manual", ref: stackRef, children: t6 }); $[27] = t4; $[28] = t6; $[29] = t7; } else { t7 = $[29]; } return t7; }