Skip to content

Instantly share code, notes, and snippets.

@thomashibbard
Last active January 11, 2022 21:51
Show Gist options
  • Save thomashibbard/e24d98df73c4cc9d647193558065c3b4 to your computer and use it in GitHub Desktop.
Save thomashibbard/e24d98df73c4cc9d647193558065c3b4 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 CURRENT_LICENSE_STATE = "PreProto";
const licensingMachine = Machine(
{
id: "licensing",
initial: CURRENT_LICENSE_STATE,
context: {
assetsFirstAccessedAt: null,
useCase: "",
prototypeUrl: "",
finalUrl: "",
licenseeAcceptedTac: false,
licensorApprovedPrototype: false,
licensorApprovedScheduleA: false,
licensorApprovedFinal: false,
vermillioApprovedFinal: false,
},
states: {
PreProto: {
id: "preproto",
initial: "useCase",
states: {
useCase: {
target: "tac",
on: {
UPDATE_USE_CASE: {
target: "tac",
actions: assign({
useCase(context, event) {
return event.useCase || 'FAKE_USE_CASE'
},
}),
},
},
},
tac: {
on: {
AGREE: {
actions: assign({
licenseeAcceptedTac() {
return true;
},
}),
},
ADVANCE: {
target: "mediaAccess",
cond(context) {
return context.licenseeAcceptedTac;
},
},
},
},
mediaAccess: {
on: {
DOWNLOAD_ASSETS: {
target: "#proto",
actions: assign({
assetsFirstAccessedAt() {
return new Date().toString();
},
}),
},
},
},
},
},
Proto: {
id: "proto",
initial: "licenseeMustAct",
states: {
licenseeMustAct: {
on: {
UPDATE_PROTOTYPE_URL: {
target: "licensorMustAct",
actions: assign({
prototypeUrl(context, event) {
return event.url || 'FAKE_PROTOTYPE_URL'
},
}),
},
ABANDON: {
target: "#abandon",
},
},
},
licensorMustAct: {
on: {
ACCEPT_PROTOTYPE: {
target: "#scheduleA",
actions: assign({
licensorApprovedPrototype: () => true
})
},
DENY_PROTOTYPE: {
target: "licenseeMustAct",
},
},
},
},
},
ScheduleA: {
id: "scheduleA",
initial: "licenseeMustAct",
states: {
licenseeMustAct: {
on: {
UPDATE_SCHEDULE_A: {
target: "licensorMustAct",
},
},
},
licensorMustAct: {
on: {
ACCEPT_SCHEDULE_A: {
target: "#preprod",
actions: assign({
licensorApprovedScheduleA: () => true
})
},
DENY_SCHEDULE_A: "licenseeMustAct",
},
},
},
},
PreProd: {
id: "preprod",
initial: "licenseeMustAct",
states: {
licenseeMustAct: {
entry: assign({
licensorApprovedFinal: () => false,
vermillioApprovedFinal: () => false
}),
on: {
UPDATE_FINAL_URL: {
target: "finalApproversMustAct",
actions: assign({
finalUrl(context, event) {
return event.url || 'FAKE_PROD_URL'
},
}),
},
ABANDON: {
target: "#abandon",
},
},
},
finalApproversMustAct: {
initial: 'licensorMustAct',
states: {
licensorMustAct: {
on: {
DENY_PROD: "#preprod.licenseeMustAct",
ACCEPT_PROD: {
target: "vermillioMustAct",
actions: assign({
licensorApprovedFinal: () => true,
}),
},
},
},
vermillioMustAct: {
on: {
DENY_PROD: "#preprod.licenseeMustAct",
ACCEPT_PROD: {
target: "#prod",
actions: assign({
vermillioApprovedFinal: true,
}),
},
},
},
},
},
},
},
Prod: {
type: "final",
id: "prod",
},
Abandon: {
type: "final",
id: "abandon",
},
},
},
{
guards: {
prodIsApproved(context) {
return context.licensorApprovedFinal && context.vermillioApprovedFinal;
},
},
actions: {
resetFinalApprovals(context) {
assign({
licensorApprovedFinal: () => false,
vermillioApprovedFinal: () => false,
});
},
},
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment