| 18 | |
| 19 | /* eslint-disable complexity, max-statements */ |
| 20 | function updateLayer(map: MapInstance, id: string, props: LayerProps, prevProps: LayerProps) { |
| 21 | assert(props.id === prevProps.id, 'layer id changed'); |
| 22 | assert(props.type === prevProps.type, 'layer type changed'); |
| 23 | |
| 24 | if (props.type === 'custom' || prevProps.type === 'custom') { |
| 25 | return; |
| 26 | } |
| 27 | |
| 28 | // @ts-ignore filter does not exist in some Layer types |
| 29 | const {layout = {}, paint = {}, filter, minzoom, maxzoom, beforeId} = props; |
| 30 | |
| 31 | if (beforeId !== prevProps.beforeId) { |
| 32 | map.moveLayer(id, beforeId); |
| 33 | } |
| 34 | if (layout !== prevProps.layout) { |
| 35 | const prevLayout = prevProps.layout || {}; |
| 36 | for (const key in layout) { |
| 37 | if (!deepEqual(layout[key], prevLayout[key])) { |
| 38 | map.setLayoutProperty(id, key as any, layout[key]); |
| 39 | } |
| 40 | } |
| 41 | for (const key in prevLayout) { |
| 42 | if (!layout.hasOwnProperty(key)) { |
| 43 | map.setLayoutProperty(id, key as any, undefined); |
| 44 | } |
| 45 | } |
| 46 | } |
| 47 | if (paint !== prevProps.paint) { |
| 48 | const prevPaint = prevProps.paint || {}; |
| 49 | for (const key in paint) { |
| 50 | if (!deepEqual(paint[key], prevPaint[key])) { |
| 51 | map.setPaintProperty(id, key as any, paint[key]); |
| 52 | } |
| 53 | } |
| 54 | for (const key in prevPaint) { |
| 55 | if (!paint.hasOwnProperty(key)) { |
| 56 | map.setPaintProperty(id, key as any, undefined); |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | // @ts-ignore filter does not exist in some Layer types |
| 62 | if (!deepEqual(filter, prevProps.filter)) { |
| 63 | map.setFilter(id, filter); |
| 64 | } |
| 65 | if (minzoom !== prevProps.minzoom || maxzoom !== prevProps.maxzoom) { |
| 66 | map.setLayerZoomRange(id, minzoom, maxzoom); |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | function createLayer(map: MapInstance, id: string, props: LayerProps) { |
| 71 | // @ts-ignore |