Skip to content

Instantly share code, notes, and snippets.

@chenxeed
Last active September 9, 2021 09:40
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/04567830086ae16a872ca604a5dbcda9 to your computer and use it in GitHub Desktop.
Save chenxeed/04567830086ae16a872ca604a5dbcda9 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 id = 'popoverShare'
const ShareTransition = {
IDLE: 'idle',
PUBLICIZE: 'publicize',
PRIVATIZE: 'privatize',
PROTECTING: 'protecting',
FILL_PASSWORD: 'fill-password',
PRIVATE_TO_FILL_PASSWORD: 'private-to-fill-password'
}
const Permission = {
PRIVATE: 'private',
PROTECTED: 'protected',
PUBLIC: 'public'
}
const transition = {
[ShareTransition.PUBLICIZE]: {
invoke: {
src: 'service.publishDocument',
onDone: { target: `#${id}.${Permission.PUBLIC}` },
onError: { target: ShareTransition.IDLE }
}
},
[ShareTransition.PROTECTING]: {
invoke: {
src: 'service.protectDocument',
onDone: { target: `#${id}.${Permission.PROTECTED}` },
onError: { target: ShareTransition.FILL_PASSWORD }
}
},
[ShareTransition.PRIVATIZE]: {
invoke: {
src: 'service.unpublishDocument',
onDone: { target: `#${id}.${Permission.PRIVATE}` },
onError: { target: ShareTransition.IDLE }
}
}
}
const machineConfig = {
id,
context: {},
initial: Permission.PRIVATE,
states: {
[Permission.PRIVATE]: {
initial: ShareTransition.IDLE,
states: {
[ShareTransition.IDLE]: {
on: {
TO_PUBLIC: { target: ShareTransition.PUBLICIZE },
TO_PROTECTED: { target: ShareTransition.FILL_PASSWORD }
}
},
[ShareTransition.FILL_PASSWORD]: {
entry: 'resetPassword',
on: {
CANCEL: { target: ShareTransition.IDLE },
SUBMIT: { target: ShareTransition.PROTECTING },
TO_PUBLIC: { target: ShareTransition.PUBLICIZE }
}
},
[ShareTransition.PUBLICIZE]: transition[ShareTransition.PUBLICIZE],
[ShareTransition.PROTECTING]: transition[ShareTransition.PROTECTING]
}
},
[Permission.PUBLIC]: {
initial: ShareTransition.IDLE,
states: {
[ShareTransition.IDLE]: {
on: {
TO_PRIVATE: { target: ShareTransition.PRIVATIZE },
TO_PROTECTED: { target: 'private-to-fill-password' }
}
},
[ShareTransition.PRIVATE_TO_FILL_PASSWORD]: {
entry: 'resetPassword',
invoke: {
...transition[ShareTransition.PRIVATIZE].invoke,
onDone: { target: `#${id}.${Permission.PRIVATE}.${ShareTransition.FILL_PASSWORD}` }
}
},
[ShareTransition.PRIVATIZE]: transition[ShareTransition.PRIVATIZE]
}
},
[Permission.PROTECTED]: {
initial: ShareTransition.IDLE,
states: {
[ShareTransition.IDLE]: {
on: {
TO_PUBLIC: { target: ShareTransition.PUBLICIZE },
TO_PRIVATE: { target: ShareTransition.PRIVATIZE },
SUBMIT: { target: ShareTransition.PROTECTING }
}
},
[ShareTransition.PRIVATIZE]: transition[ShareTransition.PRIVATIZE],
[ShareTransition.PUBLICIZE]: transition[ShareTransition.PUBLICIZE],
[ShareTransition.PROTECTING]: {
invoke: {
...transition[ShareTransition.PROTECTING].invoke,
onError: { target: ShareTransition.IDLE }
}
}
}
}
}
}
const fetchMachine = Machine(machineConfig, {
actions: {
resetPassword () { return true }
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment