mirror of
https://github.com/mosip/inji-wallet.git
synced 2026-01-08 21:18:14 -05:00
* [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>
799 lines
29 KiB
TypeScript
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,
|
|
});
|
|
}
|