mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-23 01:01:27 +00:00
77 lines
2.7 KiB
TypeScript
77 lines
2.7 KiB
TypeScript
// lib/hooks/useAnalytics.ts
|
|
import { useEffect, useMemo } from 'react';
|
|
import { analyticsService } from '@/lib/services/AnalyticsService';
|
|
import { useWorkoutService } from '@/components/DatabaseProvider';
|
|
import { useSQLiteContext } from 'expo-sqlite';
|
|
import { UnifiedWorkoutHistoryService } from '@/lib/db/services/UnifiedWorkoutHistoryService';
|
|
import { useNDKCurrentUser } from '@/lib/hooks/useNDK';
|
|
|
|
/**
|
|
* Hook to provide access to the analytics service
|
|
* This hook ensures the analytics service is properly initialized with
|
|
* the necessary database services
|
|
*/
|
|
export function useAnalytics() {
|
|
const workoutService = useWorkoutService();
|
|
const db = useSQLiteContext();
|
|
const { isAuthenticated } = useNDKCurrentUser();
|
|
|
|
// Create UnifiedWorkoutHistoryService instance
|
|
const unifiedWorkoutHistoryService = useMemo(() => {
|
|
return new UnifiedWorkoutHistoryService(db);
|
|
}, [db]);
|
|
|
|
// Initialize the analytics service with the necessary services
|
|
useEffect(() => {
|
|
analyticsService.setWorkoutService(workoutService);
|
|
analyticsService.setNostrWorkoutHistoryService(unifiedWorkoutHistoryService);
|
|
|
|
return () => {
|
|
// Clear the cache when the component unmounts
|
|
analyticsService.invalidateCache();
|
|
};
|
|
}, [workoutService, unifiedWorkoutHistoryService]);
|
|
|
|
// Create a memoized object with the analytics methods
|
|
const analytics = useMemo(() => ({
|
|
// Workout statistics
|
|
getWorkoutStats: (period: 'week' | 'month' | 'year' | 'all') =>
|
|
analyticsService.getWorkoutStats(period),
|
|
|
|
// Exercise progress
|
|
getExerciseProgress: (
|
|
exerciseId: string,
|
|
metric: 'weight' | 'reps' | 'volume',
|
|
period: 'month' | 'year' | 'all'
|
|
) => analyticsService.getExerciseProgress(exerciseId, metric, period),
|
|
|
|
// Personal records
|
|
getPersonalRecords: (exerciseIds?: string[], limit?: number) =>
|
|
analyticsService.getPersonalRecords(exerciseIds, limit),
|
|
|
|
// New methods for Profile tab
|
|
getWorkoutFrequency: (period: 'daily' | 'weekly' | 'monthly', limit?: number) =>
|
|
analyticsService.getWorkoutFrequency(period, limit),
|
|
|
|
getVolumeProgression: (period: 'daily' | 'weekly' | 'monthly', limit?: number) =>
|
|
analyticsService.getVolumeProgression(period, limit),
|
|
|
|
getStreakMetrics: () =>
|
|
analyticsService.getStreakMetrics(),
|
|
|
|
getSummaryStatistics: () =>
|
|
analyticsService.getSummaryStatistics(),
|
|
|
|
getMostFrequentExercises: (limit?: number) =>
|
|
analyticsService.getMostFrequentExercises(limit),
|
|
|
|
getWorkoutsByDayOfWeek: () =>
|
|
analyticsService.getWorkoutsByDayOfWeek(),
|
|
|
|
// Cache management
|
|
invalidateCache: () => analyticsService.invalidateCache()
|
|
}), []);
|
|
|
|
return analytics;
|
|
}
|