100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import createMachine from "./fsm.js";
 | |
| 
 | |
| /**
 | |
|  * @typedef {Object} ShowOverlayData
 | |
|  * @property {'warning' | 'error'} level
 | |
|  * @property {Array<string  | { moduleIdentifier?: string, moduleName?: string, loc?: string, message?: string }>} 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; |