All files / src/hooks useRevenueMetrics.ts

0% Statements 0/93
100% Branches 0/0
0% Functions 0/1
0% Lines 0/93

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94                                                                                                                                                                                           
/**
 * useRevenueMetrics Hook
 *
 * Fetches revenue metrics with automatic refresh capabilities.
 */

"use client";

import { useState, useEffect, useCallback } from "react";

interface RevenueMetrics {
  today: number;
  yesterday: number;
  thisWeek: number;
  lastWeek: number;
  thisMonth: number;
  lastMonth: number;
  trend: number;
  averageOrderValue: number;
  totalOrders: number;
}

interface UseRevenueMetricsResult {
  metrics: RevenueMetrics | null;
  isLoading: boolean;
  error: Error | null;
  refetch: () => Promise<void>;
}

const defaultMetrics: RevenueMetrics = {
  today: 0,
  yesterday: 0,
  thisWeek: 0,
  lastWeek: 0,
  thisMonth: 0,
  lastMonth: 0,
  trend: 0,
  averageOrderValue: 0,
  totalOrders: 0,
};

export function useRevenueMetrics(
  autoRefresh: boolean = false,
  refreshInterval: number = 60000
): UseRevenueMetricsResult {
  const [metrics, setMetrics] = useState<RevenueMetrics | null>(null);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState<Error | null>(null);

  const fetchMetrics = useCallback(async () => {
    try {
      setIsLoading(true);
      setError(null);

      const response = await fetch("/api/admin/analytics/revenue");

      if (!response.ok) {
        throw new Error(`Failed to fetch revenue metrics: ${response.status}`);
      }

      const result = await response.json();

      if (result.success && result.data) {
        setMetrics(result.data);
      } else {
        setMetrics(defaultMetrics);
      }
    } catch (err) {
      setError(err instanceof Error ? err : new Error("Unknown error"));
      setMetrics(defaultMetrics);
    } finally {
      setIsLoading(false);
    }
  }, []);

  useEffect(() => {
    fetchMetrics();

    if (autoRefresh) {
      const intervalId = setInterval(fetchMetrics, refreshInterval);
      return () => clearInterval(intervalId);
    }
  }, [fetchMetrics, autoRefresh, refreshInterval]);

  return {
    metrics,
    isLoading,
    error,
    refetch: fetchMetrics,
  };
}

export default useRevenueMetrics;