|
| 1 | +import { CountriesApi } from 'api' |
| 2 | +import classNames from 'classnames' |
| 3 | +import { ICountryInfo, ICurrencies } from 'components' |
| 4 | +import { FC, useEffect, useState } from 'react' |
| 5 | +import { Link } from 'react-router-dom' |
| 6 | +import classes from './CountryInfo.module.scss' |
| 7 | + |
| 8 | +interface Props { |
| 9 | + country: ICountryInfo |
| 10 | +} |
| 11 | + |
| 12 | +const placeObjectFieldsInArray = (object: object): Array<string> => { |
| 13 | + let array: Array<string> = [] |
| 14 | + |
| 15 | + if (object) { |
| 16 | + Object.entries(object).forEach(([, value]) => array.push(value)) |
| 17 | + } |
| 18 | + |
| 19 | + return array |
| 20 | +} |
| 21 | + |
| 22 | +const getFormattedCurrencies = (currencies: object): Array<string> => { |
| 23 | + let array: Array<string> = [] |
| 24 | + Object.entries(currencies).forEach(([, currency]: [string, ICurrencies]) => { |
| 25 | + array.push(currency.name) |
| 26 | + }) |
| 27 | + return array |
| 28 | +} |
| 29 | + |
| 30 | +export const CountryInfo: FC<Props> = ({ country }): JSX.Element => { |
| 31 | + console.log(country) |
| 32 | + const [borderCounries, setBorderCountries] = useState<Array<ICountryInfo>>([]) |
| 33 | + const languages: Array<string> = placeObjectFieldsInArray(country.languages) |
| 34 | + const currencies = getFormattedCurrencies(country.currencies) |
| 35 | + |
| 36 | + useEffect(() => { |
| 37 | + CountriesApi.getCountriesByAlfaCode(country.borders, { fields: 'name' }).then(response => { |
| 38 | + setBorderCountries(response.data) |
| 39 | + }) |
| 40 | + }, [country]) |
| 41 | + |
| 42 | + return ( |
| 43 | + <div className={classes.root}> |
| 44 | + <img src={country.flags.svg} alt={`flag: ${country.name.common}`} className={classes.flag} /> |
| 45 | + <div className={classes.info}> |
| 46 | + <h2 className={classes.name}>{country.name.common}</h2> |
| 47 | + <div className={classes.stats}> |
| 48 | + <div className={classes.stats_col}> |
| 49 | + <div className={classes.stats_row}> |
| 50 | + <span className={classes.description}>Native Name:</span> |
| 51 | + <span className={classes.value}>{country.name.official}</span> |
| 52 | + </div> |
| 53 | + <div className={classes.stats_row}> |
| 54 | + <span className={classes.description}>Population:</span> |
| 55 | + <span className={classes.value}>{country.population}</span> |
| 56 | + </div> |
| 57 | + <div className={classes.stats_row}> |
| 58 | + <span className={classes.description}>Region:</span> |
| 59 | + <span className={classes.value}>{country.region}</span> |
| 60 | + </div> |
| 61 | + <div className={classes.stats_row}> |
| 62 | + <span className={classes.description}>Sub Region:</span> |
| 63 | + <span className={classes.value}>{country.subregion}</span> |
| 64 | + </div> |
| 65 | + <div className={classes.stats_row}> |
| 66 | + <span className={classes.description}>Capital:</span> |
| 67 | + <span className={classes.value}>{country.capital}</span> |
| 68 | + </div> |
| 69 | + </div> |
| 70 | + <div className={classes.stats_col}> |
| 71 | + <div className={classes.stats_row}> |
| 72 | + <span className={classes.description}>Top Level Domain:</span> |
| 73 | + <span className={classes.value}>{country.tld.join(', ')}</span> |
| 74 | + </div> |
| 75 | + <div className={classes.stats_row}> |
| 76 | + <span className={classes.description}>Currencies:</span> |
| 77 | + <span className={classes.value}>{currencies.join(', ')}</span> |
| 78 | + </div> |
| 79 | + <div className={classes.stats_row}> |
| 80 | + <span className={classes.description}>Languages:</span> |
| 81 | + <span className={classes.value}>{languages.join(', ')}</span> |
| 82 | + </div> |
| 83 | + </div> |
| 84 | + </div> |
| 85 | + <div className={classes.border_countries}> |
| 86 | + <span className={classNames(classes.description, classes.descriptionBorderCountries)}> |
| 87 | + Border Countries: |
| 88 | + </span> |
| 89 | + <div className={classes.borderCountriesWrapper}> |
| 90 | + {country.borders.length !== 0 ? ( |
| 91 | + borderCounries.map(borderCountry => ( |
| 92 | + <Link |
| 93 | + className={classes.buttonBorderCountry} |
| 94 | + key={borderCountry.name.common} |
| 95 | + to={`/${borderCountry.name.common.toLowerCase()}`} |
| 96 | + > |
| 97 | + {borderCountry.name.common} |
| 98 | + </Link> |
| 99 | + )) |
| 100 | + ) : ( |
| 101 | + <span className={classes.valueBorderCountries}>No border countries</span> |
| 102 | + )} |
| 103 | + </div> |
| 104 | + </div> |
| 105 | + </div> |
| 106 | + </div> |
| 107 | + ) |
| 108 | +} |
0 commit comments