react-native-map4d-map-dtqg 0.1.3 → 0.1.5

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 (321) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +191 -133
  3. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  4. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  6. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  7. package/android/.gradle/8.9/gc.properties +0 -0
  8. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  9. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  10. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  11. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  12. package/android/.gradle/9.2.0/gc.properties +0 -0
  13. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  14. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  15. package/android/.gradle/vcs-1/gc.properties +0 -0
  16. package/android/build.gradle +60 -60
  17. package/android/src/main/AndroidManifest.xml +4 -4
  18. package/android/src/main/java/com/reactnativemap4dmap/ImageUtils.java +87 -87
  19. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapModule.java +310 -298
  20. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapPackage.java +35 -35
  21. package/android/src/main/java/com/reactnativemap4dmap/Map4dMapViewManager.java +31 -31
  22. package/android/src/main/java/com/reactnativemap4dmap/RMFBuilding.java +167 -167
  23. package/android/src/main/java/com/reactnativemap4dmap/RMFBuildingManager.java +121 -121
  24. package/android/src/main/java/com/reactnativemap4dmap/RMFCircle.java +105 -105
  25. package/android/src/main/java/com/reactnativemap4dmap/RMFCircleManager.java +121 -121
  26. package/android/src/main/java/com/reactnativemap4dmap/RMFDirectionsRenderer.java +502 -502
  27. package/android/src/main/java/com/reactnativemap4dmap/RMFDirectionsRendererManager.java +143 -143
  28. package/android/src/main/java/com/reactnativemap4dmap/RMFFeature.java +17 -17
  29. package/android/src/main/java/com/reactnativemap4dmap/RMFMapView.java +1172 -1172
  30. package/android/src/main/java/com/reactnativemap4dmap/RMFMapViewManager.java +231 -231
  31. package/android/src/main/java/com/reactnativemap4dmap/RMFMarker.java +412 -412
  32. package/android/src/main/java/com/reactnativemap4dmap/RMFMarkerManager.java +211 -211
  33. package/android/src/main/java/com/reactnativemap4dmap/RMFPOI.java +222 -222
  34. package/android/src/main/java/com/reactnativemap4dmap/RMFPOIManager.java +119 -119
  35. package/android/src/main/java/com/reactnativemap4dmap/RMFPolygon.java +172 -172
  36. package/android/src/main/java/com/reactnativemap4dmap/RMFPolygonManager.java +147 -147
  37. package/android/src/main/java/com/reactnativemap4dmap/RMFPolyline.java +146 -146
  38. package/android/src/main/java/com/reactnativemap4dmap/RMFPolylineManager.java +137 -137
  39. package/android/src/main/java/com/reactnativemap4dmap/RMFTileOverlay.java +95 -95
  40. package/android/src/main/java/com/reactnativemap4dmap/RMFTileOverlayManager.java +64 -64
  41. package/android/src/main/java/com/reactnativemap4dmap/SizeReportingShadowNode.java +31 -31
  42. package/android/src/main/java/com/reactnativemap4dmap/ViewAttacherGroup.java +31 -31
  43. package/android/src/main/java/com/reactnativemap4dmap/ViewChangesTracker.java +70 -70
  44. package/android/src/main/java/vn/map4d/map/annotations/RMFBitmapDescriptor.java +9 -9
  45. package/ios/Map4dMap.h +16 -7
  46. package/ios/Map4dMap.m +119 -14
  47. package/ios/Map4dMapTurbo.mm +16 -0
  48. package/ios/RCTConvert+Map4dMap.h +33 -33
  49. package/ios/RCTConvert+Map4dMap.m +112 -112
  50. package/ios/RMFCircle.h +37 -37
  51. package/ios/RMFCircle.m +100 -100
  52. package/ios/RMFCircleManager.h +18 -18
  53. package/ios/RMFCircleManager.m +127 -155
  54. package/ios/RMFCircleMap4d.h +23 -23
  55. package/ios/RMFCircleMap4d.m +13 -13
  56. package/ios/RMFCoordinate.h +22 -22
  57. package/ios/RMFCoordinate.m +13 -13
  58. package/ios/RMFDirectionsMarkerOptions.h +24 -24
  59. package/ios/RMFDirectionsMarkerOptions.m +23 -23
  60. package/ios/RMFDirectionsRenderer.h +47 -47
  61. package/ios/RMFDirectionsRenderer.m +182 -182
  62. package/ios/RMFDirectionsRendererManager.h +17 -17
  63. package/ios/RMFDirectionsRendererManager.m +86 -84
  64. package/ios/RMFDirectionsRendererMap4d.h +21 -21
  65. package/ios/RMFDirectionsRendererMap4d.m +12 -12
  66. package/ios/RMFDummyView.h +6 -6
  67. package/ios/RMFDummyView.m +12 -12
  68. package/ios/RMFEventResponse.h +39 -39
  69. package/ios/RMFEventResponse.m +98 -98
  70. package/ios/RMFIcon.h +24 -24
  71. package/ios/RMFIcon.m +35 -35
  72. package/ios/RMFMapView.h +84 -84
  73. package/ios/RMFMapView.m +376 -376
  74. package/ios/RMFMapViewManager.h +17 -17
  75. package/ios/RMFMapViewManager.m +424 -509
  76. package/ios/RMFMarker.h +57 -57
  77. package/ios/RMFMarker.m +267 -267
  78. package/ios/RMFMarkerManager.h +17 -17
  79. package/ios/RMFMarkerManager.m +128 -156
  80. package/ios/RMFMarkerMap4d.h +19 -19
  81. package/ios/RMFMarkerMap4d.m +13 -13
  82. package/ios/RMFPOI.h +38 -38
  83. package/ios/RMFPOI.m +123 -123
  84. package/ios/RMFPOIManager.h +18 -18
  85. package/ios/RMFPOIManager.m +134 -168
  86. package/ios/RMFPOIMap4d.h +22 -22
  87. package/ios/RMFPOIMap4d.m +12 -12
  88. package/ios/RMFPolygon.h +41 -41
  89. package/ios/RMFPolygon.m +106 -106
  90. package/ios/RMFPolygonManager.h +18 -18
  91. package/ios/RMFPolygonManager.m +119 -141
  92. package/ios/RMFPolygonMap4d.h +23 -23
  93. package/ios/RMFPolygonMap4d.m +15 -15
  94. package/ios/RMFPolyline.h +38 -38
  95. package/ios/RMFPolyline.m +101 -101
  96. package/ios/RMFPolylineManager.h +18 -18
  97. package/ios/RMFPolylineManager.m +117 -139
  98. package/ios/RMFPolylineMap4d.h +22 -22
  99. package/ios/RMFPolylineMap4d.m +15 -15
  100. package/ios/building/RMFBuilding.h +41 -41
  101. package/ios/building/RMFBuilding.m +104 -104
  102. package/ios/building/RMFBuildingManager.h +19 -19
  103. package/ios/building/RMFBuildingManager.m +105 -133
  104. package/ios/building/RMFBuildingMap4d.h +23 -23
  105. package/ios/building/RMFBuildingMap4d.m +15 -15
  106. package/ios/overlays/RMFTileOverlay.h +36 -36
  107. package/ios/overlays/RMFTileOverlay.m +64 -64
  108. package/ios/overlays/RMFTileOverlayManager.h +17 -17
  109. package/ios/overlays/RMFTileOverlayManager.m +27 -27
  110. package/lib/commonjs/components/MFBanDoSo/constants.js +27 -0
  111. package/lib/commonjs/components/MFBanDoSo/constants.js.map +1 -0
  112. package/lib/commonjs/components/MFBanDoSo/helpers.js +200 -0
  113. package/lib/commonjs/components/MFBanDoSo/helpers.js.map +1 -0
  114. package/lib/commonjs/components/MFBanDoSo/propTypes.js +18 -0
  115. package/lib/commonjs/components/MFBanDoSo/propTypes.js.map +1 -0
  116. package/lib/commonjs/components/MFBanDoSo/styles.js +328 -0
  117. package/lib/commonjs/components/MFBanDoSo/styles.js.map +1 -0
  118. package/lib/commonjs/components/MFBanDoSo/ui.js +220 -0
  119. package/lib/commonjs/components/MFBanDoSo/ui.js.map +1 -0
  120. package/lib/commonjs/components/MFBanDoSo.js +190 -73
  121. package/lib/commonjs/components/MFBanDoSo.js.map +1 -1
  122. package/lib/commonjs/components/MFBuilding.js +41 -98
  123. package/lib/commonjs/components/MFBuilding.js.map +1 -1
  124. package/lib/commonjs/components/MFCircle.js +40 -90
  125. package/lib/commonjs/components/MFCircle.js.map +1 -1
  126. package/lib/commonjs/components/MFDirectionsRenderer.js +47 -107
  127. package/lib/commonjs/components/MFDirectionsRenderer.js.map +1 -1
  128. package/lib/commonjs/components/MFMapView.js +119 -199
  129. package/lib/commonjs/components/MFMapView.js.map +1 -1
  130. package/lib/commonjs/components/MFMarker.js +50 -118
  131. package/lib/commonjs/components/MFMarker.js.map +1 -1
  132. package/lib/commonjs/components/MFPOI.js +37 -94
  133. package/lib/commonjs/components/MFPOI.js.map +1 -1
  134. package/lib/commonjs/components/MFPolygon.js +37 -91
  135. package/lib/commonjs/components/MFPolygon.js.map +1 -1
  136. package/lib/commonjs/components/MFPolyline.js +35 -87
  137. package/lib/commonjs/components/MFPolyline.js.map +1 -1
  138. package/lib/commonjs/components/MFTileOverlay.js +16 -24
  139. package/lib/commonjs/components/MFTileOverlay.js.map +1 -1
  140. package/lib/commonjs/components/Map4dMapView.js +1 -4
  141. package/lib/commonjs/components/Map4dMapView.js.map +1 -1
  142. package/lib/commonjs/components/extends/AreaFocusManager.js +20 -54
  143. package/lib/commonjs/components/extends/AreaFocusManager.js.map +1 -1
  144. package/lib/commonjs/components/extends/AreaFocuser.js +3 -19
  145. package/lib/commonjs/components/extends/AreaFocuser.js.map +1 -1
  146. package/lib/commonjs/components/extends/BoundHelper.js +0 -6
  147. package/lib/commonjs/components/extends/BoundHelper.js.map +1 -1
  148. package/lib/commonjs/components/extends/area/AreaFocusAreas.js +0 -37
  149. package/lib/commonjs/components/extends/area/AreaFocusAreas.js.map +1 -1
  150. package/lib/commonjs/components/extends/area/AreaFocusGeometryUtils.js +1 -35
  151. package/lib/commonjs/components/extends/area/AreaFocusGeometryUtils.js.map +1 -1
  152. package/lib/commonjs/components/extends/area/AreaFocusSession.js +0 -18
  153. package/lib/commonjs/components/extends/area/AreaFocusSession.js.map +1 -1
  154. package/lib/commonjs/components/extends/area/AreaFocusTypes.js +20 -21
  155. package/lib/commonjs/components/extends/area/AreaFocusTypes.js.map +1 -1
  156. package/lib/commonjs/components/internal/DefaultRoadmapStyle.js +1 -2
  157. package/lib/commonjs/components/internal/DefaultRoadmapStyle.js.map +1 -1
  158. package/lib/commonjs/components/internal/GeojsonStyleUtils.js +20 -31
  159. package/lib/commonjs/components/internal/GeojsonStyleUtils.js.map +1 -1
  160. package/lib/commonjs/index.js +0 -11
  161. package/lib/commonjs/index.js.map +1 -1
  162. package/lib/commonjs/native/Map4dMapNativeModule.js +10 -0
  163. package/lib/commonjs/native/Map4dMapNativeModule.js.map +1 -0
  164. package/lib/commonjs/native/NativeModuleResolver.js +35 -0
  165. package/lib/commonjs/native/NativeModuleResolver.js.map +1 -0
  166. package/lib/commonjs/native/ViewManagerCommand.js +67 -0
  167. package/lib/commonjs/native/ViewManagerCommand.js.map +1 -0
  168. package/lib/commonjs/package.json +1 -0
  169. package/lib/commonjs/specs/NativeMap4dMap.js +9 -0
  170. package/lib/commonjs/specs/NativeMap4dMap.js.map +1 -0
  171. package/lib/module/components/MFBanDoSo/constants.js +22 -0
  172. package/lib/module/components/MFBanDoSo/constants.js.map +1 -0
  173. package/lib/module/components/MFBanDoSo/helpers.js +188 -0
  174. package/lib/module/components/MFBanDoSo/helpers.js.map +1 -0
  175. package/lib/module/components/MFBanDoSo/propTypes.js +14 -0
  176. package/lib/module/components/MFBanDoSo/propTypes.js.map +1 -0
  177. package/lib/module/components/MFBanDoSo/styles.js +325 -0
  178. package/lib/module/components/MFBanDoSo/styles.js.map +1 -0
  179. package/lib/module/components/MFBanDoSo/ui.js +213 -0
  180. package/lib/module/components/MFBanDoSo/ui.js.map +1 -0
  181. package/lib/module/components/MFBanDoSo.js +192 -63
  182. package/lib/module/components/MFBanDoSo.js.map +1 -1
  183. package/lib/module/components/MFBuilding.js +43 -90
  184. package/lib/module/components/MFBuilding.js.map +1 -1
  185. package/lib/module/components/MFCircle.js +42 -82
  186. package/lib/module/components/MFCircle.js.map +1 -1
  187. package/lib/module/components/MFDirectionsRenderer.js +48 -99
  188. package/lib/module/components/MFDirectionsRenderer.js.map +1 -1
  189. package/lib/module/components/MFMapView.js +120 -188
  190. package/lib/module/components/MFMapView.js.map +1 -1
  191. package/lib/module/components/MFMarker.js +52 -109
  192. package/lib/module/components/MFMarker.js.map +1 -1
  193. package/lib/module/components/MFPOI.js +39 -86
  194. package/lib/module/components/MFPOI.js.map +1 -1
  195. package/lib/module/components/MFPolygon.js +39 -83
  196. package/lib/module/components/MFPolygon.js.map +1 -1
  197. package/lib/module/components/MFPolyline.js +37 -79
  198. package/lib/module/components/MFPolyline.js.map +1 -1
  199. package/lib/module/components/MFTileOverlay.js +19 -18
  200. package/lib/module/components/MFTileOverlay.js.map +1 -1
  201. package/lib/module/components/Map4dMapView.js +2 -0
  202. package/lib/module/components/Map4dMapView.js.map +1 -1
  203. package/lib/module/components/extends/AreaFocusManager.js +22 -48
  204. package/lib/module/components/extends/AreaFocusManager.js.map +1 -1
  205. package/lib/module/components/extends/AreaFocuser.js +5 -17
  206. package/lib/module/components/extends/AreaFocuser.js.map +1 -1
  207. package/lib/module/components/extends/BoundHelper.js +2 -5
  208. package/lib/module/components/extends/BoundHelper.js.map +1 -1
  209. package/lib/module/components/extends/area/AreaFocusAreas.js +2 -33
  210. package/lib/module/components/extends/area/AreaFocusAreas.js.map +1 -1
  211. package/lib/module/components/extends/area/AreaFocusGeometryUtils.js +2 -32
  212. package/lib/module/components/extends/area/AreaFocusGeometryUtils.js.map +1 -1
  213. package/lib/module/components/extends/area/AreaFocusSession.js +2 -17
  214. package/lib/module/components/extends/area/AreaFocusSession.js.map +1 -1
  215. package/lib/module/components/extends/area/AreaFocusTypes.js +21 -18
  216. package/lib/module/components/extends/area/AreaFocusTypes.js.map +1 -1
  217. package/lib/module/components/internal/DefaultRoadmapStyle.js +2 -0
  218. package/lib/module/components/internal/DefaultRoadmapStyle.js.map +1 -1
  219. package/lib/module/components/internal/GeojsonStyleUtils.js +21 -28
  220. package/lib/module/components/internal/GeojsonStyleUtils.js.map +1 -1
  221. package/lib/module/index.js +2 -0
  222. package/lib/module/index.js.map +1 -1
  223. package/lib/module/native/Map4dMapNativeModule.js +5 -0
  224. package/lib/module/native/Map4dMapNativeModule.js.map +1 -0
  225. package/lib/module/native/NativeModuleResolver.js +29 -0
  226. package/lib/module/native/NativeModuleResolver.js.map +1 -0
  227. package/lib/module/native/ViewManagerCommand.js +61 -0
  228. package/lib/module/native/ViewManagerCommand.js.map +1 -0
  229. package/lib/module/specs/NativeMap4dMap.js +5 -0
  230. package/lib/module/specs/NativeMap4dMap.js.map +1 -0
  231. package/lib/typescript/components/MFBanDoSo/constants.d.ts +8 -0
  232. package/lib/typescript/components/MFBanDoSo/constants.d.ts.map +1 -0
  233. package/lib/typescript/components/MFBanDoSo/helpers.d.ts +14 -0
  234. package/lib/typescript/components/MFBanDoSo/helpers.d.ts.map +1 -0
  235. package/lib/typescript/components/MFBanDoSo/propTypes.d.ts +2 -0
  236. package/lib/typescript/components/MFBanDoSo/propTypes.d.ts.map +1 -0
  237. package/lib/typescript/components/MFBanDoSo/styles.d.ts +462 -0
  238. package/lib/typescript/components/MFBanDoSo/styles.d.ts.map +1 -0
  239. package/lib/typescript/components/MFBanDoSo/ui.d.ts +30 -0
  240. package/lib/typescript/components/MFBanDoSo/ui.d.ts.map +1 -0
  241. package/lib/typescript/components/MFBanDoSo.d.ts +37 -0
  242. package/lib/typescript/components/MFBanDoSo.d.ts.map +1 -0
  243. package/lib/typescript/components/MFBuilding.d.ts +24 -0
  244. package/lib/typescript/components/MFBuilding.d.ts.map +1 -0
  245. package/lib/typescript/components/MFCircle.d.ts +24 -0
  246. package/lib/typescript/components/MFCircle.d.ts.map +1 -0
  247. package/lib/typescript/components/MFDirectionsRenderer.d.ts +19 -0
  248. package/lib/typescript/components/MFDirectionsRenderer.d.ts.map +1 -0
  249. package/lib/typescript/components/MFMapView.d.ts +66 -0
  250. package/lib/typescript/components/MFMapView.d.ts.map +1 -0
  251. package/lib/typescript/components/MFMarker.d.ts +26 -0
  252. package/lib/typescript/components/MFMarker.d.ts.map +1 -0
  253. package/lib/typescript/components/MFPOI.d.ts +24 -0
  254. package/lib/typescript/components/MFPOI.d.ts.map +1 -0
  255. package/lib/typescript/components/MFPolygon.d.ts +24 -0
  256. package/lib/typescript/components/MFPolygon.d.ts.map +1 -0
  257. package/lib/typescript/components/MFPolyline.d.ts +24 -0
  258. package/lib/typescript/components/MFPolyline.d.ts.map +1 -0
  259. package/lib/typescript/components/MFTileOverlay.d.ts +12 -0
  260. package/lib/typescript/components/MFTileOverlay.d.ts.map +1 -0
  261. package/lib/typescript/components/Map4dMapView.d.ts +2 -1
  262. package/lib/typescript/components/Map4dMapView.d.ts.map +1 -0
  263. package/lib/typescript/components/extends/AreaFocusManager.d.ts +34 -0
  264. package/lib/typescript/components/extends/AreaFocusManager.d.ts.map +1 -0
  265. package/lib/typescript/components/extends/AreaFocuser.d.ts +15 -0
  266. package/lib/typescript/components/extends/AreaFocuser.d.ts.map +1 -0
  267. package/lib/typescript/components/extends/BoundHelper.d.ts +11 -0
  268. package/lib/typescript/components/extends/BoundHelper.d.ts.map +1 -0
  269. package/lib/typescript/components/extends/area/AreaFocusAreas.d.ts +58 -0
  270. package/lib/typescript/components/extends/area/AreaFocusAreas.d.ts.map +1 -0
  271. package/lib/typescript/components/extends/area/AreaFocusGeometryUtils.d.ts +19 -0
  272. package/lib/typescript/components/extends/area/AreaFocusGeometryUtils.d.ts.map +1 -0
  273. package/lib/typescript/components/extends/area/AreaFocusSession.d.ts +14 -0
  274. package/lib/typescript/components/extends/area/AreaFocusSession.d.ts.map +1 -0
  275. package/lib/typescript/components/extends/area/AreaFocusTypes.d.ts +40 -0
  276. package/lib/typescript/components/extends/area/AreaFocusTypes.d.ts.map +1 -0
  277. package/lib/typescript/components/internal/DefaultRoadmapStyle.d.ts +820 -0
  278. package/lib/typescript/components/internal/DefaultRoadmapStyle.d.ts.map +1 -0
  279. package/lib/typescript/components/internal/GeojsonStyleUtils.d.ts +3 -0
  280. package/lib/typescript/components/internal/GeojsonStyleUtils.d.ts.map +1 -0
  281. package/lib/typescript/index.d.ts +13 -0
  282. package/lib/typescript/index.d.ts.map +1 -0
  283. package/lib/typescript/native/Map4dMapNativeModule.d.ts +2 -0
  284. package/lib/typescript/native/Map4dMapNativeModule.d.ts.map +1 -0
  285. package/lib/typescript/native/NativeModuleResolver.d.ts +3 -0
  286. package/lib/typescript/native/NativeModuleResolver.d.ts.map +1 -0
  287. package/lib/typescript/native/ViewManagerCommand.d.ts +11 -0
  288. package/lib/typescript/native/ViewManagerCommand.d.ts.map +1 -0
  289. package/package.json +168 -152
  290. package/react-native-map4d-map.podspec +20 -20
  291. package/src/components/MFBanDoSo/constants.js +32 -0
  292. package/src/components/MFBanDoSo/helpers.js +273 -0
  293. package/src/components/MFBanDoSo/propTypes.js +14 -0
  294. package/src/components/MFBanDoSo/styles.js +316 -0
  295. package/src/components/MFBanDoSo/ui.js +230 -0
  296. package/src/components/MFBanDoSo.js +314 -124
  297. package/src/components/MFBuilding.js +160 -187
  298. package/src/components/MFCircle.js +146 -173
  299. package/src/components/MFDirectionsRenderer.js +211 -237
  300. package/src/components/MFMapView.js +458 -464
  301. package/src/components/MFMarker.js +218 -246
  302. package/src/components/MFPOI.js +157 -184
  303. package/src/components/MFPolygon.js +159 -186
  304. package/src/components/MFPolyline.js +145 -172
  305. package/src/components/MFTileOverlay.js +45 -45
  306. package/src/components/Map4dMapView.tsx +26 -26
  307. package/src/components/extends/AreaFocusManager.js +196 -196
  308. package/src/components/extends/AreaFocuser.js +61 -61
  309. package/src/components/extends/BoundHelper.js +31 -31
  310. package/src/components/extends/area/AreaFocusAreas.js +164 -164
  311. package/src/components/extends/area/AreaFocusGeometryUtils.js +164 -164
  312. package/src/components/extends/area/AreaFocusSession.js +100 -100
  313. package/src/components/extends/area/AreaFocusTypes.js +36 -36
  314. package/src/components/internal/DefaultRoadmapStyle.js +3365 -3365
  315. package/src/components/internal/GeojsonStyleUtils.js +146 -143
  316. package/src/index.js +25 -25
  317. package/src/native/Map4dMapNativeModule.js +3 -0
  318. package/src/native/NativeModuleResolver.js +33 -0
  319. package/src/native/ViewManagerCommand.js +82 -0
  320. package/src/specs/NativeMap4dMap.js +12 -0
  321. package/ios/Map4dMapViewManager.m +0 -34
@@ -0,0 +1,230 @@
1
+ import React from 'react';
2
+ import {
3
+ Animated,
4
+ Pressable,
5
+ ScrollView,
6
+ Text,
7
+ View,
8
+ } from 'react-native';
9
+ import { styles } from './styles';
10
+
11
+ function LayerButton({ show, isActive, onPress }) {
12
+ if (!show) {
13
+ return null;
14
+ }
15
+
16
+ return (
17
+ <View style={styles.layerButtonContainer} pointerEvents="box-none">
18
+ <Pressable
19
+ style={[
20
+ styles.layerButton,
21
+ isActive && styles.layerButtonActive,
22
+ ]}
23
+ onPress={onPress}
24
+ >
25
+ <View style={styles.layerIconBoxPrimary} />
26
+ <View style={styles.layerIconBoxSecondary} />
27
+ </Pressable>
28
+ </View>
29
+ );
30
+ }
31
+
32
+ function LegendButton({ show, isActive, onPress }) {
33
+ if (!show) {
34
+ return null;
35
+ }
36
+
37
+ return (
38
+ <View style={styles.layerButtonContainer} pointerEvents="box-none">
39
+ <Pressable
40
+ style={[
41
+ styles.layerButton,
42
+ styles.legendButton,
43
+ isActive && styles.layerButtonActive,
44
+ ]}
45
+ onPress={onPress}
46
+ >
47
+ <View style={styles.legendToggleIconRow}>
48
+ <View style={styles.legendToggleIconDot} />
49
+ <View style={styles.legendToggleIconLine} />
50
+ </View>
51
+ <View style={styles.legendToggleIconRow}>
52
+ <View style={styles.legendToggleIconDot} />
53
+ <View style={styles.legendToggleIconLine} />
54
+ </View>
55
+ </Pressable>
56
+ </View>
57
+ );
58
+ }
59
+
60
+ function SelectorDrawer({
61
+ show,
62
+ title,
63
+ groupSections,
64
+ expandedGroupKeys,
65
+ backdropAnimatedStyle,
66
+ panelAnimatedStyle,
67
+ onClose,
68
+ onToggleGroup,
69
+ onToggleGroupChecked,
70
+ onToggleItem,
71
+ }) {
72
+ if (!show) {
73
+ return null;
74
+ }
75
+
76
+ return (
77
+ <View style={styles.selectorContainer}>
78
+ <Animated.View style={[styles.selectorBackdrop, backdropAnimatedStyle]}>
79
+ <Pressable
80
+ style={styles.selectorBackdropPressable}
81
+ onPress={onClose}
82
+ />
83
+ </Animated.View>
84
+ <Animated.View style={[styles.selectorPanel, panelAnimatedStyle]}>
85
+ <View style={styles.selectorHeader}>
86
+ <Text style={styles.selectorTitle}>{title}</Text>
87
+ </View>
88
+ <ScrollView style={styles.selectorList} showsVerticalScrollIndicator={false}>
89
+ <View style={styles.selectorGrid}>
90
+ {groupSections.map((group) => {
91
+ const groupKey = group?.key || '__group__';
92
+ const groupTitle = group?.title || 'Khac';
93
+ const groupItems = Array.isArray(group?.items) ? group.items : [];
94
+ const isExpanded = expandedGroupKeys[groupKey] !== false;
95
+ const checkedCount = groupItems.reduce(
96
+ (acc, wrapped) => acc + (wrapped?.item?.checked !== false ? 1 : 0),
97
+ 0
98
+ );
99
+ const isGroupChecked = groupItems.length > 0 && checkedCount === groupItems.length;
100
+ const isGroupIndeterminate =
101
+ checkedCount > 0 && checkedCount < groupItems.length;
102
+
103
+ return (
104
+ <View key={groupKey} style={styles.selectorGroupSection}>
105
+ <View style={styles.selectorGroupHeader}>
106
+ <Pressable
107
+ style={styles.selectorGroupCheckAction}
108
+ onPress={() => onToggleGroupChecked(groupKey, !isGroupChecked)}
109
+ >
110
+ <View
111
+ style={[
112
+ styles.groupCheckOuter,
113
+ isGroupChecked && styles.groupCheckOuterChecked,
114
+ isGroupIndeterminate && styles.groupCheckOuterIndeterminate,
115
+ ]}
116
+ >
117
+ {isGroupChecked ? (
118
+ <Text style={styles.groupCheckMark}>✓</Text>
119
+ ) : isGroupIndeterminate ? (
120
+ <View style={styles.groupCheckIndeterminateMark} />
121
+ ) : null}
122
+ </View>
123
+ </Pressable>
124
+ <Pressable
125
+ style={styles.selectorGroupToggleAction}
126
+ onPress={() => onToggleGroup(groupKey)}
127
+ >
128
+ <View
129
+ style={[
130
+ styles.selectorGroupChevronTriangle,
131
+ isExpanded
132
+ ? styles.selectorGroupChevronExpanded
133
+ : styles.selectorGroupChevronCollapsed,
134
+ ]}
135
+ />
136
+ <Text style={styles.selectorGroupTitle} numberOfLines={1}>
137
+ {groupTitle}
138
+ </Text>
139
+ </Pressable>
140
+ </View>
141
+
142
+ {isExpanded ? (
143
+ <View style={styles.selectorGroupBody}>
144
+ {groupItems.map(({ item, index }) => {
145
+ const itemKey = item?.key ?? `index-${index}`;
146
+ const checked = item?.checked !== false;
147
+ const itemTitle = item?.title || item?.key || `Item ${index + 1}`;
148
+
149
+ return (
150
+ <Pressable
151
+ key={`${itemKey}-${index}`}
152
+ style={styles.selectorRow}
153
+ onPress={() => onToggleItem(itemKey, index)}
154
+ >
155
+ <View
156
+ style={[
157
+ styles.checkboxOuter,
158
+ checked && styles.checkboxOuterChecked,
159
+ ]}
160
+ >
161
+ {checked ? (
162
+ <Text style={styles.checkboxMark}>✓</Text>
163
+ ) : null}
164
+ </View>
165
+ <Text style={styles.selectorLabel}>
166
+ {itemTitle}
167
+ </Text>
168
+ </Pressable>
169
+ );
170
+ })}
171
+ </View>
172
+ ) : null}
173
+ </View>
174
+ );
175
+ })}
176
+ </View>
177
+ </ScrollView>
178
+ </Animated.View>
179
+ </View>
180
+ );
181
+ }
182
+
183
+ function LegendPanel({ show, title, items, getItemColor }) {
184
+ if (!show) {
185
+ return null;
186
+ }
187
+
188
+ return (
189
+ <View style={styles.legendContainer} pointerEvents="box-none">
190
+ <View style={styles.legendPanel}>
191
+ <Text style={styles.legendTitle}>{title}</Text>
192
+ <View style={styles.legendDivider} />
193
+ <ScrollView style={styles.legendList} showsVerticalScrollIndicator={true}>
194
+ <View style={styles.legendListInner}>
195
+ {items.map((item, index) => {
196
+ const checked = item?.checked !== false;
197
+ const itemTitle =
198
+ item?.title || item?.label || item?.name || item?.key || '';
199
+ const dotColor = getItemColor(item, index);
200
+ const hasDotColor =
201
+ typeof dotColor === 'string' && dotColor.trim().length > 0;
202
+
203
+ return (
204
+ <View
205
+ key={`${item?.key ?? `index-${index}`}-${index}`}
206
+ style={styles.legendRow}
207
+ >
208
+ <View
209
+ style={[
210
+ styles.legendDot,
211
+ hasDotColor
212
+ ? { backgroundColor: dotColor, borderColor: dotColor }
213
+ : null,
214
+ !checked && !hasDotColor ? styles.legendDotUnchecked : null,
215
+ ]}
216
+ />
217
+ <Text style={styles.legendLabel} numberOfLines={1}>
218
+ {itemTitle}
219
+ </Text>
220
+ </View>
221
+ );
222
+ })}
223
+ </View>
224
+ </ScrollView>
225
+ </View>
226
+ </View>
227
+ );
228
+ }
229
+
230
+ export { LayerButton, LegendButton, LegendPanel, SelectorDrawer };
@@ -1,124 +1,314 @@
1
- import PropTypes from 'prop-types';
2
- import { MFMapView } from './MFMapView';
3
- import {
4
- buildGeojsonStyle,
5
- createCategoryItemsSignature,
6
- } from './internal/GeojsonStyleUtils';
7
-
8
- const FilterStylePropType = PropTypes.shape({
9
- kind: PropTypes.oneOfType([
10
- PropTypes.string,
11
- PropTypes.arrayOf(PropTypes.string),
12
- ]),
13
- kind_detail: PropTypes.oneOfType([
14
- PropTypes.string,
15
- PropTypes.arrayOf(PropTypes.string),
16
- ]),
17
- });
18
-
19
- const DrawLinePropType = PropTypes.shape({
20
- color: PropTypes.string,
21
- width: PropTypes.oneOfType([PropTypes.number, PropTypes.array]),
22
- });
23
-
24
- const DrawFillPropType = PropTypes.shape({
25
- color: PropTypes.string,
26
- });
27
-
28
- const DrawSymbolPropType = PropTypes.shape({
29
- icon_image: PropTypes.string,
30
- icon_index: PropTypes.number,
31
- icon_color: PropTypes.string,
32
- use_direct_icon_url: PropTypes.bool,
33
- });
34
-
35
- const CategoryStylePropType = PropTypes.shape({
36
- line: PropTypes.arrayOf(
37
- PropTypes.shape({
38
- layer: PropTypes.string,
39
- filter: FilterStylePropType,
40
- draw: DrawLinePropType,
41
- })
42
- ),
43
- fill: PropTypes.arrayOf(
44
- PropTypes.shape({
45
- layer: PropTypes.string,
46
- filter: FilterStylePropType,
47
- draw: DrawFillPropType,
48
- })
49
- ),
50
- symbol: PropTypes.arrayOf(
51
- PropTypes.shape({
52
- layer: PropTypes.string,
53
- filter: FilterStylePropType,
54
- draw: DrawSymbolPropType,
55
- })
56
- ),
57
- });
58
-
59
- const CategoryItemPropType = PropTypes.shape({
60
- key: PropTypes.string,
61
- title: PropTypes.string,
62
- group: PropTypes.string,
63
- order: PropTypes.number,
64
- checked: PropTypes.bool,
65
- style: CategoryStylePropType,
66
- });
67
-
68
- class MFBanDoSo extends MFMapView {
69
- constructor(props) {
70
- super(props);
71
- this._appliedGeojsonStyle = null;
72
- }
73
-
74
- componentDidMount() {
75
- this._syncGeojsonStyle();
76
- }
77
-
78
- componentDidUpdate(prevProps, prevState) {
79
- const mapReadyChanged = prevState.isReady !== this.state.isReady;
80
- const mapStyleChanged = prevProps.mapStyle !== this.props.mapStyle;
81
- const sourceUrlChanged = prevProps.sourceUrl !== this.props.sourceUrl;
82
- const itemsChanged =
83
- createCategoryItemsSignature(prevProps.items) !==
84
- createCategoryItemsSignature(this.props.items);
85
-
86
- if (
87
- mapReadyChanged ||
88
- mapStyleChanged ||
89
- sourceUrlChanged ||
90
- itemsChanged
91
- ) {
92
- this._syncGeojsonStyle();
93
- }
94
- }
95
-
96
- _syncGeojsonStyle() {
97
- if (!this.state.isReady) {
98
- return;
99
- }
100
-
101
- const items = this.props.items || [];
102
-
103
- const geojsonStyle = buildGeojsonStyle(
104
- this.props.mapStyle,
105
- this.props.sourceUrl,
106
- items
107
- );
108
-
109
- if (!geojsonStyle || geojsonStyle === this._appliedGeojsonStyle) {
110
- return;
111
- }
112
-
113
- this._appliedGeojsonStyle = geojsonStyle;
114
- this._runCommand('setMapStyle', [geojsonStyle]);
115
- }
116
- }
117
-
118
- MFBanDoSo.propTypes = {
119
- ...MFMapView.propTypes,
120
- items: PropTypes.arrayOf(CategoryItemPropType),
121
- sourceUrl: PropTypes.string.isRequired,
122
- };
123
-
124
- export { MFBanDoSo };
1
+ import React from 'react';
2
+ import {
3
+ Animated,
4
+ Easing,
5
+ } from 'react-native';
6
+ import {
7
+ LEGEND_TITLE,
8
+ SELECTOR_CLOSE_DURATION_MS,
9
+ SELECTOR_DRAWER_TRANSLATE_X,
10
+ SELECTOR_OPEN_DURATION_MS,
11
+ SELECTOR_TITLE,
12
+ getCategoryConfigUrl,
13
+ getSourceUrl,
14
+ } from './MFBanDoSo/constants';
15
+ import {
16
+ createCategoryGroupSections,
17
+ createSelectedCategoryItemsSignature,
18
+ getSelectedCategoryItems,
19
+ normalizeCategoryItems,
20
+ reconcileExpandedGroupKeys,
21
+ resolveCategoryGroupMetadataFromResponse,
22
+ resolveCategoryItemColor,
23
+ resolveItemsFromCategoryResponse,
24
+ toggleCategoryGroupChecked,
25
+ toggleCategoryItemChecked,
26
+ } from './MFBanDoSo/helpers';
27
+ import {
28
+ banDoSoPropTypes,
29
+ } from './MFBanDoSo/propTypes';
30
+ import { MFMapView } from './MFMapView';
31
+ import {
32
+ LayerButton,
33
+ LegendButton,
34
+ LegendPanel,
35
+ SelectorDrawer,
36
+ } from './MFBanDoSo/ui';
37
+ import {
38
+ buildGeojsonStyle,
39
+ } from './internal/GeojsonStyleUtils';
40
+
41
+ class MFBanDoSo extends MFMapView {
42
+ constructor(props) {
43
+ super(props);
44
+ this._appliedGeojsonStyle = null;
45
+ this._isMounted = false;
46
+ this._categoryRequestId = 0;
47
+ this._selectorAnim = new Animated.Value(0);
48
+ this.state = {
49
+ ...this.state,
50
+ categoryItems: [],
51
+ expandedGroupKeys: {},
52
+ groupTitleByKey: {},
53
+ groupOrderedKeys: [],
54
+ isLegendVisible: false,
55
+ isSelectorVisible: false,
56
+ isSelectorMounted: false,
57
+ };
58
+
59
+ this._toggleItem = this._toggleItem.bind(this);
60
+ this._toggleGroupChecked = this._toggleGroupChecked.bind(this);
61
+ this._toggleGroup = this._toggleGroup.bind(this);
62
+ this._toggleSelectorVisibility = this._toggleSelectorVisibility.bind(this);
63
+ this._toggleLegendVisibility = this._toggleLegendVisibility.bind(this);
64
+ this._openSelector = this._openSelector.bind(this);
65
+ this._closeSelector = this._closeSelector.bind(this);
66
+ }
67
+
68
+ componentDidMount() {
69
+ this._isMounted = true;
70
+ this._loadCategoryItems();
71
+ this._syncGeojsonStyle();
72
+ }
73
+
74
+ componentDidUpdate(prevProps, prevState) {
75
+ const mapReadyChanged = prevState.isReady !== this.state.isReady;
76
+ const mapStyleChanged = prevProps.mapStyle !== this.props.mapStyle;
77
+ const isStagingChanged = prevProps.isStaging !== this.props.isStaging;
78
+
79
+ if (isStagingChanged) {
80
+ this._loadCategoryItems();
81
+ }
82
+
83
+ const itemsChanged =
84
+ createSelectedCategoryItemsSignature(prevState.categoryItems) !==
85
+ createSelectedCategoryItemsSignature(this.state.categoryItems);
86
+
87
+ if (mapReadyChanged || mapStyleChanged || isStagingChanged || itemsChanged) {
88
+ this._syncGeojsonStyle();
89
+ }
90
+ }
91
+
92
+ componentWillUnmount() {
93
+ this._isMounted = false;
94
+ }
95
+
96
+ async _loadCategoryItems() {
97
+ const requestId = this._categoryRequestId + 1;
98
+ this._categoryRequestId = requestId;
99
+
100
+ try {
101
+ const response = await fetch(getCategoryConfigUrl(this.props.isStaging));
102
+ if (!response.ok) {
103
+ throw new Error(`Failed to fetch category config: ${response.status}`);
104
+ }
105
+
106
+ const json = await response.json();
107
+ const nextItems = resolveItemsFromCategoryResponse(json);
108
+ const groupMetadata = resolveCategoryGroupMetadataFromResponse(json);
109
+
110
+ if (!this._isMounted || requestId !== this._categoryRequestId) {
111
+ return;
112
+ }
113
+
114
+ this.setState((prevState) => {
115
+ const categoryItems = normalizeCategoryItems(nextItems);
116
+ const groupSections = createCategoryGroupSections(
117
+ categoryItems,
118
+ groupMetadata.titleByKey,
119
+ groupMetadata.orderedKeys
120
+ );
121
+
122
+ return {
123
+ categoryItems,
124
+ groupTitleByKey: groupMetadata.titleByKey,
125
+ groupOrderedKeys: groupMetadata.orderedKeys,
126
+ expandedGroupKeys: reconcileExpandedGroupKeys(
127
+ groupSections,
128
+ prevState.expandedGroupKeys
129
+ ),
130
+ };
131
+ });
132
+ } catch (error) {
133
+ if (requestId !== this._categoryRequestId) {
134
+ return;
135
+ }
136
+ console.warn('Cannot load category items', error);
137
+ }
138
+ }
139
+
140
+ _toggleItem(targetKey, targetIndex) {
141
+ this.setState((prevState) => ({
142
+ categoryItems: toggleCategoryItemChecked(
143
+ prevState.categoryItems,
144
+ targetKey,
145
+ targetIndex
146
+ ),
147
+ }));
148
+ }
149
+
150
+ _toggleGroup(groupKey) {
151
+ if (typeof groupKey !== 'string' || groupKey.length === 0) {
152
+ return;
153
+ }
154
+
155
+ this.setState((prevState) => ({
156
+ expandedGroupKeys: {
157
+ ...prevState.expandedGroupKeys,
158
+ [groupKey]: !(prevState.expandedGroupKeys[groupKey] !== false),
159
+ },
160
+ }));
161
+ }
162
+
163
+ _toggleGroupChecked(groupKey, checkedValue) {
164
+ this.setState((prevState) => ({
165
+ categoryItems: toggleCategoryGroupChecked(
166
+ prevState.categoryItems,
167
+ groupKey,
168
+ checkedValue
169
+ ),
170
+ }));
171
+ }
172
+
173
+ _toggleSelectorVisibility() {
174
+ if (this.state.isSelectorVisible) {
175
+ this._closeSelector();
176
+ return;
177
+ }
178
+
179
+ this._openSelector();
180
+ }
181
+
182
+ _toggleLegendVisibility() {
183
+ this.setState((prevState) => ({
184
+ isLegendVisible: !prevState.isLegendVisible,
185
+ }));
186
+ }
187
+
188
+ _openSelector() {
189
+ this.setState({
190
+ isSelectorMounted: true,
191
+ isSelectorVisible: true,
192
+ }, () => {
193
+ Animated.timing(this._selectorAnim, {
194
+ toValue: 1,
195
+ duration: SELECTOR_OPEN_DURATION_MS,
196
+ easing: Easing.out(Easing.cubic),
197
+ useNativeDriver: true,
198
+ }).start();
199
+ });
200
+ }
201
+
202
+ _closeSelector() {
203
+ Animated.timing(this._selectorAnim, {
204
+ toValue: 0,
205
+ duration: SELECTOR_CLOSE_DURATION_MS,
206
+ easing: Easing.in(Easing.cubic),
207
+ useNativeDriver: true,
208
+ }).start(() => {
209
+ if (!this._isMounted) {
210
+ return;
211
+ }
212
+
213
+ this.setState({
214
+ isSelectorVisible: false,
215
+ isSelectorMounted: false,
216
+ });
217
+ });
218
+ }
219
+
220
+ _syncGeojsonStyle() {
221
+ if (!this.state.isReady) {
222
+ return;
223
+ }
224
+
225
+ const items = getSelectedCategoryItems(this.state.categoryItems);
226
+
227
+ const geojsonStyle = buildGeojsonStyle(
228
+ this.props.mapStyle,
229
+ getSourceUrl(this.props.isStaging),
230
+ items
231
+ );
232
+
233
+ if (!geojsonStyle || geojsonStyle === this._appliedGeojsonStyle) {
234
+ return;
235
+ }
236
+
237
+ this._appliedGeojsonStyle = geojsonStyle;
238
+ this._runCommand('setMapStyle', [geojsonStyle]);
239
+ }
240
+
241
+ render() {
242
+ const items = this.state.categoryItems;
243
+ const groupSections = createCategoryGroupSections(
244
+ items,
245
+ this.state.groupTitleByKey,
246
+ this.state.groupOrderedKeys
247
+ );
248
+ const hasItems = Array.isArray(items) && items.length > 0;
249
+ const showLayerButton = hasItems;
250
+ const showSelector = this.state.isSelectorMounted && hasItems;
251
+ const showLegendButton = hasItems;
252
+ const showLegend = this.state.isLegendVisible && hasItems;
253
+ const selectorTitle = SELECTOR_TITLE;
254
+ const legendTitle = LEGEND_TITLE;
255
+ const backdropAnimatedStyle = {
256
+ opacity: this._selectorAnim.interpolate({
257
+ inputRange: [0, 1],
258
+ outputRange: [0, 1],
259
+ }),
260
+ };
261
+ const panelAnimatedStyle = {
262
+ transform: [
263
+ {
264
+ translateX: this._selectorAnim.interpolate({
265
+ inputRange: [0, 1],
266
+ outputRange: [SELECTOR_DRAWER_TRANSLATE_X, 0],
267
+ }),
268
+ },
269
+ ],
270
+ };
271
+
272
+ return (
273
+ <React.Fragment>
274
+ {super.render()}
275
+ <LayerButton
276
+ show={showLayerButton}
277
+ isActive={this.state.isSelectorVisible}
278
+ onPress={this._toggleSelectorVisibility}
279
+ />
280
+ <LegendButton
281
+ show={showLegendButton}
282
+ isActive={this.state.isLegendVisible}
283
+ onPress={this._toggleLegendVisibility}
284
+ />
285
+ <SelectorDrawer
286
+ show={showSelector}
287
+ title={selectorTitle}
288
+ groupSections={groupSections}
289
+ expandedGroupKeys={this.state.expandedGroupKeys}
290
+ backdropAnimatedStyle={backdropAnimatedStyle}
291
+ panelAnimatedStyle={panelAnimatedStyle}
292
+ onClose={this._toggleSelectorVisibility}
293
+ onToggleGroup={this._toggleGroup}
294
+ onToggleGroupChecked={this._toggleGroupChecked}
295
+ onToggleItem={this._toggleItem}
296
+ />
297
+ <LegendPanel
298
+ show={showLegend}
299
+ title={legendTitle}
300
+ items={items}
301
+ getItemColor={(item) => resolveCategoryItemColor(item)}
302
+ />
303
+ </React.Fragment>
304
+ );
305
+ }
306
+ }
307
+
308
+ MFBanDoSo.propTypes = banDoSoPropTypes;
309
+ MFBanDoSo.defaultProps = {
310
+ ...MFMapView.defaultProps,
311
+ isStaging: true,
312
+ };
313
+
314
+ export { MFBanDoSo };