Search code examples
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 */}
          }
        }
      }
    });