Skip to content

Instantly share code, notes, and snippets.

@coded-aesthetics
Created July 3, 2021 08:09
Show Gist options
  • Select an option

  • Save coded-aesthetics/288cd726f24735f132516c6d9b959ff6 to your computer and use it in GitHub Desktop.

Select an option

Save coded-aesthetics/288cd726f24735f132516c6d9b959ff6 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 getPatientDesktopApp = (context) => {
if (!context.genericSurvey) {
return Promise.reject(new Error('Cannot load the patientDesktopApp because the genericSurvey is undefined'));
}
return PatientServiceSingleton.instance
.getNextFreeIpid('ext')
.map(getPrefilledPatientDesktopAppWithIpid('ext')(convertGenericSurveyPatientDataToPatientData(context.genericSurvey.entity.config.patientData)))
.promise();
};
const performMergeWithExistingPatient = (context) => {
return ClientLibResourcesSingleton.resources.genericSurveyToolbox
.moveToSurveyDbExistingPatient(context.genericSurvey.id, context.selectedPatient.id, context.mergedPatient)
.promise();
};
const performMergeWithNewPatient = (context) => {
return ClientLibResourcesSingleton.resources.genericSurveyToolbox
.moveToSurveyDbNewPatient(context.genericSurvey.id, context.editedPatientData)
.promise();
};
Machine({
id: 'genericSurveyMergeAssistant',
initial: 'needsInitialContext',
context: {
genericSurvey: null,
suggestions: [],
selectedPatient: null,
genericSurveyPatientDesktopApp: null,
mergedPatient: null,
editedPatientData: null,
errorMessage: '',
},
states: {
needsInitialContext: {
on: {
SET_INITIAL_CONTEXT: {
target: 'loadingPatientDesktopApp',
actions: ['assignInitialContext'],
},
},
},
loadingPatientDesktopApp: {
invoke: {
id: 'loadingPatientDesktopApp',
src: getPatientDesktopApp,
onDone: {
target: 'selectingSuggestion',
actions: assign({ genericSurveyPatientDesktopApp: (_, event) => event.data }),
},
/* onError: {
target: 'failure',
actions: assign({ errorMessage: (_, event) => event.data })
} */
},
},
selectingSuggestion: {
id: 'selectingSuggestion',
on: {
CONFIRM_SUGGESTION_MERGE: {
target: 'mergeWithExistingPatient',
actions: ['assignSuggestedPatientToContext'],
},
CONFIRM_SUGGESTION_NEW_PATIENT: {
target: 'mergeWithNewPatient',
},
},
},
mergeWithExistingPatient: {
id: 'mergeWithExistingPatient',
initial: 'manualMerge',
states: {
manualMerge: {
on: {
CONFIRM_MERGE: {
target: 'performMerge',
actions: ['assignMergedPatientToContext'],
},
BACK: {
target: '#selectingSuggestion',
},
},
},
performMerge: {
invoke: {
id: 'performMerge',
src: performMergeWithExistingPatient,
onDone: {
target: '#success',
},
/* onError: {
target: 'failure',
actions: assign({ errorMessage: (_, event) => event.data })
} */
},
},
},
},
mergeWithNewPatient: {
id: 'mergeWithNewPatient',
initial: 'enterPatientData',
states: {
enterPatientData: {
on: {
CONFIRM_CREATE: {
target: 'performMerge',
actions: ['assignEditedPatientDataToContext'],
},
BACK: {
target: '#selectingSuggestion',
},
},
},
performMerge: {
invoke: {
id: 'performMerge',
src: performMergeWithNewPatient,
onDone: {
target: '#success',
},
/* onError: {
target: 'failure',
actions: assign({ errorMessage: (_, event) => event.data })
} */
},
},
},
},
success: { id: 'success', type: 'final' },
},
}, {
services: { submitPayment: () => () => { } },
actions: {
assignInitialContext: assign((context, event) => {
if (event.type !== 'SET_INITIAL_CONTEXT')
return {};
return {
genericSurvey: event.genericSurvey,
suggestions: event.suggestions,
selectedPatient: null,
patientDesktopApp: null,
errorMessage: '',
};
}),
assignSuggestedPatientToContext: assign((_, event) => {
if (event.type !== 'CONFIRM_SUGGESTION_MERGE')
return {};
return {
selectedPatient: event.selectedPatient,
};
}),
assignErrorMessageToContext: assign((_, event) => {
var _a;
return {
errorMessage: ((_a = event.data) === null || _a === void 0 ? void 0 : _a.message) || 'An unknown error occurred',
};
}),
assignEditedPatientDataToContext: assign((_, event) => {
if (event.type !== 'CONFIRM_CREATE')
return {};
return {
editedPatientData: event.editedPatientData,
};
}),
assignMergedPatientToContext: assign((_, event) => {
if (event.type !== 'CONFIRM_MERGE')
return {};
return {
mergedPatient: event.mergedPatient,
};
}),
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment