I'm new to coding and I'm trying to replace the content of my useEffect with a hook but I get this error message :
Failed to compile.
./src/pages/Freelances/index.jsx 32:29
Module parse failed: Unexpected token (32:29)
You may need an appropriate loader to handle this file type.
| isLoading = _useFetch.isLoading,
| error = _useFetch.error;
> var freelancersList = data?.freelancersList;
| if (error) {
| return /*#__PURE__*/React.createElement("span", {
Here is my index.jsx file with my useEffect (works perfectly)
import React, { useEffect, useState } from 'react'
import Card from '../../components/Card'
import { Loader } from '../../utils/style/Atoms'
import { useTheme } from '../../utils/hooks'
function Freelances() {
const [isDataLoading, setDataLoading] = useState(false)
const [error, setError] = useState(false)
const [freelancersList, setFreelancesList] = useState([])
const { theme } = useTheme()
useEffect(() => {
async function fetchFreelances() {
setDataLoading(true)
try {
const response = await fetch(`http://localhost:8000/freelances`)
const { freelancersList } = await response.json()
setFreelancesList(freelancersList)
} catch (err) {
console.log('===== error =====', err)
setError(true)
} finally {
setDataLoading(false)
}
}
fetchFreelances()
}, [])
if (error) {
return <span>Oups il y a eu un problème</span>
}
return (
<div>
<PageTitle theme={theme}>Trouvez votre prestataire</PageTitle>
<PageSubtitle theme={theme}>
Chez Shiny nous réunissons les meilleurs profils pour vous.
</PageSubtitle>
{isDataLoading ? (
<LoaderWrapper theme={theme}>
<Loader />
</LoaderWrapper>
) : (
<CardsContainer>
{freelancersList.map((profile, index) => (
<Card
key={`${profile.name}-${index}`}
label={profile.job}
title={profile.name}
picture={profile.picture}
theme={theme}
/>
))}
</CardsContainer>
)}
</div>
)
}
export default Freelances
Here is my hook
import { useState, useEffect, useContext } from 'react'
import { ThemeContext } from '../context'
export function useFetch(url) {
const [data, setData] = useState({})
const [isLoading, setLoading] = useState(true)
const [error, setError] = useState(false)
useEffect(() => {
if (!url) return
setLoading(true)
async function fetchData() {
try {
const response = await fetch(url)
const data = await response.json()
setData(data)
} catch (err) {
console.log(err)
setError(true)
} finally {
setLoading(false)
}
}
fetchData()
}, [url])
return { isLoading, data, error }
}
export function useTheme() {
const { theme, toggleTheme } = useContext(ThemeContext)
return { theme, toggleTheme }
}
Does anyone have an idea on how to make it work with the hook please?
Here is my index.jsx file with my hook (which give the error message shown upon)
import { Link } from 'react-router-dom'
import Card from '../../components/Card'
import { Loader } from '../../utils/style/Atoms'
import { useFetch, useTheme } from '../../utils/hooks'
function Freelances() {
const { theme } = useTheme()
const { data, isLoading, error } = useFetch(
`http://localhost:8000/freelances`
)
const freelancersList = data?.freelancersList
if (error) {
return <span>Il y a un problème</span>
}
return (
<div>
<PageTitle theme={theme}>Trouvez votre prestataire</PageTitle>
<PageSubtitle theme={theme}>
Chez Shiny nous réunissons les meilleurs profils pour vous.
</PageSubtitle>
{isLoading ? (
<LoaderWrapper>
<Loader theme={theme} data-testid="loader" />
</LoaderWrapper>
) : (
<CardsContainer>
{freelancersList?.map((profile) => (
<Link key={`freelance-${profile.id}`} to={`/profile/${profile.id}`}>
<Card
label={profile.job}
title={profile.name}
picture={profile.picture}
theme={theme}
/>
</Link>
))}
</CardsContainer>
)}
</div>
)
}
export default Freelances```