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 );