@kirz/react-native-toolkit
Version:
Toolkit to speed up React Native development
57 lines (55 loc) • 2.11 kB
JavaScript
import { useCallback } from 'react';
import { checkMultiple, requestMultiple, openSettings } from 'react-native-permissions';
export function usePermissions() {
const checkPermissionStatus = useCallback(async function (permission) {
let request = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
const permissions = typeof permission === 'string' ? [permission] : permission;
const statusesMap = await checkMultiple(permissions);
const statuses = Object.entries(statusesMap).map(x => ({
permission: x[0],
status: x[1]
}));
const grantedPermissions = statuses.filter(x => x.status === 'granted' || x.status === 'limited');
if (grantedPermissions.length === permissions.length) {
return {
status: 'granted'
};
}
const blockedPermissions = statuses.filter(x => x.status === 'blocked' || x.status === 'unavailable');
if (blockedPermissions.length) {
return {
status: 'blocked',
permissions: blockedPermissions.map(x => x.permission)
};
}
const deniedPermissions = statuses.filter(x => x.status === 'denied');
if (!request) {
return {
status: 'blocked',
permissions: deniedPermissions.map(x => x.permission)
};
}
const newStatusesMap = await requestMultiple(deniedPermissions.map(x => x.permission));
const newStatuses = Object.entries(newStatusesMap).map(x => ({
permission: x[0],
status: x[1]
}));
const newGrantedPermissions = newStatuses.filter(x => x.status === 'granted' || x.status === 'limited');
// ToDo: await limited image picker here
if (newGrantedPermissions.length === deniedPermissions.length) {
return {
status: 'granted'
};
}
const newBlockedPermissions = newStatuses.filter(x => x.status === 'blocked' || x.status === 'unavailable');
return {
status: 'blocked',
permissions: newBlockedPermissions.map(x => x.permission)
};
}, []);
return {
checkPermissionStatus,
openSettings
};
}
//# sourceMappingURL=usePermissions.js.map