react-native-healthkit-bridge
Version:
A comprehensive React Native bridge for Apple HealthKit with TypeScript support, advanced authorization, and flexible data queries
75 lines (74 loc) • 2.84 kB
JavaScript
import { useState, useCallback, useEffect } from 'react';
import { GetQuantitySamplesUseCase } from '../../domain/usecases/GetQuantitySamplesUseCase';
import { RequestAuthorizationUseCase } from '../../domain/usecases/RequestAuthorizationUseCase';
export function useHealthKit(config) {
const [isAvailable, setIsAvailable] = useState(false);
const [isAuthorized, setIsAuthorized] = useState(false);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(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) => {
try {
setLoading(true);
setError(null);
let authorized;
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, unit, days) => {
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, unit, startDate, endDate) => {
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
};
}