Skip to content

Instantly share code, notes, and snippets.

@kevinold
Last active March 11, 2020 16:58
Show Gist options
  • Save kevinold/f6cbf43dd12c8bac2b9c1d225ec4cc21 to your computer and use it in GitHub Desktop.
Save kevinold/f6cbf43dd12c8bac2b9c1d225ec4cc21 to your computer and use it in GitHub Desktop.
const dataMachine = Machine({
id: "dataMachine",
initial: "idle",
context: {
pageData: {},
results: []
},
states: {
idle: {
on: {
FETCH: "loading",
UPDATE: "updating"
}
},
loading: {
invoke: {
src: "fetchData",
onDone: { target: "success" },
onError: { target: "failure", actions: "setMessage" }
}
},
updating: {
invoke: {
src: "updateData",
onDone: { target: ["success", "loading"] },
onError: { target: "failure", actions: "setMessage" }
}
},
success: {
entry: ["setResults", "setPageData"],
on: {
FETCH: "loading"
},
initial: "unknown",
states: {
unknown: {
on: {
"": [
{ target: "withData", cond: "hasData" },
{ target: "withoutData" }
]
}
},
withData: {
//entry: ["notifyHasData"]
},
withoutData: {}
}
},
failure: {
entry: ["setMessage"],
on: {
FETCH: "loading"
}
}
}
},
{
actions: {
setResults: assign((ctx, event) => ({
results:
event.data && event.data.pageData && event.data.pageData.page > 1
? concat(ctx.results, event.data.results)
: event.data.results
})),
setPageData: assign((ctx, event) => ({
pageData: event.data.pageData
})),
setMessage: assign((ctx, event) => ({
message: event.message
}))
},
guards: {
hasData: (ctx, event) => !!ctx.results && ctx.results.length > 0
}
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment