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