I'm trying to implement onSearch fetch functionality on coingecko api.So apparently i'm doing everything right.
onLoadMore button is working fine, everything is ok until i enter something in searchbar, then app crashes with error'coins are not iterable'.
I verified the request(https://api.coingecko.com/api/v3/search?query=bitcoin) with postman and it seems to give me back the right response.
Thank you.
import React, { useState, useEffect, useRef } from 'react';
import { Link } from 'react-router-dom';
import axios from 'axios';
import CoinItem from '../CoinItem/CoinItem';
import Coin from '../routes/Coin';
import Spinner from '../Spinner/Spinner'
import searchIcon from './search-3-32.ico'
import './Coins.css';
const Coins = () => {
const [isloading, setIsLoading] = useState(true)
const [coins, setCoins] = useState([]);
const [page, setPage] = useState(1);
const [searchText, setSearchText]= useState()
// const url = 'https://api.coingecko.com/api/v3/coins/markets?vs_currency=eur&order=market_cap_desc&per_page=100&page=1&sparkline=false
const loadMore = () => {
setPage(page => page + 1)
}
const fetchAll = async () => {
if(searchText !== '') {
await axios.get(`https://api.coingecko.com/api/v3/search?query=${searchText}`).then((response) => {
setCoins(response.data)
console.log(response)
}).catch(error => {
console.log(error)
})
}
await axios.get(`https://api.coingecko.com/api/v3/coins/markets?vs_currency=eur&order=market_cap_desc&page=${page}&per_page=10`).then((response) => {
setCoins(coins => [...coins, ...response.data])
// console.log(response)
}).catch(error => {
console.log(error)
})
setIsLoading(false)
}
useEffect(() => {
fetchAll()
}, [page, searchText])
if (isloading) {
return <Spinner />
}
return (
<div className='container'>
<div>
<div className='heading'>
<img src={searchIcon} alt="icon" />
<input
// ref={initial}
className='search'
type="text"
value={searchText}
placeholder='Search coin'
onChange={(e) => setSearchText(escape.target.value)}
/>
</div>
<div className='heading'>
<p>#</p>
<p className='coin-name'>Coin</p>
<p>Price</p>
<p>24h</p>
<p className='hide-mobile'>Volume</p>
<p className='hide-mobile'>Mkt Place</p>
</div>
{coins.map(coins => {
return (
<Link to={`coin/${coins.id}`} element={<Coin />} key={coins.id}>
<CoinItem coins={coins} />
</Link>
)
})}
<button className='load-more' onClick={loadMore}>Load More</button>
</div>
</div>
);
};
export default Coins;