github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/machines/evaluations.js (about)

     1  import { assign, createMachine, send } from 'xstate';
     2  
     3  // Docs on using statecharts:  https://xstate.js.org/docs/packages/xstate-fsm/#api
     4  export default createMachine(
     5    {
     6      id: 'evaluations_ui',
     7      context: { evaluation: null },
     8      type: 'parallel',
     9      states: {
    10        table: {
    11          initial: 'unknown',
    12          on: {
    13            NEXT: {
    14              actions: ['requestNextPage', send('MODAL_CLOSE')],
    15            },
    16            PREV: {
    17              actions: ['requestPrevPage', send('MODAL_CLOSE')],
    18            },
    19            CHANGE_PAGES_SIZE: {
    20              actions: ['changePageSize', send('MODAL_CLOSE')],
    21            },
    22            MODEL_UPDATED: '#unknown',
    23          },
    24          states: {
    25            unknown: {
    26              id: 'unknown',
    27              always: [{ target: 'data', cond: 'hasData' }, { target: 'empty' }],
    28            },
    29            data: {},
    30            empty: {},
    31          },
    32        },
    33        sidebar: {
    34          initial: 'unknown',
    35          states: {
    36            unknown: {
    37              always: [
    38                { target: 'open', cond: 'sidebarIsOpen' },
    39                { target: 'close' },
    40              ],
    41            },
    42            open: {
    43              initial: 'busy',
    44              exit: ['removeCurrentEvaluationQueryParameter'],
    45              states: {
    46                busy: {
    47                  invoke: {
    48                    src: 'loadEvaluation',
    49                    onDone: 'success',
    50                    onError: 'error',
    51                  },
    52                },
    53                success: {
    54                  entry: assign({
    55                    evaluation: (context, event) => {
    56                      return event.data;
    57                    },
    58                  }),
    59                  on: {
    60                    LOAD_EVALUATION: {
    61                      target: 'busy',
    62                      actions: ['updateEvaluationQueryParameter'],
    63                    },
    64                  },
    65                },
    66                error: {
    67                  entry: assign({ error: (_ctx, event) => event.data }),
    68                  on: {
    69                    RETRY: 'busy',
    70                  },
    71                },
    72              },
    73              on: {
    74                MODAL_CLOSE: 'close',
    75                CHANGE_EVAL: [{ target: 'close', cond: 'hasNoCurrentEval' }],
    76              },
    77            },
    78            close: {
    79              on: {
    80                LOAD_EVALUATION: {
    81                  target: 'open',
    82                  actions: ['updateEvaluationQueryParameter'],
    83                },
    84                CHANGE_EVAL: [
    85                  {
    86                    target: 'open',
    87                    cond: 'hasCurrentEval',
    88                  },
    89                ],
    90              },
    91            },
    92          },
    93        },
    94      },
    95    },
    96    {
    97      services: {
    98        // Overridden in the controller
    99        async loadEvaluations() {},
   100        async loadEvaluation() {},
   101      },
   102      guards: {
   103        sidebarIsOpen() {
   104          return false;
   105        },
   106        hasData() {
   107          return true;
   108        },
   109        hasNoCurrentEval(_ctx, { evaluation }) {
   110          return !evaluation;
   111        },
   112        hasCurrentEval(_ctx, { evaluation }) {
   113          return evaluation;
   114        },
   115        notBusy(_ctx, _event, meta) {
   116          return !meta.state.matches({ sidebar: { open: 'busy' } });
   117        },
   118      },
   119      actions: {
   120        updateEvaluationQueryParameter() {},
   121        removeCurrentEvaluationQueryParameter() {},
   122      },
   123    }
   124  );