Files
inji-wallet/machines/bleShare/scan/scanServices.ts
KiruthikaJeyashankar 5413671e8e [INJIMOB-3571] | [INJIMOB-3572] | [INJIMOB-3453] Sync release 0.20.0 (#2097)
* [INJIMOB-3453] fix share-with-selfie not coming with vc with face (#2095)

* [INJIMOB-3453] fix share-with-selfie not coming with vc with face and remove mosip vc hardcoding

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-3453] pass issuerHost instead of issuer name in activitylogs

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-3453] exclude processed credentialdata data in ble share

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-3453] refactor: rename vcHasImage to getFaceAtribute

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3453] refactor: modify fallback for face in VC

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3453] fix: inexisting function import

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

---------

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>
Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>
Co-authored-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-3571] | [INJIMOB-3572] refactor: Modify trusted verifiers construction (#2094)

* [INJIMOB-3571] add: modify trusted verifiers

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3571] add: modify trusted verifiers in swift

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3571] refactor: remove unused logs and code

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3572] add: support for unsigned request in pre-registered verifiers

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3572] chore: update openid4vp swift package version

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3571] refactor: revert changes trustedVerifiers cachePreference

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3558] refactor: update vc renderer renderVc to generateCredentualDisplayCOntent

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3559] fix: bridging issue of generateCredentialContent method

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3559] refactor: modify vc renderer native module

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3559] refactor: modify vc renderer native module

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-3559] chore: update vc renderer swift package

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

---------

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

---------

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>
Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>
Co-authored-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>
2025-10-06 15:23:44 +05:30

195 lines
6.1 KiB
TypeScript

import {isLocationEnabled} from 'react-native-device-info';
import { isMinimumStorageLimitReached } from '../../../shared/storage';
import BluetoothStateManager from 'react-native-bluetooth-state-manager';
import {
check,
checkMultiple,
PERMISSIONS,
PermissionStatus,
requestMultiple,
RESULTS,
} from 'react-native-permissions';
import {subscribe} from '../../../shared/openIdBLE/walletEventHandler';
import {
requestLocationPermission,
checkLocationPermissionStatus,
} from '../../../shared/location';
import {isIOS} from '../../../shared/constants';
import {wallet, EventTypes, VerificationStatus} from '../../../shared/tuvali';
import {WalletDataEvent} from '../../../shared/tuvali/types/events';
export const ScanServices = (model: any) => {
return {
checkBluetoothPermission: () => async callback => {
// wait a bit for animation to finish when app becomes active
await new Promise(resolve => setTimeout(resolve, 250));
try {
// Passing Granted for android since permission status is always granted even if its denied.
let response: PermissionStatus = RESULTS.GRANTED;
if (isIOS()) {
response = await check(PERMISSIONS.IOS.BLUETOOTH_PERIPHERAL);
}
if (response === RESULTS.GRANTED) {
callback(model.events.BLUETOOTH_PERMISSION_ENABLED());
} else {
callback(model.events.BLUETOOTH_PERMISSION_DENIED());
}
} catch (e) {
console.error(e);
}
},
checkBluetoothState: () => callback => {
const subscription = BluetoothStateManager.onStateChange(state => {
if (state === 'PoweredOn') {
callback(model.events.BLUETOOTH_STATE_ENABLED());
} else {
callback(model.events.BLUETOOTH_STATE_DISABLED());
}
}, true);
return () => subscription.remove();
},
requestBluetooth: () => callback => {
BluetoothStateManager.requestToEnable()
.then(() => callback(model.events.BLUETOOTH_STATE_ENABLED()))
.catch(() => callback(model.events.BLUETOOTH_STATE_DISABLED()));
},
requestToEnableLocationPermission: () => callback => {
requestLocationPermission(
() => callback(model.events.LOCATION_ENABLED()),
() => callback(model.events.LOCATION_DISABLED()),
);
},
monitorConnection: () => callback => {
const walletErrorCodePrefix = 'TVW';
const subscription = wallet.handleDataEvents(event => {
if (event.type === EventTypes.onDisconnected) {
callback({type: 'DISCONNECT'});
}
if (
event.type === EventTypes.onError &&
event.code.includes(walletErrorCodePrefix)
) {
callback({
type: 'BLE_ERROR',
bleError: {message: event.message, code: event.code},
});
console.error('BLE Exception: ' + event.message);
}
});
return () => subscription.remove();
},
checkNearByDevicesPermission: () => callback => {
checkMultiple([
PERMISSIONS.ANDROID.BLUETOOTH_CONNECT,
PERMISSIONS.ANDROID.BLUETOOTH_SCAN,
])
.then(response => {
if (
response[PERMISSIONS.ANDROID.BLUETOOTH_ADVERTISE] ===
RESULTS.GRANTED &&
response[PERMISSIONS.ANDROID.BLUETOOTH_CONNECT] === RESULTS.GRANTED
) {
callback(model.events.NEARBY_ENABLED());
} else {
callback(model.events.NEARBY_DISABLED());
}
})
.catch(err => {
callback(model.events.NEARBY_DISABLED());
});
},
requestNearByDevicesPermission: () => callback => {
requestMultiple([
PERMISSIONS.ANDROID.BLUETOOTH_SCAN,
PERMISSIONS.ANDROID.BLUETOOTH_CONNECT,
])
.then(response => {
if (
response[PERMISSIONS.ANDROID.BLUETOOTH_SCAN] === RESULTS.GRANTED &&
response[PERMISSIONS.ANDROID.BLUETOOTH_CONNECT] === RESULTS.GRANTED
) {
callback(model.events.NEARBY_ENABLED());
} else {
callback(model.events.NEARBY_DISABLED());
}
})
.catch(err => {
callback(model.events.NEARBY_DISABLED());
});
},
checkLocationPermission: () => callback => {
checkLocationPermissionStatus(
() => callback(model.events.LOCATION_ENABLED()),
() => callback(model.events.LOCATION_DISABLED()),
);
},
checkLocationStatus: () => async callback => {
const isEnabled: boolean = await isLocationEnabled();
if (isEnabled) {
callback(model.events.LOCATION_ENABLED());
} else {
callback(model.events.LOCATION_DISABLED());
}
},
startConnection: (context: any) => callback => {
wallet.startConnection(context.openId4VpUri);
const statusCallback = (event: WalletDataEvent) => {
if (event.type === EventTypes.onSecureChannelEstablished) {
callback({type: 'CONNECTED'});
}
};
const subscription = subscribe(statusCallback);
return () => subscription?.remove();
},
sendVc: context => callback => {
const statusCallback = (event: WalletDataEvent) => {
if (event.type === EventTypes.onDataSent) {
callback({type: 'VC_SENT'});
} else if (event.type === EventTypes.onVerificationStatusReceived) {
callback({
type:
event.status === VerificationStatus.ACCEPTED
? 'VC_ACCEPTED'
: 'VC_REJECTED',
});
}
};
const { processedCredential, ...rest } = context.selectedVc;
const payload = JSON.stringify(rest);
wallet.sendData(
payload
);
const subscription = subscribe(statusCallback);
return () => subscription?.remove();
},
disconnect: () => () => {
try {
console.log('inside wallet disconnect');
wallet.disconnect();
} catch (e) {
// pass
}
},
checkStorageAvailability: () => async () => {
return Promise.resolve(isMinimumStorageLimitReached('minStorageRequiredForAuditEntry'));
},
};
};