All files / src/hooks useProductDetails.ts

100% Statements 18/18
100% Branches 6/6
100% Functions 5/5
100% Lines 18/18

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                              7x 7x 7x   7x 4x 1x 1x 1x 1x     3x 3x 3x   3x               1x       2x     2x     3x       7x    
import { useState, useEffect } from 'react';
import axios from 'axios';
import type { Product } from '../types/products';
import { API_BASE_URL } from '../config';
 
export interface UseProductDetailsReturn {
  product: Product | null;
  loading: boolean;
  error: string | null;
}
 
export function useProductDetails(
  productId: number | null,
  lang: string
): UseProductDetailsReturn {
  const [product, setProduct] = useState<Product | null>(null);
  const [loading, setLoading] = useState<boolean>(productId != null);
  const [error, setError] = useState<string | null>(null);
 
  useEffect(() => {
    if (productId == null) {
      setProduct(null);
      setError(null);
      setLoading(false);
      return;
    }
 
    setLoading(true);
    setError(null);
    setProduct(null);
 
    axios
      .get<{ data: Product }>(
        `${API_BASE_URL}/api/products/${productId}`,
        {
          headers: { 'Accept-Language': lang },
        }
      )
      .then(res => {
        setProduct(res.data.data);
      })
      .catch(err => {
        const msg =
          axios.isAxiosError(err) && err.response?.data?.message
            ? err.response.data.message
            : err.message;
        setError(msg);
      })
      .finally(() => {
        setLoading(false);
      });
  }, [productId, lang]);
 
  return { product, loading, error };
}