'use client'; import { useQuery } from '@tanstack/react-query'; import { apiFetch } from '@/lib/api/client'; import { isCustomRange, type DateRange } from '@/lib/analytics/range'; import type { LeadSourceAttributionData, MetricBase, OccupancyTimelineData, PipelineFunnelData, RevenueBreakdownData, } from '@/lib/services/analytics.service'; interface MetricResponse { metric: MetricBase; range: DateRange; data: T; } /** * Serialize a DateRange (preset or custom) into the URL query params the * /api/v1/analytics route expects: `range=30d` for presets, or * `range=custom&from=YYYY-MM-DD&to=YYYY-MM-DD` for custom. */ function rangeToQuery(range: DateRange): string { if (isCustomRange(range)) { return `range=custom&from=${range.from}&to=${range.to}`; } return `range=${range}`; } export function useAnalyticsMetric(metric: MetricBase, range: DateRange) { return useQuery({ // Stringify custom ranges into the cache key so React Query treats // each {from,to} pair as its own query - otherwise switching dates // would never refetch. queryKey: ['analytics', metric, range], queryFn: async () => { const res = await apiFetch>( `/api/v1/analytics?metric=${metric}&${rangeToQuery(range)}`, ); return res.data; }, staleTime: 60_000, retry: 2, }); } export const useFunnel = (range: DateRange) => useAnalyticsMetric('pipeline_funnel', range); export const useOccupancy = (range: DateRange) => useAnalyticsMetric('occupancy_timeline', range); export const useRevenue = (range: DateRange) => useAnalyticsMetric('revenue_breakdown', range); export const useLeadSource = (range: DateRange) => useAnalyticsMetric('lead_source_attribution', range);