javascriptnode.jsfsmstatechartxstate

Using xstate, is it possible to configure an event that is applicable under all states and is handled in the same way across all states and substates?


I am new to xstate, and I'm trying to use it in an application where a user can request different things in an application, based on parent state and/or sub-state. However, there are some requests that the user should be able to make, no matter what state/sub-state the app is in. The response to those events is the same, no matter what the previous state was. How can I configure this event, so that I don't have to repeat define it under all states/sub-states?


Solution

  • Yes - the algorithm for choosing transitions is similar to DOM event propagation, in that it searches from leaf nodes to root node.

    You can define transitions on the root node (top-level) which will be handled in any state naturally:

    import { createMachine } from 'xstate';
    
    const machine = createMachine({
      // ...
    
      // top-level transitions
      on: {
        ESC: {/* ... */}
      },
      states: {
        // ...
        someState: {
          on: {
            ESC: {/* override top-level transition */}
          }
        }
      }
    });