Last active
October 25, 2019 00:00
-
-
Save larrybotha/30aca3c983c8132a34402287bd2447dd to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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