Skip to content

Instantly share code, notes, and snippets.

@smirea
Last active January 23, 2020 15:57
Show Gist options
  • Save smirea/eeeec56a74e1f7bf3cc7e4d5831b30d0 to your computer and use it in GitHub Desktop.
Save smirea/eeeec56a74e1f7bf3cc7e4d5831b30d0 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 fetchMachine = Machine({
id: 'Product Status Pipeline',
initial: 'new',
context: {
isPublished: false,
hasImages: false,
hasData: false,
hasStoreAvailability: false,
hasPartner: false,
succeededTasks: 0,
imagesProcessed: false,
digitization: {
outOfStock: null,
needsImages: true,
needsDimensions: true,
needsVerification: false,
},
},
states: {
new: {
on: {
ENABLE_STORE_DIGITIZATION: {
target: 'digitization',
cond: 'readyForDigitization',
},
SET_STORE_AVAILABILITY: {
actions: ['setStoreAvailability'],
},
SET_PARTNER: {
actions: ['setPartner'],
},
},
},
digitization: {
id: 'digitization',
initial: 'pending',
states: {
cart: {
on: {
ADD_IMAGES: {
actions: 'addImages',
cond: 'needsImages',
},
ADD_DIMENSIONS: {
actions: 'addDimensions',
cond: 'needsDimensions',
},
SUBMIT: {
target: '#ingestion',
cond: 'readyForIngestion',
},
},
},
pending: {
on: {
ADD_TO_CART: {
target: 'cart',
actions: 'clearOutOfStock',
cond: 'needsImagesOrDimensions',
},
OUT_OF_STOCK: {
target: 'pending',
actions: 'setOutOfStock',
cond: 'needsImagesOrDimensions',
},
VERIFY_UP_TO_DATE: {
target: '#done',
actions: 'setVerification',
cond: 'needsVerification',
},
VERIFY_NEEDS_REDO: {
target: 'pending',
actions: 'setVerification',
cond: 'needsVerification',
},
},
},
},
},
ingestion: {
id: 'ingestion',
type: 'parallel',
on: {
SUBMIT: {
target: '#qa',
cond: 'readyForQa',
},
},
states: {
imageProcessing: {
id: 'imageProcessing',
initial: 'pending',
states: {
pending: {
on: {
'': {
target: 'done',
cond: 'allImagesProcessed',
},
DOWNLOAD: 'processing',
},
},
processing: {
on: {
UPLOAD: {
target: 'done',
actions: 'imagesFinishedProcessing',
},
NO_UPLOAD: 'error',
},
},
done: {},
error: {
type: 'final',
},
},
},
mturk: {
id: 'mturk',
initial: 'pending',
states: {
pending: {
on: {
CREATE_TAXONOMY_TASK: 'taxonomy',
},
},
taxonomy: {
on: {
CREATE_VALIDATION_TASK: 'runTasks',
},
},
runTasks: {
on: {
GENERATE_OTHER_TASKS: {
target: 'runTasks',
actions: 'succeedTask',
},
ALL_TASKS_RESOLVED: {
target: 'done',
cond: 'tasksProcessedSuccessfully',
},
TASK_FAILED: 'error',
},
},
done: {},
error: {
type: 'final',
},
},
},
},
},
qa: {
id: 'qa',
initial: 'pending',
states: {
pending: {
on: {
ALL_CHECKS_PASSED: '#done',
SOME_CHECKS_FAILED: 'error',
},
},
error: {
type: 'final',
},
},
},
done: {
id: 'done',
initial: 'inactive',
states: {
inactive: {
on: {
'': {
target: 'active',
cond: 'isPublished',
},
ACTIVATE: {
target: 'active',
actions: 'publish',
},
},
},
active: {
on: {
DEACTIVATE: {
target: 'inactive',
actions: 'unpublish',
},
},
},
},
on: {
VERIFY: {
target: '#digitization',
actions: 'setNeedsVerification',
},
GENERATE_MORE_TASKS: {
target: '#mturk.runTasks',
},
},
},
},
}, {
guards: {
readyForDigitization: ctx =>
ctx.hasStoreAvailability &&
ctx.hasPartner,
readyForIngestion: ctx =>
ctx.hasImages,
needsImages: ctx =>
ctx.digitization.needsImages,
needsDimensions: ctx =>
ctx.digitization.needsDimensions,
needsImagesOrDimensions: ctx =>
ctx.digitization.needsImages ||
ctx.digitization.needsDimensions,
needsVerification: ctx =>
ctx.digitization.needsVerification,
tasksProcessedSuccessfully: ctx =>
ctx.succeededTasks >= 3,
readyForQa: ctx =>
ctx.succeededTasks >= 3 && ctx.imagesProcessed,
allImagesProcessed: ctx =>
ctx.imagesProcessed,
isPublished: ctx =>
ctx.isPublished,
},
actions: {
setStoreAvailability: assign({
hasStoreAvailability: true,
}),
setPartner: assign({
hasPartner: true,
}),
addImages: assign({
hasImages: true,
digitization: ctx => ({
...ctx.digitization,
needsImages: false,
}),
}),
addDimensions: assign({
hasDimensions: true,
digitization: ctx => ({
...ctx.digitization,
needsDimensions: false,
}),
}),
setOutOfStock: assign({
digitization: ctx => ({
...ctx.digitization,
outOfStock: (new Date).toISOString(),
}),
}),
clearOutOfStock: assign({
digitization: ctx => ({
...ctx.digitization,
outOfStock: null,
}),
}),
setNeedsVerification: assign({
digitization: (ctx, { type }) => ({
...ctx.digitization,
needsVerification: true,
}),
}),
setVerification: assign({
digitization: (ctx, { type }) => ({
...ctx.digitization,
needsVerification: false,
...(type !== 'VERIFY_NEEDS_REDO' ? null : {
needsImages: true,
needsDimensions: true,
}),
}),
}),
succeedTask: assign({
succeededTasks: ctx => ctx.succeededTasks + 1,
}),
publish: assign({
isPublished: true,
}),
unpublish: assign({
isPublished: false,
}),
imagesFinishedProcessing: assign({
imagesProcessed: true,
}),
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment