UNPKG

@octopusdeploy/design-system-components

Version:
42 lines (41 loc) 2.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GlobalSnackbarProvider = GlobalSnackbarProvider; exports.useShowSnackbar = useShowSnackbar; const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = require("react"); const Snackbar_1 = require("./Snackbar"); const showSnackbarContext = (0, react_1.createContext)(null); function GlobalSnackbarProvider({ children }) { const [open, setOpen] = (0, react_1.useState)(false); const [currentMessage, setCurrentMessage] = (0, react_1.useState)(null); const [messageQueue, setMessageQueue] = (0, react_1.useState)([]); const showSnackbar = (0, react_1.useCallback)((snackbarMessage) => { setMessageQueue((prev) => [...prev, snackbarMessage]); }, []); // effect to enqueue the next message (0, react_1.useEffect)(() => { if (messageQueue.length === 0) return; if (currentMessage === null) { // show the next message const nextMessage = messageQueue[0]; setMessageQueue((prev) => prev.slice(1)); setCurrentMessage(nextMessage); setOpen(true); } else { // start the transition to close the current message. // The currentMessage will be set to null when the message transition completes, which re-fires this effect and shows the next message in the queue setOpen(false); } }, [currentMessage, messageQueue]); return ((0, jsx_runtime_1.jsxs)(showSnackbarContext.Provider, { value: showSnackbar, children: [(0, jsx_runtime_1.jsx)(Snackbar_1.Snackbar, { open: open, content: currentMessage, autoHideDuration: 3500, onClose: () => setOpen(false), textAlign: "center", onExited: () => setCurrentMessage(null) }), children] })); } function useShowSnackbar() { const showSnackbar = (0, react_1.useContext)(showSnackbarContext); if (showSnackbar === null) { throw new Error("SnackbarProvider not found"); } return showSnackbar; }