import { NativeEventEmitter, NativeModules } from 'react-native'; import NativeTracelet from './NativeTracelet'; import type { Config } from './types/Config'; import type { State } from './types/State'; import type { Location, CurrentPositionOptions, LastKnownLocationOptions, WatchPositionOptions, SQLQuery, } from './types/Location'; import type { Geofence } from './types/Geofence'; import type { MotionChangeEvent, ActivityChangeEvent, ProviderChangeEvent, GeofenceEvent, GeofencesChangeEvent, HeartbeatEvent, HttpEvent, ConnectivityChangeEvent, AuthorizationEvent, HeadlessEvent, Sensors, DeviceInfo, } from './types/Events'; import type { AuthorizationStatus, AccuracyAuthorization } from './types/Enums'; /** Event subscription handle. Call remove() to unsubscribe. */ export interface Subscription { remove(): void; } const emitter = new NativeEventEmitter( NativeModules['TraceletReactNative'] as never ); /** * Tracelet — production-grade background geolocation for React Native. * * All methods are static. The underlying native module is a singleton. */ export class Tracelet { // ── Lifecycle ────────────────────────────────────────────────────── static async ready(config: Config): Promise { return NativeTracelet.ready(config) as Promise; } static async start(): Promise { return NativeTracelet.start() as Promise; } static async stop(): Promise { return NativeTracelet.stop() as Promise; } static async startGeofences(): Promise { return NativeTracelet.startGeofences() as Promise; } static async startPeriodic(): Promise { return NativeTracelet.startPeriodic() as Promise; } static async getState(): Promise { return NativeTracelet.getState() as Promise; } static async setConfig(config: Partial): Promise { return NativeTracelet.setConfig(config) as Promise; } static async reset(config?: Config): Promise { return NativeTracelet.reset(config) as Promise; } // ── Location ─────────────────────────────────────────────────────── static async getCurrentPosition( options?: CurrentPositionOptions ): Promise { return NativeTracelet.getCurrentPosition(options ?? {}) as Promise; } static async getLastKnownLocation( options?: LastKnownLocationOptions ): Promise { return NativeTracelet.getLastKnownLocation(options) as Promise; } static async watchPosition(options: WatchPositionOptions): Promise { return NativeTracelet.watchPosition(options); } static async stopWatchPosition(watchId: number): Promise { return NativeTracelet.stopWatchPosition(watchId); } static async changePace(isMoving: boolean): Promise { return NativeTracelet.changePace(isMoving); } static async getOdometer(): Promise { return NativeTracelet.getOdometer(); } static async setOdometer(value: number): Promise { return NativeTracelet.setOdometer(value) as Promise; } // ── Geofencing ───────────────────────────────────────────────────── static async addGeofence(geofence: Geofence): Promise { return NativeTracelet.addGeofence(geofence); } static async addGeofences(geofences: Geofence[]): Promise { return NativeTracelet.addGeofences(geofences); } static async removeGeofence(identifier: string): Promise { return NativeTracelet.removeGeofence(identifier); } static async removeGeofences(): Promise { return NativeTracelet.removeGeofences(); } static async getGeofences(): Promise { return NativeTracelet.getGeofences() as Promise; } static async getGeofence(identifier: string): Promise { return NativeTracelet.getGeofence(identifier) as Promise; } static async geofenceExists(identifier: string): Promise { return NativeTracelet.geofenceExists(identifier); } // ── Persistence ──────────────────────────────────────────────────── static async getLocations(query?: SQLQuery): Promise { return NativeTracelet.getLocations(query) as Promise; } static async getCount(): Promise { return NativeTracelet.getCount(); } static async destroyLocations(): Promise { return NativeTracelet.destroyLocations(); } static async destroyLocation(uuid: string): Promise { return NativeTracelet.destroyLocation(uuid); } static async insertLocation(location: Partial): Promise { return NativeTracelet.insertLocation(location); } // ── HTTP Sync ────────────────────────────────────────────────────── static async sync(): Promise { return NativeTracelet.sync() as Promise; } // ── Permissions ──────────────────────────────────────────────────── static async requestPermission(): Promise { return NativeTracelet.requestPermission() as Promise; } static async getPermissionStatus(): Promise { return NativeTracelet.getPermissionStatus() as Promise; } static async requestNotificationPermission(): Promise { return NativeTracelet.requestNotificationPermission() as Promise; } static async getNotificationPermissionStatus(): Promise { return NativeTracelet.getNotificationPermissionStatus() as Promise; } static async requestMotionPermission(): Promise { return NativeTracelet.requestMotionPermission() as Promise; } static async getMotionPermissionStatus(): Promise { return NativeTracelet.getMotionPermissionStatus() as Promise; } static async requestTemporaryFullAccuracy( purposeKey: string ): Promise { return NativeTracelet.requestTemporaryFullAccuracy( purposeKey ) as Promise; } static async canScheduleExactAlarms(): Promise { return NativeTracelet.canScheduleExactAlarms(); } // ── Utilities ────────────────────────────────────────────────────── static async isPowerSaveMode(): Promise { return NativeTracelet.isPowerSaveMode(); } static async getProviderState(): Promise { return NativeTracelet.getProviderState() as Promise; } static async getSensors(): Promise { return NativeTracelet.getSensors() as Promise; } static async getDeviceInfo(): Promise { return NativeTracelet.getDeviceInfo() as Promise; } // ── Events ───────────────────────────────────────────────────────── static onLocation(callback: (location: Location) => void): Subscription { return emitter.addListener('onLocation', callback); } static onMotionChange( callback: (event: MotionChangeEvent) => void ): Subscription { return emitter.addListener('onMotionChange', callback); } static onActivityChange( callback: (event: ActivityChangeEvent) => void ): Subscription { return emitter.addListener('onActivityChange', callback); } static onProviderChange( callback: (event: ProviderChangeEvent) => void ): Subscription { return emitter.addListener('onProviderChange', callback); } static onGeofence(callback: (event: GeofenceEvent) => void): Subscription { return emitter.addListener('onGeofence', callback); } static onGeofencesChange( callback: (event: GeofencesChangeEvent) => void ): Subscription { return emitter.addListener('onGeofencesChange', callback); } static onHeartbeat( callback: (event: HeartbeatEvent) => void ): Subscription { return emitter.addListener('onHeartbeat', callback); } static onHttp(callback: (event: HttpEvent) => void): Subscription { return emitter.addListener('onHttp', callback); } static onSchedule(callback: (event: HeadlessEvent) => void): Subscription { return emitter.addListener('onSchedule', callback); } static onPowerSaveChange( callback: (isPowerSave: boolean) => void ): Subscription { return emitter.addListener('onPowerSaveChange', callback); } static onConnectivityChange( callback: (event: ConnectivityChangeEvent) => void ): Subscription { return emitter.addListener('onConnectivityChange', callback); } static onEnabledChange(callback: (enabled: boolean) => void): Subscription { return emitter.addListener('onEnabledChange', callback); } static onNotificationAction( callback: (action: string) => void ): Subscription { return emitter.addListener('onNotificationAction', callback); } static onAuthorization( callback: (event: AuthorizationEvent) => void ): Subscription { return emitter.addListener('onAuthorization', callback); } }