diff --git a/src/components/metrics/WorldMap.tsx b/src/components/metrics/WorldMap.tsx index 3c8fadb80..4c3ba860e 100644 --- a/src/components/metrics/WorldMap.tsx +++ b/src/components/metrics/WorldMap.tsx @@ -6,6 +6,7 @@ import { useCountryNames, useLocale, useMessages, + useNavigation, useWebsiteMetricsQuery, } from '@/components/hooks'; import { getThemeColors } from '@/lib/colors'; @@ -25,8 +26,10 @@ export function WorldMap({ websiteId, data, ...props }: WorldMapProps) { const { locale } = useLocale(); const { formatMessage, labels } = useMessages(); const { countryNames } = useCountryNames(locale); + const { router, updateParams, query } = useNavigation(); const visitorsLabel = formatMessage(labels.visitors).toLocaleLowerCase(locale); const unknownLabel = formatMessage(labels.unknown); + const canFilter = Boolean(websiteId); const { data: mapData } = useWebsiteMetricsQuery(websiteId, { type: 'country', @@ -41,6 +44,10 @@ export function WorldMap({ websiteId, data, ...props }: WorldMapProps) { if (code === 'AQ') return; const country = metrics?.find(({ x }) => x === code); + if (isFiltered(code)) { + return colors.map.baseColor; + } + if (!country) { return colors.map.fillColor; } @@ -64,6 +71,16 @@ export function WorldMap({ websiteId, data, ...props }: WorldMapProps) { ); }; + const handleClick = (code: string) => { + if (!canFilter || code === 'AQ') return; + const isActive = query.country === `eq.${code}`; + router.push(updateParams({ country: isActive ? undefined : `eq.${code}` })); + }; + + const isFiltered = (code: string) => { + return canFilter && query.country === `eq.${code}`; + }; + return ( handleHover(code)} onMouseOut={() => setTooltipPopup(null)} + onClick={() => handleClick(code)} /> ); });