Skip to content

Instantly share code, notes, and snippets.

@austinsamsel
Last active April 8, 2021 00:30
Show Gist options
  • Save austinsamsel/ff7a6314f1aa36bdb5c63416d4d983b4 to your computer and use it in GitHub Desktop.
Save austinsamsel/ff7a6314f1aa36bdb5c63416d4d983b4 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
TRANSFER_STATES = {
IDLE: 'idle',
ERROR: 'error',
VALIDATING_USERNAME: 'validating_username',
VALIDATING_FLOW_ADDRESS: 'validating_flow_address',
CREATING_TRANSFER: 'creating_transfer',
POLLING_FOR_INVOCATION: 'polling_for_invocation',
SUCCESS: 'success',
BLOCKED: 'blocked',
}
IGNORE_ERRORS_DURATION = 30000
Machine(
{
id: 'momentTransfer',
initial: 'idle',
states: {
[TRANSFER_STATES.IDLE]: {
on: {
VALIDATE: '#momentTransfer.validating',
},
},
[TRANSFER_STATES.ERROR]: {
on: {
RESET_FORM: '#momentTransfer.idle',
},
exit: 'clearErrorMessage',
},
[TRANSFER_STATES.BLOCKED]: {
on: {
RESET_FORM: '#momentTransfer.idle',
},
entry: 'setErrorMessage',
exit: 'clearErrorMessage',
},
validating: {
initial: 'validating_username',
states: {
[TRANSFER_STATES.VALIDATING_USERNAME]: {
invoke: {
id: 'validatingUsername',
src: 'getUserByNickname',
onDone: 'validating_flow_address',
onError: {
target: '#momentTransfer.error',
actions: 'setErrorMessage',
},
},
},
[TRANSFER_STATES.VALIDATING_FLOW_ADDRESS]: {
invoke: {
id: 'validatingFlowAddress',
src: 'validateFlowAddress',
onDone: '#momentTransfer.transfer',
onError: {
target: '#momentTransfer.error',
actions: 'setErrorMessage',
},
},
},
},
},
transfer: {
initial: 'creating_transfer',
states: {
[TRANSFER_STATES.CREATING_TRANSFER]: {
invoke: {
id: 'createTransferRequest',
src: 'createTransferRequest',
onDone: [
{
target: '#momentTransfer.blocked',
cond: 'isTransferBlocked',
},
{
target: 'polling_for_invocation',
},
],
onError: {
target: '#momentTransfer.error',
actions: 'setErrorMessage',
},
},
},
[TRANSFER_STATES.POLLING_FOR_INVOCATION]: {
after: {
[IGNORE_ERRORS_DURATION]: {
actions: send('STOP', { to: 'pollForInvocation' }),
},
},
invoke: {
id: 'pollForInvocation',
src: 'pollForInvocationSuccess',
onError: {
target: '#momentTransfer.error',
actions: 'setErrorMessage',
},
},
on: {
INVOCATION_POLL_ERROR: {
target: '#momentTransfer.error',
actions: 'setErrorMessage',
},
INVOCATION_POLL_SUCCESS: '#momentTransfer.success',
},
},
},
},
[TRANSFER_STATES.SUCCESS]: {
type: 'final',
entry: 'finish',
},
},
},
{
guards: {
isTransferBlocked: (context, event) => {
if (!context?.flags?.feature_transferFraudErrors) return false;
// @NOTE: if we don't receive an ID we can assume we're receiving a
// fraud type in the response from the API
return !event?.data?.ID;
},
},
},
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment