Files
boc/iom/quixzoom-app/src/utils/permissions.js
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- Add NFC ePassport roadmap (ICAO 9303, eIDAS)
- Add TensorFlow.js edge face detection (BlazeFace)
- Add structured audit logger (GDPR-compliant)
- Risk scoring support

Part of KYC Apple Native UX v1.1.0
2026-06-29 16:24:48 +00:00

129 lines
3.8 KiB
JavaScript

/**
* Permissions Utility
* Handle camera, location, and storage permissions
*/
import { Platform, PermissionsAndroid } from 'react-native';
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions';
/**
* Request camera permission
*/
export async function requestCameraPermission() {
if (Platform.OS === 'ios') {
const result = await check(PERMISSIONS.IOS.CAMERA);
if (result === RESULTS.DENIED) {
return await request(PERMISSIONS.IOS.CAMERA);
}
return result;
} else {
const result = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
{
title: 'Camera Permission',
message: 'quiXzoom needs camera access to capture observations.',
buttonPositive: 'Allow',
buttonNegative: 'Deny',
}
);
return result === PermissionsAndroid.RESULTS.GRANTED ? RESULTS.GRANTED : RESULTS.DENIED;
}
}
/**
* Request location permission
*/
export async function requestLocationPermission() {
if (Platform.OS === 'ios') {
const result = await check(PERMISSIONS.IOS.LOCATION_WHEN_IN_USE);
if (result === RESULTS.DENIED) {
return await request(PERMISSIONS.IOS.LOCATION_WHEN_IN_USE);
}
return result;
} else {
const result = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
title: 'Location Permission',
message: 'quiXzoom needs location access to tag observations with GPS.',
buttonPositive: 'Allow',
buttonNegative: 'Deny',
}
);
return result === PermissionsAndroid.RESULTS.GRANTED ? RESULTS.GRANTED : RESULTS.DENIED;
}
}
/**
* Request storage permission
*/
export async function requestStoragePermission() {
if (Platform.OS === 'ios') {
const result = await check(PERMISSIONS.IOS.PHOTO_LIBRARY);
if (result === RESULTS.DENIED) {
return await request(PERMISSIONS.IOS.PHOTO_LIBRARY);
}
return result;
} else {
const result = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
{
title: 'Storage Permission',
message: 'quiXzoom needs storage access to save observations.',
buttonPositive: 'Allow',
buttonNegative: 'Deny',
}
);
return result === PermissionsAndroid.RESULTS.GRANTED ? RESULTS.GRANTED : RESULTS.DENIED;
}
}
/**
* Request all required permissions
*/
export async function requestAllPermissions() {
const results = await Promise.all([
requestCameraPermission(),
requestLocationPermission(),
requestStoragePermission(),
]);
return {
camera: results[0],
location: results[1],
storage: results[2],
allGranted: results.every(r => r === RESULTS.GRANTED),
};
}
/**
* Check if all permissions are granted
*/
export async function checkPermissions() {
if (Platform.OS === 'ios') {
const [camera, location, storage] = await Promise.all([
check(PERMISSIONS.IOS.CAMERA),
check(PERMISSIONS.IOS.LOCATION_WHEN_IN_USE),
check(PERMISSIONS.IOS.PHOTO_LIBRARY),
]);
return {
camera,
location,
storage,
allGranted: camera === RESULTS.GRANTED && location === RESULTS.GRANTED && storage === RESULTS.GRANTED,
};
} else {
const [camera, location, storage] = await Promise.all([
PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.CAMERA),
PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION),
PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE),
]);
return {
camera: camera ? RESULTS.GRANTED : RESULTS.DENIED,
location: location ? RESULTS.GRANTED : RESULTS.DENIED,
storage: storage ? RESULTS.GRANTED : RESULTS.DENIED,
allGranted: camera && location && storage,
};
}
}