Created
February 4, 2020 22:09
-
-
Save tmikeschu/8397ee95510ff87d4877dcdb50277eb1 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 BOOK_OR_REVIEW = { BOOK: '#schedule', DATES: '#dates' }; | |
const machine = 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: [], | |
graphqlClient: {}, | |
topics: [], | |
markMeetingsAsSeen: false, | |
}, | |
entry: ['setBaseUrl', 'setToken'], | |
states: { | |
fetchAttendee: { | |
invoke: { | |
id: 'fetchAttendee', | |
src: 'fetchAttendee', | |
onDone: { target: 'fetchMeetings', actions: ['setAttendee'] }, | |
onError: { | |
actions: () => { | |
throw new Error('Unable to fetch attendee'); | |
}, | |
}, | |
}, | |
}, | |
fetchMeetings: { | |
on: { CONCAT_MEETINGS: { actions: ['concatMeetings'] } }, | |
invoke: { | |
id: 'meetingsApiMachine', | |
src: 'meetingsApiMachine', | |
data: ({ attendee, graphqlClient }) => ({ | |
attendee, | |
graphqlClient, | |
}), | |
onDone: { target: 'codeOfConduct' }, | |
}, | |
}, | |
codeOfConduct: { | |
on: { | |
'': { target: 'schedule', cond: 'hasAcceptedCodeOfConduct' }, | |
SCHEDULE: { target: 'schedule', cond: 'hasAcceptedCodeOfConduct' }, | |
}, | |
}, | |
schedule: { | |
id: 'schedule', | |
initial: 'home', | |
entry: 'setLastToSchedule', | |
on: { | |
DATES: 'dates', | |
SCHEDULE: 'schedule', | |
SETTINGS: 'settings', | |
}, | |
states: { | |
hist: { type: 'history', history: 'deep' }, | |
home: { | |
entry: ['clearState'], | |
on: { FRIEND: 'friend', SOMEONE_NEW: 'someoneNew' }, | |
}, | |
friend: { | |
initial: 'fetchAttendees', | |
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', | |
}, | |
}, | |
}, | |
fetchTimes: { | |
invoke: { | |
id: 'fetchTimes', | |
src: 'fetchTimes', | |
onDone: { target: 'time', actions: ['setMeetingTimes'] }, | |
}, | |
}, | |
time: { | |
on: { | |
SELECT_TIME: { actions: ['setSelectedFriendTime'] }, | |
RESERVE_FRIEND: { | |
target: 'reserve', | |
cond: 'friendTimeSelected', | |
}, | |
}, | |
}, | |
reserve: { | |
invoke: { | |
id: 'reserveFriend', | |
src: 'reserveFriend', | |
onDone: { target: 'reserved', actions: 'addMeeting' }, | |
}, | |
}, | |
reserved: { on: BOOK_OR_REVIEW }, | |
}, | |
}, | |
someoneNew: { | |
initial: 'fetchTimes', | |
states: { | |
fetchTimes: { | |
invoke: { | |
id: 'fetchTimes', | |
src: 'fetchTimes', | |
onDone: { target: 'times', actions: ['setMeetingTimes'] }, | |
}, | |
}, | |
times: { | |
on: { | |
INTERESTS: { | |
target: 'fetchTopics', | |
cond: 'someoneNewTimesSelected', | |
}, | |
SELECT_SOMEONE_NEW_TIME: { | |
actions: ['setSelectedSomeoneNewTimes'], | |
}, | |
}, | |
}, | |
fetchTopics: { | |
invoke: { | |
id: 'fetchTopics', | |
src: 'fetchTopics', | |
onDone: { target: 'interests', actions: ['setTopics'] }, | |
}, | |
}, | |
interests: { | |
on: { | |
RESERVE_SOMEONE_NEW: 'reserve', | |
SELECT_SOMEONE_NEW_INTEREST: { | |
actions: ['setSelectedSomeoneNewInterests'], | |
}, | |
}, | |
}, | |
reserve: { | |
invoke: { | |
id: 'reserveSomeoneNew', | |
src: 'reserveSomeoneNew', | |
onDone: [ | |
{ | |
target: 'reserved.instant', | |
actions: ['addMeeting', 'setSelectedFriend'], | |
cond: 'instantMatch', | |
}, | |
{ target: 'reserved.magic', actions: ['addMeeting'] }, | |
], | |
}, | |
}, | |
reserved: { | |
initial: 'magic', | |
states: { | |
magic: { on: BOOK_OR_REVIEW }, | |
instant: { on: BOOK_OR_REVIEW }, | |
}, | |
}, | |
}, | |
}, | |
}, | |
}, | |
dates: { | |
id: 'dates', | |
initial: 'home', | |
entry: ['setLastToDates'], | |
on: { | |
CONCAT_MEETINGS: { actions: ['concatMeetings'] }, | |
SET_PENDING_MATCHES: { | |
actions: assign({ | |
pendingMatchesCount: ({ pendingMatchesCount }, event) => | |
event.type === 'SET_PENDING_MATCHES' | |
? event.data | |
: pendingMatchesCount, | |
}), | |
}, | |
SCHEDULE: 'schedule.hist', | |
DATES: 'dates', | |
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', | |
on: { | |
DECLINE: 'decline', | |
CANCEL: 'cancel', | |
DISMISS: 'dismissMeeting', | |
}, | |
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: { | |
on: { DECLINE_CONFIRM: 'declineMeeting', CANCEL: '#dates' }, | |
}, | |
declineMeeting: { | |
invoke: { | |
id: 'declineMeeting', | |
src: 'declineMeeting', | |
onDone: { target: 'reason', actions: ['setMeeting'] }, | |
}, | |
}, | |
reason: { | |
on: { | |
NOT_AVAILABLE: 'becauseNotAvailable', | |
NOT_INTERESTED: 'becauseNotInterested', | |
}, | |
}, | |
becauseNotAvailable: { | |
invoke: { | |
id: 'becauseNotInterested', | |
src: 'updateRejection', | |
onDone: { | |
target: 'notAvailable', | |
actions: ['setMeeting'], | |
}, | |
}, | |
}, | |
becauseNotInterested: { | |
invoke: { | |
id: 'becauseNotInterested', | |
src: 'updateRejection', | |
onDone: { | |
target: 'notInterested', | |
actions: ['setMeeting'], | |
}, | |
}, | |
}, | |
notAvailable: { on: BOOK_OR_REVIEW }, | |
notInterested: { on: BOOK_OR_REVIEW }, | |
}, | |
}, | |
cancel: { | |
initial: 'confirm', | |
states: { | |
confirm: { | |
on: { DECLINE_CONFIRM: 'declineMeeting', CANCEL: '#dates' }, | |
}, | |
declineMeeting: { | |
invoke: { | |
id: 'declineMeeting', | |
src: 'declineMeeting', | |
onDone: { target: 'declined', actions: ['setMeeting'] }, | |
}, | |
}, | |
declined: { on: { BOOK: '#schedule', DATES: '#dates' } }, | |
}, | |
}, | |
}, | |
}, | |
settings: { | |
initial: 'home', | |
on: { | |
CLOSE: [ | |
{ target: 'schedule..hist', cond: 'wasSchedule' }, | |
{ target: 'dates.hist', cond: 'wasDates' }, | |
{ target: 'schedule' }, | |
], | |
}, | |
states: { | |
home: { on: { TOGGLE_ALLOW_MEETINGS: 'toggleAllowMeetings' } }, | |
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