From ab659db03a4a039137d85d5cfe1ced6055f3401e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Gonz=C3=A1lez=20Mu=C3=B1oz?= Date: Tue, 7 Nov 2023 16:26:58 +0100 Subject: [PATCH] map: toggle on/off labels --- .../data-tool/content/map/index.tsx | 2 + .../content/map/labels-manager/index.tsx | 41 +++++++++++++++++++ .../map/layers-toolbox/layers-list/index.tsx | 22 ++++++---- .../data-tool/content/map/sync-settings.ts | 2 + 4 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 frontend/src/containers/data-tool/content/map/labels-manager/index.tsx diff --git a/frontend/src/containers/data-tool/content/map/index.tsx b/frontend/src/containers/data-tool/content/map/index.tsx index 017fb0f3..b67146f2 100644 --- a/frontend/src/containers/data-tool/content/map/index.tsx +++ b/frontend/src/containers/data-tool/content/map/index.tsx @@ -9,6 +9,7 @@ import { useAtomValue, useSetAtom } from 'jotai'; import Map, { ZoomControls, Attributions, DrawControls, Drawing } from '@/components/map'; import SidebarContent from '@/components/sidebar-content'; // import Popup from '@/containers/map/popup'; +import LabelsManager from '@/containers/data-tool/content/map/labels-manager'; import LayersToolbox from '@/containers/data-tool/content/map/layers-toolbox'; import { useSyncMapSettings } from '@/containers/data-tool/content/map/sync-settings'; import { cn } from '@/lib/classnames'; @@ -99,6 +100,7 @@ const DataToolMap: React.FC = () => { > {/* */} + diff --git a/frontend/src/containers/data-tool/content/map/labels-manager/index.tsx b/frontend/src/containers/data-tool/content/map/labels-manager/index.tsx new file mode 100644 index 00000000..b1fb08bb --- /dev/null +++ b/frontend/src/containers/data-tool/content/map/labels-manager/index.tsx @@ -0,0 +1,41 @@ +import { useCallback, useEffect } from 'react'; + +import { useMap } from 'react-map-gl'; + +import { useSyncMapSettings } from '@/containers/data-tool/content/map/sync-settings'; + +const LABELS_LAYER_ID = 'country-label'; + +const LabelsManager = () => { + const { default: mapRef } = useMap(); + const [{ labels }] = useSyncMapSettings(); + + const toggleLabels = useCallback(() => { + if (!mapRef) return; + const map = mapRef.getMap(); + + map.setLayoutProperty(LABELS_LAYER_ID, 'visibility', labels ? 'visible' : 'none'); + }, [mapRef, labels]); + + const handleStyleLoad = useCallback(() => { + toggleLabels(); + }, [toggleLabels]); + + useEffect(() => { + if (!mapRef) return; + mapRef.on('style.load', handleStyleLoad); + + return () => { + mapRef.off('style.load', handleStyleLoad); + }; + }, [mapRef, handleStyleLoad]); + + useEffect(() => { + if (!mapRef) return; + toggleLabels(); + }, [mapRef, toggleLabels]); + + return null; +}; + +export default LabelsManager; diff --git a/frontend/src/containers/data-tool/content/map/layers-toolbox/layers-list/index.tsx b/frontend/src/containers/data-tool/content/map/layers-toolbox/layers-list/index.tsx index 8d7f300a..8023771b 100644 --- a/frontend/src/containers/data-tool/content/map/layers-toolbox/layers-list/index.tsx +++ b/frontend/src/containers/data-tool/content/map/layers-toolbox/layers-list/index.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { ComponentProps, useCallback } from 'react'; import { LuChevronDown, LuChevronUp } from 'react-icons/lu'; @@ -8,6 +8,7 @@ import { Switch } from '@/components/ui/switch'; import { useSyncMapLayers, useSyncMapLayerSettings, + useSyncMapSettings, } from '@/containers/data-tool/content/map/sync-settings'; import { useGetLayers } from '@/types/generated/layer'; import { LayerResponseDataObject } from '@/types/generated/strapi.schemas'; @@ -19,6 +20,7 @@ const TABS_ICONS_CLASSES = 'w-5 h-5 -translate-y-[2px]'; const LayersDropdown = (): JSX.Element => { const [activeLayers, setMapLayers] = useSyncMapLayers(); const [, setLayerSettings] = useSyncMapLayerSettings(); + const [{ labels }, setMapSettings] = useSyncMapSettings(); const layersQuery = useGetLayers( { @@ -51,6 +53,16 @@ const LayersDropdown = (): JSX.Element => { [activeLayers, setLayerSettings, setMapLayers] ); + const handleLabelsChange = useCallback( + (active: Parameters['onCheckedChange']>[0]) => { + setMapSettings((prev) => ({ + ...prev, + labels: active, + })); + }, + [setMapSettings] + ); + return (
@@ -83,7 +95,7 @@ const LayersDropdown = (): JSX.Element => { - + @@ -94,11 +106,7 @@ const LayersDropdown = (): JSX.Element => {
  • - {}} - /> + diff --git a/frontend/src/containers/data-tool/content/map/sync-settings.ts b/frontend/src/containers/data-tool/content/map/sync-settings.ts index 6235ce66..81d4580d 100644 --- a/frontend/src/containers/data-tool/content/map/sync-settings.ts +++ b/frontend/src/containers/data-tool/content/map/sync-settings.ts @@ -7,8 +7,10 @@ import { LayerSettings } from '@/types/layers'; const DEFAULT_SYNC_MAP_SETTINGS: { bbox: LngLatBoundsLike; + labels: boolean; } = { bbox: null, + labels: true, }; export const useSyncMapSettings = () => {