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
text/typescript
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
}));
}
}