@mapcomponents/react-maplibre 0.1.57 → 0.1.59

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 (276) hide show
  1. package/.eslintignore +11 -0
  2. package/.eslintrc.js +20 -0
  3. package/.github/workflows/check-formatting.yml +46 -0
  4. package/.prettierignore +11 -0
  5. package/.prettierrc.json +6 -0
  6. package/CHANGELOG.md +18 -0
  7. package/coverage/clover.xml +229 -77
  8. package/coverage/coverage-final.json +43 -37
  9. package/coverage/lcov-report/index.html +65 -20
  10. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.tsx.html +83 -83
  11. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  12. package/coverage/lcov-report/src/components/MlCenterPosition/MlCenterPosition.tsx.html +66 -66
  13. package/coverage/lcov-report/src/components/MlCenterPosition/index.html +1 -1
  14. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx.html +30 -30
  15. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  16. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx.html +202 -0
  17. package/coverage/lcov-report/src/components/MlCreatePdfForm/index.html +116 -0
  18. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.tsx.html +99 -99
  19. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +1 -1
  20. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx.html +66 -66
  21. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  22. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.tsx.html +221 -221
  23. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  24. package/coverage/lcov-report/src/components/MlGPXViewer/MlGPXViewer.tsx.html +308 -308
  25. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +497 -497
  26. package/coverage/lcov-report/src/components/MlGPXViewer/index.html +1 -1
  27. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx.html +85 -85
  28. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  29. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx.html +469 -0
  30. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/index.html +116 -0
  31. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx.html +140 -140
  32. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +1 -1
  33. package/coverage/lcov-report/src/components/MlLayer/MlLayer.tsx.html +37 -37
  34. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  35. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.tsx.html +179 -179
  36. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  37. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.tsx.html +113 -113
  38. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +1 -1
  39. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +181 -181
  40. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +58 -58
  41. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  42. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  43. package/coverage/lcov-report/src/components/MlMarker/MlMarker.tsx.html +108 -108
  44. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  45. package/coverage/lcov-report/src/components/MlMeasureTool/MlMeasureTool.tsx.html +39 -39
  46. package/coverage/lcov-report/src/components/MlMeasureTool/index.html +1 -1
  47. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.tsx.html +183 -183
  48. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  49. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.tsx.html +163 -163
  50. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  51. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +50 -50
  52. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.stories_.js.html +30 -30
  53. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  54. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +83 -83
  55. package/coverage/lcov-report/src/components/MlScaleReference/index.html +1 -1
  56. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +204 -204
  57. package/coverage/lcov-report/src/components/MlShareMapState/index.html +1 -1
  58. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +180 -180
  59. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +1 -1
  60. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +163 -163
  61. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  62. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx.html +136 -136
  63. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/index.html +1 -1
  64. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +53 -53
  65. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  66. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx.html +123 -123
  67. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +1 -1
  68. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +35 -35
  69. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  70. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.tsx.html +155 -155
  71. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +1 -1
  72. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.tsx.html +255 -255
  73. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +1 -1
  74. package/coverage/lcov-report/src/contexts/MapContext.tsx.html +66 -66
  75. package/coverage/lcov-report/src/contexts/SimpleDataContext.js.html +1 -1
  76. package/coverage/lcov-report/src/contexts/SimpleDataProvider.js.html +48 -48
  77. package/coverage/lcov-report/src/contexts/index.html +1 -1
  78. package/coverage/lcov-report/src/hooks/exportMap/index.html +131 -0
  79. package/coverage/lcov-report/src/hooks/exportMap/index.ts.html +175 -0
  80. package/coverage/lcov-report/src/hooks/exportMap/lib.ts.html +646 -0
  81. package/coverage/lcov-report/src/hooks/index.html +48 -18
  82. package/coverage/lcov-report/src/hooks/useLayer.ts.html +230 -188
  83. package/coverage/lcov-report/src/hooks/useLayerEvent.js.html +232 -0
  84. package/coverage/lcov-report/src/hooks/useMap.ts.html +72 -69
  85. package/coverage/lcov-report/src/hooks/useMapState.ts.html +145 -145
  86. package/coverage/lcov-report/src/hooks/useSource.ts.html +337 -0
  87. package/coverage/lcov-report/src/hooks/useWms.js.html +72 -72
  88. package/coverage/lcov-report/src/index.html +1 -1
  89. package/coverage/lcov-report/src/index.ts.html +11 -2
  90. package/coverage/lcov.info +448 -151
  91. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.d.ts +24 -0
  92. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.stories.d.ts +13 -0
  93. package/dist/components/MlCreatePdfForm/lib/PdfContext.d.ts +21 -0
  94. package/dist/components/MlCreatePdfForm/lib/PdfForm.d.ts +10 -0
  95. package/dist/components/MlCreatePdfForm/lib/PdfPreview.d.ts +13 -0
  96. package/dist/components/MlCreatePdfForm/lib/pdf.templates.d.ts +11 -0
  97. package/dist/components/MlFeatureEditor/lib/create_vertex.d.ts +1 -1
  98. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.d.ts +22 -0
  99. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.d.ts +10 -0
  100. package/dist/components/MlLayerSwipe/MlLayerSwipe.d.ts +1 -1
  101. package/dist/components/MlWmsLayer/MlWmsLayer.d.ts +2 -2
  102. package/dist/decorators/MapContextDecoratorHooks.d.ts +2 -0
  103. package/dist/hooks/exportMap/index.d.ts +11 -0
  104. package/dist/hooks/exportMap/lib.d.ts +36 -0
  105. package/dist/hooks/useLayer.d.ts +6 -5
  106. package/dist/hooks/useLayerEvent.d.ts +2 -0
  107. package/dist/hooks/useMap.d.ts +1 -1
  108. package/dist/hooks/useMapState.stories.d.ts +2 -2
  109. package/dist/hooks/useSource.d.ts +17 -0
  110. package/dist/hooks/useSources.stories.d.ts +13 -0
  111. package/dist/index.d.ts +3 -0
  112. package/dist/index.esm.js +1055 -315
  113. package/dist/index.esm.js.map +1 -1
  114. package/eslintErrorTest.js +10 -0
  115. package/package.json +7 -1
  116. package/public/thumbnails/MlCreatePdfForm.png +0 -0
  117. package/src/components/MapLibreMap/MapLibreMap.stories.js +72 -72
  118. package/src/components/MapLibreMap/MapLibreMap.test.js +60 -60
  119. package/src/components/MapLibreMap/MapLibreMap.tsx +82 -82
  120. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.test.js +343 -343
  121. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.ts +619 -619
  122. package/src/components/MlBasicComponent.js +25 -25
  123. package/src/components/MlCenterPosition/MlCenterPosition.stories.js +6 -6
  124. package/src/components/MlCenterPosition/MlCenterPosition.tsx +65 -65
  125. package/src/components/MlComponentTemplate/MlComponentTemplate.stories.js +5 -5
  126. package/src/components/MlComponentTemplate/MlComponentTemplate.tsx +23 -23
  127. package/src/components/MlCreatePdfButton/{MlCreatePdfButton.meta.json → MlCreatePdfButton.meta_.json} +0 -0
  128. package/src/components/MlCreatePdfButton/MlCreatePdfButton.stories.js +16 -16
  129. package/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx +29 -29
  130. package/src/components/MlCreatePdfButton/lib/createPdf.ts +175 -175
  131. package/src/components/MlCreatePdfButton/lib/nominatimMap.ts +51 -51
  132. package/src/components/MlCreatePdfForm/MlCreatePdfForm.doc.de.md +3 -0
  133. package/src/components/MlCreatePdfForm/MlCreatePdfForm.meta.json +15 -0
  134. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +152 -0
  135. package/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx +39 -0
  136. package/src/components/MlCreatePdfForm/lib/PdfContext.tsx +53 -0
  137. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +161 -0
  138. package/src/components/MlCreatePdfForm/lib/PdfPreview.tsx +399 -0
  139. package/src/components/MlCreatePdfForm/lib/pdf.templates.ts +82 -0
  140. package/src/components/MlFeatureEditor/MlFeatureEditor.stories.js +55 -55
  141. package/src/components/MlFeatureEditor/MlFeatureEditor.test.js +105 -105
  142. package/src/components/MlFeatureEditor/MlFeatureEditor.tsx +119 -119
  143. package/src/components/MlFeatureEditor/custom-direct-select-mode.js +208 -208
  144. package/src/components/MlFeatureEditor/custom-polygon-mode.js +148 -148
  145. package/src/components/MlFeatureEditor/custom-select-mode.js +314 -314
  146. package/src/components/MlFeatureEditor/lib/common_selectors.js +34 -34
  147. package/src/components/MlFeatureEditor/lib/constants.js +61 -61
  148. package/src/components/MlFeatureEditor/lib/constrain_feature_movement.js +51 -51
  149. package/src/components/MlFeatureEditor/lib/create_midpoint.js +30 -30
  150. package/src/components/MlFeatureEditor/lib/create_supplementary_points.js +82 -82
  151. package/src/components/MlFeatureEditor/lib/create_vertex.js +16 -16
  152. package/src/components/MlFeatureEditor/lib/double_click_zoom.js +23 -23
  153. package/src/components/MlFeatureEditor/lib/euclidean_distance.js +3 -3
  154. package/src/components/MlFeatureEditor/lib/features_at.js +23 -23
  155. package/src/components/MlFeatureEditor/lib/get_features_and_set_cursor.js +15 -15
  156. package/src/components/MlFeatureEditor/lib/is_click.js +8 -8
  157. package/src/components/MlFeatureEditor/lib/is_event_at_coordinates.js +2 -2
  158. package/src/components/MlFeatureEditor/lib/is_tap.js +6 -6
  159. package/src/components/MlFeatureEditor/lib/map_event_to_bounding_box.js +4 -4
  160. package/src/components/MlFeatureEditor/lib/mode_handler.js +105 -105
  161. package/src/components/MlFeatureEditor/lib/mouse_event_point.js +5 -5
  162. package/src/components/MlFeatureEditor/lib/move_features.js +33 -33
  163. package/src/components/MlFeatureEditor/lib/sort_features.js +25 -25
  164. package/src/components/MlFeatureEditor/lib/string_set.js +36 -36
  165. package/src/components/MlFeatureEditor/lib/string_sets_are_equal.js +2 -2
  166. package/src/components/MlFeatureEditor/lib/theme.js +230 -230
  167. package/src/components/MlFeatureEditor/lib/to_dense_array.js +1 -1
  168. package/src/components/MlFeatureEditor/lib/utils.js +40 -40
  169. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.stories.js +9 -9
  170. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.test.js +4 -4
  171. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx +65 -65
  172. package/src/components/MlFollowGps/MlFollowGps.stories.js +6 -6
  173. package/src/components/MlFollowGps/MlFollowGps.test.js +44 -44
  174. package/src/components/MlFollowGps/MlFollowGps.tsx +220 -220
  175. package/src/components/MlGPXViewer/MlGPXViewer.stories.js +15 -15
  176. package/src/components/MlGPXViewer/MlGPXViewer.test.js +12 -12
  177. package/src/components/MlGPXViewer/MlGPXViewer.tsx +345 -345
  178. package/src/components/MlGPXViewer/gpxConverter.js +496 -496
  179. package/src/components/MlGPXViewer/util/GeoJsonContext.ts +4 -4
  180. package/src/components/MlGPXViewer/util/GeoJsonProvider.tsx +16 -16
  181. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.js +34 -34
  182. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.test.js +8 -8
  183. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx +84 -84
  184. package/src/components/MlGeoJsonLayer/util/getDefaultLayerTypeByGeometry.ts +21 -21
  185. package/src/components/MlGeoJsonLayer/util/getDefaultPaintPropsByType.ts +27 -27
  186. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.doc.de.md +3 -0
  187. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.meta_.json +15 -0
  188. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.js +19 -0
  189. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx +128 -0
  190. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.js +28 -28
  191. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +8 -8
  192. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx +162 -162
  193. package/src/components/MlLayer/MlLayer.stories.js +5 -5
  194. package/src/components/MlLayer/MlLayer.test.js +86 -86
  195. package/src/components/MlLayer/MlLayer.tsx +36 -36
  196. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.js +21 -21
  197. package/src/components/MlLayerMagnify/MlLayerMagnify.test.js +54 -54
  198. package/src/components/MlLayerMagnify/MlLayerMagnify.tsx +201 -201
  199. package/src/components/MlLayerSwipe/MlLayerSwipe.stories.js +20 -20
  200. package/src/components/MlLayerSwipe/MlLayerSwipe.test.js +54 -54
  201. package/src/components/MlLayerSwipe/MlLayerSwipe.tsx +130 -130
  202. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +194 -194
  203. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +85 -85
  204. package/src/components/MlLayerSwitcher/components/LayerBox.js +57 -57
  205. package/src/components/MlMarker/MlMarker.stories.js +7 -7
  206. package/src/components/MlMarker/MlMarker.tsx +119 -119
  207. package/src/components/MlMeasureTool/MlMeasureTool.stories.js +64 -64
  208. package/src/components/MlMeasureTool/MlMeasureTool.tsx +38 -38
  209. package/src/components/MlNavigationCompass/MlNavigationCompass.stories.js +45 -45
  210. package/src/components/MlNavigationCompass/MlNavigationCompass.test.js +40 -40
  211. package/src/components/MlNavigationCompass/MlNavigationCompass.tsx +192 -192
  212. package/src/components/MlNavigationTools/MlNavigationTools.stories.js +18 -18
  213. package/src/components/MlNavigationTools/MlNavigationTools.tsx +173 -173
  214. package/src/components/MlOsmLayer/MlOsmLayer.js +49 -49
  215. package/src/components/MlOsmLayer/MlOsmLayer.stories_.js +29 -29
  216. package/src/components/MlOsmLayer/MlOsmLayer.test.js +8 -8
  217. package/src/components/MlScaleReference/MlScaleReference.js +82 -82
  218. package/src/components/MlScaleReference/MlScaleReference.stories.js +27 -27
  219. package/src/components/MlShareMapState/MlShareMapState.js +203 -203
  220. package/src/components/MlShareMapState/MlShareMapState.stories.js +68 -68
  221. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js +201 -201
  222. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +35 -35
  223. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.test.js +8 -8
  224. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +186 -186
  225. package/src/components/MlThreeJsLayer/MlThreeJsLayer.stories.js +21 -21
  226. package/src/components/MlThreeJsLayer/MlThreeJsLayer.test.js +24 -24
  227. package/src/components/MlThreeJsLayer/lib/GLTFLoader.js +3327 -3327
  228. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.stories.js +31 -30
  229. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.test.js +8 -8
  230. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx +146 -146
  231. package/src/components/MlTransitionGeoJsonLayer/util/transitionFunctions.js +207 -207
  232. package/src/components/MlUseMapDebugger/MlUseMapDebugger.js +52 -52
  233. package/src/components/MlUseMapDebugger/MlUseMapDebugger.stories.js +13 -13
  234. package/src/components/MlVectorTileLayer/MlVectorTileLayer.stories.js +27 -27
  235. package/src/components/MlVectorTileLayer/MlVectorTileLayer.test.js +27 -27
  236. package/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx +137 -137
  237. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js +34 -34
  238. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.stories.js +7 -7
  239. package/src/components/MlWmsLayer/MlWmsLayer.stories.js +26 -26
  240. package/src/components/MlWmsLayer/MlWmsLayer.test.js +8 -8
  241. package/src/components/MlWmsLayer/MlWmsLayer.tsx +167 -167
  242. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +27 -27
  243. package/src/components/MlWmsLoader/MlWmsLoader.tsx +254 -254
  244. package/src/contexts/MapComponentsProvider.test.js +229 -229
  245. package/src/contexts/MapContext.tsx +65 -65
  246. package/src/contexts/SimpleDataProvider.js +47 -47
  247. package/src/contexts/SimpleDataProvider.test.js +29 -29
  248. package/src/custom.d.tsx +14 -14
  249. package/src/decorators/MapContextDecorator.js +22 -22
  250. package/src/decorators/MapContextDecoratorHooks.js +34 -0
  251. package/src/decorators/MultiMapContextDecorator.js +63 -63
  252. package/src/decorators/NoNavToolsDecorator.js +17 -17
  253. package/src/decorators/ThemeWrapper.jsx +1 -1
  254. package/src/hooks/assets/pointWG.json +13 -0
  255. package/src/hooks/exportMap/index.ts +30 -0
  256. package/src/hooks/exportMap/lib.ts +187 -0
  257. package/src/hooks/useLayer.test.js +188 -188
  258. package/src/hooks/useLayer.ts +194 -180
  259. package/src/hooks/useLayerEvent.js +49 -0
  260. package/src/hooks/useMap.ts +67 -66
  261. package/src/hooks/useMapState.stories.js +78 -78
  262. package/src/hooks/useMapState.ts +161 -161
  263. package/src/hooks/useSource.ts +84 -0
  264. package/src/hooks/useSources.stories.js +232 -0
  265. package/src/hooks/useWms.js +71 -71
  266. package/src/index.ts +3 -0
  267. package/src/setupTests.js +86 -86
  268. package/src/ui_components/ImageLoader.js +62 -62
  269. package/src/ui_components/Legend.js +34 -34
  270. package/src/ui_components/LoadingOverlay.js +29 -29
  271. package/src/ui_components/LoadingOverlayContext.js +68 -68
  272. package/src/ui_components/Sidebar.js +80 -80
  273. package/src/ui_components/Tooltip.js +9 -9
  274. package/src/ui_components/TopToolbar.js +23 -23
  275. package/src/util/layerRemovalTest.js +111 -111
  276. package/src/util/sourceRemovalTest.js +103 -103
@@ -1,198 +1,212 @@
1
- import { useState, useEffect, useCallback, useRef } from "react";
1
+ import { useState, useEffect, useCallback, useRef } from 'react';
2
2
 
3
- import useMap, { useMapType } from "./useMap";
3
+ import useMap, { useMapType } from './useMap';
4
4
 
5
- import { LayerSpecification } from "maplibre-gl";
5
+ import { SourceSpecification, LayerSpecification } from 'maplibre-gl';
6
6
 
7
- import MapLibreGlWrapper from "../components/MapLibreMap/lib/MapLibreGlWrapper";
7
+ import MapLibreGlWrapper from '../components/MapLibreMap/lib/MapLibreGlWrapper';
8
8
 
9
- import { MapLayerMouseEvent } from "maplibre-gl";
10
- import { GeoJSONObject } from "@turf/turf";
9
+ import { MapLayerMouseEvent } from 'maplibre-gl';
10
+ import { GeoJSONObject } from '@turf/turf';
11
11
 
12
12
  type useLayerType = {
13
- map: MapLibreGlWrapper | undefined;
14
- layer: LayerSpecification;
15
- layerId: string;
16
- componentId: string;
17
- mapHook: useMapType;
13
+ map: MapLibreGlWrapper | undefined;
14
+ layer: LayerSpecification;
15
+ layerId: string;
16
+ componentId: string;
17
+ mapHook: useMapType;
18
18
  };
19
19
 
20
20
  interface useLayerProps {
21
- mapId?: string;
22
- layerId?: string;
23
- idPrefix?: string;
24
- insertBeforeLayer?: string;
25
- insertBeforeFirstSymbolLayer?: boolean;
26
- geojson?: GeoJSONObject;
27
- options: Partial<LayerSpecification>;
28
- onHover?: MapLayerMouseEvent;
29
- onClick?: MapLayerMouseEvent;
30
- onLeave?: MapLayerMouseEvent;
21
+ mapId?: string;
22
+ layerId?: string;
23
+ idPrefix?: string;
24
+ insertBeforeLayer?: string;
25
+ insertBeforeFirstSymbolLayer?: boolean;
26
+ geojson?: GeoJSONObject;
27
+ source?: SourceSpecification | string;
28
+ options: Partial<LayerSpecification>;
29
+ onHover?: MapLayerMouseEvent;
30
+ onClick?: MapLayerMouseEvent;
31
+ onLeave?: MapLayerMouseEvent;
31
32
  }
32
33
 
33
34
  const legalLayerTypes = [
34
- "fill",
35
- "line",
36
- "symbol",
37
- "circle",
38
- "heatmap",
39
- "fill-extrusion",
40
- "raster",
41
- "hillshade",
42
- "background",
35
+ 'fill',
36
+ 'line',
37
+ 'symbol',
38
+ 'circle',
39
+ 'heatmap',
40
+ 'fill-extrusion',
41
+ 'raster',
42
+ 'hillshade',
43
+ 'background',
43
44
  ];
44
45
 
45
46
  function useLayer(props: useLayerProps): useLayerType {
46
- const mapHook = useMap({
47
- mapId: props.mapId,
48
- waitForLayer: props.insertBeforeLayer,
49
- });
50
-
51
- const layerTypeRef = useRef<string>("");
52
- const layerPaintConfRef = useRef<string>("");
53
- const layerLayoutConfRef = useRef<string>("");
54
-
55
- const [layer, setLayer] = useState<any>();
56
-
57
- const initializedRef = useRef<boolean>(false);
58
- const layerId = useRef(
59
- props.layerId || (props.idPrefix ? props.idPrefix : "Layer-") + mapHook.componentId
60
- );
61
-
62
- const createLayer = useCallback(() => {
63
- if (!mapHook.map) return;
64
-
65
- if (mapHook.map.map.getLayer(layerId.current)) {
66
- mapHook.cleanup();
67
- }
68
- if (mapHook.map.map.getSource(layerId.current)) {
69
- mapHook.map.map.removeSource(layerId.current);
70
- }
71
- initializedRef.current = true;
72
-
73
- mapHook.map.addLayer(
74
- {
75
- ...props.options,
76
- ...(props.geojson
77
- ? {
78
- source: {
79
- type: "geojson",
80
- data: props.geojson,
81
- },
82
- }
83
- : {}),
84
- id: layerId.current,
85
- },
86
- props.insertBeforeLayer
87
- ? props.insertBeforeLayer
88
- : props.insertBeforeFirstSymbolLayer
89
- ? mapHook.map.firstSymbolLayer
90
- : undefined,
91
- mapHook.componentId
92
- );
93
-
94
- setLayer(mapHook.map.map.getLayer(layerId.current));
95
-
96
- if (typeof props.onHover !== "undefined") {
97
- mapHook.map.on("mousemove", layerId.current, props.onHover, mapHook.componentId);
98
- }
99
-
100
- if (typeof props.onClick !== "undefined") {
101
- mapHook.map.on("click", layerId.current, props.onClick, mapHook.componentId);
102
- }
103
-
104
- if (typeof props.onLeave !== "undefined") {
105
- mapHook.map.on("mouseleave", layerId.current, props.onLeave, mapHook.componentId);
106
- }
107
-
108
- // recreate layer if style has changed
109
- mapHook.map.on(
110
- "styledata",
111
- () => {
112
- if (initializedRef.current && !mapHook.map?.map.getLayer(layerId.current)) {
113
- console.log("Recreate Layer");
114
- createLayer();
115
- }
116
- },
117
- mapHook.componentId
118
- );
119
-
120
- layerPaintConfRef.current = JSON.stringify(props.options?.paint);
121
- layerLayoutConfRef.current = JSON.stringify(props.options?.layout);
122
- layerTypeRef.current = props.options.type as LayerSpecification['type'];
123
- }, [props, mapHook.map]);
124
-
125
- useEffect(() => {
126
- if (!mapHook.map) return;
127
-
128
- if (
129
- initializedRef.current &&
130
- (legalLayerTypes.indexOf(props.options.type as LayerSpecification['type']) === -1 ||
131
- (legalLayerTypes.indexOf(props.options.type as LayerSpecification['type']) !== -1 &&
132
- props.options.type === layerTypeRef.current))
133
- ) {
134
- return;
135
- }
136
-
137
- createLayer();
138
- }, [mapHook.map, props.options, createLayer]);
139
-
140
- useEffect(() => {
141
- if (!initializedRef.current || !mapHook.map?.map?.getSource(layerId.current)) return;
142
-
143
- //@ts-ignore setData only exists on GeoJsonSource
144
- mapHook.map.map.getSource(layerId.current)?.setData?.(props.geojson);
145
- }, [props.geojson, mapHook.map, props.options.type]);
146
-
147
- useEffect(() => {
148
- if (
149
- !mapHook.map ||
150
- !mapHook.map?.map?.getLayer?.(layerId.current) ||
151
- !initializedRef.current ||
152
- props.options.type !== layerTypeRef.current
153
- )
154
- return;
155
-
156
- var key;
157
-
158
- let layoutString = JSON.stringify(props.options.layout);
159
- if (props.options.layout && layoutString !== layerLayoutConfRef.current) {
160
- let oldLayout = JSON.parse(layerLayoutConfRef.current);
161
-
162
- for (key in props.options.layout) {
163
- if (props.options.layout?.[key] && props.options.layout[key] !== oldLayout[key]) {
164
- mapHook.map.map.setLayoutProperty(layerId.current, key, props.options.layout[key]);
165
- }
166
- }
167
- layerLayoutConfRef.current = layoutString;
168
- }
169
-
170
- let paintString = JSON.stringify(props.options.paint);
171
- if (paintString !== layerPaintConfRef.current) {
172
- let oldPaint = JSON.parse(layerPaintConfRef.current);
173
- for (key in props.options.paint) {
174
- if (props.options.paint?.[key] && props.options.paint[key] !== oldPaint[key]) {
175
- mapHook.map.map.setPaintProperty(layerId.current, key, props.options.paint[key]);
176
- }
177
- }
178
- layerPaintConfRef.current = paintString;
179
- }
180
- }, [props.options, mapHook.map]);
181
-
182
- useEffect(() => {
183
- return () => {
184
- initializedRef.current = false;
185
- mapHook.cleanup();
186
- };
187
- }, []);
188
-
189
- return {
190
- map: mapHook.map,
191
- layer: layer,
192
- layerId: layerId.current,
193
- componentId: mapHook.componentId,
194
- mapHook: mapHook,
195
- };
47
+ const mapHook = useMap({
48
+ mapId: props.mapId,
49
+ waitForLayer: props.insertBeforeLayer,
50
+ });
51
+
52
+ const layerTypeRef = useRef<string>('');
53
+ const layerPaintConfRef = useRef<string>('');
54
+ const layerLayoutConfRef = useRef<string>('');
55
+
56
+ const [layer, setLayer] = useState<any>();
57
+
58
+ const initializedRef = useRef<boolean>(false);
59
+ const layerId = useRef(
60
+ props.layerId || (props.idPrefix ? props.idPrefix : 'Layer-') + mapHook.componentId
61
+ );
62
+
63
+ const createLayer = useCallback(() => {
64
+ if (!mapHook.map) return;
65
+
66
+ if (mapHook.map.map.getLayer(layerId.current)) {
67
+ mapHook.cleanup();
68
+ }
69
+ if (mapHook.map.map.getSource(layerId.current)) {
70
+ mapHook.map.map.removeSource(layerId.current);
71
+ }
72
+
73
+ if (typeof props.source === 'string') {
74
+ if (props.source === '' || !mapHook.map.map.getSource(props.source)) {
75
+ return;
76
+ }
77
+ }
78
+
79
+ initializedRef.current = true;
80
+
81
+ mapHook.map.addLayer(
82
+ {
83
+ ...props.options,
84
+ ...(props.geojson && !props.source
85
+ ? {
86
+ source: {
87
+ type: 'geojson',
88
+ data: props.geojson,
89
+ },
90
+ }
91
+ : {}),
92
+ ...(props.source
93
+ ? {
94
+ source: props.source,
95
+ }
96
+ : {}),
97
+ id: layerId.current,
98
+ },
99
+ props.insertBeforeLayer
100
+ ? props.insertBeforeLayer
101
+ : props.insertBeforeFirstSymbolLayer
102
+ ? mapHook.map.firstSymbolLayer
103
+ : undefined,
104
+ mapHook.componentId
105
+ );
106
+
107
+ setLayer(mapHook.map.map.getLayer(layerId.current));
108
+
109
+ if (typeof props.onHover !== 'undefined') {
110
+ mapHook.map.on('mousemove', layerId.current, props.onHover, mapHook.componentId);
111
+ }
112
+
113
+ if (typeof props.onClick !== 'undefined') {
114
+ mapHook.map.on('click', layerId.current, props.onClick, mapHook.componentId);
115
+ }
116
+
117
+ if (typeof props.onLeave !== 'undefined') {
118
+ mapHook.map.on('mouseleave', layerId.current, props.onLeave, mapHook.componentId);
119
+ }
120
+
121
+ // recreate layer if style has changed
122
+ mapHook.map.on(
123
+ 'styledata',
124
+ () => {
125
+ if (initializedRef.current && !mapHook.map?.map.getLayer(layerId.current)) {
126
+ console.log('Recreate Layer');
127
+ createLayer();
128
+ }
129
+ },
130
+ mapHook.componentId
131
+ );
132
+
133
+ layerPaintConfRef.current = JSON.stringify(props.options?.paint);
134
+ layerLayoutConfRef.current = JSON.stringify(props.options?.layout);
135
+ layerTypeRef.current = props.options.type as LayerSpecification['type'];
136
+ }, [props, mapHook.map]);
137
+
138
+ useEffect(() => {
139
+ if (!mapHook.map) return;
140
+
141
+ if (
142
+ initializedRef.current &&
143
+ (legalLayerTypes.indexOf(props.options.type as LayerSpecification['type']) === -1 ||
144
+ (legalLayerTypes.indexOf(props.options.type as LayerSpecification['type']) !== -1 &&
145
+ props.options.type === layerTypeRef.current))
146
+ ) {
147
+ return;
148
+ }
149
+
150
+ createLayer();
151
+ }, [mapHook.map, props.options, createLayer]);
152
+
153
+ useEffect(() => {
154
+ if (!initializedRef.current || !mapHook.map?.map?.getSource(layerId.current)) return;
155
+
156
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
157
+ //@ts-ignore setData only exists on GeoJsonSource
158
+ mapHook.map.map.getSource(layerId.current)?.setData?.(props.geojson);
159
+ }, [props.geojson, mapHook.map, props.options.type]);
160
+
161
+ useEffect(() => {
162
+ if (
163
+ !mapHook.map ||
164
+ !mapHook.map?.map?.getLayer?.(layerId.current) ||
165
+ !initializedRef.current ||
166
+ props.options.type !== layerTypeRef.current
167
+ )
168
+ return;
169
+
170
+ let key;
171
+
172
+ const layoutString = JSON.stringify(props.options.layout);
173
+ if (props.options.layout && layoutString !== layerLayoutConfRef.current) {
174
+ const oldLayout = JSON.parse(layerLayoutConfRef.current);
175
+
176
+ for (key in props.options.layout) {
177
+ if (props.options.layout?.[key] && props.options.layout[key] !== oldLayout[key]) {
178
+ mapHook.map.map.setLayoutProperty(layerId.current, key, props.options.layout[key]);
179
+ }
180
+ }
181
+ layerLayoutConfRef.current = layoutString;
182
+ }
183
+
184
+ const paintString = JSON.stringify(props.options.paint);
185
+ if (paintString !== layerPaintConfRef.current) {
186
+ const oldPaint = JSON.parse(layerPaintConfRef.current);
187
+ for (key in props.options.paint) {
188
+ if (props.options.paint?.[key] && props.options.paint[key] !== oldPaint[key]) {
189
+ mapHook.map.map.setPaintProperty(layerId.current, key, props.options.paint[key]);
190
+ }
191
+ }
192
+ layerPaintConfRef.current = paintString;
193
+ }
194
+ }, [props.options, mapHook.map]);
195
+
196
+ useEffect(() => {
197
+ return () => {
198
+ initializedRef.current = false;
199
+ mapHook.cleanup();
200
+ };
201
+ }, []);
202
+
203
+ return {
204
+ map: mapHook.map,
205
+ layer: layer,
206
+ layerId: layerId.current,
207
+ componentId: mapHook.componentId,
208
+ mapHook: mapHook,
209
+ };
196
210
  }
197
211
 
198
212
  export default useLayer;
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { useEffect } from 'react';
3
+ import useMapState from './useMapState';
4
+ import useMap from './useMap';
5
+
6
+ const touchEquivalents = {
7
+ mousedown: 'touchstart',
8
+ mouseup: 'touchend',
9
+ mousemove: 'touchmove',
10
+ };
11
+ const touchEquivalentsKeys = Object.keys(touchEquivalents);
12
+ function useLayerEvent(props) {
13
+ const mapState = useMapState({ mapId: props.mapId, watch: { layers: true } });
14
+ const mapHook = useMap({ mapId: props.mapId });
15
+
16
+ useEffect(() => {
17
+ if (!mapHook.map) return true;
18
+ if (typeof props.condition !== 'undefined' && props.condition === false) return;
19
+ //console.log('useLayerEvent');
20
+ //console.log(mapState);
21
+
22
+ if (mapHook.map.map.getLayer(props.layerId)) {
23
+ //console.log("layer avail");
24
+ var _event = props.event;
25
+ var _layerId = props.layerId;
26
+ var _eventHandler = props.eventHandler;
27
+
28
+ //console.log(_event);
29
+ mapHook.map.on(_event, _layerId, _eventHandler, mapHook.componentId);
30
+ if (props?.addTouchEvents === true) {
31
+ if (touchEquivalentsKeys.indexOf(_event) !== -1) {
32
+ mapHook.map.on(touchEquivalents[_event], _layerId, _eventHandler, mapHook.componentId);
33
+ }
34
+ }
35
+ return () => {
36
+ mapHook.map.off(_event, _layerId, _eventHandler);
37
+ if (props?.addTouchEvents === true) {
38
+ if (touchEquivalentsKeys.indexOf(_event) !== -1) {
39
+ mapHook.map.off(touchEquivalents[_event], _layerId, _eventHandler, mapHook.componentId);
40
+ }
41
+ }
42
+ };
43
+ }
44
+ }, [props, mapState, mapHook.map]);
45
+
46
+ return {};
47
+ }
48
+
49
+ export default useLayerEvent;
@@ -1,88 +1,89 @@
1
- import { useContext, useState, useEffect, useRef, MutableRefObject } from "react";
1
+ import { useContext, useState, useEffect, useRef } from "react";
2
2
  import { v4 as uuidv4 } from "uuid";
3
3
  import MapContext from "../contexts/MapContext";
4
4
  import useMapState from "./useMapState";
5
5
  import MapLibreGlWrapper, { LayerState } from "../components/MapLibreMap/lib/MapLibreGlWrapper";
6
6
 
7
7
  type useMapType = {
8
- map: MapLibreGlWrapper | undefined;
9
- mapIsReady: boolean;
10
- componentId: string;
11
- layers: (LayerState | undefined)[];
12
- cleanup: Function;
8
+ map: MapLibreGlWrapper | undefined;
9
+ mapIsReady: boolean;
10
+ componentId: string;
11
+ layers: (LayerState | undefined)[];
12
+ cleanup: () => void;
13
13
  };
14
14
 
15
15
  function useMap(props: { mapId?: string; waitForLayer?: string }): useMapType {
16
- // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
17
- const mapContext: MapContextType = useContext(MapContext);
18
- const [map, setMap] = useState<MapLibreGlWrapper>();
16
+ // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
17
+ const mapContext: MapContextType = useContext(MapContext);
18
+ const [map, setMap] = useState<MapLibreGlWrapper>();
19
19
 
20
- const mapState = useMapState({
21
- mapId: props.mapId,
22
- watch: {
23
- viewport: false,
24
- layers: props.waitForLayer ? true : false,
25
- sources: false,
26
- },
27
- filter: {
28
- includeBaseLayers: true,
29
- },
30
- });
20
+ const mapState = useMapState({
21
+ mapId: props.mapId,
22
+ watch: {
23
+ viewport: false,
24
+ layers: props.waitForLayer ? true : false,
25
+ sources: false,
26
+ },
27
+ filter: {
28
+ includeBaseLayers: true,
29
+ },
30
+ });
31
31
 
32
- const initializedRef = useRef(false);
33
- const mapRef: MutableRefObject<MapLibreGlWrapper | undefined> = useRef(undefined);
32
+ const initializedRef = useRef(false);
34
33
 
35
- const componentId = useRef(uuidv4());
34
+ const mapRef = useRef<MapLibreGlWrapper>();
36
35
 
37
- const [mapIsReady, setMapIsReady] = useState(false);
36
+ const componentId = useRef(uuidv4());
38
37
 
39
- const cleanup = () => {
40
- if (mapRef.current) {
41
- mapRef.current.cleanup(componentId.current);
42
- mapRef.current = undefined;
43
- }
44
- initializedRef.current = false;
45
- };
38
+ const [mapIsReady, setMapIsReady] = useState(false);
46
39
 
47
- useEffect(() => {
48
- return () => {
49
- cleanup();
50
- setMapIsReady(false);
51
- }
52
- }, []);
40
+ const cleanup = () => {
41
+ if (mapRef.current) {
42
+ mapRef.current.cleanup(componentId.current);
43
+ }
44
+ initializedRef.current = false;
45
+ };
53
46
 
54
- useEffect(() => {
55
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
47
+ useEffect(() => {
48
+ return () => {
49
+ cleanup();
50
+ setMapIsReady(false);
51
+ mapRef.current = undefined;
52
+ };
53
+ }, []);
56
54
 
57
- // check if waitForLayer (string, layer id of the layer this hook is supposed to wait for)
58
- // exists as layer in the MapLibre instance
59
- if (props.waitForLayer) {
60
- let layerFound = false;
55
+ useEffect(() => {
56
+ if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
61
57
 
62
- mapState?.layers?.forEach((layer: any) => {
63
- if (layer.id === props.waitForLayer) {
64
- layerFound = true;
65
- }
66
- });
67
- if (!layerFound) {
68
- return;
69
- }
70
- }
71
- // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
72
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
73
- initializedRef.current = true;
74
- mapRef.current = mapContext.getMap(props.mapId);
75
- setMap(mapRef.current);
76
- setMapIsReady(true);
77
- }, [mapContext.mapIds, mapState.layers, mapContext, props.waitForLayer, props.mapId]);
58
+ // check if waitForLayer (string, layer id of the layer this hook is supposed to wait for)
59
+ // exists as layer in the MapLibre instance
60
+ if (props.waitForLayer) {
61
+ let layerFound = false;
78
62
 
79
- return {
80
- map: map,
81
- mapIsReady,
82
- componentId: componentId.current,
83
- layers: mapState.layers,
84
- cleanup,
85
- };
63
+ mapState?.layers?.forEach((layer: any) => {
64
+ if (layer.id === props.waitForLayer) {
65
+ layerFound = true;
66
+ }
67
+ });
68
+ if (!layerFound) {
69
+ return;
70
+ }
71
+ }
72
+ // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
73
+ // initialize the layer and add it to the MapLibre-gl instance or do something else with it
74
+ initializedRef.current = true;
75
+ mapRef.current = mapContext.getMap(props.mapId);
76
+ setMap(mapRef.current);
77
+ setMapIsReady(true);
78
+ }, [mapContext.mapIds, mapState.layers, mapContext, props.waitForLayer, props.mapId]);
79
+
80
+ return {
81
+ map: map,
82
+ mapIsReady,
83
+ componentId: componentId.current,
84
+ layers: mapState.layers,
85
+ cleanup,
86
+ };
86
87
  }
87
88
 
88
89
  export default useMap;