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 }; } |