Skip to content

Instantly share code, notes, and snippets.

@larrybotha
Last active October 25, 2019 00:00
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 larrybotha/30aca3c983c8132a34402287bd2447dd to your computer and use it in GitHub Desktop.
Save larrybotha/30aca3c983c8132a34402287bd2447dd to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
// LunaMed organization authorisation
const fetchTargets = [{target: 'select', cond: 'hasOrgs'}, {target: 'fetching'}];
const xeroTokenExchangeTargets = [
{target: '#org.xeroSelect.exchangingToken', cond: 'hasOrgs'},
{target: 'fetchingOrgsForXeroTokenExchange'},
];
const authOrgMachine = Machine({
id: 'org',
initial: 'idle',
entry: 'storeXeroSelectedAuthOrgIdFromSession',
context: {
error: undefined,
selection: {selectionType: 'none'},
userOrgs: [],
xero: {},
},
states: {
idle: {
on: {
FETCH_ORGS: [...fetchTargets],
REQUEST_XERO_AUTH_URL: 'xeroSelect.authUrl',
REQUEST_XERO_TOKEN_EXCHANGE: 'xeroSelect.exchangingToken',
USE_SIMPLE_CREATE: 'create',
USE_SIMPLE_SELECT: 'select',
USE_XERO_SELECT: 'xeroSelect',
},
},
fetching: {
invoke: {
src: 'fetchOrgs',
onDone: [
{
cond: 'noOrgsReturned',
target: 'create',
},
{
actions: 'storeOrgs',
target: 'select',
},
],
onError: {
actions: 'handleError',
target: 'error',
},
},
},
select: {
on: {
FETCH_ORGS: [...fetchTargets],
SELECT_ORG: {
actions: 'storeSelectedOrg',
target: 'selected',
},
USE_SIMPLE_CREATE: 'create',
USE_XERO_SELECT: 'xeroSelect',
},
},
create: {
initial: 'idle',
states: {
idle: {
on: {
SUBMIT_NEW_ORG_DATA: 'pending',
},
},
pending: {
invoke: {
src: 'createOrg',
onDone: {
actions: 'storeCreatedOrg',
target: '#org.select',
},
onError: {
actions: 'handleError',
target: 'error',
},
},
},
error: {
on: {
SUBMIT_NEW_ORG_DATA: 'pending',
},
},
},
on: {
USE_SIMPLE_SELECT: 'select',
USE_XERO_SELECT: 'xeroSelect',
},
},
xeroSelect: {
initial: 'idle',
states: {
idle: {
on: {
FETCH_ORGS: [{target: 'select', cond: 'hasOrgs'}, {target: 'fetchingOrgs'}],
REQUEST_XERO_AUTH_URL: 'authUrl.requesting',
REQUEST_XERO_TOKEN_EXCHANGE: 'exchangingToken',
USE_XERO_CREATE: 'create',
},
},
fetchingOrgs: {
invoke: {
src: 'fetchOrgs',
onDone: [
{
cond: 'noOrgsReturned',
target: 'create',
},
{
actions: 'storeOrgs',
target: 'select',
},
],
onError: {
actions: 'handleError',
target: 'error',
},
},
},
authUrl: {
initial: 'unknown',
states: {
unknown: {
on: {
'': [
{
cond: 'notHasXeroAuthUrl',
target: 'requesting',
},
{
cond: 'hasXeroAuthUrl',
target: 'visiting',
},
{target: 'error'},
],
},
},
requesting: {
invoke: {
id: 'requestXeroAuthUrlService',
src: 'requestXeroAuthUrl',
onDone: {
actions: 'persistXeroAuthUrlToSession',
target: 'visiting',
},
onError: {
actions: 'handleError',
target: 'error',
},
},
},
visiting: {
entry: 'navigateToXeroAuthUrl',
type: 'final',
},
error: {
on: {
REQUEST_XERO_AUTH_URL: 'requesting',
},
},
},
on: {
REQUEST_XERO_AUTH_URL: 'authUrl.requesting',
USE_XERO_SELECT: 'select',
},
},
exchangingToken: {
invoke: {
id: 'exchangeXeroTokenService',
src: 'exchangeXeroToken',
onDone: {
actions: 'storeXeroSelectedOrg',
target: '#org.selected',
},
onError: {
actions: 'handleError',
target: 'error',
},
},
},
create: {
initial: 'idle',
states: {
idle: {
on: {
SUBMIT_NEW_ORG_DATA: 'pending',
},
},
pending: {
invoke: {
src: 'createOrg',
onDone: {
actions: [
'storeCreatedOrg',
'storeXeroCreatedOrgAuthId',
'persistXeroSelectedAuthOrgIdToSession',
],
target: '#org.xeroSelect.authUrl.requesting',
},
onError: {
actions: 'handleError',
target: 'error',
},
},
},
error: {
on: {
SUBMIT_NEW_ORG_DATA: 'pending',
},
},
},
on: {
USE_SIMPLE_SELECT: '#org.select',
USE_XERO_SELECT: 'select',
},
},
select: {
on: {
REQUEST_XERO_AUTH_URL: 'authUrl.requesting',
SELECT_ORG: {
actions: ['storeXeroSelectedAuthOrgId', 'persistXeroSelectedAuthOrgIdToSession'],
target: 'authUrl.requesting',
},
USE_XERO_CREATE: 'create',
},
},
error: {
on: {
REQUEST_XERO_AUTH_URL: 'authUrl.requesting',
USE_XERO_SELECT: 'fetchingOrgs',
},
},
},
on: {
USE_SIMPLE_SELECT: 'select',
USE_SIMPLE_CREATE: 'create',
},
},
error: {
on: {
FETCH_ORGS: [...fetchTargets],
USE_SIMPLE_CREATE: 'create',
USE_SIMPLE_SELECT: 'select',
USE_XERO_SELECT: 'xeroSelect',
},
},
selected: {
entry: 'sendSelectionToParent',
on: {
USE_SIMPLE_CREATE: 'create',
USE_SIMPLE_SELECT: 'select',
USE_XERO_SELECT: 'xeroSelect',
},
},
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment