Last active
August 19, 2020 07:18
-
-
Save Xaraxia/de4fbfc0e4003efff3f768cb918b3905 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
const initialContext = { | |
isUQ: false, | |
institution: undefined, | |
orgunit: undefined, | |
isStaff: false, | |
isStudent: false, | |
exceptionreason: undefined, | |
purpose: undefined, | |
cluster: undefined, | |
clusterxp: undefined, | |
linuxxp: undefined, | |
email: undefined, | |
fullname: undefined, | |
uqusername: undefined, | |
statestack: [] | |
}; | |
const surveyMachine = Machine({ | |
id: 'clustersurvey', | |
initial: 'persontype', | |
context: initialContext, | |
states: { | |
// see https://xstate.js.org/docs/guides/history.html#history-state-configuration | |
'persontype': { | |
on: { | |
SELECT_UQSTAFF: { | |
actions: ['setUQ', 'setStaff'], | |
target: 'select_ou' | |
}, | |
SELECT_UQSTUDENT: { | |
actions: ['setUQ', 'setStudent'], | |
target: 'select_ou' | |
}, | |
SELECT_OTHSTAFF: { | |
actions: ['setNotUQ', 'setStaff'], | |
target: 'select_institution' | |
}, | |
SELECT_OTHSTUDENT: { | |
actions: ['setNotUQ', 'setStudent'], | |
target: 'select_institution' | |
}, | |
RESTART: 'reset' | |
}, | |
exit: [assign({ statestack: (context) => context.statestack.concat('persontype') })] | |
}, | |
'select_ou': { | |
on: { | |
NEXT: [ | |
{ | |
target: 'purpose', | |
cond: 'isStaff', | |
actions: [ | |
'setOU', | |
assign({ statestack: (context) => context.statestack.concat('select_ou') }) | |
] | |
}, | |
{ | |
target: 'exceptionreason', | |
cond: 'isStudent', | |
actions: [ | |
'setOU', | |
assign({ statestack: (context) => context.statestack.concat('select_ou') }) | |
] | |
} | |
], | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'select_institution': { | |
on: { | |
SELECT_INSTITUTION: [ | |
{ | |
target: 'purpose', | |
cond: 'isStaff', | |
actions: [ | |
'setInstitution', | |
assign({ statestack: (context) => context.statestack.concat('select_institution') }) | |
] | |
}, | |
{ | |
target: 'exceptionreason', | |
cond: 'isStudent', | |
actions: [ | |
'setInstitution', | |
assign({ statestack: (context) => context.statestack.concat('select_institution') }) | |
] | |
} | |
], | |
NOT_VALID_INSTITUTION: { | |
target: 'invalidinstitution', actions: ['setInstitution'] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'exceptionreason': { | |
on: { | |
NEXT: { | |
target: 'purpose', | |
actions: [assign({ statestack: (context) => context.statestack.concat('exceptionreason') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'purpose': { | |
on: { | |
NEXT: { | |
target: 'whichcluster', | |
actions: [assign({ statestack: (context) => context.statestack.concat('purpose') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'whichcluster': { | |
on: { | |
NEXT: { | |
target: 'linuxxp', | |
actions: [assign({ statestack: (context) => context.statestack.concat('whichcluster') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
}, | |
}, | |
'linuxxp': { | |
on: { | |
NEXT: { | |
target: 'clusterxp', | |
actions: [assign({ statestack: (context) => context.statestack.concat('linuxxp') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
}, | |
}, | |
'clusterxp': { | |
on: { | |
NEXT: { | |
target: 'accountdetails', | |
actions: [assign({ statestack: (context) => context.statestack.concat('clusterxp') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'accountdetails': { | |
on: { | |
NEXT: [ | |
{ | |
target: 'checkneedsaccount', | |
actions: [ | |
'setUQusername', | |
'setEmail', | |
'setFullName', | |
assign({ statestack: (context) => context.statestack.concat('accountdetails') }) | |
] | |
}, | |
], | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'checkneedsaccount': { | |
on: { | |
"": [ | |
{ | |
target: 'confirmrequest', | |
cond: 'hasAccount', | |
}, | |
{ | |
target: 'uqacctapplyinfo', | |
cond: 'needsAccount', | |
}, | |
], | |
} | |
}, | |
'uqacctapplyinfo': { | |
on: { | |
NEXT: { | |
target: 'confirmrequest', | |
actions: [assign({ statestack: (context) => context.statestack.concat('uqacctapplyinfo') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'confirmrequest': { | |
on: { | |
NEXT: { | |
target: 'submitted', | |
actions: [assign({ statestack: (context) => context.statestack.concat('confirmrequest') })] | |
}, | |
PREV: 'goback', | |
RESTART: 'reset' | |
} | |
}, | |
'submitted': { | |
type: 'final' | |
}, | |
'invalidinstitution': { | |
type: 'final' | |
}, | |
'goback': { | |
on: { | |
"": [ | |
{ target: 'persontype', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'persontype' }, | |
{ target: 'select_ou', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'select_ou' }, | |
{ target: 'select_institution', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'select_institution' }, | |
{ target: 'exceptionreason', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'exceptionreason' }, | |
{ target: 'purpose', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'purpose' }, | |
{ target: 'whichcluster', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'whichcluster' }, | |
{ target: 'linuxxp', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'linuxxp' }, | |
{ target: 'clusterxp', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'clusterxp' }, | |
{ target: 'accountdetails', cond: (ctx) => ctx.statestack[ctx.statestack.length - 1] == 'accountdetails' } | |
] | |
}, | |
exit: ['popHistory'], | |
}, | |
'reset': { | |
on: { | |
"": { | |
target: 'persontype', | |
actions: 'resetState' | |
} | |
} | |
} | |
} | |
}, { | |
actions: { | |
setUQ: assign({ isUQ: true }), | |
setNotUQ: assign({ isUQ: false }), | |
setStaff: assign({ isStaff: true, isStudent: false }), | |
setStudent: assign({ isStudent: true, isStaff: false }), | |
setInstitution: assign({ institution: (context, event) => { var _a; return ((_a = event.value) !== null && _a !== void 0 ? _a : '').trim() || context.institution; } }), | |
setOU: assign({ orgunit: (context, event) => { var _a; return ((_a = event.value) !== null && _a !== void 0 ? _a : '').trim() || context.orgunit; } }), | |
setUQusername: assign({ uqusername: (context, event) => { var _a; return ((_a = event.value) !== null && _a !== void 0 ? _a : { 'uqusername': '' }).uqusername.trim() || context.uqusername; } }), | |
setEmail: assign({ uqusername: (context, event) => { var _a; return ((_a = event.value) !== null && _a !== void 0 ? _a : { 'email': '' }).email.trim() || context.email; } }), | |
setFullName: assign({ uqusername: (context, event) => { var _a; return ((_a = event.value) !== null && _a !== void 0 ? _a : { 'fullname': '' }).fullname.trim() || context.fullname; } }), | |
popHistory: assign((context, event) => ({ statestack: context.statestack.slice(0, -1) })), | |
// pushHistory: assign<SurveyContext, SurveyEvent>({ statestack: (context: SurveyContext, event: SurveyEvent, meta) : Partial<SurveyContext> => context.statestack.concat(context.statestack, meta.state.value)}), | |
resetState: assign(Object.assign({}, initialContext)) | |
}, | |
guards: { | |
isExternal: (context) => !context.isUQ, | |
isInternal: (context) => context.isUQ, | |
isStudent: (context) => context.isStudent, | |
isStaff: (context) => context.isStaff, | |
hasAccount: (context) => typeof (context.uqusername) !== 'undefined' && context.uqusername != '', | |
needsAccount: (context) => typeof (context.uqusername) === 'undefined' || context.uqusername == '', | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment