react-native-healthkit-bridge
Version:
A comprehensive React Native bridge for Apple HealthKit with TypeScript support, advanced authorization, and flexible data queries
161 lines (160 loc) • 5.33 kB
JavaScript
import { useCallback, useEffect, useState } from 'react';
import { HealthKitBridge } from '../core/HealthKitBridge';
// Singleton instance of HealthKitBridge with proper cleanup
let healthKitInstance = null;
function getHealthKitBridge() {
if (!healthKitInstance) {
healthKitInstance = new HealthKitBridge();
}
return healthKitInstance;
}
// Cleanup function for testing and memory management
export function cleanupHealthKitBridge() {
healthKitInstance = null;
}
// Generic hook for quantitative data
export function useHealthKitQuantity(identifier, unit) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetch = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await getHealthKitBridge().getQuantitySamples(identifier, unit);
// Convert to HealthKitQuantity format
const formattedData = result.map((sample, index) => ({
value: sample.value,
unit,
startDate: Date.now() / 1000 - (index * 86400),
endDate: Date.now() / 1000 - (index * 86400) + 86400
}));
setData(formattedData);
}
catch (e) {
setError((e === null || e === void 0 ? void 0 : e.message) || 'Error fetching data');
}
finally {
setLoading(false);
}
}, [identifier, unit]);
useEffect(() => {
fetch();
}, [fetch]);
return { data, loading, error, refetch: fetch };
}
// Generic hook for categorical data
export function useHealthKitCategory(identifier) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetch = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await getHealthKitBridge().getCategorySamples(identifier);
setData(result);
}
catch (e) {
setError((e === null || e === void 0 ? void 0 : e.message) || 'Error fetching data');
}
finally {
setLoading(false);
}
}, [identifier]);
useEffect(() => {
fetch();
}, [fetch]);
return { data, loading, error, refetch: fetch };
}
// Hook for workouts
export function useHealthKitWorkouts() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetch = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await getHealthKitBridge().getWorkoutsGeneric();
setData(result);
}
catch (e) {
setError((e === null || e === void 0 ? void 0 : e.message) || 'Error fetching data');
}
finally {
setLoading(false);
}
}, []);
useEffect(() => {
fetch();
}, [fetch]);
return { data, loading, error, refetch: fetch };
}
// Hook for available types
export function useHealthKitTypes() {
const [types, setTypes] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchTypes = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await getHealthKitBridge().getAvailableTypes();
setTypes(result);
return result;
}
catch (e) {
const errorMessage = (e === null || e === void 0 ? void 0 : e.message) || 'Error fetching available types';
setError(errorMessage);
return [];
}
finally {
setLoading(false);
}
}, []);
const getTypeInfo = useCallback(async (identifier) => {
setLoading(true);
setError(null);
try {
const result = await getHealthKitBridge().getTypeInfo(identifier);
return result;
}
catch (e) {
const errorMessage = (e === null || e === void 0 ? void 0 : e.message) || 'Error fetching type information';
setError(errorMessage);
return null;
}
finally {
setLoading(false);
}
}, []);
return {
types,
loading,
error,
fetchTypes,
getTypeInfo
};
}
// Hook for provider information
export function useHealthKitProvider() {
const [providerInfo, setProviderInfo] = useState(null);
const [availableProviders, setAvailableProviders] = useState([]);
const [allProvidersInfo, setAllProvidersInfo] = useState([]);
const fetchProviderInfo = useCallback(() => {
const info = getHealthKitBridge().getProviderInfo();
const available = getHealthKitBridge().getAvailableProviders();
const allInfo = getHealthKitBridge().getAllProvidersInfo();
setProviderInfo(info);
setAvailableProviders(available);
setAllProvidersInfo(allInfo);
return { info, available, allInfo };
}, []);
return {
providerInfo,
availableProviders,
allProvidersInfo,
fetchProviderInfo
};
}