Created
March 26, 2020 21:04
-
-
Save tmikeschu/81af144fbf0c8a244c4e4d1d50fc2467 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
This file contains 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
const DATES_TAB = { | |
target: "dates", | |
actions: ["sendGAEvent"], | |
} | |
Machine({ | |
id: "app", | |
initial: "fetchAttendee", | |
context: { | |
lastScreen: "schedule", | |
friendId: undefined, | |
friendTimeId: undefined, | |
someoneNewTimes: new Set(), | |
someoneNewInterests: new Set(), | |
attendee: null, | |
meetings: [], | |
apiBaseUrl: "", | |
token: "", | |
pendingMatchesCount: 0, | |
meetingId: undefined, | |
attendees: [], | |
newMeetings: false, | |
meetingTimes: [], | |
topics: [], | |
markMeetingsAsSeen: false, | |
}, | |
entry: ["setBaseUrl", "setToken"], | |
states: { | |
fetchAttendee: { | |
invoke: { | |
id: "fetchAttendee", | |
src: "fetchAttendee", | |
onDone: { | |
target: "fetchMeetings", | |
actions: ["setAttendee", "setGADimension"], | |
}, | |
onError: { | |
actions: () => { | |
throw new Error("Unable to fetch attendee") | |
}, | |
}, | |
}, | |
}, | |
fetchMeetings: { | |
on: { CONCAT_MEETINGS: { actions: ["concatMeetings"] } }, | |
invoke: { | |
id: "meetingsApiMachine", | |
src: "meetingsApiMachine", | |
onDone: { target: "codeOfConduct" }, | |
}, | |
}, | |
codeOfConduct: { | |
on: { | |
"": { target: "schedule", cond: "hasAcceptedCodeOfConduct" }, | |
ACCEPT_CODE_OF_CONDUCT: { | |
target: "schedule", | |
cond: "hasAcceptedCodeOfConduct", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
}, | |
schedule: { | |
id: "schedule", | |
initial: "home", | |
after: { | |
300: { | |
actions: ["setLastToSchedule"], | |
}, | |
}, | |
on: { | |
DATES_TAB, | |
SCHEDULE_TAB: "schedule", | |
SETTINGS: "settings", | |
}, | |
states: { | |
hist: { type: "history", history: "deep" }, | |
home: { | |
entry: ["clearState", "sendGAPageView"], | |
on: { | |
FRIEND: "friend", | |
SOMEONE_NEW: "someoneNew", | |
}, | |
}, | |
friend: { | |
initial: "fetchAttendees", | |
entry: "sendGAPageView", | |
states: { | |
fetchAttendees: { | |
invoke: { | |
id: "fetchAttendees", | |
src: "fetchAttendees", | |
onDone: { | |
target: "person", | |
actions: assign({ attendees: (_, event) => event.data }), | |
}, | |
}, | |
}, | |
person: { | |
on: { | |
SELECT_FRIEND: { actions: ["setSelectedFriend"] }, | |
TIME: { | |
target: "fetchTimes", | |
cond: "friendSelected", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
}, | |
fetchTimes: { | |
invoke: { | |
id: "fetchTimes", | |
src: "fetchTimes", | |
onDone: { target: "time", actions: ["setMeetingTimes"] }, | |
}, | |
}, | |
time: { | |
on: { | |
SELECT_TIME: { | |
actions: ["setSelectedFriendTime", "sendGAEvent"], | |
}, | |
RESERVE_FRIEND: { | |
target: "reserve", | |
cond: "friendTimeSelected", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
}, | |
reserve: { | |
invoke: { | |
id: "reserveFriend", | |
src: "reserveFriend", | |
onDone: { target: "reserved", actions: "addMeeting" }, | |
}, | |
}, | |
reserved: { | |
entry: ["sendGAPageView"], | |
on: { | |
SCHEDULE_BUTTON: { | |
target: "#schedule", | |
actions: ["sendGAEvent"], | |
}, | |
DATES_BUTTON: { | |
target: "#dates", | |
actions: ["sendGAEvent"], | |
}, | |
"": { | |
target: "#schedule.home", | |
cond: "datesToReserved", | |
}, | |
}, | |
}, | |
}, | |
}, | |
someoneNew: { | |
entry: ["sendGAPageView"], | |
initial: "fetchTimes", | |
states: { | |
fetchTimes: { | |
invoke: { | |
id: "fetchTimes", | |
src: "fetchTimes", | |
onDone: { target: "times", actions: ["setMeetingTimes"] }, | |
}, | |
}, | |
times: { | |
on: { | |
INTERESTS: { | |
target: "fetchTopics", | |
cond: "someoneNewTimesSelected", | |
actions: ["sendGAEvent"], | |
}, | |
SELECT_SOMEONE_NEW_TIME: { | |
actions: ["setSelectedSomeoneNewTimes", "sendGAEvent"], | |
}, | |
}, | |
}, | |
fetchTopics: { | |
invoke: { | |
id: "fetchTopics", | |
src: "fetchTopics", | |
onDone: { target: "interests", actions: ["setTopics"] }, | |
}, | |
}, | |
interests: { | |
on: { | |
RESERVE_SOMEONE_NEW: { | |
target: "reserve", | |
actions: ["sendGAEvent"], | |
}, | |
SELECT_SOMEONE_NEW_INTEREST: { | |
actions: ["setSelectedSomeoneNewInterests", "sendGAEvent"], | |
}, | |
}, | |
}, | |
reserve: { | |
invoke: { | |
id: "reserveSomeoneNew", | |
src: "reserveSomeoneNew", | |
onDone: [ | |
{ | |
target: "reservedInstant", | |
actions: ["addMeeting", "setSelectedFriend"], | |
cond: "instantMatch", | |
}, | |
{ target: "reservedMagic", actions: ["addMeeting"] }, | |
], | |
}, | |
}, | |
reservedMagic: { | |
entry: ["sendGAPageView"], | |
on: { | |
SCHEDULE_BUTTON: { | |
target: "#schedule", | |
actions: ["sendGAEvent"], | |
}, | |
DATES_BUTTON: { | |
target: "#dates", | |
actions: ["sendGAEvent"], | |
}, | |
"": { | |
target: "#schedule.home", | |
cond: "datesToReserved", | |
}, | |
}, | |
}, | |
reservedInstant: { | |
entry: ["sendGAPageView"], | |
on: { | |
SCHEDULE_BUTTON: { | |
target: "#schedule", | |
actions: ["sendGAEvent"], | |
}, | |
DATES_BUTTON: { | |
target: "#dates", | |
actions: ["sendGAEvent"], | |
}, | |
"": { | |
target: "#schedule.home", | |
cond: "datesToReserved", | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
dates: { | |
id: "dates", | |
initial: "home", | |
after: { | |
300: { actions: ["setLastToDates"] }, | |
}, | |
on: { | |
CONCAT_MEETINGS: { actions: ["concatMeetings"] }, | |
SET_PENDING_MATCHES: { | |
actions: assign({ | |
pendingMatchesCount: ({ pendingMatchesCount }, event) => | |
event.type === "SET_PENDING_MATCHES" | |
? event.data | |
: pendingMatchesCount, | |
}), | |
}, | |
SCHEDULE_TAB: "schedule.hist", | |
DATES_TAB, | |
SETTINGS: "settings", | |
SET_MEETING_ID: { | |
actions: assign({ | |
meetingId: ({ meetingId }, event) => | |
event.type === "SET_MEETING_ID" ? event.data : meetingId, | |
}), | |
}, | |
}, | |
states: { | |
hist: { type: "history", history: "deep" }, | |
home: { | |
initial: "init", | |
entry: ["sendGAPageView"], | |
on: { | |
DECLINE: { | |
target: "decline", | |
actions: ["sendGAEvent"], | |
}, | |
CANCEL: { | |
target: "cancel", | |
actions: ["sendGAEvent"], | |
}, | |
DISMISS: { | |
target: "dismissMeeting", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
invoke: { | |
id: "meetingsApiMachine", | |
src: "meetingsApiMachine", | |
data: ({ attendee, graphqlClient }) => ({ | |
attendee, | |
graphqlClient, | |
}), | |
}, | |
states: { | |
init: { | |
after: { | |
2000: "seen", | |
}, | |
}, | |
seen: { | |
exit: ["setMeetingsSeen"], | |
invoke: { | |
id: "markMeetingsSeen", | |
src: "markMeetingsSeen", | |
onDone: { actions: ["queueMeetingsForMarkedAsSeen"] }, | |
}, | |
}, | |
}, | |
}, | |
dismissMeeting: { | |
invoke: { | |
id: "dismissMeeting", | |
src: "dismissMeeting", | |
onDone: { | |
target: "home", | |
actions: assign({ | |
meetings: ({ meetings }, event) => { | |
return meetings.filter(m => m.uuid !== event.data.uuid) | |
}, | |
}), | |
}, | |
}, | |
}, | |
decline: { | |
initial: "confirm", | |
states: { | |
confirm: { | |
entry: ["sendGAPageView"], | |
on: { | |
DECLINE_CONFIRM: { | |
target: "declineMeeting", | |
actions: ["sendGAEvent"], | |
}, | |
CANCEL: { | |
target: "#dates", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
}, | |
declineMeeting: { | |
invoke: { | |
id: "declineMeeting", | |
src: "declineMeeting", | |
onDone: { target: "reason", actions: ["setMeeting"] }, | |
}, | |
}, | |
reason: { | |
on: { | |
NOT_AVAILABLE: { | |
target: "becauseNotAvailable", | |
actions: ["sendGAEvent"], | |
}, | |
NOT_INTERESTED: { | |
target: "becauseNotInterested", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
}, | |
becauseNotAvailable: { | |
invoke: { | |
id: "becauseNotInterested", | |
src: "updateRejection", | |
onDone: { | |
target: "notAvailable", | |
actions: ["setMeeting"], | |
}, | |
}, | |
}, | |
becauseNotInterested: { | |
invoke: { | |
id: "becauseNotInterested", | |
src: "updateRejection", | |
onDone: { | |
target: "notInterested", | |
actions: ["setMeeting"], | |
}, | |
}, | |
}, | |
notAvailable: { | |
entry: ["sendGAPageView"], | |
on: { | |
DATES_BUTTON: { | |
target: "#dates", | |
}, | |
SCHEDULE_BUTTON: { | |
target: "#schedule", | |
actions: ["sendGAEvent"], | |
}, | |
}, | |
}, | |
notInterested: { | |
entry: "sendGAPageView", | |
on: { | |
DATES_BUTTON: { | |
target: "#dates", | |
}, | |
SCHEDULE_BUTTON: { | |
target: "#schedule", | |
actions: "sendGAEvent", | |
}, | |
}, | |
}, | |
}, | |
}, | |
cancel: { | |
initial: "confirm", | |
states: { | |
confirm: { | |
entry: "sendGAPageView", | |
on: { | |
DECLINE_CONFIRM: { | |
target: "declineMeeting", | |
actions: "sendGAEvent", | |
}, | |
CANCEL: { | |
target: "#dates", | |
actions: "sendGAEvent", | |
}, | |
}, | |
}, | |
declineMeeting: { | |
invoke: { | |
id: "declineMeeting", | |
src: "declineMeeting", | |
onDone: { target: "declined", actions: ["setMeeting"] }, | |
}, | |
}, | |
declined: { | |
on: { | |
SCHEDULE_BUTTON: { | |
target: "#schedule", | |
actions: "sendGAEvent", | |
}, | |
DATES_BUTTON: "#dates", | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
settings: { | |
initial: "home", | |
entry: "sendGAPageView", | |
exit: "sendGAEvent", | |
on: { | |
CLOSE: [ | |
{ target: "schedule..hist", cond: "wasSchedule" }, | |
{ target: "dates.hist", cond: "wasDates" }, | |
{ target: "schedule" }, | |
], | |
}, | |
states: { | |
home: { | |
on: { | |
TOGGLE_ALLOW_MEETINGS: { | |
target: "toggleAllowMeetings", | |
actions: "sendGAEvent", | |
}, | |
}, | |
}, | |
toggleAllowMeetings: { | |
invoke: { | |
id: "toggleAllowMeetings", | |
src: "toggleAllowMeetings", | |
onDone: { target: "home", actions: ["toggleAllowMeetings"] }, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment