/** * 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, }; } }