Files
inji-wallet/machines/bleShare/scan/scanMachine.ts
Alka Prasad a78b2d2ef3 [INJIMOB-1911]: add logic for QR login via deeplink (#1601)
* [INJIMOB-1911]: add logic for QR login via deeplink

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1911]: bump up tuvali version

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1911]: bump up kotlin patch version

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1911]: rename the singleton variable name

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1911]: extract common code in a function

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

* [INJIMOB-1911]: refactor some logic and remove redundant code

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>

---------

Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>
2024-09-10 10:09:06 +05:30

799 lines
29 KiB
TypeScript

/* eslint-disable sonarjs/no-duplicate-string */
import {EventFrom, send, StateFrom} from 'xstate';
import {AppServices} from '../../../shared/GlobalContext';
import {TelemetryConstants} from '../../../shared/telemetry/TelemetryConstants';
import {
getStartEventData,
sendStartEvent,
} from '../../../shared/telemetry/TelemetryUtils';
import {qrLoginMachine} from '../../QrLogin/QrLoginMachine';
// @ts-ignore
import {ScanActions} from './scanActions';
import {ScanGuards} from './scanGuards';
import {ScanModel} from './scanModel';
import {ScanServices} from './scanServices';
const model = ScanModel;
const QR_LOGIN_REF_ID = 'QrLogin';
export const ScanEvents = model.events;
export const scanMachine =
/** @xstate-layout N4IgpgJg5mDOIC5SwMYEMB2BiAygYQCUBRIgOQH0AhAGQFUCBtABgF1FQAHAe1gEsAXXlwzsQAD0QAWAEwAaEAE9EARgCsygHSSAnLu1N1ypkwBs06QF8L81JlyESFAGIB5PLRzM2SENz6DhUQkEGXklBFVVJg0zQ20TJn0AdmlVKxt0bBoiciICAhdGVlE-ASERH2CADjlFRCqTJI1lVJbzYyYUqvSQWwwNFAALMBQAaxx+LgAnNBgsCGEwDV4MADcuUaW+geGxienZsAQV9fQAjC8vEp4ywMrEKJMNJKYqgGYTN+k3qKrtWvCqhMTzeSSiYMkb0kyn+SR62yGI3GkxmcwWGCWJw2W0yOyR+1RRyxZ3Kl2U3k4N3OQQepmerw+Xx+r3+YVpTSqSR0qiSMOUkhMaWsvVxsH4aCm-AACmApgBbXiwPjCPC7Ua4AAqAEECBryFK8gBZACSOBwxpcFDwAAkiHgANJXHylan3BBGeIaJjQpJgzoyVImNkhfkaPS6N5GaTGQUmeGi8WSmXyxXKjCqpGanV6g0EE1mi1W20Ohjk67+co091GJ7e5S+8EBoHBgWqLR6Ixg741OHC7ZiiXS2UKpXlDNjLO6-VG03my3kG12x3SCm+KmVt0tbSSL1mBJffTaA-B9RtvQ1KqSJjSMFVbp93GIsakMASgBGCgAImBVrwUHBkxHNM8TGFYoCwUgiB1SgAE1clILVsk-J1KQrO5QGCaEQVUaFtBaNRpB0RoT0kGpmkkHkrxaAxtHjTAQNGF93y-H8-wA4dU3KBiwIgqCCFg8hP1NRDqCIZDimddd0PEKRlGw3D8NUQj4iSEjjHI1R3m0TTVChe8Mnop9GNfKYP2-X9-1gQDOOEDQpjAABHABXOBBAwcDIOguCyBEsSULXNCKgwxBdDbKprzUMFlDeH5BRPRkND+HkkjMUwjGUOj+iMpjTJYiz2JTUdbPs5zXJ4zz+LgoScF88TVxdDdgoQULEoinl1BioFVBI0M3m0pJtySPrlH0kVDLVHKzNYyzrKK-owAwNA3wAG0gLB-Ia6Tgha8LpEijrYu6uoIlIt4Ygogb9F01R-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-jLTLQ8QK5-BK41h7KRhq7VpKRnTXivBRCw5Z5+7bCgEz544QYh4k45p5py6wHbIIH4YHKcjVrZ684GCpCnQqQCaT7l5i6EGS4k4274qkAP6pbIYhCMKozxD8wzLMLhq-p0joFmAwhlaIKH5gGV4EFkah54Cx5EDx6cz8EabViJzPBlrFqYH-CGqwyNBoHRjAgdyaSxAKH4ELQqFcFqHEAABScuWhdG7eOWbYvInIhh14xhd2Hw9BMh+gPYUIth7BDhgOwOoOCumuPhzCic-h5gKBKQXo0Y7wQWPInIrOERxu9hRB+2M2cAsA82XaSwS2soA6OA1oOoxoRK5AG2U6s686rBge+RHBteRRh2JR9OukXG3m4I4IrmtB-MzwLwOEHwZh14OBbRR+HRDhX2vAP2f2AOi+y+cRkQ+hvh-GyRJhqQMCSkiQck4UzCYIeRShBRnBs+GAaxMRK+2hnh9Y3hBhuxRSKR+6Zgga0YXYRgciwBBu8xleaAKA-4HAPsOsjms4duAozwscmkrw58bwOGQ06RuyVhDQCsIBbBE29kAAVu2mtFCWaOQfAbslQcgb+kEUcSEXIbMfRHgZ9qsLKLwD2goGBMaBAAtIIPwAoFgE4B8jkN8lqNQMaM1rojoZfHdroEjgYKcTFAKA0oCYoRoMyS2myRyVybcQIHyQKSDuQPUcKaKeKfrAIZ3hnj3tnkeK7t-onCWnuOFGYD2MFpgu0ZXmqayeye5JydyTqdEUvrEY-m6Oad3lnn3jaSoMep7oFrFHtPyBPgyTiZXigPZN7CHhwLJhiPJusJsFXnMSqSma+GbhwMcApiSMIJcEGeQkfPupbBMjCAiVljeBcQMKmcWVgLKNNlMBoBwMtN7D2tMHKHmYmW6a2UWemaWacGmRWawPTqyv1tIrIfENuMiW7uoLWHzvzHDOhgmf0IyRNicGgNARAD6dqbydLjgE5lWTDKzhEqkMYH1KVgYKud-gkK3KehSjUoci2YeceaeTyXycQBqAQHBGHhHsaEDl8nTteXzKjDEPeSVlvrpFzhVolC0KlP8OPkUndNeqgLtkSaaFeY8X6uYB7jdFeF+QcvELQWoOMQYF8Q+TUPSf0IMJgBANAe5A9GAEQFMF2ReURR4X6leDuMCDxkiSxvzMGHxolDhLeZgXIueqPL+bwJCYRdCTBShqRCWtCNuhWvhNWqCAjHtAojeMjp-jfKBO5JJuWRgDgLKPlOXM6qXE5KUdQG4EvGDD-O4S1gIVCBRLzv1OfNIflggIZW2DWq0JUpEAmlVtPFZVwDZXZVMA5X7FAE5Y-C5VgG5ZBWDFkiQhpf6ryIlEFmWgYFyLEBUhKs8I0HGSNKzl8C6aldZdObZfZWxJgqVK-O5BqFwEQItPwlle5VBRQF5SaY3FWN2OdkYEgTFOfJiRvqFbpGdNLPWHspeN8BZaMGBM1ecElQ5c-GVN1b1f1atINTlfOHld5RKe3redEFeFQvUq2LyJVVQpYgYDGtCFCHYiNnFVADteUHte1VqZilgJqjyjqiloJRNduLWDGDhJyMnD+qMtCNEOoCkK8OjENDYT9akvFYlW1f+BoMDWtNlR5fOInsnnwVDVvN8G2Map0IXk6QtVCEAojFECzdItruesKBgFwFyfAD4H0NTU1AALRI2IAi1njhjS26CRJ3QrAgmCDMnC03mHqfA4SJCfB1Vwxc6s6bodCmAURfqJy3Q417AoiHAq18yESJRCypCXI5zvAMpNCxDRSRCGBKQxW4GuQtqZo4CsUtqcFW0qAXwmo1BFI57ox87i0RCCiSzMI1VfA56l79iJhDiFRpjjijDB0IBoxGLGGWlyLWxPCcgyp-qtCVYcJIiTRKozSqrSTjVbwx17znaRKJx4yciKWxXV0mRTT5QqoZ1cSpU500HHS6R4RMqs5vnaSbU12Op12D3FRYKHVQA50yGSyJxBZiLTXRTxS+hMJyxmDFop2PgTS9210FRAQawnWQA51dBhi0pXiaSs4vBf4PCkQ+YURyzqDxCJCbVqLkzOo50jQ-AdZmy76QrWwNCnxHixymX-0ooUyL0qJbXuTAN3hnQgrgMWyQNj0jQIwtDs0NlfC6QIO3L13zQ30QA52tDRAdCO5DQRg3iYwBK7zoxMXq2NWLLqI8Ij0x0yABI4yJxfCfB8ZkOJLcJtLD0+WSmghpw3hGLlrQhZHMVjwtIYIHVdWr0yPt7hR9xSqvZJ1mEtgywiUXTlozJHjiNLJtIrLAMNUxBSxchfrXiXZpyQinz+aaSgJxLNISOtI+x8MVLAgmrir-B1UNmQi+PcNJJlzSPXVr5yNhLMKmqXhAi97WHROoL+MaJUNr1kTCHAjejnz1h3gVJghTVf2RhHi2IAk2o3L+POrqo0OoyaBwE0Q3R3itjiyYOyUywyzywukNPFzNM6Nr7+YyXSyJC+HM0Kla76AM0Mh1PbB2oOrTSX02QuoLSYrAP4QxBY3RXfATELVSqYPaQLMWogMsGGSLpQYfYN25LPqfW87GLvH8Y1mjLoyaAdy8gLMZGvAumkY3qwYPMbIMa8gmrLn4PRTIy0Epy7jmA3gZamNd2CZhZ2aqY506VM46Y4z6YSHhCEQKLGaRj1W6BdOqOha2YqYrDLDsVgBYtEuOPWEY3fBHg4Y22fBfpcgtyO13RUvhaqZV5RZoNjNVimwcgC4YH74x2FYRImblpfMyz8s2aCu0uLS-hQBplHXWiKgojhAJPisYZhgywVqRBHjbiGYmrRTG0UTRiNojYfaiuGtuhYSt2+jwzRXvC020FbGh1FIyGZGNVOuV4rBTbFFKiMv1j7O+j7z1U+u-p-AxCyIBYDKkOOtjZ7bfa-b-ZYsfrPD-CDw55MV3ZJuPZ3h7wfDpvKkV530x2o7RBGACOyFXYn0jlAmz7B5B1ituhKRtjTNHhAJggevKB56JDzNQiERfnvAtkQH44cXaMuvkIuMXZ3h7KYWJwoHmBom0KnE6CV35l2GdHE450-BnSFOiG6DiE4YT03hDsvYnGXgtnKGFFhsHZHZYtCFwGXsdw6AEsFZlJ0WQg4RFOAHPtXFdHZurHAPGCaAyyIotzcgDSjHeHv5SygeqP7mXHHsoA3H8A539HaaEOdDDHny0GXiym4bfrwwxQtkglgkQn2M8iJRRQos1AKKjufFRBonq320-DNnYmjn4mEnUM9vLvEuipf0jR0rNhUkF4WF7ShHAYulYe2poCavatQA9XWhcA-bAO9wxDAjCOQg6AvkFZmHBEpy3ixAqdJmqkskanelakAUwcKMWMhHFLMNu5DSQt7gsjwzhQyCzttnpnANeff5RB0OweQgHHxB9Q-lrBHkqX-k6lhcLVlrLXr7HFAh1Jtv9C4WjYrq31ic3k0RaCmAgfoH6BmewyH2UfoU+jhGNKsUQYLtcU8Vdk0NFLtjhhAJt0jRSWGJSxyXXgKXy2JfHlYtySaD3kpBxkpBQL7rSyOORjTNGcH5m2oN-UJUtWA3-g0Ps7NDFNPYpxmz-uhWRjeHs3DSNCMOoun243bf43JXtWpXpXewuUHeehNtmAdyncJDnfoeIzywPlZadCbXbU7e7UE1LCaM4I9V9VawMsld8w3RnS2IY1BY3hBaVX+XMhAiiGTvXMoOQ-PcOXE2idLv6L8jLW7JBWHOA-GJvUgdcjRQChWBWBAA */
model.createMachine(
{
predictableActionArguments: true,
preserveActionOrder: true,
tsTypes: {} as import('./scanMachine.typegen').Typegen0,
schema: {
context: model.initialContext,
events: {} as EventFrom<typeof model>,
},
invoke: {
src: 'monitorConnection',
},
id: 'scan',
initial: 'inactive',
on: {
SCREEN_BLUR: {
target: '#scan.disconnectDevice',
},
SCREEN_FOCUS: {
target: '.checkStorage',
},
BLE_ERROR: {
target: '.handlingBleError',
actions: ['sendBLEConnectionErrorEvent', 'setBleError'],
},
RESET: {
actions: ['removeLoggers', 'resetFlowType', 'resetSelectedVc'],
target: '.checkStorage',
},
DISMISS: {
target: '#scan.reviewing.disconnect',
},
SELECT_VC: {
actions: ['setSelectedVc', 'setFlowType'],
target: '.checkStorage',
},
DISMISS_QUICK_SHARE_BANNER: {
actions: 'resetShowQuickShareSuccessBanner',
target: '.inactive',
},
},
states: {
inactive: {
entry: ['removeLoggers', 'resetFlowType', 'resetSelectedVc'],
},
disconnectDevice: {
invoke: {
src: 'disconnect',
},
on: {
DISCONNECT: {
target: '#scan.inactive',
},
},
},
checkStorage: {
invoke: {
src: 'checkStorageAvailability',
onDone: [
{
cond: 'isMinimumStorageRequiredForAuditEntryReached',
target: 'restrictSharingVc',
},
{
target: 'qrLoginViaDeepLink',
},
],
},
},
qrLoginViaDeepLink: {
on: {
QRLOGIN_VIA_DEEP_LINK: [
{
actions: ['setChildRef', 'setLinkCodeFromDeepLink'],
cond: (_, event) => event.linkCode != '',
target: '#scan.showQrLogin',
},
{
target: 'startPermissionCheck',
},
],
},
},
restrictSharingVc: {},
startPermissionCheck: {
on: {
START_PERMISSION_CHECK: [
{
cond: 'uptoAndroid11',
target: '#scan.checkBluetoothPermission',
},
{
cond: 'isIOS',
target: '#scan.checkBluetoothPermission',
},
{
target: '#scan.checkNearbyDevicesPermission',
},
],
},
},
checkNearbyDevicesPermission: {
initial: 'checking',
states: {
checking: {
invoke: {
src: 'checkNearByDevicesPermission',
},
on: {
NEARBY_ENABLED: {
target: 'enabled',
},
NEARBY_DISABLED: {
target: 'requesting',
},
},
},
requesting: {
invoke: {
src: 'requestNearByDevicesPermission',
},
on: {
NEARBY_ENABLED: {
target: '#scan.checkBluetoothPermission',
},
NEARBY_DISABLED: {
target: '#scan.nearByDevicesPermissionDenied',
},
},
},
enabled: {
always: {
target: '#scan.checkBluetoothPermission',
},
},
},
},
checkBluetoothPermission: {
initial: 'checking',
states: {
checking: {
invoke: {
src: 'checkBluetoothPermission',
},
on: {
BLUETOOTH_PERMISSION_ENABLED: {
actions: 'setReadyForBluetoothStateCheck',
target: 'enabled',
},
BLUETOOTH_PERMISSION_DENIED: {
target: '#scan.bluetoothPermissionDenied',
},
},
},
enabled: {
always: {
target: '#scan.checkBluetoothState',
},
},
},
},
checkBluetoothState: {
initial: 'checking',
states: {
checking: {
invoke: {
src: 'checkBluetoothState',
},
on: {
BLUETOOTH_STATE_ENABLED: {
target: 'enabled',
},
BLUETOOTH_STATE_DISABLED: [
{
cond: 'isIOS',
target: '#scan.checkBluetoothPermission',
},
{
target: 'requesting',
},
],
},
},
requesting: {
invoke: {
src: 'requestBluetooth',
},
on: {
BLUETOOTH_STATE_ENABLED: {
target: 'enabled',
},
BLUETOOTH_STATE_DISABLED: {
target: '#scan.bluetoothDenied',
},
},
},
enabled: {
always: [
{
cond: 'uptoAndroid11',
target: '#scan.checkingLocationState',
},
{
target: '#scan.clearingConnection',
},
],
},
},
},
recheckBluetoothState: {
initial: 'checking',
states: {
checking: {
invoke: {
src: 'checkBluetoothState',
},
on: {
BLUETOOTH_STATE_ENABLED: {
target: 'enabled',
},
BLUETOOTH_STATE_DISABLED: {
target: '#scan.bluetoothDenied',
},
},
},
enabled: {
always: [
{
cond: 'uptoAndroid11',
target: '#scan.checkingLocationState',
},
{
target: '#scan.clearingConnection',
},
],
},
},
},
bluetoothPermissionDenied: {
on: {
APP_ACTIVE: '#scan.checkBluetoothState',
GOTO_SETTINGS: {
actions: 'openBluetoothSettings',
},
},
},
bluetoothDenied: {
on: {
APP_ACTIVE: '#scan.recheckBluetoothState',
},
},
nearByDevicesPermissionDenied: {
on: {
APP_ACTIVE: '#scan.checkNearbyDevicesPermission',
GOTO_SETTINGS: {
actions: 'openAppPermission',
},
},
},
clearingConnection: {
invoke: {
src: 'disconnect',
},
on: {
DISCONNECT: {
target: '#scan.checkFaceAuthConsent',
internal: false,
},
},
after: {
DESTROY_TIMEOUT: {
target: '#scan.checkFaceAuthConsent',
actions: [],
internal: false,
},
},
},
checkFaceAuthConsent: {
entry: 'getFaceAuthConsent',
on: {
STORE_RESPONSE: {
actions: 'updateShowFaceAuthConsent',
target: '#scan.findingConnection',
},
},
},
findingConnection: {
entry: [
'removeLoggers',
'registerLoggers',
'clearUri',
'setChildRef',
'resetFaceCaptureBannerStatus',
],
on: {
SCAN: [
{
target: 'connecting',
cond: 'isOpenIdQr',
actions: ['sendVcSharingStartEvent', 'setUri'],
},
{
target: 'showQrLogin',
cond: 'isQrLogin',
actions: ['sendVcSharingStartEvent', 'setLinkCode'],
},
{
target: 'decodeQuickShareData',
cond: 'isQuickShare',
actions: 'setQuickShareData',
},
{
target: 'invalid',
},
],
},
},
decodeQuickShareData: {
entry: 'loadMetaDataToMemory',
on: {
STORE_RESPONSE: {
target: 'loadVCS',
},
},
},
loadVCS: {
entry: 'loadVCDataToMemory',
on: {
STORE_RESPONSE: {
actions: ['refreshVCs', 'setShowQuickShareSuccessBanner'],
target: '.navigatingToHome',
},
},
initial: 'idle',
states: {
idle: {},
navigatingToHome: {},
},
},
showQrLogin: {
invoke: {
id: 'QrLogin',
src: qrLoginMachine,
onDone: {
target: '.storing',
},
},
on: {
DISMISS: {
target: '#scan.checkFaceAuthConsent',
actions: ['resetLinkCode'],
},
},
initial: 'idle',
states: {
idle: {},
storing: {
entry: ['storeLoginItem'],
on: {
STORE_RESPONSE: {
target: 'navigatingToHistory',
actions: ['storingActivityLog'],
},
},
},
navigatingToHistory: {},
},
entry: [
'sendScanData',
() =>
sendStartEvent(
getStartEventData(TelemetryConstants.FlowType.qrLogin),
),
],
exit: ['resetLinkCode'],
},
connecting: {
invoke: {
src: 'startConnection',
},
initial: 'inProgress',
after: {
CONNECTION_TIMEOUT: {
target: '.timeout',
internal: true,
},
},
states: {
inProgress: {
on: {
CANCEL: {
target: '#scan.reviewing.cancelling',
},
},
},
timeout: {
on: {
STAY_IN_PROGRESS: {
target: 'inProgress',
},
CANCEL: {
target: '#scan.reviewing.cancelling',
},
RETRY: {
target: '#scan.reviewing.cancelling',
},
},
},
},
on: {
CONNECTED: {
target: 'reviewing',
actions: ['setSenderInfo', 'setReceiverInfo'],
},
},
},
reviewing: {
initial: 'idle',
entry: [send('CHECK_FLOW_TYPE')],
on: {
CHECK_FLOW_TYPE: [
{
cond: 'isFlowTypeSimpleShare',
target: '.selectingVc',
},
{
cond: 'isFlowTypeMiniViewShare',
target: '.sendingVc',
actions: 'setShareLogTypeUnverified',
},
{
cond: 'isFlowTypeMiniViewShareWithSelfie',
target: '.checkFaceAuthConsentForMiniView',
},
],
},
states: {
idle: {},
selectingVc: {
on: {
DISCONNECT: {
target: '#scan.disconnected',
},
SELECT_VC: {
actions: ['setSelectedVc', 'setFlowType'],
},
VERIFY_AND_ACCEPT_REQUEST: [
{
cond: 'showFaceAuthConsentScreen',
target: 'faceVerificationConsent',
},
{
target: 'verifyingIdentity',
},
],
ACCEPT_REQUEST: {
target: 'sendingVc',
actions: [
'setShareLogTypeUnverified',
'resetFaceCaptureBannerStatus',
],
},
CANCEL: {
target: 'cancelling',
actions: 'sendVCShareFlowCancelEndEvent',
},
},
},
cancelling: {
always: {
target: '#scan.clearingConnection',
},
},
sendingVc: {
invoke: {
src: 'sendVc',
},
after: {
SHARING_TIMEOUT: {
target: '.timeout',
internal: true,
},
},
initial: 'inProgress',
states: {
inProgress: {
on: {
CANCEL: {
target: '#scan.reviewing.cancelling',
actions: ['sendVCShareFlowCancelEndEvent'],
},
CLOSE_BANNER: {
actions: ['resetFaceCaptureBannerStatus'],
},
},
},
timeout: {
on: {
STAY_IN_PROGRESS: {
target: 'inProgress',
},
CANCEL: {
target: '#scan.reviewing.cancelling',
actions: ['sendVCShareFlowTimeoutEndEvent'],
},
RETRY: {
target: '#scan.reviewing.cancelling',
actions: ['sendVCShareFlowTimeoutEndEvent'],
},
},
},
sent: {
description:
'VC data has been shared and the receiver should now be viewing it',
on: {
CANCEL: {
target: '#scan.reviewing.cancelling',
},
},
},
},
on: {
DISCONNECT: {
target: '#scan.disconnected',
},
VC_SENT: {
target: '.sent',
},
VC_ACCEPTED: {
target: '#scan.reviewing.accepted',
},
VC_REJECTED: {
target: '#scan.reviewing.rejected',
},
CANCEL: {
target: '#scan.reviewing.cancelling',
},
},
},
accepted: {
entry: ['logShared', 'sendVcShareSuccessEvent'],
on: {
DISMISS: {
target: 'disconnect',
},
GOTO_HISTORY: {
target: 'navigateToHistory',
},
},
},
rejected: {
on: {
RETRY: {
target: '#scan.clearingConnection',
},
},
},
disconnect: {
entry: [
'resetFlowType',
'resetSelectedVc',
'resetShowQuickShareSuccessBanner',
],
invoke: {
src: 'disconnect',
},
},
navigateToHistory: {
entry: ['resetFlowType', 'resetSelectedVc'],
always: '#scan.disconnected',
},
checkFaceAuthConsentForMiniView: {
always: [
{
cond: 'showFaceAuthConsentScreen',
target: 'faceVerificationConsent',
},
{
target: 'verifyingIdentity',
},
],
},
faceVerificationConsent: {
on: {
FACE_VERIFICATION_CONSENT: {
actions: [
'setShowFaceAuthConsent',
'storeShowFaceAuthConsent',
],
target: 'verifyingIdentity',
},
DISMISS: [
{
cond: 'isFlowTypeMiniViewShareWithSelfie',
target: '#scan.checkFaceAuthConsent',
},
{
target: '#scan.reviewing.selectingVc',
},
],
},
},
verifyingIdentity: {
on: {
FACE_VALID: {
target: 'sendingVc',
actions: [
'setShareLogTypeVerified',
'updateFaceCaptureBannerStatus',
],
},
FACE_INVALID: {
target: 'invalidIdentity',
actions: 'logFailedVerification',
},
CANCEL: [
{
cond: 'isFlowTypeSimpleShare',
target: 'selectingVc',
},
{
target: 'cancelling',
},
],
},
},
invalidIdentity: {
on: {
DISMISS: [
{
cond: 'isFlowTypeSimpleShare',
target: 'selectingVc',
},
{
target: 'cancelling',
},
],
RETRY_VERIFICATION: {
target: 'verifyingIdentity',
},
},
},
},
},
disconnected: {
on: {
RETRY: {
target: '#scan.reviewing.cancelling',
},
DISMISS: {
target: '#scan.reviewing.disconnect',
},
},
},
handlingBleError: {
on: {
RETRY: {
target: '#scan.reviewing.cancelling',
},
DISMISS: {
target: '#scan.clearingConnection',
},
},
},
invalid: {
on: {
DISMISS: {
target: '#scan.clearingConnection',
},
},
},
checkingLocationState: {
initial: 'checkLocationService',
states: {
checkLocationService: {
invoke: {
src: 'checkLocationStatus',
},
on: {
LOCATION_ENABLED: {
target: 'checkingPermissionStatus',
},
LOCATION_DISABLED: {
target: 'LocationPermissionRationale',
},
},
},
LocationPermissionRationale: {
on: {
APP_ACTIVE: {
target: 'checkLocationService',
},
ALLOWED: {
actions: 'enableLocation',
},
DENIED: {
target: 'disabled',
},
},
},
checkingPermissionStatus: {
invoke: {
src: 'checkLocationPermission',
},
on: {
LOCATION_ENABLED: {
target: '#scan.clearingConnection',
},
LOCATION_DISABLED: {
target: 'requestToEnableLocation',
},
},
},
requestToEnableLocation: {
invoke: {
src: 'requestToEnableLocationPermission',
},
on: {
LOCATION_ENABLED: {
target: '#scan.clearingConnection',
},
LOCATION_DISABLED: {
target: 'denied',
},
},
},
denied: {
on: {
LOCATION_REQUEST: {
actions: 'openAppPermission',
},
},
},
disabled: {
on: {
LOCATION_REQUEST: {
target: 'checkLocationService',
actions: 'enableLocation',
},
},
},
},
},
},
},
{
actions: ScanActions(model, QR_LOGIN_REF_ID),
services: ScanServices(model),
guards: ScanGuards(),
delays: {
DESTROY_TIMEOUT: 500,
CONNECTION_TIMEOUT: 5 * 1000,
SHARING_TIMEOUT: 15 * 1000,
},
},
);
type State = StateFrom<typeof scanMachine>;
export function createScanMachine(serviceRefs: AppServices) {
return scanMachine.withContext({
...scanMachine.context,
serviceRefs,
});
}