UNPKG

expo-geofencing

Version:

Production-ready geofencing and activity recognition for Expo React Native with offline support, security features, and enterprise-grade reliability

139 lines (138 loc) 5.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // Placeholder for native module - will be properly imported in production const ExpoGeofencingNative = { addGeofence: async (_region) => { }, removeGeofence: async (_regionId) => { }, removeAllGeofences: async () => { }, getActiveGeofences: async () => [], startActivityRecognition: async (_intervalMs) => { }, stopActivityRecognition: async () => { }, startLocationUpdates: async (_options) => { }, stopLocationUpdates: async () => { }, setHealthCheckInterval: async (_intervalMs) => { }, forceLocationCheck: async () => ({ latitude: 0, longitude: 0, accuracy: 0, timestamp: 0 }), checkBatteryOptimization: async () => ({ isBatteryOptimized: false, isLocationEnabled: true, deviceInstructions: { manufacturer: 'Generic', instructions: 'No optimization needed', additionalSettings: 'None' } }), requestBatteryOptimizationDisable: async () => true, openLocationSettings: async () => { }, checkSystemStatus: async () => ({ isMonitoringActive: false, activeGeofences: 0, locationServicesEnabled: true, healthCheckInterval: 300000 }), getServiceStatus: async () => ({ isMonitoringActive: false, activeGeofences: 0, locationServicesEnabled: true, healthCheckInterval: 300000 }), requestPermissions: async () => true, addListener: (_event, _callback) => ({ remove: () => { } }) }; const index_1 = require("./index"); class ExpoGeofencingImpl { async addGeofence(region) { if (!(0, index_1.validateGeofenceRegion)(region)) { throw new Error('Invalid geofence region parameters'); } return ExpoGeofencingNative.addGeofence(region); } async removeGeofence(regionId) { return ExpoGeofencingNative.removeGeofence(regionId); } async removeAllGeofences() { return ExpoGeofencingNative.removeAllGeofences(); } async getActiveGeofences() { return ExpoGeofencingNative.getActiveGeofences(); } async startActivityRecognition(intervalMs) { return ExpoGeofencingNative.startActivityRecognition(intervalMs); } async stopActivityRecognition() { return ExpoGeofencingNative.stopActivityRecognition(); } async startLocationUpdates(options) { if (!(0, index_1.validateLocationUpdateOptions)(options)) { throw new Error('Invalid location update options'); } return ExpoGeofencingNative.startLocationUpdates(options); } async stopLocationUpdates() { return ExpoGeofencingNative.stopLocationUpdates(); } addGeofenceListener(callback) { const subscription = ExpoGeofencingNative.addListener('onGeofenceEvent', callback); return () => subscription.remove(); } addActivityListener(callback) { const subscription = ExpoGeofencingNative.addListener('onActivityRecognition', callback); return () => subscription.remove(); } addLocationUpdateListener(callback) { const subscription = ExpoGeofencingNative.addListener('onLocationUpdate', callback); return () => subscription.remove(); } addHealthAlertListener(callback) { const subscription = ExpoGeofencingNative.addListener('onHealthAlert', callback); return () => subscription.remove(); } addServiceStatusListener(callback) { const subscription = ExpoGeofencingNative.addListener('onServiceStatus', callback); return () => subscription.remove(); } // Android-specific functions async checkBatteryOptimization() { return ExpoGeofencingNative.checkBatteryOptimization(); } async requestBatteryOptimizationDisable() { return ExpoGeofencingNative.requestBatteryOptimizationDisable(); } async openLocationSettings() { return ExpoGeofencingNative.openLocationSettings(); } // iOS-specific functions async checkSystemStatus() { return ExpoGeofencingNative.checkSystemStatus(); } async requestPermissions() { return ExpoGeofencingNative.requestPermissions(); } // Common functions async setHealthCheckInterval(intervalMs) { if (intervalMs < 60000) { throw new Error('Health check interval must be at least 60000ms (1 minute)'); } return ExpoGeofencingNative.setHealthCheckInterval(intervalMs); } async forceLocationCheck() { return ExpoGeofencingNative.forceLocationCheck(); } async getServiceStatus() { return ExpoGeofencingNative.getServiceStatus(); } } // Create and export enhanced implementation const ExpoGeofencing = new ExpoGeofencingImpl(); // Auto-setup health monitoring when first geofence is added const originalAddGeofence = ExpoGeofencing.addGeofence.bind(ExpoGeofencing); ExpoGeofencing.addGeofence = async (region) => { await originalAddGeofence(region); // Auto-start health monitoring if not already started try { await ExpoGeofencing.setHealthCheckInterval(5 * 60 * 1000); // 5 minutes } catch (error) { // Ignore if already started or not supported } }; exports.default = ExpoGeofencing;