as-app/src/permissions/requestPermissionMotion.js

96 lines
2.5 KiB
JavaScript

import { Platform } from "react-native";
import { check, request, PERMISSIONS, RESULTS } from "react-native-permissions";
import { createLogger } from "~/lib/logger";
import { FEATURE_SCOPES } from "~/lib/logger/scopes";
const permissionLogger = createLogger({
module: FEATURE_SCOPES.PERMISSIONS,
feature: "motion",
});
// Get the correct permission based on platform
const getPermissionType = () => {
if (Platform.OS === "android") {
return PERMISSIONS.ANDROID.ACTIVITY_RECOGNITION;
}
// iOS doesn't require explicit motion/activity permission for background geolocation
permissionLogger.debug("No explicit motion permission needed on iOS");
return null;
};
// Check current permission status
const checkPermission = async () => {
try {
const permissionType = getPermissionType();
if (!permissionType) {
permissionLogger.debug("Motion permission check skipped (iOS)");
return true;
}
permissionLogger.debug("Checking motion permission status", {
permissionType,
platform: Platform.OS,
});
const status = await check(permissionType);
permissionLogger.info("Motion permission status", {
status,
granted: status === RESULTS.GRANTED,
});
return status === RESULTS.GRANTED;
} catch (error) {
permissionLogger.error("Failed to check motion permission", {
error: error.message,
stack: error.stack,
platform: Platform.OS,
});
return false;
}
};
// Request permission if not already granted
const requestPermission = async () => {
try {
const permissionType = getPermissionType();
if (!permissionType) {
permissionLogger.debug("Motion permission request skipped (iOS)");
return true;
}
permissionLogger.info("Requesting motion permission", {
permissionType,
platform: Platform.OS,
});
const status = await request(permissionType);
const granted = status === RESULTS.GRANTED;
permissionLogger.info("Motion permission request result", {
status,
granted,
platform: Platform.OS,
});
if (!granted) {
permissionLogger.warn("Motion permission denied", { status });
}
return granted;
} catch (error) {
permissionLogger.error("Failed to request motion permission", {
error: error.message,
stack: error.stack,
platform: Platform.OS,
});
return false;
}
};
// Export as an object with named functions to prevent undefined function errors
const motionPermissions = {
checkPermission,
requestPermission,
};
export default motionPermissions;