const createPreview = (campaignId) => { return {}; }; const deletePreview = (campaignId) => { return {}; }; const previewMachine = Machine( { initial: 'idle', context: { preview: null, previewed_at: null, campaign_id: null, }, states: { idle: { // check if has preview already, if has skip to created state always: [ { cond: 'hasPreviewAlready', target: 'created' }, ], on: { CREATE: { target: 'creating', }, CLOSE_MODAL: { target: 'idle', } } }, creating: { invoke: { src: (context) => createPreview(context.campaign_id), onDone: { target: 'created', actions: assign({ preview: (context, event) => event.data.data.preview, previewed_at: (context, event) => event.data.data.previewed_at }), } }, }, created: { on: { UPDATE: { target: 'updating' }, DONE: { target: 'idle' }, DELETE: { target: 'deleting' } } }, updating: { invoke: { src: (context) => createPreview(context.campaign_id), onDone: { target: 'updated', actions: assign({ previewed_at: (context, event) => event.data.data.previewed_at }), }, } }, updated: { on: { CLOSE_MODAL: { target: 'close_and_reset', } } }, close_and_reset: { // delay state change until after modal closes after: { 600: 'created' } }, deleting: { invoke: { src: (context) => deletePreview(context.campaign_id), onDone: { target: 'idle', actions: assign({ previewed_at: null }) } }, } }, }, { guards: { hasPreviewAlready: (context) => { return context.previewed_at; } } } )