Rework map state
This commit is contained in:
@@ -37,7 +37,7 @@ export const MapboxProvider = ({
|
|||||||
zoom: mapState.zoom,
|
zoom: mapState.zoom,
|
||||||
bearing: mapState.bearing,
|
bearing: mapState.bearing,
|
||||||
pitch: mapState.pitch,
|
pitch: mapState.pitch,
|
||||||
style: mapState.style.data,
|
style: MapStyles[mapState.style].data,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -81,10 +81,10 @@ export const MapboxProvider = ({
|
|||||||
}, [map, mapState.latLng]);
|
}, [map, mapState.latLng]);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (['Light', 'Dark'].includes(mapState.style.title)) {
|
if (['Light', 'Dark'].includes(mapState.style)) {
|
||||||
dispatch(setMapStyle(darkMode ? MapStyles.Dark : MapStyles.Light));
|
dispatch(setMapStyle(darkMode ? 'Dark' : 'Light'));
|
||||||
}
|
}
|
||||||
}, [dispatch, darkMode, mapState.style.title]);
|
}, [dispatch, darkMode, mapState.style]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hill Shading
|
* Hill Shading
|
||||||
@@ -125,7 +125,7 @@ export const MapboxProvider = ({
|
|||||||
*/
|
*/
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (map?.loaded()) {
|
if (map?.loaded()) {
|
||||||
map.setStyle(mapState.style.data);
|
map.setStyle(MapStyles[mapState.style].data);
|
||||||
}
|
}
|
||||||
}, [map, mapState.style]);
|
}, [map, mapState.style]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import mapboxgl from 'mapbox-gl';
|
import mapboxgl from 'mapbox-gl';
|
||||||
|
|
||||||
import type { MapStyle } from '@app/pages/Map/styles';
|
import type { MapStyleName } from '@app/pages/Map/styles';
|
||||||
import { MapStyles } from '@app/pages/Map/styles';
|
|
||||||
import type { PayloadAction } from '@reduxjs/toolkit';
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
|
|
||||||
@@ -12,7 +11,7 @@ interface MapState {
|
|||||||
bearing: number;
|
bearing: number;
|
||||||
pitch: number;
|
pitch: number;
|
||||||
accessToken: string;
|
accessToken: string;
|
||||||
style: MapStyle;
|
style: MapStyleName;
|
||||||
hillShade: boolean;
|
hillShade: boolean;
|
||||||
exaggeration: boolean;
|
exaggeration: boolean;
|
||||||
}
|
}
|
||||||
@@ -25,10 +24,7 @@ const initialState: MapState = {
|
|||||||
pitch: 0,
|
pitch: 0,
|
||||||
accessToken:
|
accessToken:
|
||||||
'pk.eyJ1Ijoic2FjaGF3IiwiYSI6ImNrNW9meXozZjBsdW0zbHBjM2FnNnV6cmsifQ.3E4n8eFGD9ZOFo-XDVeZnQ',
|
'pk.eyJ1Ijoic2FjaGF3IiwiYSI6ImNrNW9meXozZjBsdW0zbHBjM2FnNnV6cmsifQ.3E4n8eFGD9ZOFo-XDVeZnQ',
|
||||||
style:
|
style: localStorage.getItem('darkModeDisabled') !== 'true' ? 'Dark' : 'Light',
|
||||||
localStorage.getItem('darkModeDisabled') !== 'true'
|
|
||||||
? MapStyles.Dark
|
|
||||||
: MapStyles.Light,
|
|
||||||
hillShade: false,
|
hillShade: false,
|
||||||
exaggeration: true,
|
exaggeration: true,
|
||||||
};
|
};
|
||||||
@@ -49,7 +45,7 @@ export const mapSlice = createSlice({
|
|||||||
setPitch: (state, action: PayloadAction<number>) => {
|
setPitch: (state, action: PayloadAction<number>) => {
|
||||||
state.pitch = action.payload;
|
state.pitch = action.payload;
|
||||||
},
|
},
|
||||||
setMapStyle(state, action: PayloadAction<MapStyle>) {
|
setMapStyle(state, action: PayloadAction<MapStyleName>) {
|
||||||
state.style = action.payload;
|
state.style = action.payload;
|
||||||
},
|
},
|
||||||
setHillShade(state, action: PayloadAction<boolean>) {
|
setHillShade(state, action: PayloadAction<boolean>) {
|
||||||
|
|||||||
@@ -28,22 +28,22 @@ export const MapContainer = (): JSX.Element => {
|
|||||||
(styleName: string, style: MapStyle) => {
|
(styleName: string, style: MapStyle) => {
|
||||||
dispatch(
|
dispatch(
|
||||||
setMapStyle(
|
setMapStyle(
|
||||||
mapState.style.title === styleName
|
mapState.style === styleName
|
||||||
? darkMode
|
? darkMode
|
||||||
? MapStyles.Dark
|
? 'Dark'
|
||||||
: MapStyles.Light
|
: 'Light'
|
||||||
: style,
|
: style.title,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
[dispatch, darkMode, mapState.style.title],
|
[dispatch, darkMode, mapState.style],
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative flex h-full w-full">
|
<div className="relative flex h-full w-full">
|
||||||
<div className="absolute right-0 z-20 m-4 space-y-2 rounded-md border border-gray-300 bg-white p-2 shadow-md dark:border-gray-600 dark:bg-primaryDark">
|
<div className="absolute right-0 z-20 m-4 space-y-2 rounded-md border border-gray-300 bg-white p-2 shadow-md dark:border-gray-600 dark:bg-primaryDark">
|
||||||
<IconButton
|
<IconButton
|
||||||
active={mapState.style.title === 'Satellite'}
|
active={mapState.style === 'Satellite'}
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
ChangeMapStyle('Satellite', MapStyles.Satellite);
|
ChangeMapStyle('Satellite', MapStyles.Satellite);
|
||||||
}}
|
}}
|
||||||
@@ -52,17 +52,17 @@ export const MapContainer = (): JSX.Element => {
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
className={`-m-1 space-y-2 rounded-md border-gray-300 p-1 dark:border-gray-600 ${
|
className={`-m-1 space-y-2 rounded-md border-gray-300 p-1 dark:border-gray-600 ${
|
||||||
mapState.style.title === 'Outdoors' ? 'border' : ''
|
mapState.style === 'Outdoors' ? 'border' : ''
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<IconButton
|
<IconButton
|
||||||
active={mapState.style.title === 'Outdoors'}
|
active={mapState.style === 'Outdoors'}
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
ChangeMapStyle('Outdoors', MapStyles.Outdoors);
|
ChangeMapStyle('Outdoors', MapStyles.Outdoors);
|
||||||
}}
|
}}
|
||||||
icon={<FaDirections />}
|
icon={<FaDirections />}
|
||||||
/>
|
/>
|
||||||
{mapState.style.title === 'Outdoors' && (
|
{mapState.style === 'Outdoors' && (
|
||||||
<IconButton
|
<IconButton
|
||||||
active={mapState.hillShade}
|
active={mapState.hillShade}
|
||||||
onClick={(): void => {
|
onClick={(): void => {
|
||||||
|
|||||||
+13
-2
@@ -1,11 +1,22 @@
|
|||||||
import type { Style } from 'mapbox-gl';
|
import type { Style } from 'mapbox-gl';
|
||||||
|
|
||||||
|
export type MapStyleName =
|
||||||
|
| 'Streets'
|
||||||
|
| 'Outdoors'
|
||||||
|
| 'Light'
|
||||||
|
| 'Dark'
|
||||||
|
| 'Satellite';
|
||||||
|
|
||||||
export interface MapStyle {
|
export interface MapStyle {
|
||||||
title: string;
|
title: MapStyleName;
|
||||||
data: Style | string;
|
data: Style | string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MapStyles = {
|
type MapStyleType = {
|
||||||
|
[mapStyleType in MapStyleName]: MapStyle;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const MapStyles: MapStyleType = {
|
||||||
Streets: {
|
Streets: {
|
||||||
title: 'Streets',
|
title: 'Streets',
|
||||||
data: 'mapbox://styles/mapbox/streets-v11?optimize=true',
|
data: 'mapbox://styles/mapbox/streets-v11?optimize=true',
|
||||||
|
|||||||
Reference in New Issue
Block a user