import { Alert, Platform } from 'react-native'; import { openSettings, Permission, PERMISSIONS, PermissionStatus, requestMultiple, request, RESULTS, requestNotifications, } from 'react-native-permissions'; import { Strings } from '../resources/localization/Strings'; import { Logger } from '../utils/Log'; class PermissionsService { private logger = new Logger('PermissionsService'); public iosPermissions: Permission[] = [ PERMISSIONS.IOS.CAMERA, PERMISSIONS.IOS.MICROPHONE, PERMISSIONS.IOS.PHOTO_LIBRARY, PERMISSIONS.IOS.CONTACTS, ]; public androidPermissions: Permission[] = [ PERMISSIONS.ANDROID.READ_CONTACTS, PERMISSIONS.ANDROID.RECORD_AUDIO, PERMISSIONS.ANDROID.CALL_PHONE, PERMISSIONS.ANDROID.READ_PHONE_STATE, PERMISSIONS.ANDROID.CAMERA, PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE, PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE, ]; public appPermissions: Permission[] = Platform.OS === 'ios' ? this.iosPermissions : this.androidPermissions; public async checkPermission( permission: Permission ): Promise { return request(permission) .then((result) => { return result; }) .catch((error) => { this.logger.error( `something went wrong checkPermission ${permission} with error msg: ${error}` ); return RESULTS.UNAVAILABLE; }); } public async requestIOSNotificationsPermission(): Promise { if (Platform.OS === 'ios'){ return requestNotifications(['alert', 'sound']) .then(({status, settings}) => { return status; }) .catch((error) => { this.logger.error( `something went wrong checkAllPermissionHadBeenRequested with error msg: ${error}` ); return RESULTS.UNAVAILABLE; }); } return RESULTS.UNAVAILABLE; } public async checkMultiPermissionRequest(permissions: Permission[]): Promise { try { const result = await requestMultiple(permissions); const blockedKey = (Object.keys(result) as Permission[]).find( (key: Permission) => result[key] === RESULTS.BLOCKED ); return (blockedKey === undefined || blockedKey === null) ? RESULTS.GRANTED : RESULTS.BLOCKED; } catch (error) { console.error("Something went wrong during permissions check with error msg:", error); return RESULTS.UNAVAILABLE; } } public openSetting() { openSettings().catch(() => this.logger.warn('cannot open settings')); } public openSettingAlert(title: string, msg: string) { return Alert.alert( title, msg, [ { text: Strings.goToSetting, onPress: () => { this.openSetting(); }, }, { text: Strings.cancel, onPress: () => this.logger.info('cancel is pressed'), style: 'cancel', }, ], { cancelable: false } ); } } export const permissionsService = new PermissionsService();