Last active
November 7, 2019 20:19
-
-
Save adamscott/9cc3dba6ebd9bd7750a8ed893e7ee214 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
// Available variables: | |
// - Machine | |
// - interpret | |
// - assign | |
// - send | |
// - sendParent | |
// - spawn | |
// - raise | |
// - actions | |
// - XState (all XState exports) | |
const CurrentStep = Object.freeze({ | |
START: 1, | |
INDUSTRY: 2, | |
OBJECTIVE: 3, | |
CONFIRM: 4, | |
FINALIZING: 4, | |
PREVIEW: 5 | |
}); | |
const TOTAL_STEPS = 4; | |
let machine = Machine({ | |
id: "CampaignAssistant", | |
context: { | |
component: null, | |
isTemporary: true, | |
hasIndustry: false, | |
hasInfo: false, | |
locale: "en", | |
_hasBeenSniffed: false, | |
_hasBeenFinalized: false, | |
_templatesLocale: null | |
}, | |
type: "parallel", | |
states: { | |
flow: { | |
id: "flow", | |
initial: "uninitialized", | |
states: { | |
uninitialized: { | |
on: { | |
"": [ | |
{ | |
target: "start", | |
cond: "isTemporary" | |
}, | |
{ | |
target: "industry", | |
cond: "hasNoIndustry", | |
actions: [raise("CHECK_WEBSITE")] | |
}, | |
{ | |
target: "objective", | |
cond: "hasNoInfo", | |
actions: [raise("CHECK_WEBSITE")] | |
}, | |
{ | |
target: "objective" | |
} | |
] | |
} | |
}, | |
start: { | |
on: { | |
START: "industry" | |
}, | |
meta: { | |
route: "start", | |
signup: { | |
step: CurrentStep.START, | |
steps: TOTAL_STEPS | |
} | |
} | |
}, | |
industry: { | |
on: { | |
BACK: [{ | |
target: "start", | |
cond: "isTemporary" | |
}], | |
NEXT: "objective", | |
INFO_CHANGED: [{ | |
actions: [assign({ | |
_hasBeenFinalized: false | |
})] | |
}] | |
}, | |
meta: { | |
route: "industry", | |
signup: { | |
step: CurrentStep.INDUSTRY, | |
steps: TOTAL_STEPS | |
} | |
} | |
}, | |
objective: { | |
on: { | |
BACK: [ | |
{ | |
target: "industry", | |
cond: "isTemporary" | |
}, | |
{ | |
target: "industry", | |
cond: "hasNoIndustry" | |
} | |
], | |
NEXT: [ | |
{ | |
target: "confirm", | |
cond: "hasNoInfo" | |
}, | |
{ | |
target: "finalizing", | |
cond: "needFinalizing" | |
}, | |
{ | |
target: "preview" | |
} | |
], | |
BROWSE_ALL_TEMPLATES: [{ | |
target: "template manager", | |
cond: "isNotTemporary" | |
}], | |
OBJECTIVE_CHANGED: [{ | |
actions: [assign({ | |
_hasBeenFinalized: false | |
})] | |
}] | |
}, | |
meta: { | |
route: "objective", | |
signup: { | |
step: CurrentStep.OBJECTIVE, | |
steps: TOTAL_STEPS | |
} | |
} | |
}, | |
confirm: { | |
initial: "uninitialized", | |
states: { | |
uninitialized: { | |
on: { | |
"": [ | |
{ | |
target: "loading", | |
cond: "hasNotBeenSniffed" | |
}, | |
{ | |
target: "display" | |
} | |
] | |
} | |
}, | |
loading: { | |
on: { | |
WEBSITE_LOADED: "display", | |
WEBSITE_ERROR: "display" | |
} | |
}, | |
display: { | |
on: { | |
NEXT: [ | |
{ | |
target: "#flow.finalizing", | |
cond: "needFinalizing" | |
}, | |
{ | |
target: "#flow.preview" | |
} | |
] | |
} | |
} | |
}, | |
on: { | |
BACK: "objective", | |
INFO_CHANGED: [{ | |
actions: [assign({ | |
_hasBeenFinalized: false | |
})] | |
}], | |
BROWSE_ALL_TEMPLATES: [{ | |
target: "template manager", | |
cond: "isNotTemporary" | |
}] | |
}, | |
meta: { | |
route: "confirm", | |
signup: { | |
step: CurrentStep.CONFIRM, | |
steps: TOTAL_STEPS | |
} | |
} | |
}, | |
finalizing: { | |
on: { | |
DONE: [{ | |
target: "preview", | |
actions: [assign({ | |
_hasBeenFinalized: true | |
})] | |
}], | |
ERROR: [ | |
{ | |
target: "ready", | |
cond: "isTemporary" | |
}, | |
{ | |
target: "create" | |
} | |
] | |
}, | |
entry: [assign({ | |
_templatesLocale: (context) => context.locale | |
})], | |
meta: { | |
route: "finalizing", | |
signup: { | |
step: CurrentStep.FINALIZING, | |
steps: TOTAL_STEPS | |
} | |
} | |
}, | |
preview: { | |
on: { | |
BACK: [ | |
{ | |
target: "confirm", | |
cond: "hasNoInfo" | |
}, | |
{ | |
target: "objective" | |
} | |
], | |
NEXT: [ | |
{ | |
target: "ready", | |
cond: "isTemporary" | |
}, | |
{ | |
target: "create" | |
} | |
], | |
BROWSE_ALL_TEMPLATES: [{ | |
target: "template manager", | |
cond: "isNotTemporary" | |
}] | |
}, | |
meta: { | |
route: "preview", | |
signup: { | |
step: CurrentStep.PREVIEW, | |
steps: TOTAL_STEPS | |
} | |
} | |
}, | |
ready: { | |
on: { | |
BACK: [ | |
{ | |
target: "confirm", | |
cond: "hasNotBeenFinalized" | |
}, | |
{ | |
target: "preview" | |
} | |
], | |
CREATE: [{ | |
target: "campaign" | |
}] | |
}, | |
meta: { | |
route: "ready" | |
} | |
}, | |
create: { | |
on: { | |
BACK: [ | |
{ | |
target: "objective", | |
cond: "hasNotBeenFinalizedAndHasInfo" | |
}, | |
{ | |
target: "confirm", | |
cond: "hasNotBeenFinalized" | |
}, | |
{ | |
target: "preview" | |
} | |
], | |
CREATE: [{ | |
target: "campaign" | |
}] | |
}, | |
meta: { | |
route: "create" | |
} | |
}, | |
campaign: { | |
type: "final", | |
entry: ["finalizeFlow"] | |
}, | |
"template manager": { | |
type: "final", | |
entry: ["redirectToTemplateManager"] | |
} | |
}, | |
on: { | |
SWITCH_LOCALE: [{ | |
target: undefined, | |
actions: ["switchLocale"] | |
}] | |
} | |
}, | |
sniffer: { | |
initial: "idle", | |
states: { | |
idle: { | |
on: { | |
WEBSITE_CHANGED: "loading", | |
CHECK_WEBSITE: [{ | |
target: "loading", | |
cond: "hasNotBeenSniffed" | |
}] | |
} | |
}, | |
loading: { | |
on: { | |
WEBSITE_LOADED: [{ | |
target: "idle", | |
actions: [assign({ | |
_hasBeenSniffed: true | |
})] | |
}], | |
WEBSITE_ERROR: [{ | |
target: "idle", | |
actions: [assign({ | |
_hasBeenSniffed: true | |
})] | |
}], | |
WEBSITE_CHANGED: "loading" | |
}, | |
entry: [ | |
"sniffWebsite", | |
assign({ | |
_hasBeenSniffed: false | |
}) | |
] | |
} | |
} | |
} | |
} | |
}, { | |
actions: { | |
finalizeFlow: (context) => { | |
if (context.component) { | |
context.component.finalizeFlow(); | |
} | |
}, | |
redirectToTemplateManager: (context) => { | |
if (context.component) { | |
context.component.redirectToTemplateManager(); | |
} | |
}, | |
sniffWebsite: (context) => { | |
if (context.component) { | |
context.component.sniffWebsite(); | |
} | |
}, | |
switchLocale: assign({ | |
locale: (context, event) => { | |
if (event.locale) { | |
return event.locale; | |
} | |
if (context.locale === "fr") { | |
return "en"; | |
} | |
return "fr"; | |
} | |
}) | |
}, | |
guards: { | |
isTemporary: (context) => context.isTemporary, | |
isNotTemporary: (context) => !context.isTemporary, | |
hasIndustry: (context) => context.hasIndustry, | |
hasNoIndustry: (context) => !context.hasIndustry, | |
hasInfo: (context) => context.hasInfo, | |
hasNoInfo: (context) => !context.hasInfo, | |
hasBeenSniffed: (context) => context._hasBeenSniffed, | |
hasNotBeenSniffed: (context) => !context._hasBeenSniffed, | |
hasBeenFinalized: (context) => context._hasBeenFinalized, | |
hasNotBeenFinalized: (context) => !context._hasBeenFinalized, | |
needFinalizing: (context) => !context._hasBeenFinalized || context.locale !== context._templatesLocale, | |
hasNotBeenFinalizedAndHasInfo: (context) => !context._hasBeenFinalized && context.hasInfo | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment