@octopusdeploy/design-system-components
Version:
The design systems component library.
42 lines (41 loc) • 2.02 kB
JavaScript
;
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;
}