Skip to content

Instantly share code, notes, and snippets.

@lamtranweb
Created September 24, 2021 19:55
Show Gist options
  • Save lamtranweb/c5a4b9179002ae0b934735d5b1ccaade to your computer and use it in GitHub Desktop.
Save lamtranweb/c5a4b9179002ae0b934735d5b1ccaade to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const machineDefinition = Machine({
id: 'KYC',
initial: 'pre_init',
context: {
phoneNumber: null,
supportsGetUserMedia: true,
forcedDesktop: false,
},
states: {
pre_init: {
invoke: {
src: 'initialize',
onDone: {
actions: ['initMachine'],
target: 'init',
},
},
},
init: {
on: {
VERIFY_PHONE_NUMBER: 'phone_number_verification_start',
KYC: 'intro',
KYC_INITIATED: 'reinit_verifying',
},
},
reinit_verifying: {
invoke: {
src: 'fetchKycChecks',
onDone: {
actions: ['restoreKycChecks'],
target: 'submit_verification',
},
},
},
phone_number_verification_start: {
// invoke: {
// src: phoneMachine,
// onDone: {
// actions: ['savePhoneNumber'],
// target: '#KYC.init',
// },
// },
},
intro: {
on: {
// we temporarily do not show passport choice
// since it does not have the user's state
NEXT: [
{
target: 'launch_dl_camera',
cond: 'isMobile',
},
{
target: 'dl_camera',
cond: 'isDesktop',
},
],
NEXT_MANUAL: 'manual_dl_camera',
FORCE_DESKTOP: {
actions: ['forceDesktop'],
target: 'intro_desktop',
},
// this is here just for testing the passport screen
// since we'll need to use it later
PASSPORT: 'launch_passport_camera',
},
},
intro_desktop: {
on: {
DESKTOP_NEXT_FILE: {
actions: 'saveDriverLicenseFront',
target: 'desktop_launch_barcode_camera',
},
DESKTOP_ERROR: {
actions: ['saveDriverLicenseFront', 'saveDriverLicenseError'],
target: 'desktop_manual_dl_camera_error',
},
},
},
desktop_launch_barcode_camera: {
on: {
DESKTOP_NEXT_FILE: {
actions: 'saveBarcode',
target: 'desktop_launch_selfie_camera',
},
DESKTOP_ERROR: {
actions: ['saveDriverLicenseBack', 'saveDriverLicenseError'],
target: 'desktop_manual_barcode_camera_error',
},
},
},
desktop_launch_selfie_camera: {
on: {
DESKTOP_NEXT_FILE: {
actions: 'saveSelfie',
target: 'launch_verify',
},
DESKTOP_ERROR: {
actions: ['safeSelfie', 'saveSelfieError'],
target: 'desktop_manual_selfie_camera_error',
},
},
},
document_chooser: {
on: {
DRIVER_LICENSE: 'launch_dl_camera',
PASSPORT: 'launch_passport_camera',
},
},
launch_dl_camera: {
on: {
NEXT: 'dl_camera',
CAMERA_NEXT: {
actions: 'saveDriverLicenseFront',
target: 'launch_barcode_camera',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseFront', 'saveDriverLicenseError'],
target: 'manual_dl_camera_error',
},
},
},
launch_passport_camera: {
on: {
NEXT: 'passport_camera',
},
},
dl_camera: {
on: {
CAMERA_NEXT: {
actions: 'saveDriverLicenseFront',
target: 'launch_barcode_camera',
},
LAUNCH_MANUAL: 'manual_dl_camera',
LAUNCH_MANUAL_FORCED: 'manual_dl_camera_forced',
ERROR: {
actions: ['saveError'],
target: 'error',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseFront', 'saveDriverLicenseError'],
target: 'manual_dl_camera_error',
},
// only used in KycDesktop
CLOSE: 'intro',
},
},
manual_dl_camera: {
on: {
CAMERA_NEXT: {
actions: 'saveDriverLicenseFront',
target: 'launch_barcode_camera',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseFront', 'saveDriverLicenseError'],
target: 'manual_dl_camera_error',
},
CLOSE: 'intro',
LAUNCH_AUTO: 'dl_camera',
},
},
manual_dl_camera_forced: {
on: {
CAMERA_NEXT: {
actions: 'saveDriverLicenseFront',
target: 'launch_barcode_camera',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseFront', 'saveDriverLicenseError'],
target: 'manual_dl_camera_error',
},
CLOSE: 'intro',
},
},
manual_dl_camera_error: {
on: {
NEXT: 'dl_camera',
NEXT_MANUAL: 'manual_dl_camera',
RETRY: 'manual_dl_camera',
RELAUNCH: 'launch_dl_camera',
PROCEED: 'launch_barcode_camera',
},
},
desktop_manual_dl_camera_error: {
on: {
DESKTOP_NEXT_FILE: {
actions: 'saveDriverLicenseFront',
target: 'desktop_launch_barcode_camera',
},
DESKTOP_ERROR: {
actions: ['saveDriverLicenseFront', 'saveDriverLicenseError'],
target: 'desktop_manual_dl_camera_error',
},
},
},
launch_barcode_camera: {
on: {
NEXT: 'barcode_camera',
NEXT_MANUAL: 'manual_barcode_camera',
CAMERA_NEXT: {
actions: 'saveBarcode',
target: 'launch_selfie_camera',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseBack', 'saveDriverLicenseError'],
target: 'manual_barcode_camera_error',
},
},
},
barcode_camera: {
on: {
CAMERA_NEXT: {
actions: 'saveBarcode',
target: 'launch_selfie_camera',
},
LAUNCH_MANUAL: 'manual_barcode_camera',
LAUNCH_MANUAL_FORCED: 'manual_barcode_camera_forced',
ERROR: {
actions: ['saveError'],
target: 'error',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseBack', 'saveDriverLicenseError'],
target: 'manual_barcode_camera_error',
},
CLOSE: 'launch_barcode_camera',
},
},
manual_barcode_camera: {
on: {
CAMERA_NEXT: {
actions: 'saveBarcode',
target: 'launch_selfie_camera',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseBack', 'saveDriverLicenseError'],
target: 'manual_barcode_camera_error',
},
CLOSE: 'launch_barcode_camera',
LAUNCH_AUTO: 'barcode_camera',
},
},
manual_barcode_camera_forced: {
on: {
CAMERA_NEXT: {
actions: 'saveBarcode',
target: 'launch_selfie_camera',
},
CAMERA_ERROR: {
actions: ['saveDriverLicenseBack', 'saveDriverLicenseError'],
target: 'manual_dl_camera_error',
},
CLOSE: 'launch_barcode_camera',
},
},
manual_barcode_camera_error: {
on: {
NEXT: 'barcode_camera',
NEXT_MANUAL: 'manual_barcode_camera',
RETRY: 'manual_barcode_camera',
RELAUNCH: 'launch_barcode_camera',
PROCEED: 'launch_selfie_camera',
},
},
desktop_manual_barcode_camera_error: {
on: {
DESKTOP_NEXT_FILE: {
actions: 'saveBarcode',
target: 'desktop_launch_selfie_camera',
},
DESKTOP_ERROR: {
actions: ['saveDriverLicenseBack', 'saveDriverLicenseError'],
target: 'desktop_manual_barcode_camera_error',
},
},
},
passport_camera: {
on: {
CAMERA_NEXT: {
actions: 'savePassport',
target: 'launch_selfie_camera',
},
LAUNCH_MANUAL: 'manual_passport_camera',
ERROR: {
actions: ['saveError'],
target: 'error',
},
},
},
manual_passport_camera: {
on: {
CAMERA_NEXT: {
actions: 'savePassport',
target: 'launch_selfie_camera',
},
CLOSE: 'intro',
},
},
launch_selfie_camera: {
on: {
NEXT: 'selfie_camera',
NEXT_MANUAL: 'manual_selfie_camera',
CAMERA_NEXT: {
actions: 'saveSelfie',
target: 'launch_verify',
},
CAMERA_ERROR: {
actions: ['saveSelfie', 'saveSelfieError'],
target: 'manual_selfie_camera_error',
},
},
},
selfie_camera: {
on: {
CAMERA_NEXT: {
actions: 'saveSelfie',
target: 'launch_verify',
},
LAUNCH_MANUAL: 'manual_selfie_camera',
LAUNCH_MANUAL_FORCED: 'manual_selfie_camera_forced',
CAMERA_ERROR: {
actions: ['saveSelfie', 'saveSelfieError'],
target: 'manual_selfie_camera_error',
},
ERROR: {
actions: ['saveError'],
target: 'error',
},
CLOSE: 'launch_selfie_camera',
},
},
manual_selfie_camera: {
on: {
CAMERA_NEXT: {
actions: 'saveSelfie',
target: 'launch_verify',
},
CAMERA_ERROR: {
actions: ['saveSelfie', 'saveSelfieError'],
target: 'manual_selfie_camera_error',
},
CLOSE: 'launch_selfie_camera',
LAUNCH_AUTO: 'selfie_camera',
},
},
manual_selfie_camera_error: {
on: {
NEXT: 'selfie_camera',
NEXT_MANUAL: 'manual_selfie_camera',
RETRY: 'manual_selfie_camera',
RELAUNCH: 'launch_selfie_camera',
PROCEED: 'launch_verify',
},
},
desktop_manual_selfie_camera_error: {
on: {
DESKTOP_NEXT_FILE: {
actions: 'saveSelfie',
target: 'launch_verify',
},
DESKTOP_ERROR: {
actions: ['safeSelfie', 'saveSelfieError'],
target: 'desktop_manual_selfie_camera_error',
},
},
},
manual_selfie_camera_forced: {
on: {
CAMERA_NEXT: {
actions: 'saveSelfie',
target: 'launch_verify',
},
CLOSE: 'launch_selfie_camera',
},
},
launch_verify: {
on: {
NEXT: 'verify',
},
},
verify: {
on: {
FINAL_VERIFY: {
actions: ['saveUserDataFromMitek'],
target: 'submit_verification',
},
NO_SUPPORT_STATE: {
actions: ['clearData'],
target: 'no_support_state',
},
CLOSE: {
actions: ['clearData'],
target: 'intro',
},
},
},
submit_verification: {
on: {
SUCCESS: 'success',
UPDATE_INFO: {
actions: ['updateUserData'],
},
FAILURE_CONTACT_US: 'failure_contact_us',
FAILURE_NO_CONTACT_US: 'failure_no_contact_us',
CLOSE: 'intro',
},
},
success: {},
failure_contact_us: {},
failure_no_contact_us: {},
no_support_state: {},
error: {},
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment