import { useState, useMemo } from 'react'; import { ComposableMap, Geographies, Geography, ZoomableGroup } from 'react-simple-maps'; import classNames from 'classnames'; import { colord } from 'colord'; import HoverTooltip from 'components/common/HoverTooltip'; import { ISO_COUNTRIES, MAP_FILE } from 'lib/constants'; import useTheme from 'components/hooks/useTheme'; import useCountryNames from 'components/hooks/useCountryNames'; import useLocale from 'components/hooks/useLocale'; import useMessages from 'components/hooks/useMessages'; import { formatLongNumber } from 'lib/format'; import { percentFilter } from 'lib/filters'; import styles from './WorldMap.module.css'; export function WorldMap({ data, className }) { const [tooltip, setTooltipPopup] = useState(); const { theme, colors } = useTheme(); const { locale } = useLocale(); const { formatMessage, labels } = useMessages(); const countryNames = useCountryNames(locale); const visitorsLabel = formatMessage(labels.visitors).toLocaleLowerCase(locale); const metrics = useMemo(() => (data ? percentFilter(data) : []), [data]); function getFillColor(code) { if (code === 'AQ') return; const country = metrics?.find(({ x }) => x === code); if (!country) { return colors.map.fillColor; } return colord(colors.map.baseColor) [theme === 'light' ? 'lighten' : 'darken'](0.4 * (1.0 - country.z / 100)) .toHex(); } function getOpacity(code) { return code === 'AQ' ? 0 : 1; } function handleHover(code) { if (code === 'AQ') return; const country = metrics?.find(({ x }) => x === code); setTooltipPopup(`${countryNames[code]}: ${formatLongNumber(country?.y || 0)} ${visitorsLabel}`); } return (
{({ geographies }) => { return geographies.map(geo => { const code = ISO_COUNTRIES[geo.id]; return ( handleHover(code)} onMouseOut={() => setTooltipPopup(null)} /> ); }); }} {tooltip && {tooltip}}
); } export default WorldMap;