@mapcomponents/react-maplibre 0.1.20 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/coverage/clover.xml +195 -198
  3. package/coverage/coverage-final.json +6 -6
  4. package/coverage/lcov-report/index.html +31 -31
  5. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.js.html +1 -1
  6. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  7. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.js.html +1 -1
  8. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  9. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.js.html +1 -1
  10. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +1 -1
  11. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.js.html +1 -1
  12. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  13. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.js.html +1 -1
  14. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  15. package/coverage/lcov-report/src/components/MlGPXViewer/MlGPXViewer.js.html +1 -1
  16. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +1 -1
  17. package/coverage/lcov-report/src/components/MlGPXViewer/index.html +1 -1
  18. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.js.html +4 -4
  19. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  20. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.js.html +1 -1
  21. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +1 -1
  22. package/coverage/lcov-report/src/components/MlLayer/MlLayer.js.html +1 -1
  23. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  24. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.js.html +1 -1
  25. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  26. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.js.html +1 -1
  27. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +1 -1
  28. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +1 -1
  29. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +1 -1
  30. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  31. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  32. package/coverage/lcov-report/src/components/MlMarker/MlMarker.js.html +1 -1
  33. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  34. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.js.html +1 -1
  35. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  36. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.js.html +1 -1
  37. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  38. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +1 -1
  39. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  40. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +1 -1
  41. package/coverage/lcov-report/src/components/MlScaleReference/index.html +1 -1
  42. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +261 -111
  43. package/coverage/lcov-report/src/components/MlShareMapState/index.html +9 -9
  44. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +1 -1
  45. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +1 -1
  46. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +1 -1
  47. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  48. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +1 -1
  49. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  50. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.js.html +94 -124
  51. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +17 -17
  52. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +1 -1
  53. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  54. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.js.html +35 -89
  55. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +17 -17
  56. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.js.html +1 -1
  57. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +1 -1
  58. package/coverage/lcov-report/src/hooks/index.html +1 -1
  59. package/coverage/lcov-report/src/hooks/useMap.js.html +23 -23
  60. package/coverage/lcov-report/src/hooks/useMapState.js.html +34 -34
  61. package/coverage/lcov-report/src/hooks/useWms.js.html +1 -1
  62. package/coverage/lcov-report/src/i18n.js.html +1 -1
  63. package/coverage/lcov-report/src/index.html +1 -1
  64. package/coverage/lcov-report/src/translations/english.js.html +1 -1
  65. package/coverage/lcov-report/src/translations/german.js.html +1 -1
  66. package/coverage/lcov-report/src/translations/index.html +1 -1
  67. package/coverage/lcov.info +334 -329
  68. package/dist/index.esm.js +86 -106
  69. package/dist/index.esm.js.map +1 -1
  70. package/package.json +1 -1
  71. package/scripts/build-catalogue-markdown-docs.js +5 -3
  72. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.js +26 -21
  73. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.test.js +3 -3
  74. package/src/components/MlCreatePdfButton/MlCreatePdfButton.doc.de.md +2 -2
  75. package/src/components/MlCreatePdfButton/MlCreatePdfButton.doc.en.md +3 -0
  76. package/src/components/MlFeatureEditor/MlFeatureEditor.test.js +2 -2
  77. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.js +3 -3
  78. package/src/components/MlNavigationCompass/MlNavigationCompass.test.js +2 -2
  79. package/src/components/MlShareMapState/MlShareMapState.js +138 -88
  80. package/src/components/MlShareMapState/MlShareMapState.stories.js +79 -29
  81. package/src/components/MlVectorTileLayer/MlVectorTileLayer.js +65 -75
  82. package/src/components/MlVectorTileLayer/MlVectorTileLayer.test.js +6 -6
  83. package/src/components/MlWmsLayer/MlWmsLayer.js +16 -34
  84. package/src/hooks/useMap.js +1 -1
@@ -1,5 +1,5 @@
1
- import React, { useContext, useRef, useEffect } from "react";
2
- import { MapContext } from "@mapcomponents/react-core";
1
+ import React, { useRef, useEffect } from "react";
2
+ import useMap from "../../hooks/useMap";
3
3
  import PropTypes from "prop-types";
4
4
 
5
5
  /**
@@ -9,104 +9,94 @@ import PropTypes from "prop-types";
9
9
  * @component
10
10
  */
11
11
  const MlVectorTileLayer = (props) => {
12
- const mapContext = useContext(MapContext);
12
+ const mapHook = useMap({ mapId: props.mapId, waitForLayer: props.insertBeforeLayer });
13
13
 
14
- const layerName = "vector-tile-layer-";
15
- const sourceName = "vector-tile-source-";
16
- const idSuffixRef = useRef(new Date().getTime());
17
14
  const layerIdsRef = useRef({});
15
+ const layerId = useRef(props.layerId || "MlVectorTileLayer-" + mapHook.componentId);
18
16
  const layerPaintConfsRef = useRef({});
17
+ const layerLayoutConfsRef = useRef({});
19
18
  const initializedRef = useRef(false);
20
- const mapRef = useRef(null);
21
-
22
- const cleanup = () => {
23
- if (mapRef.current && mapRef.current.style) {
24
- for (let key in layerIdsRef.current) {
25
- if (mapRef.current.getLayer(layerIdsRef.current[key])) {
26
- mapRef.current.removeLayer(layerIdsRef.current[key]);
27
- }
28
- }
29
- if (mapRef.current.getSource(sourceName + idSuffixRef.current)) {
30
- mapRef.current.removeSource(sourceName + idSuffixRef.current);
31
- }
32
- }
33
- };
34
-
35
- useEffect(() => {
36
- return cleanup;
37
- }, []);
38
19
 
39
20
  useEffect(() => {
40
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
21
+ if (!mapHook.map || initializedRef.current) return;
41
22
 
42
23
  initializedRef.current = true;
43
- mapRef.current = mapContext.getMap(props.mapId);
44
24
 
45
25
  // Add the new layer to the openlayers instance once it is available
46
- mapRef.current.addSource(sourceName + idSuffixRef.current, {
47
- type: "vector",
48
- tiles: [props.url],
49
- tileSize: 512,
50
- attribution: "",
51
- ...props.sourceOptions,
52
- });
26
+ mapHook.map.addSource(
27
+ layerId.current,
28
+ {
29
+ type: "vector",
30
+ tiles: [props.url],
31
+ tileSize: 512,
32
+ attribution: "",
33
+ ...props.sourceOptions,
34
+ },
35
+ mapHook.componentId
36
+ );
53
37
 
54
38
  for (let key in props.layers) {
55
- let layerId = layerName + "_" + key + "_" + idSuffixRef.current;
56
- layerIdsRef.current[key] = layerId;
57
-
58
- mapRef.current.addLayer({
59
- id: layerId,
60
- source: sourceName + idSuffixRef.current,
61
- type: "line",
62
- minzoom: 0,
63
- maxzoom: 22,
64
- layout: {},
65
- paint: {
66
- "line-opacity": 0.5,
67
- "line-color": "rgb(80, 80, 80)",
68
- "line-width": 2,
39
+ let _layerId = layerId.current + "_" + key;
40
+ layerIdsRef.current[key] = _layerId;
41
+
42
+ mapHook.map.addLayer(
43
+ {
44
+ id: _layerId,
45
+ source: layerId.current,
46
+ type: "line",
47
+ minzoom: 0,
48
+ maxzoom: 22,
49
+ layout: {},
50
+ paint: {
51
+ "line-opacity": 0.5,
52
+ "line-color": "rgb(80, 80, 80)",
53
+ "line-width": 2,
54
+ },
55
+ ...props.layers[key],
69
56
  },
70
- ...props.layers[key],
71
- });
57
+ props.insertBeforeLayer,
58
+ mapHook.componentId
59
+ );
72
60
  layerPaintConfsRef.current[key] = JSON.stringify(props.layers[key].paint);
61
+ layerLayoutConfsRef.current[key] = JSON.stringify(props.layers[key].layout);
73
62
  }
74
- }, [mapContext.mapIds, props, mapContext]);
63
+ }, [mapHook.map, props]);
75
64
 
76
65
  useEffect(() => {
77
- if (!mapRef.current) return;
78
- // the MapLibre-gl instance (mapContext.map) is accessible here
66
+ if (!mapHook.map || !initializedRef.current) return;
79
67
  // initialize the layer and add it to the MapLibre-gl instance or do something else with it
80
68
  for (var key in props.layers) {
81
- if (mapRef.current.getLayer(layerIdsRef.current[key])) {
82
- let layerConfString = JSON.stringify(props.layers[key].paint);
69
+ if (mapHook.map.getLayer(layerIdsRef.current[key])) {
70
+ // update changed paint property
71
+ let layerPaintConfString = JSON.stringify(props.layers[key].paint);
83
72
 
84
- if (layerConfString !== layerPaintConfsRef.current[key]) {
73
+ if (layerPaintConfString !== layerPaintConfsRef.current[key]) {
85
74
  for (let paintKey in props.layers[key].paint) {
86
- mapContext
87
- .getMap(props.mapId)
88
- .setPaintProperty(
89
- layerIdsRef.current[key],
90
- paintKey,
91
- props.layers[key].paint[paintKey]
92
- );
75
+ mapHook.map.setPaintProperty(
76
+ layerIdsRef.current[key],
77
+ paintKey,
78
+ props.layers[key].paint[paintKey]
79
+ );
80
+ }
81
+ }
82
+ layerPaintConfsRef.current[key] = layerPaintConfString;
83
+
84
+ // update changed layout property
85
+ let layerLayoutConfString = JSON.stringify(props.layers[key].layout);
86
+
87
+ if (layerLayoutConfString !== layerLayoutConfsRef.current[key]) {
88
+ for (let layoutKey in props.layers[key].layout) {
89
+ mapHook.map.setLayoutProperty(
90
+ layerIdsRef.current[key],
91
+ layoutKey,
92
+ props.layers[key].layout[layoutKey]
93
+ );
93
94
  }
94
95
  }
95
- layerPaintConfsRef.current[key] = layerConfString;
96
+ layerLayoutConfsRef.current[key] = layerLayoutConfString;
96
97
  }
97
98
  }
98
- }, [props.layers, props, mapContext]);
99
-
100
- useEffect(() => {
101
- if (!mapRef.current) return;
102
-
103
- // toggle layer visibility by changing the layout object's visibility property
104
- if (props.visible) {
105
- mapRef.current.setLayoutProperty(layerName + idSuffixRef.current, "visibility", "visible");
106
- } else {
107
- mapRef.current.setLayoutProperty(layerName + idSuffixRef.current, "visibility", "none");
108
- }
109
- }, [props.visible]);
99
+ }, [props.layers, mapHook.map]);
110
100
 
111
101
  return <></>;
112
102
  };
@@ -1,12 +1,12 @@
1
1
  import { layerRemovalTest, sourceRemovalTest } from "../../util";
2
2
 
3
3
  import MlVectorTileLayer from "./MlVectorTileLayer";
4
+ import { uuid_regex } from "../../setupTests";
4
5
 
5
6
  const testComponent = (
6
7
  <MlVectorTileLayer
7
8
  {...{
8
- url:
9
- "https://wms.wheregroup.com/tileserver/tile/tileserver.php?/europe-0-14/index.json?/europe-0-14/{z}/{x}/{y}.pbf",
9
+ url: "https://wms.wheregroup.com/tileserver/tile/tileserver.php?/europe-0-14/index.json?/europe-0-14/{z}/{x}/{y}.pbf",
10
10
  layers: {
11
11
  landuseLine: {
12
12
  "source-layer": "landuse",
@@ -28,12 +28,12 @@ const testComponent = (
28
28
  layerRemovalTest(
29
29
  "<MlVectorTileLayer />",
30
30
  testComponent,
31
- /^.*"vector-tile-layer-_landuseLine_[0-9]*".*$/,
32
- "vector-tile-layer-_landuseLine_{unix-timestamp}"
31
+ new RegExp('^.*"MlVectorTileLayer-' + uuid_regex + '_landuseLine".*$'),
32
+ "MlVectorTileLayer-{uuid}_landuseLine"
33
33
  );
34
34
  sourceRemovalTest(
35
35
  "<MlVectorTileLayer />",
36
36
  testComponent,
37
- /^.*"vector-tile-source-[0-9]*".*$/,
38
- "vector-tile-source-{unix-timestamp}"
37
+ new RegExp('^.*"MlVectorTileLayer-' + uuid_regex + '".*$'),
38
+ "MlVectorTileLayer-{uuid}"
39
39
  );
@@ -1,5 +1,5 @@
1
- import React, { useContext, useRef, useEffect } from "react";
2
- import { MapContext } from "@mapcomponents/react-core";
1
+ import React, { useRef, useEffect } from "react";
2
+ import useMap from "../../hooks/useMap";
3
3
 
4
4
  import PropTypes from "prop-types";
5
5
  import { v4 as uuidv4 } from "uuid";
@@ -45,31 +45,13 @@ const defaultProps = {
45
45
  * @component
46
46
  */
47
47
  const MlWmsLayer = (props) => {
48
- const mapContext = useContext(MapContext);
48
+ const mapHook = useMap({ mapId: props.mapId, waitForLayer: props.insertBeforeLayer });
49
49
 
50
- const componentId = useRef(props.layerId || ("MlWmsLayer-" + uuidv4()));
51
- const mapRef = useRef(null);
52
50
  const initializedRef = useRef(false);
53
- const layerId = useRef(props.layerId || componentId.current);
51
+ const layerId = useRef(props.layerId || "MlWmsLayer-" + mapHook.componentId);
54
52
 
55
53
  useEffect(() => {
56
- let _componentId = componentId.current;
57
- return () => {
58
- // This is the cleanup function, it is called when this react component is removed from react-dom
59
- if (mapRef.current) {
60
- mapRef.current.cleanup(_componentId);
61
-
62
- mapRef.current = null;
63
- }
64
- initializedRef.current = false;
65
- };
66
- }, []);
67
-
68
- useEffect(() => {
69
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
70
-
71
- mapRef.current = mapContext.getMap(props.mapId);
72
- if (!mapRef.current) return;
54
+ if (!mapHook.map || initializedRef.current) return;
73
55
 
74
56
  initializedRef.current = true;
75
57
 
@@ -90,7 +72,7 @@ const MlWmsLayer = (props) => {
90
72
  let urlParamsStr =
91
73
  decodeURIComponent(urlParams.toString()) + "".replace(/%2F/g, "/").replace(/%3A/g, ":");
92
74
 
93
- mapRef.current.addSource(
75
+ mapHook.map.addSource(
94
76
  layerId.current,
95
77
  {
96
78
  type: "raster",
@@ -99,35 +81,35 @@ const MlWmsLayer = (props) => {
99
81
  attribution: props.attribution,
100
82
  ...props.sourceOptions,
101
83
  },
102
- componentId.current
84
+ mapHook.componentId
103
85
  );
104
86
 
105
- mapRef.current.addLayer(
87
+ mapHook.map.addLayer(
106
88
  {
107
89
  id: layerId.current,
108
90
  type: "raster",
109
- source: componentId.current,
91
+ source: layerId.current,
110
92
  ...props.layerOptions,
111
93
  },
112
94
  props.insertBeforeLayer,
113
- componentId.current
95
+ mapHook.componentId
114
96
  );
115
97
 
116
98
  if (!props.visible) {
117
- mapRef.current.setLayoutProperty(componentId.current, "visibility", "none");
99
+ mapHook.map.setLayoutProperty(layerId.current, "visibility", "none");
118
100
  }
119
- }, [mapContext.mapIds, mapContext, props]);
101
+ }, [mapHook.map, props]);
120
102
 
121
103
  useEffect(() => {
122
- if (!mapRef.current || !initializedRef.current) return;
104
+ if (!mapHook.map || !initializedRef.current) return;
123
105
 
124
106
  // toggle layer visibility by changing the layout object's visibility property
125
107
  if (props.visible) {
126
- mapRef.current.setLayoutProperty(componentId.current, "visibility", "visible");
108
+ mapHook.map.setLayoutProperty(layerId.current, "visibility", "visible");
127
109
  } else {
128
- mapRef.current.setLayoutProperty(componentId.current, "visibility", "none");
110
+ mapHook.map.setLayoutProperty(layerId.current, "visibility", "none");
129
111
  }
130
- }, [props.visible]);
112
+ }, [props.visible, mapHook.map]);
131
113
 
132
114
  return <></>;
133
115
  };
@@ -1,4 +1,4 @@
1
- import { useContext, useState, useEffect, useRef } from "react";
1
+ import React, { useContext, useState, useEffect, useRef } from "react";
2
2
  import { v4 as uuidv4 } from "uuid";
3
3
  import { MapContext } from "@mapcomponents/react-core";
4
4
  import useMapState from "./useMapState";