"CoinInfo.js:29 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'id') at fetchHistoricData (CoinInfo.js:29:1)"
jatin-choubey opened this issue · 0 comments
jatin-choubey commented
The historic chart is not loading and i am getting this error "CoinInfo.js:29 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'id') at fetchHistoricData (CoinInfo.js:29:1)"
Also when i console.log the coin id, days and currency, "undefined" is being returned.
Here is my context/api.js
export const CoinList = (currency) =>
`https://api.coingecko.com/api/v3/coins/markets?vs_currency=${currency}&order=market_cap_desc&per_page=100&page=1&sparkline=false`;
export const SingleCoin = (id) =>
`https://api.coingecko.com/api/v3/coins/${id}`;
export const HistoricalChart = (id, days = 365, currency) =>
`https://api.coingecko.com/api/v3/coins/${id}/market_chart?vs_currency=${currency}&days=${days}`;
export const TrendingCoins = (currency) =>
`https://api.coingecko.com/api/v3/coins/markets?vs_currency=${currency}&order=gecko_desc&per_page=10&page=1&sparkline=false&price_change_percentage=24h`;
Here is my CoinInfo.js
import { HistoricalChart } from "../config/api";
import { Line } from "react-chartjs-2";
import axios from "axios";
import { useState } from "react";
import { useEffect } from "react";
import { createTheme, ThemeProvider } from "@mui/system";
import SelectButton from "./SelectButton";
import { chartDays } from "../config/data";
import { CryptoState } from "../CryptoContext";
import { CircularProgress } from "@mui/material";
const CoinInfo = ({ coin }) => {
const [historicData, setHistoricData] = useState();
const [days, setDays] = useState(1);
const { currency } = CryptoState();
const [flag, setFlag] = useState(false);
const containerStyle = {
width: "75%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
marginTop: 25,
padding: 40,
};
const fetchHistoricData = async () => {
const { data } = await axios.get(HistoricalChart(coin.id, days, currency));
setFlag(true);
setHistoricData(data.prices);
};
console.log(coin);
useEffect(() => {
fetchHistoricData();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [days]);
const darkTheme = createTheme({
palette: {
primary: {
main: "#fff",
},
type: "dark",
},
});
return (
<ThemeProvider theme={darkTheme}>
<div style={containerStyle}>
{!historicData || !flag ? (
<CircularProgress
style={{ color: "gold" }}
size={250}
thickness={1}
/>
) : (
<>
<Line
data={{
labels: historicData.map((coin) => {
let date = new Date(coin[0]);
let time =
date.getHours() > 12
? `${date.getHours() - 12}:${date.getMinutes()} PM`
: `${date.getHours()}:${date.getMinutes()} AM`;
return days === 1 ? time : date.toLocaleDateString();
}),
datasets: [
{
data: historicData.map((coin) => coin[1]),
label: `Price ( Past ${days} Days ) in ${currency}`,
borderColor: "#EEBC1D",
},
],
}}
options={{
elements: {
point: {
radius: 1,
},
},
}}
/>
<div
style={{
display: "flex",
marginTop: 20,
justifyContent: "space-around",
width: "100%",
}}
>
{chartDays.map((day) => (
<SelectButton
key={day.value}
onClick={() => {
setDays(day.value);
setFlag(false);
}}
selected={day.value === days}
>
{day.label}
</SelectButton>
))}
</div>
</>
)}
</div>
</ThemeProvider>
);
};
export default CoinInfo;