diff --git a/client/src/components/map/MapLayers/MapLayers.tsx b/client/src/components/map/MapLayers/MapLayers.tsx index 8bc2a59..e495f6c 100644 --- a/client/src/components/map/MapLayers/MapLayers.tsx +++ b/client/src/components/map/MapLayers/MapLayers.tsx @@ -1,6 +1,7 @@ -import { Checkbox, Flex, NavLink, Stack } from '@mantine/core' +import { Checkbox, Flex, NavLink, Slider, Stack } from '@mantine/core' +import BaseLayer from 'ol/layer/Base' import Map from 'ol/Map' -import React from 'react' +import React, { useEffect, useState } from 'react' interface MapLayersProps { map: React.MutableRefObject<Map | null> @@ -12,16 +13,49 @@ const MapLayers = ({ return ( <Stack gap='0'> {map.current?.getLayers().getArray() && map.current?.getLayers().getArray().map((layer, index) => ( - <Flex key={`layer-${index}`} gap='xs' align='center'> - <Checkbox.Indicator - checked={layer.getLayerState().visible} - onClick={() => layer.getLayerState().visible ? layer.setVisible(false) : layer.setVisible(true)} - /> - <NavLink p={0} label={layer.get('name')} onClick={() => { console.log(layer.getLayerState()) }} /> - </Flex> + <LayerSetting key={index} index={index} layer={layer} /> ))} </Stack> ) } +interface LayerSettingProps { + index: number; + layer: BaseLayer; +} + +const LayerSetting = ({ + index, + layer +}: LayerSettingProps) => { + const [opacity, setOpacity] = useState(layer.getOpacity()) + const [visible, setVisible] = useState(layer.getLayerState().visible) + + useEffect(() => { + layer.setVisible(visible) + }, [visible, layer]) + + useEffect(() => { + layer.setOpacity(opacity) + }, [opacity, layer]) + + return ( + <Flex key={`layer-${index}`} gap='xs' align='center'> + <Checkbox + checked={visible} + onChange={(e) => setVisible(e.currentTarget.checked)} + /> + <Slider + w='100%' + min={0} + max={1} + step={0.001} + value={opacity} + onChange={(value) => setOpacity(value)} + /> + <NavLink p={0} label={layer.get('name')} onClick={() => { console.log(layer.getLayerState()) }} /> + </Flex> + ) +} + export default MapLayers \ No newline at end of file diff --git a/client/src/components/map/MapSources.ts b/client/src/components/map/MapSources.ts index e398ac9..9e261dc 100644 --- a/client/src/components/map/MapSources.ts +++ b/client/src/components/map/MapSources.ts @@ -20,6 +20,11 @@ const yandexMapsSatelliteSource = new XYZ({ projection: yandexProjection, }) +const customMapSource = new XYZ({ + url: `${import.meta.env.VITE_API_EMS_URL}/tiles/tile/custom/{z}/{x}/{y}`, + attributions: 'Custom map data' +}) + const regionsLayerSource = new VectorSource({ url: 'sakha_republic.geojson', format: new GeoJSON(), @@ -28,5 +33,6 @@ const regionsLayerSource = new VectorSource({ export { googleMapsSatelliteSource, yandexMapsSatelliteSource, - regionsLayerSource + regionsLayerSource, + customMapSource } \ No newline at end of file