diff --git a/modern/src/common/attributes/useServerAttributes .js b/modern/src/common/attributes/useServerAttributes .js new file mode 100644 index 0000000000..fd749f20a7 --- /dev/null +++ b/modern/src/common/attributes/useServerAttributes .js @@ -0,0 +1,8 @@ +import { useMemo } from 'react'; + +export default (t) => useMemo(() => ({ + disableMapLayers: { + name: t('attributeUiDisableMapLayers'), + type: 'string', + }, +}), [t]); diff --git a/modern/src/map/core/useMapStyles.js b/modern/src/map/core/useMapStyles.js index 72f18ebc69..8bac74a3df 100644 --- a/modern/src/map/core/useMapStyles.js +++ b/modern/src/map/core/useMapStyles.js @@ -30,8 +30,10 @@ export default () => { const hereKey = useAttributePreference('hereKey'); const mapboxAccessToken = useAttributePreference('mapboxAccessToken'); const customMapUrl = useSelector((state) => state.session.server?.mapUrl); + const disabledStyles = new Set((useSelector((state) => state.session.server.attributes?.disableMapLayers) || '').split(',') || []); + const activeStyles = []; - return [ + const Styles = [ { id: 'locationIqStreets', title: t('mapLocationIqStreets'), @@ -170,7 +172,7 @@ export default () => { attribute: 'mapboxAccessToken', }, { - id: 'mapboxSatelliteStreet', + id: 'mapboxSatellite', title: t('mapMapboxSatellite'), style: styleCustom( [`https://api.mapbox.com/styles/v1/mapbox/satellite-streets-v11/tiles/{z}/{x}/{y}?access_token=${mapboxAccessToken}`], @@ -185,4 +187,11 @@ export default () => { available: !!customMapUrl, }, ]; + + for (let i = 0; i < Styles.length; i += 1) { + if (!disabledStyles.has(Styles[i].id)) { + activeStyles.push(Styles[i]); + } + } + return activeStyles; }; diff --git a/modern/src/settings/ServerPage.js b/modern/src/settings/ServerPage.js index 26ef5bbf31..6b7cb573e7 100644 --- a/modern/src/settings/ServerPage.js +++ b/modern/src/settings/ServerPage.js @@ -28,6 +28,7 @@ import PageLayout from '../common/components/PageLayout'; import SettingsMenu from './components/SettingsMenu'; import useCommonDeviceAttributes from '../common/attributes/useCommonDeviceAttributes'; import useCommonUserAttributes from '../common/attributes/useCommonUserAttributes'; +import useServerAttributes from '../common/attributes/useServerAttributes '; import { useCatch } from '../reactHelper'; const useStyles = makeStyles((theme) => ({ @@ -58,6 +59,7 @@ const ServerPage = () => { const t = useTranslation(); const commonUserAttributes = useCommonUserAttributes(t); + const commonServerAttributes = useServerAttributes(t); const commonDeviceAttributes = useCommonDeviceAttributes(t); const original = useSelector((state) => state.session.server); @@ -238,7 +240,7 @@ const ServerPage = () => { setItem({ ...item, attributes })} - definitions={{ ...commonUserAttributes, ...commonDeviceAttributes }} + definitions={{ ...commonUserAttributes, ...commonDeviceAttributes, ...commonServerAttributes }} /> diff --git a/web/l10n/en.json b/web/l10n/en.json index b00ecc03a4..b66ea0cb7e 100644 --- a/web/l10n/en.json +++ b/web/l10n/en.json @@ -117,6 +117,7 @@ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes", "attributeUiDisableCalendars": "UI: Disable Calendars", "attributeUiDisableMaintenance": "UI: Disable Maintenance", + "attributeUiDisableMapLayers": "UI: Disable Map Layers", "attributeUiHidePositionAttributes": "UI: Hide Position Attributes", "attributeNotificationTokens": "Notification Tokens", "errorTitle": "Error",