import { Platform } from 'react-native'; import { HKQuantityTypeIdentifier, HKQuantitySample, getMostRecentQuantitySample, isAvailable, authorize, } from 'react-native-health'; interface HealthData { oxygenSaturation: number | null; heartRate: number | null; lastUpdated: Date | null; } class HealthDataService { private static instance: HealthDataService; private isAuthorized = false; private constructor() {} public static getInstance(): HealthDataService { if (!HealthDataService.instance) { HealthDataService.instance = new HealthDataService(); } return HealthDataService.instance; } async requestAuthorization(): Promise { if (Platform.OS !== 'ios') { return false; } try { const available = await isAvailable(); if (!available) { return false; } const permissions = [ { type: HKQuantityTypeIdentifier.OxygenSaturation, access: 'read' as const }, { type: HKQuantityTypeIdentifier.HeartRate, access: 'read' as const } ]; const authorized = await authorize(permissions); this.isAuthorized = authorized; return authorized; } catch (error) { console.error('Health data authorization error:', error); return false; } } async getOxygenSaturation(): Promise { if (!this.isAuthorized) { return null; } try { const sample: HKQuantitySample | null = await getMostRecentQuantitySample( HKQuantityTypeIdentifier.OxygenSaturation ); if (sample) { return Number(sample.value.toFixed(1)); } return null; } catch (error) { console.error('Error reading oxygen saturation:', error); return null; } } async getHeartRate(): Promise { if (!this.isAuthorized) { return null; } try { const sample: HKQuantitySample | null = await getMostRecentQuantitySample( HKQuantityTypeIdentifier.HeartRate ); if (sample) { return Math.round(sample.value); } return null; } catch (error) { console.error('Error reading heart rate:', error); return null; } } async getHealthData(): Promise { const [oxygenSaturation, heartRate] = await Promise.all([ this.getOxygenSaturation(), this.getHeartRate() ]); return { oxygenSaturation, heartRate, lastUpdated: new Date() }; } } export default HealthDataService.getInstance();