All files / src/hooks useTopProducts.ts

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

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                                                                                                                                                                         
/**
 * useTopProducts Hook
 *
 * Fetches top products by revenue for product performance analytics.
 */

"use client";

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

export interface TopProduct {
  productId: string;
  productName: string;
  revenue: number;
  unitsSold: number;
  percentage: number;
}

interface UseTopProductsResult {
  products: TopProduct[];
  isLoading: boolean;
  error: Error | null;
  days: number;
  setDays: (days: number) => void;
  limit: number;
  setLimit: (limit: number) => void;
  refetch: () => Promise<void>;
}

export function useTopProducts(
  initialDays: number = 30,
  initialLimit: number = 10
): UseTopProductsResult {
  const [products, setProducts] = useState<TopProduct[]>([]);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState<Error | null>(null);
  const [days, setDays] = useState(initialDays);
  const [limit, setLimit] = useState(initialLimit);

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

      const response = await fetch(
        `/api/admin/analytics/products/top?days=${days}&limit=${limit}`
      );

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

      const result = await response.json();

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

  useEffect(() => {
    fetchProducts();
  }, [fetchProducts]);

  return {
    products,
    isLoading,
    error,
    days,
    setDays,
    limit,
    setLimit,
    refetch: fetchProducts,
  };
}

export default useTopProducts;