Skip to content

Instantly share code, notes, and snippets.

@knownasilya
Last active August 22, 2020 03:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knownasilya/bd4bffec2d06b962afa7778336be99d6 to your computer and use it in GitHub Desktop.
Save knownasilya/bd4bffec2d06b962afa7778336be99d6 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
// Available variables:
// - Machine
// - interpret
// - assign
// - send
// - sendParent
// - spawn
// - raise
// - actions
// - XState (all XState exports)
const fetchMachine = Machine({
id: 'entity',
initial: 'idle',
states: {
idle: {
on: {
// null event, calls on enter
'': [{
target: 'emptyDraft',
cond: 'isEmptyDraft'
}, {
target: 'draft',
cond: 'isDraft'
}, {
target: 'published',
cond: 'isPublished'
}]
}
},
emptyDraft: {
initial: 'idle',
states: {
idle: {
on: {
AUTO_SAVE: {
target: 'create',
actions: 'setStatusDraft'
}
}
},
create: {
invoke: {
id: 'create',
src: 'create',
onDone: {
target: '#entity.draft',
actions: assign({
createPrResult: (_context, event) => event.data
})
},
onError: {
target: 'createFailed',
actions: assign({
createPrError: (_context, event) => event.data
})
}
}
},
createFailed: {
on: {
RETRY: 'create',
CANCEL: 'idle'
}
}
}
},
draft: {
initial: 'idle',
states: {
idle: {
on: {
AUTO_SAVE: 'save',
PUBLISH: 'publish',
DELETE: '#entity.draftDeleted'
}
},
save: {
invoke: {
id: 'save',
src: 'save',
onDone: {
target: 'idle',
actions: assign({
saveResult: (_context, event) => event.data
})
},
onError: {
target: 'saveFailed',
actions: assign({
saveError: (_context, event) => event.data
})
}
}
},
saveFailed: {
on: {
RETRY: 'save',
CANCEL: 'idle'
}
},
publish: {
invoke: {
id: 'publish',
src: 'publish',
onDone: {
target: '#entity.published',
actions: assign({
publishResult: (_context, event) => event.data
})
},
onError: {
target: 'publishFailed',
actions: assign({
publishError: (_context, event) => event.data
})
}
}
},
publishFailed: {
on: {
RETRY: 'publish',
CANCEL: 'idle'
}
}
}
},
published: {
on: {
EDIT: {
target: 'draft',
actions: 'createPRFromExistingContent'
},
DELETE: 'publishedDeleted'
},
},
draftDeleted: {
entry: ['deletePr', 'deleteRecord'],
type: 'final'
},
publishedDeleted: {
entry: ['deleteContent', 'deleteRecord'],
type: 'final'
}
}
}, {
services: {
createPr: (context, event) => context.model.createPR(event.payload)
},
guards: {
isEmptyDraft: (context) => true,
isDraft: (context) => false,
isPublished: (context) => false
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment