Skip to content

Instantly share code, notes, and snippets.

@one-aalam
Created June 19, 2020 11:09
Show Gist options
  • Save one-aalam/38e4d272ca32ab0c56342d7e90c51f63 to your computer and use it in GitHub Desktop.
Save one-aalam/38e4d272ca32ab0c56342d7e90c51f63 to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const assignmentStates = {
initial: 'with_candidate',
states: {
with_candidate: {
id: 'assignment_with_candidate',
on: {
CANDIDATE_REJECTED: '#assignment_with_candidate',
CANDIDATE_NOT_DOING_ASSIGNMENT: '#discuss_with_business',
CANDIDATE_SUBMITTED_ASSIGNMENT: '#assignment_submitted_by_candidate',
},
},
submitted_by_candidate: {
id: 'assignment_submitted_by_candidate',
on: {
CANDIDATE_REJECTED: '#assignment_submitted_by_candidate',
GOT_OTHER_JOB: '#assignment_submitted_by_candidate',
ALLOCATE_ASSIGNMENT_PANEL: '#assignment_pending_code_review',
},
},
pending_code_review: {
id: 'assignment_pending_code_review',
on: {
GOT_OTHER_JOB: '#assignment_pending_code_review',
PANEL_SAYS_GOOD_CODE: '#domain',
CANDIDATE_REJECTED: {
target: '#rejected',
actions: 'setReasonBadCode',
data: 'BAD CODE',
},
},
},
},
};
const phoneScreenStates = {
initial: 'schedule_pending',
states: {
schedule_pending: {
id: 'phone_screen_schedule_pending',
on: {
CANDIDATE_REJECTED: '#phone_screen_schedule_pending',
ALLOCATE_PHONE_SCREEN_PANEL: '#phone_screen_assessment_pending',
},
},
assessment_pending: {
id: 'phone_screen_assessment_pending',
on: {
PANEL_FIND_CANDIDATE_GOOD: '#domain',
// PANEL_FIND_CANDIDATE_BAD: '#rejected',
},
},
},
};
const domainStates = {
initial: 'schedule_pending',
states: {
schedule_pending: {
id: 'domain_schedule_pending',
on: {
ALLOCATE_DOMAIN_PANEL: '#domain_assessment_pending',
CANDIDATE_REJECTED: '#domain_schedule_pending',
},
},
assessment_pending: {
id: 'domain_assessment_pending',
on: {
PANEL_FIND_CANDIDATE_GOOD_FOR_TIER_1: '#domain_project_fitment',
PANEL_FIND_CANDIDATE_GOOD_FOR_TIER_OTHERS: '#selected',
// PANEL_FIND_CANDIDATE_BAD: '#rejected',
},
},
project_fitment: {
id: 'domain_project_fitment',
on: {
PROJECT_FIND_CANDIDATE_GOOD: '#selected',
// ALL_PROJECTS_FIND_CANDIDATE_BAD: '#rejected',
RETRY_ON_SOME_OTHER_PROJECT: '#domain_project_fitment',
},
},
},
};
const fetchMachine = Machine(
{
id: 'candidate',
key: 'candidate',
initial: 'rsf_added',
context: {},
states: {
rsf_added: {
id: 'rsf_added',
on: {
GIVE_ASSIGNMENT: '#assignment',
DISCUSS_WITH_BUSINESS: '#discuss_with_business',
SUGGEST_DIRECT_PHONE_SCREEN: '#phone_screen',
SUGGEST_DIRECT_DOMAIN: '#domain',
// RECRUITER_REJECTS_CANDIDATE: '#rejected',
GOT_OTHER_JOB: '#rsf_added',
},
},
phone_screen: {
id: 'phone_screen',
...phoneScreenStates,
},
assignment: {
id: 'assignment',
...assignmentStates,
},
discuss_with_business: {
id: 'discuss_with_business',
on: {
// BUSINESS_REJECTS_CANDIDATE: '#rejected',
BUSINESS_FIND_PROFILE_GOOD: '#phone_screen',
BUSINESS_FIND_PROFILE_VERY_GOOD: '#domain',
},
},
domain: {
id: 'domain',
...domainStates,
},
selected: {
id: 'selected',
type: 'final',
},
rejected: {
id: 'rejected',
on: {
// GOT_OTHER_JOB: '#rejected',
CANDIDATE_REFACTOR_CODE: {
target: '#assignment',
cond: 'OnlyForBadCode',
actions: 'resetBadCodeReason',
},
},
},
hire_loss: {
id: 'hire_loss',
type: 'final',
},
},
on: {
GOT_OTHER_JOB: {
target: '#hire_loss',
},
CANDIDATE_REJECTED: {
target: '#rejected',
},
},
},
{
actions: {
setReasonBadCode: assign({
reason: () => {
return 'BAD_CODE';
},
}),
resetBadCodeReason: assign({
reason: () => '',
}),
},
guards: {
OnlyForBadCode: (ctx) => ctx.reason === 'BAD_CODE',
},
}
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment