Skip to content

Instantly share code, notes, and snippets.

@lamtranweb
Created September 24, 2021 19:55
Show Gist options
  • Select an option

  • Save lamtranweb/c5a4b9179002ae0b934735d5b1ccaade to your computer and use it in GitHub Desktop.

Select an option

Save lamtranweb/c5a4b9179002ae0b934735d5b1ccaade to your computer and use it in GitHub Desktop.

Revisions

  1. lamtranweb created this gist Sep 24, 2021.
    417 changes: 417 additions & 0 deletions machine.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,417 @@
    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: {},
    },
    });