import createMachine from "./fsm.js"; /** * @typedef {Object} ShowOverlayData * @property {'warning' | 'error'} level * @property {Array} messages * @property {'build' | 'runtime'} messageSource */ /** * @typedef {Object} CreateOverlayMachineOptions * @property {(data: ShowOverlayData) => void} showOverlay * @property {() => void} hideOverlay */ /** * @param {CreateOverlayMachineOptions} options */ var createOverlayMachine = function createOverlayMachine(options) { var hideOverlay = options.hideOverlay, showOverlay = options.showOverlay; var overlayMachine = createMachine({ initial: "hidden", context: { level: "error", messages: [], messageSource: "build" }, states: { hidden: { on: { BUILD_ERROR: { target: "displayBuildError", actions: ["setMessages", "showOverlay"] }, RUNTIME_ERROR: { target: "displayRuntimeError", actions: ["setMessages", "showOverlay"] } } }, displayBuildError: { on: { DISMISS: { target: "hidden", actions: ["dismissMessages", "hideOverlay"] }, BUILD_ERROR: { target: "displayBuildError", actions: ["appendMessages", "showOverlay"] } } }, displayRuntimeError: { on: { DISMISS: { target: "hidden", actions: ["dismissMessages", "hideOverlay"] }, RUNTIME_ERROR: { target: "displayRuntimeError", actions: ["appendMessages", "showOverlay"] }, BUILD_ERROR: { target: "displayBuildError", actions: ["setMessages", "showOverlay"] } } } } }, { actions: { dismissMessages: function dismissMessages() { return { messages: [], level: "error", messageSource: "build" }; }, appendMessages: function appendMessages(context, event) { return { messages: context.messages.concat(event.messages), level: event.level || context.level, messageSource: event.type === "RUNTIME_ERROR" ? "runtime" : "build" }; }, setMessages: function setMessages(context, event) { return { messages: event.messages, level: event.level || context.level, messageSource: event.type === "RUNTIME_ERROR" ? "runtime" : "build" }; }, hideOverlay: hideOverlay, showOverlay: showOverlay } }); return overlayMachine; }; export default createOverlayMachine;