UNPKG

react-native-healthkit-bridge

Version:

A comprehensive React Native bridge for Apple HealthKit with TypeScript support, advanced authorization, and flexible data queries

83 lines (68 loc) 2.42 kB
import { NativeModules, Platform } from 'react-native'; import { HealthKitProvider, HealthKitProviderConfig, HealthKitProviderFactory } from '../types/ProviderTypes'; import { NativeProvider } from './NativeProvider'; export class ProviderFactory implements HealthKitProviderFactory { private static instance: ProviderFactory; private constructor() {} static getInstance(): ProviderFactory { if (!ProviderFactory.instance) { ProviderFactory.instance = new ProviderFactory(); } return ProviderFactory.instance; } createProvider(config?: HealthKitProviderConfig): HealthKitProvider { try { return this.createNativeProvider(config); } catch (error) { console.error('Error creating NativeProvider:', error); throw error; } } private createNativeProvider(config?: HealthKitProviderConfig): HealthKitProvider { try { // Check if native module is available if (!NativeModules.HealthKitBridge) { throw new Error('Native HealthKitBridge module not found. Check if pods were installed correctly.'); } return new NativeProvider(config); } catch (error) { console.error('Error creating NativeProvider:', error); throw error; } } getAvailableProviders(): string[] { const providers: string[] = []; if (Platform.OS === 'ios' && NativeModules.HealthKitBridge) { providers.push('native'); } return providers; } getDefaultProvider(): string { const availableProviders = this.getAvailableProviders(); if (availableProviders.includes('native')) { return 'native'; } throw new Error('NativeProvider is not available. Check if running on physical iOS device and if pods were installed.'); } createDefaultProvider(config?: HealthKitProviderConfig): HealthKitProvider { return this.createProvider(config); } isNativeAvailable(): boolean { return Platform.OS === 'ios' && (!!NativeModules.HealthKitBridge); } getProviderInfo(): { name: string; version: string; available: boolean } { return { name: 'NativeProvider', version: '1.0.0', available: this.isNativeAvailable() }; } getAllProvidersInfo(): Array<{ type: string; name: string; version: string; available: boolean }> { return [ this.getProviderInfo() ].map((info) => ({ type: 'native', ...info })); } }