onboardsync-react-native
Version:
Expo SDK for OnboardSync - Remote onboarding configuration platform with A/B testing
97 lines (88 loc) • 3.35 kB
text/typescript
import { Alert, Linking } from 'react-native';
import { Camera } from 'expo-camera';
import * as MediaLibrary from 'expo-media-library';
import * as Location from 'expo-location';
import * as Contacts from 'expo-contacts';
import * as Notifications from 'expo-notifications';
// import * as Device from 'expo-device';
export class PermissionsHandler {
static async requestPermission(permission: string): Promise<boolean> {
console.log(`[OnboardSync] Requesting permission: ${permission}`);
// Check if running in simulator/emulator
// const isSimulator = !Device.isDevice;
// if (isSimulator) {
// console.log('[OnboardSync] Running in simulator, auto-granting permission');
// return true;
// }
try {
switch (permission) {
case 'camera': {
const { status } = await Camera.requestCameraPermissionsAsync();
const granted = status === 'granted';
console.log(`[OnboardSync] Camera permission ${granted ? 'granted' : 'denied'}`);
if (!granted) {
this.showSettingsAlert('Camera');
}
return granted;
}
case 'photos': {
const { status } = await MediaLibrary.requestPermissionsAsync();
const granted = status === 'granted';
console.log(`[OnboardSync] Photos permission ${granted ? 'granted' : 'denied'}`);
if (!granted) {
this.showSettingsAlert('Photos');
}
return granted;
}
case 'location': {
const { status } = await Location.requestForegroundPermissionsAsync();
const granted = status === 'granted';
console.log(`[OnboardSync] Location permission ${granted ? 'granted' : 'denied'}`);
if (!granted) {
this.showSettingsAlert('Location');
}
return granted;
}
case 'contacts': {
const { status } = await Contacts.requestPermissionsAsync();
const granted = status === 'granted';
console.log(`[OnboardSync] Contacts permission ${granted ? 'granted' : 'denied'}`);
if (!granted) {
this.showSettingsAlert('Contacts');
}
return granted;
}
case 'notification': {
const { status } = await Notifications.requestPermissionsAsync();
const granted = status === 'granted';
console.log(`[OnboardSync] Notifications permission ${granted ? 'granted' : 'denied'}`);
if (!granted) {
this.showSettingsAlert('Notifications');
}
return granted;
}
default:
console.warn(`[OnboardSync] Unknown permission type: ${permission}`);
return false;
}
} catch (error) {
console.error(`[OnboardSync] Error requesting permission ${permission}:`, error);
return false;
}
}
private static showSettingsAlert(permission: string): void {
Alert.alert(
`${permission} Permission Required`,
`Please enable ${permission} access in your device settings to use this feature.`,
[
{ text: 'Cancel', style: 'cancel' },
{
text: 'Open Settings',
onPress: () => {
Linking.openSettings();
}
},
]
);
}
}