Last time I stopped at the point where I wanted to add data about all cases, deaths and so on. It seemed to be an easy task. I had the data fetched thanks to the useFetch()
hook.
The next step was to create a DataAll.js component and pass the data to this component.
Things I did and problems I encountered.
- I passed data to DataAll.js component and tried to go over them like usual:
{!props.global ? null : (
<StyledGridSection>
{props.global.map((item) => {
const {
cases,
critical,
deaths,
todayRecovered,
todayCases,
todayDeaths,
updated,
} = item;
return (
<>
<div>{cases}</div>
{/* only a small part of my code */}
</>
);
})}
</StyledGridSection>
)}
But the only thing I was getting was an error:
Error: Objects are not valid as a React child (found: object with keys {}). If you meant to render a collection of children, use an array instead.
The error is pretty obvious but I wasn't sure how to resolve it. How to change an object into an array and where in my app I should do it? I was reading about different JS methods but eventually, I had to add square brackets around props.global
while using map() method
{[props.global].map((item) => {})}
- Because I was dealing with large numbers that are difficult to read without commas or spaces, I used
toLocaleString()
method again.
<LargeNums>{deaths.toLocaleString()}</LargeNums>
- this tag is from styled components.
- I also wanted to change the date a bit.
toLocaleString()
method can also take arguments: language and options. I set language to "default" and in options, I specified that I want to have full weekday and month (without abbreviation), day and year as numbers and also time with 2-digit hour and minute.
const options = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
};
- I still should refactor the code to get rid of each repetition of the StyledGridElem but I left it as it was. It's not perfect but it's working.
import React from 'react';
import { StyledGridSection, StyledSection, DateRow } from './modules/Sections';
import {
SectionTitle,
LargeNums,
Subtitle,
SubtitleGrid,
} from './modules/Titles';
import { StyledGridElem } from './modules/GridElem';
const DataAll = (props) => {
return (
<StyledSection>
<SectionTitle>Worldwide</SectionTitle>
{!props.global ? null : (
<StyledGridSection>
{[props.global].map((item) => {
const {
cases,
critical,
deaths,
todayRecovered,
todayCases,
todayDeaths,
updated,
} = item;
const options = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
};
const date = new Date(updated);
return (
<>
<StyledGridElem>
<SubtitleGrid>Total Cases:</SubtitleGrid>
<LargeNums>{cases.toLocaleString()}</LargeNums>
</StyledGridElem>
<StyledGridElem>
<SubtitleGrid>Critical: </SubtitleGrid>
<LargeNums>{critical.toLocaleString()}</LargeNums>
</StyledGridElem>
<StyledGridElem>
<SubtitleGrid>Deaths: </SubtitleGrid>
<LargeNums>{deaths.toLocaleString()}</LargeNums>
</StyledGridElem>
<StyledGridElem>
<SubtitleGrid>Today Cases: </SubtitleGrid>
<LargeNums>{todayCases.toLocaleString()}</LargeNums>
</StyledGridElem>
<StyledGridElem>
<SubtitleGrid>Today Recovered:</SubtitleGrid>
<LargeNums>{todayRecovered.toLocaleString()}</LargeNums>
</StyledGridElem>
<StyledGridElem>
<SubtitleGrid>Today Deaths:</SubtitleGrid>
<LargeNums>{todayDeaths.toLocaleString()}</LargeNums>
</StyledGridElem>
<DateRow>
<Subtitle>Updated: </Subtitle>
<p>{date.toLocaleString('default', options)}</p>
</DateRow>
</>
);
})}
</StyledGridSection>
)}
</StyledSection>
);
};
export default DataAll;
The part of the projects looks now like this:
Next steps:
- Add news about covid
- Add line or bar charts
- Add search functionality
- Change markers on a map
Top comments (0)