mirror of
https://github.com/a-nyx/maputnik-with-pmtiles.git
synced 2025-01-02 22:28:10 +01:00
96 lines
2 KiB
JavaScript
96 lines
2 KiB
JavaScript
import React from 'react';
|
|
import deref from '@mapbox/mapbox-gl-style-spec/deref'
|
|
import tokens from '../config/tokens.json'
|
|
|
|
// Empty style is always used if no style could be restored or fetched
|
|
const emptyStyle = ensureStyleValidity({
|
|
version: 8,
|
|
sources: {},
|
|
layers: [],
|
|
})
|
|
|
|
function generateId() {
|
|
return Math.random().toString(36).substr(2, 9)
|
|
}
|
|
|
|
function ensureHasId(style) {
|
|
if('id' in style) return style
|
|
style.id = generateId()
|
|
return style
|
|
}
|
|
|
|
function ensureHasNoInteractive(style) {
|
|
const changedLayers = style.layers.map(layer => {
|
|
const changedLayer = { ...layer }
|
|
delete changedLayer.interactive
|
|
return changedLayer
|
|
})
|
|
|
|
const nonInteractiveStyle = {
|
|
...style,
|
|
layers: changedLayers
|
|
}
|
|
return nonInteractiveStyle
|
|
}
|
|
|
|
function ensureHasNoRefs(style) {
|
|
const derefedStyle = {
|
|
...style,
|
|
layers: deref(style.layers)
|
|
}
|
|
return derefedStyle
|
|
}
|
|
|
|
function ensureStyleValidity(style) {
|
|
return ensureHasNoInteractive(ensureHasNoRefs(ensureHasId(style)))
|
|
}
|
|
|
|
function indexOfLayer(layers, layerId) {
|
|
for (let i = 0; i < layers.length; i++) {
|
|
if(layers[i].id === layerId) {
|
|
return i
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
function replaceAccessToken(mapStyle, opts={}) {
|
|
const omtSource = mapStyle.sources.openmaptiles
|
|
if(!omtSource) return mapStyle
|
|
if(!omtSource.hasOwnProperty("url")) return mapStyle
|
|
|
|
const metadata = mapStyle.metadata || {}
|
|
let accessToken = metadata['maputnik:openmaptiles_access_token'];
|
|
|
|
if(opts.allowFallback && !accessToken) {
|
|
accessToken = tokens.openmaptiles;
|
|
}
|
|
|
|
if(!accessToken) {
|
|
// Early exit.
|
|
return mapStyle;
|
|
}
|
|
|
|
const changedSources = {
|
|
...mapStyle.sources,
|
|
openmaptiles: {
|
|
...omtSource,
|
|
url: omtSource.url.replace('{key}', accessToken)
|
|
}
|
|
}
|
|
const changedStyle = {
|
|
...mapStyle,
|
|
glyphs: mapStyle.glyphs ? mapStyle.glyphs.replace('{key}', accessToken) : mapStyle.glyphs,
|
|
sources: changedSources
|
|
}
|
|
|
|
return changedStyle
|
|
}
|
|
|
|
export default {
|
|
ensureStyleValidity,
|
|
emptyStyle,
|
|
indexOfLayer,
|
|
generateId,
|
|
replaceAccessToken,
|
|
}
|