diff --git a/src/pages/ExcerciseDetail.js b/src/pages/ExcerciseDetail.js index c448c57..4039ea5 100644 --- a/src/pages/ExcerciseDetail.js +++ b/src/pages/ExcerciseDetail.js @@ -1,41 +1,112 @@ import React, { useEffect, useState } from 'react' import {useParams} from 'react-router-dom' -import {Box} from '@mui/material' +import {Box, Typography, Alert, CircularProgress} from '@mui/material' import {fetchData, exerciseOptions, youtubeOptions} from '../utils/fetchData' import Detail from '../components/Detail' import ExerciseVideos from '../components/ExerciseVideos' import SimilarExercises from '../components/SimilarExercises' +import Loader from '../components/Loader' const ExcerciseDetail = () => { const [exerciseDetails, setExerciseDetails] = useState({}) const [exerciseVideos, setExerciseVideos] = useState([]) const [targetMuscleExercises, setTargetMuscleExercisesData] = useState([]) const [equipmentExercises, setEquipmentExercises] = useState([]) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) const {id} = useParams() useEffect(() =>{ const fetchExerciseData = async() =>{ - const exerciseDbUrl = 'https://exercisedb.p.rapidapi.com' - const youtubeSearchUrl = 'https://youtube-search-and-download.p.rapidapi.com' - - const exerciseDetailData = await fetchData(`${exerciseDbUrl}/exercises/exercise/${id}`, exerciseOptions) - setExerciseDetails(exerciseDetailData) - const exerciseVideoData = await fetchData(`${youtubeSearchUrl}/search?query=${exerciseDetailData.name}`, youtubeOptions) - setExerciseVideos(exerciseVideoData.contents) - const targetMuscleExercisesData = await fetchData(`${exerciseDbUrl}/exercises/target/${exerciseDetailData.target}`, exerciseOptions) - setTargetMuscleExercisesData(targetMuscleExercisesData) - const equipmentExercisesData = await fetchData(`${exerciseDbUrl}/exercises/equipment/${exerciseDetailData.equipment}`, exerciseOptions) - setEquipmentExercises(equipmentExercisesData) - } + setIsLoading(true) + setError(null) + + try { + const exerciseDbUrl = 'https://exercisedb.p.rapidapi.com' + const youtubeSearchUrl = 'https://youtube-search-and-download.p.rapidapi.com' + + // Fetch exercise details + const exerciseDetailData = await fetchData(`${exerciseDbUrl}/exercises/exercise/${id}`, exerciseOptions) + setExerciseDetails(exerciseDetailData) + + // Fetch exercise videos + try { + const exerciseVideoData = await fetchData(`${youtubeSearchUrl}/search?query=${exerciseDetailData.name}`, youtubeOptions) + setExerciseVideos(exerciseVideoData.contents || []) + } catch (videoError) { + console.error('Error fetching exercise videos:', videoError) + // Continue with other fetches even if video fetch fails + setExerciseVideos([]) + } + + // Fetch target muscle exercises + try { + const targetMuscleExercisesData = await fetchData(`${exerciseDbUrl}/exercises/target/${exerciseDetailData.target}`, exerciseOptions) + setTargetMuscleExercisesData(targetMuscleExercisesData || []) + } catch (muscleError) { + console.error('Error fetching target muscle exercises:', muscleError) + setTargetMuscleExercisesData([]) + } + + // Fetch equipment exercises + try { + const equipmentExercisesData = await fetchData(`${exerciseDbUrl}/exercises/equipment/${exerciseDetailData.equipment}`, exerciseOptions) + setEquipmentExercises(equipmentExercisesData || []) + } catch (equipmentError) { + console.error('Error fetching equipment exercises:', equipmentError) + setEquipmentExercises([]) + } + } catch (error) { + console.error('Error fetching exercise data:', error) + setError('Failed to load exercise details. Please try again later.') + } finally { + setIsLoading(false) + } + } + fetchExerciseData() }, [id]) + + const handleRetry = () => { + window.location.reload() + } + + if (isLoading) return + + if (error) { + return ( + + + {error} + + + There was a problem loading the exercise details. + + + + ) + } + return ( - + ) } -export default ExcerciseDetail +export default ExcerciseDetail \ No newline at end of file diff --git a/src/utils/fetchData.js b/src/utils/fetchData.js index ea17ac0..2ed2ca1 100644 --- a/src/utils/fetchData.js +++ b/src/utils/fetchData.js @@ -14,7 +14,17 @@ export const youtubeOptions = { }; export const fetchData = async(url, options) =>{ - const response = await fetch(url,options) - const data = await response.json() + try { + const response = await fetch(url, options); + + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const data = await response.json(); return data; + } catch (error) { + console.error(`Error fetching data from ${url}:`, error); + throw error; // Re-throw to allow component-level error handling + } } \ No newline at end of file