state-machine.js 2.7 KB

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