Browse Source

Rework map state

pull/21/head
Sacha Weatherstone 4 years ago
parent
commit
60f5ab8725
  1. 10
      src/components/MapBox/MapboxProvider.tsx
  2. 12
      src/core/slices/mapSlice.ts
  3. 18
      src/pages/Map/MapContainer.tsx
  4. 15
      src/pages/Map/styles.ts

10
src/components/MapBox/MapboxProvider.tsx

@ -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]);

12
src/core/slices/mapSlice.ts

@ -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>) {

18
src/pages/Map/MapContainer.tsx

@ -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 => {

15
src/pages/Map/styles.ts

@ -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',

Loading…
Cancel
Save