state-machine.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import createMachine from "./fsm.js";
  2. /**
  3. * @typedef {Object} ShowOverlayData
  4. * @property {'warning' | 'error'} level
  5. * @property {Array<string | { moduleIdentifier?: string, moduleName?: string, loc?: string, message?: string }>} messages
  6. */
  7. /**
  8. * @typedef {Object} CreateOverlayMachineOptions
  9. * @property {(data: ShowOverlayData) => void} showOverlay
  10. * @property {() => void} hideOverlay
  11. */
  12. /**
  13. * @param {CreateOverlayMachineOptions} options
  14. */
  15. var createOverlayMachine = function createOverlayMachine(options) {
  16. var hideOverlay = options.hideOverlay,
  17. showOverlay = options.showOverlay;
  18. var overlayMachine = createMachine({
  19. initial: "hidden",
  20. context: {
  21. level: "error",
  22. messages: []
  23. },
  24. states: {
  25. hidden: {
  26. on: {
  27. BUILD_ERROR: {
  28. target: "displayBuildError",
  29. actions: ["setMessages", "showOverlay"]
  30. },
  31. RUNTIME_ERROR: {
  32. target: "displayRuntimeError",
  33. actions: ["setMessages", "showOverlay"]
  34. }
  35. }
  36. },
  37. displayBuildError: {
  38. on: {
  39. DISMISS: {
  40. target: "hidden",
  41. actions: ["dismissMessages", "hideOverlay"]
  42. },
  43. BUILD_ERROR: {
  44. target: "displayBuildError",
  45. actions: ["appendMessages", "showOverlay"]
  46. }
  47. }
  48. },
  49. displayRuntimeError: {
  50. on: {
  51. DISMISS: {
  52. target: "hidden",
  53. actions: ["dismissMessages", "hideOverlay"]
  54. },
  55. RUNTIME_ERROR: {
  56. target: "displayRuntimeError",
  57. actions: ["appendMessages", "showOverlay"]
  58. },
  59. BUILD_ERROR: {
  60. target: "displayBuildError",
  61. actions: ["setMessages", "showOverlay"]
  62. }
  63. }
  64. }
  65. }
  66. }, {
  67. actions: {
  68. dismissMessages: function dismissMessages() {
  69. return {
  70. messages: [],
  71. level: "error"
  72. };
  73. },
  74. appendMessages: function appendMessages(context, event) {
  75. return {
  76. messages: context.messages.concat(event.messages),
  77. level: event.level || context.level
  78. };
  79. },
  80. setMessages: function setMessages(context, event) {
  81. return {
  82. messages: event.messages,
  83. level: event.level || context.level
  84. };
  85. },
  86. hideOverlay: hideOverlay,
  87. showOverlay: showOverlay
  88. }
  89. });
  90. return overlayMachine;
  91. };
  92. export default createOverlayMachine;