Files
inji-wallet/screens/Scan/ScanScreenController.ts
adityankannan-tw 1df2d8f26a [INJIMOB-3190]: Add deeplink support for iOS OVP flow (#1913)
* [INJIMOB-3190]: add support for ovp deeplink in ios

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor ovp deeplink

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: show text for ios ovp deeplink flow

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor ovp deeplink flow

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor state variables and extract functions

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: fix additional message shown in android success overlay

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor no sharable vc variable

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor send vp screen and error modal

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor send vp screen and error modal

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3190]: refactor scan machine actions

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>

* [INJIMOB-3153]: fix closing brace issue

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

---------

Signed-off-by: adityankannan-tw <adityan.kannan@thoughtworks.com>
Signed-off-by: Alka Prasad <prasadalka1998@gmail.com>
Co-authored-by: Alka Prasad <prasadalka1998@gmail.com>
2025-05-12 14:39:18 +05:30

126 lines
4.8 KiB
TypeScript

import {useSelector} from '@xstate/react';
import {useContext} from 'react';
import {useTranslation} from 'react-i18next';
import {selectShareableVcsMetadata} from '../../machines/VerifiableCredential/VCMetaMachine/VCMetaSelectors';
import {GlobalContext} from '../../shared/GlobalContext';
import {
selectIsLocationDenied,
selectIsLocationDisabled,
selectIsQrLoginStoring,
selectIsScanning,
selectIsInvalid,
selectIsShowQrLogin,
selectQrLoginRef,
selectIsQuickShareDone,
selectShowQuickShareSuccessBanner,
} from '../../machines/bleShare/scan/scanSelectors';
import {
selectIsBluetoothDenied,
selectIsNearByDevicesPermissionDenied,
selectReadyForBluetoothStateCheck,
selectIsBluetoothPermissionDenied,
selectIsStartPermissionCheck,
selectIsLocationPermissionRationale,
} from '../../machines/bleShare/commonSelectors';
import {ScanEvents} from '../../machines/bleShare/scan/scanMachine';
import {selectIsMinimumStorageRequiredForAuditEntryLimitReached} from '../../machines/bleShare/scan/scanSelectors';
import {BOTTOM_TAB_ROUTES} from '../../routes/routesConstants';
import {MainBottomTabParamList} from '../../routes/routeTypes';
import {useNavigation, NavigationProp} from '@react-navigation/native';
import {selectAuthorizationRequest, selectIsLinkCode} from '../../machines/app';
export function useScanScreen() {
const {t} = useTranslation('ScanScreen');
const {appService} = useContext(GlobalContext);
const scanService = appService.children.get('scan')!!;
const vcMetaService = appService.children.get('vcMeta')!!;
const shareableVcsMetadata = useSelector(
vcMetaService,
selectShareableVcsMetadata,
);
const isLocationDisabled = useSelector(scanService, selectIsLocationDisabled);
const isLocationDenied = useSelector(scanService, selectIsLocationDenied);
const isReadyForBluetoothStateCheck = useSelector(
scanService,
selectReadyForBluetoothStateCheck,
);
const isStartPermissionCheck = useSelector(
scanService,
selectIsStartPermissionCheck,
);
const isNearByDevicesPermissionDenied = useSelector(
scanService,
selectIsNearByDevicesPermissionDenied,
);
const isBluetoothPermissionDenied = useSelector(
scanService,
selectIsBluetoothPermissionDenied,
);
const isBluetoothDenied = useSelector(scanService, selectIsBluetoothDenied);
const locationError = {message: '', button: ''};
const isMinimumStorageRequiredForAuditEntryLimitReached = useSelector(
scanService,
selectIsMinimumStorageRequiredForAuditEntryLimitReached,
);
if (isLocationDisabled) {
locationError.message = t('errors.locationDisabled.message');
locationError.button = t('errors.locationDisabled.button');
} else if (isLocationDenied) {
locationError.message = t('errors.locationDenied.message');
locationError.button = t('errors.locationDenied.button');
}
type ScanScreenNavigation = NavigationProp<MainBottomTabParamList>;
const navigation = useNavigation<ScanScreenNavigation>();
const GOTO_HOME = () => {
scanService.send(ScanEvents.RESET());
navigation.navigate(BOTTOM_TAB_ROUTES.home);
};
const ALLOWED = () => scanService.send(ScanEvents.ALLOWED());
const DENIED = () => scanService.send(ScanEvents.DENIED());
const isLocalPermissionRational = useSelector(
scanService,
selectIsLocationPermissionRationale,
);
const isNoSharableVCs = !shareableVcsMetadata.length;
return {
locationError,
isNoSharableVCs,
isBluetoothPermissionDenied,
isNearByDevicesPermissionDenied,
isLocationDisabled,
isLocationDenied,
isBluetoothDenied,
isStartPermissionCheck,
isReadyForBluetoothStateCheck,
isMinimumStorageRequiredForAuditEntryLimitReached,
isScanning: useSelector(scanService, selectIsScanning),
isQuickShareDone: useSelector(scanService, selectIsQuickShareDone),
showQuickShareSuccessBanner: useSelector(
scanService,
selectShowQuickShareSuccessBanner,
),
selectIsInvalid: useSelector(scanService, selectIsInvalid),
isQrLogin: useSelector(scanService, selectIsShowQrLogin),
isQrLoginstoring: useSelector(scanService, selectIsQrLoginStoring),
isQrRef: useSelector(scanService, selectQrLoginRef),
LOCATION_REQUEST: () => scanService.send(ScanEvents.LOCATION_REQUEST()),
GOTO_SETTINGS: () => scanService.send(ScanEvents.GOTO_SETTINGS()),
DISMISS: () => scanService.send(ScanEvents.DISMISS()),
DISMISS_QUICK_SHARE_BANNER: () =>
scanService.send(ScanEvents.DISMISS_QUICK_SHARE_BANNER()),
START_PERMISSION_CHECK: () =>
scanService.send(ScanEvents.START_PERMISSION_CHECK()),
SCAN: (qrCode: string) => scanService.send(ScanEvents.SCAN(qrCode)),
GOTO_HOME,
ALLOWED,
DENIED,
isLocalPermissionRational,
authorizationRequest: useSelector(appService, selectAuthorizationRequest),
linkcode: useSelector(appService, selectIsLinkCode),
};
}