Skip to content

Instantly share code, notes, and snippets.

@chenxeed
Last active September 7, 2021 03:48
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 chenxeed/78a8fe472bf480e21c76a7a9e21a1090 to your computer and use it in GitHub Desktop.
Save chenxeed/78a8fe472bf480e21c76a7a9e21a1090 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 Permission = {
PRIVATE: 'private',
PROTECTED: 'protected',
PUBLIC: 'public'
}
const fetchMachine = Machine({
id: 'popoverShare',
context: {
currentPermission: '',
nextPermission: ''
},
initial: Permission.PRIVATE,
states: {
[Permission.PRIVATE]: {
entry: 'clearContext',
on: {
TO_PUBLIC: {
target: 'publishing', actions: 'setNextPermissionToPublic'
},
TO_PROTECTED: {
target: 'fill-password', actions: 'setNextPermissionToProtected'
}
},
exit: 'setCurrentPermissionToPrivate'
},
publishing: {
invoke: {
src: 'publishDocument',
onDone: {
target: Permission.PUBLIC
},
onError: [
{ target: Permission.PROTECTED, cond: 'isCurrentPermissionProtected' },
{ target: Permission.PRIVATE }
]
}
},
[Permission.PUBLIC]: {
entry: 'clearContext',
on: {
TO_PRIVATE: { target: 'unpublishing', actions: 'setNextPermissionToPrivate' },
TO_PROTECTED: { target: 'unpublishing', actions: 'setNextPermissionToProtected' }
},
exit: 'setCurrentPermissionToPublic'
},
unpublishing: {
invoke: {
src: 'unpublishDocument',
onDone: [
{ target: 'fill-password', cond: 'isNextPermissionProtected' },
{ target: Permission.PRIVATE }
],
onError: [
{ target: Permission.PROTECTED, cond: 'isCurrentPermissionProtected' },
{ target: Permission.PUBLIC }
]
}
},
'fill-password': {
entry: 'clearPassword',
on: {
SUBMIT_PASSWORD: { target: 'protecting' },
TO_PRIVATE: { target: Permission.PRIVATE },
TO_PUBLIC: {
target: 'publishing', actions: 'setNextPermissionToPublic'
}
}
},
protecting: {
invoke: {
src: 'protectDocument',
onDone: { target: Permission.PROTECTED },
onError: [
{ target: Permission.PROTECTED, cond: 'isCurrentPermissionProtected' },
{ target: Permission.PRIVATE }
]
}
},
[Permission.PROTECTED]: {
entry: 'clearContext',
on: {
TO_PRIVATE: {
target: 'unpublishing', actions: 'setNextPermissionToPrivate'
},
TO_PUBLIC: {
target: 'publishing', actions: 'setNextPermissionToPublic'
},
SUBMIT_PASSWORD: {
target: 'protecting', actions: 'setNextPermissionToProtected'
},
FOCUS_PASSWORD: {
target: 'fill-password', actions: 'setNextPermissionToProtected'
}
},
exit: 'setCurrentPermissionToProtected'
}
}
}, {
actions: {
setCurrentPermissionToPrivate: assign((context) => ({ ...context, currentPermission: 'private' })),
setCurrentPermissionToPublic: assign((context) => ({ ...context, currentPermission: 'public' })),
setCurrentPermissionToProtected: assign((context) => ({ ...context, currentPermission: 'protected' })),
setNextPermissionToPrivate: assign((context) => ({ ...context, nextPermission: 'private' })),
setNextPermissionToPublic: assign((context) => ({ ...context, nextPermission: 'public' })),
setNextPermissionToProtected: assign((context) => ({ ...context, nextPermission: 'protected' })),
clearPassword: () => {}
},
guards: {
isCurrentPermissionProtected (context) {
return context.currentPermission === 'protected'
},
isNextPermissionProtected (context) {
return context.nextPermission === 'protected'
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment