UNPKG

react-native-healthkit-bridge

Version:

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

96 lines (83 loc) 3.05 kB
import { useState, useCallback, useEffect } from 'react'; import { GetQuantitySamplesUseCase } from '../../domain/usecases/GetQuantitySamplesUseCase'; import { RequestAuthorizationUseCase } from '../../domain/usecases/RequestAuthorizationUseCase'; import { HealthKitRepository } from '../../domain/repositories/HealthKitRepository'; import { HealthKitQuantitySample } from '../../domain/entities/HealthKitSample'; export interface UseHealthKitConfig { repository: HealthKitRepository; } export function useHealthKit(config: UseHealthKitConfig) { const [isAvailable, setIsAvailable] = useState<boolean>(false); const [isAuthorized, setIsAuthorized] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false); const [error, setError] = useState<string | null>(null); const getQuantitySamplesUseCase = new GetQuantitySamplesUseCase(config.repository); const requestAuthorizationUseCase = new RequestAuthorizationUseCase(config.repository); useEffect(() => { setIsAvailable(config.repository.isAvailable()); }, [config.repository]); const requestAuthorization = useCallback(async (identifiers?: string[]): Promise<boolean> => { try { setLoading(true); setError(null); let authorized: boolean; if (identifiers && identifiers.length > 0) { authorized = await requestAuthorizationUseCase.executeSelective(identifiers); } else { authorized = await requestAuthorizationUseCase.execute(); } setIsAuthorized(authorized); return authorized; } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Unknown error'; setError(errorMessage); return false; } finally { setLoading(false); } }, [requestAuthorizationUseCase]); const getQuantitySamplesForDays = useCallback(async ( identifier: string, unit: string, days: number ): Promise<HealthKitQuantitySample[]> => { try { setError(null); return await getQuantitySamplesUseCase.executeForDays(identifier, unit, days); } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Unknown error'; setError(errorMessage); throw err; } }, [getQuantitySamplesUseCase]); const getQuantitySamplesForRange = useCallback(async ( identifier: string, unit: string, startDate: Date, endDate: Date ): Promise<HealthKitQuantitySample[]> => { try { setError(null); return await getQuantitySamplesUseCase.execute(identifier, unit, { startDate, endDate }); } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Unknown error'; setError(errorMessage); throw err; } }, [getQuantitySamplesUseCase]); const clearError = useCallback(() => { setError(null); }, []); return { // State isAvailable, isAuthorized, loading, error, // Actions requestAuthorization, getQuantitySamplesForDays, getQuantitySamplesForRange, clearError }; }