@maydon_tech/react-native-nitro-maps 0.1.3 → 0.2.0

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 (218) hide show
  1. package/LICENSE +1 -1
  2. package/NitroMap.podspec +1 -1
  3. package/README.md +82 -9
  4. package/android/CMakeLists.txt +4 -1
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
  7. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
  8. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
  9. package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
  10. package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
  11. package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
  12. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
  13. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
  14. package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
  15. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
  16. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
  17. package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
  18. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
  19. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
  20. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
  21. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
  22. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
  23. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
  24. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
  25. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
  26. package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
  27. package/ios/Clustering/ClusterIconRenderer.swift +3 -3
  28. package/ios/Location/NitroLocationManager.swift +116 -0
  29. package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
  30. package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
  31. package/ios/NitroMap.swift +279 -13
  32. package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
  33. package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
  34. package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
  35. package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
  36. package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
  37. package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
  38. package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
  39. package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
  40. package/ios/Providers/MapProviderFactory.swift +17 -0
  41. package/ios/Providers/MapProviderProtocol.swift +48 -1
  42. package/ios/Shared/ClusterConfig+Factory.swift +2 -2
  43. package/ios/Shared/MapStyleProvider.swift +6 -4
  44. package/ios/Shared/MarkerSelectionHandler.swift +4 -1
  45. package/ios/Utils/ColorValueExtension.swift +46 -67
  46. package/lib/module/components/ImageMarker.js +39 -29
  47. package/lib/module/components/ImageMarker.js.map +1 -1
  48. package/lib/module/components/Marker.js +118 -0
  49. package/lib/module/components/Marker.js.map +1 -0
  50. package/lib/module/components/NitroCircle.js +92 -0
  51. package/lib/module/components/NitroCircle.js.map +1 -0
  52. package/lib/module/components/NitroMap.js +216 -76
  53. package/lib/module/components/NitroMap.js.map +1 -1
  54. package/lib/module/components/NitroPolygon.js +135 -0
  55. package/lib/module/components/NitroPolygon.js.map +1 -0
  56. package/lib/module/components/NitroPolyline.js +115 -0
  57. package/lib/module/components/NitroPolyline.js.map +1 -0
  58. package/lib/module/components/PriceMarker.js +16 -29
  59. package/lib/module/components/PriceMarker.js.map +1 -1
  60. package/lib/module/context/NitroMapContext.js.map +1 -1
  61. package/lib/module/hooks/useNitroCircle.js +18 -0
  62. package/lib/module/hooks/useNitroCircle.js.map +1 -0
  63. package/lib/module/hooks/useNitroMarker.js +26 -9
  64. package/lib/module/hooks/useNitroMarker.js.map +1 -1
  65. package/lib/module/hooks/useNitroOverlay.js +59 -0
  66. package/lib/module/hooks/useNitroOverlay.js.map +1 -0
  67. package/lib/module/hooks/useNitroPolygon.js +18 -0
  68. package/lib/module/hooks/useNitroPolygon.js.map +1 -0
  69. package/lib/module/hooks/useNitroPolyline.js +18 -0
  70. package/lib/module/hooks/useNitroPolyline.js.map +1 -0
  71. package/lib/module/index.js +5 -0
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/types/overlay.js +4 -0
  74. package/lib/module/types/overlay.js.map +1 -0
  75. package/lib/module/types/theme.js +4 -0
  76. package/lib/module/types/theme.js.map +1 -0
  77. package/lib/module/utils/colors.js +41 -13
  78. package/lib/module/utils/colors.js.map +1 -1
  79. package/lib/module/utils/validation.js +45 -0
  80. package/lib/module/utils/validation.js.map +1 -0
  81. package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
  82. package/lib/typescript/src/components/Marker.d.ts +34 -0
  83. package/lib/typescript/src/components/Marker.d.ts.map +1 -0
  84. package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
  85. package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
  86. package/lib/typescript/src/components/NitroMap.d.ts +60 -3
  87. package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
  88. package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
  89. package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
  90. package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
  91. package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
  92. package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
  93. package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
  94. package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
  95. package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
  96. package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
  97. package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
  98. package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
  99. package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
  101. package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
  102. package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
  103. package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
  104. package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
  105. package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
  106. package/lib/typescript/src/index.d.ts +15 -2
  107. package/lib/typescript/src/index.d.ts.map +1 -1
  108. package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
  109. package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
  110. package/lib/typescript/src/types/map.d.ts +34 -4
  111. package/lib/typescript/src/types/map.d.ts.map +1 -1
  112. package/lib/typescript/src/types/marker.d.ts +24 -36
  113. package/lib/typescript/src/types/marker.d.ts.map +1 -1
  114. package/lib/typescript/src/types/overlay.d.ts +75 -0
  115. package/lib/typescript/src/types/overlay.d.ts.map +1 -0
  116. package/lib/typescript/src/types/theme.d.ts +93 -0
  117. package/lib/typescript/src/types/theme.d.ts.map +1 -0
  118. package/lib/typescript/src/utils/colors.d.ts +6 -8
  119. package/lib/typescript/src/utils/colors.d.ts.map +1 -1
  120. package/lib/typescript/src/utils/validation.d.ts +12 -0
  121. package/lib/typescript/src/utils/validation.d.ts.map +1 -0
  122. package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
  123. package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
  124. package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
  125. package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
  126. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  127. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +328 -21
  128. package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
  129. package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
  130. package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
  131. package/nitrogen/generated/android/c++/JPolygonData.hpp +149 -0
  132. package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
  133. package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
  134. package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
  135. package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
  136. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
  137. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
  138. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
  139. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
  140. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
  142. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
  143. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
  144. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
  145. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
  146. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
  147. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
  148. package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
  149. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
  150. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +175 -17
  151. package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +15 -3
  152. package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +249 -16
  153. package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
  154. package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
  155. package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
  156. package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
  157. package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
  158. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  159. package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
  160. package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
  161. package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
  162. package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
  163. package/nitrogen/generated/ios/swift/PolygonData.swift +179 -0
  164. package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
  165. package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
  166. package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
  167. package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
  168. package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
  169. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
  170. package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
  171. package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
  172. package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
  173. package/nitrogen/generated/shared/c++/PolygonData.hpp +114 -0
  174. package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
  175. package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
  176. package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
  177. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
  178. package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
  179. package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
  180. package/package.json +36 -5
  181. package/src/components/ImageMarker.tsx +58 -42
  182. package/src/components/Marker.tsx +161 -0
  183. package/src/components/NitroCircle.tsx +183 -0
  184. package/src/components/NitroMap.tsx +328 -78
  185. package/src/components/NitroPolygon.tsx +229 -0
  186. package/src/components/NitroPolyline.tsx +208 -0
  187. package/src/components/PriceMarker.tsx +23 -48
  188. package/src/context/NitroMapContext.tsx +4 -0
  189. package/src/hooks/useNitroCircle.ts +25 -0
  190. package/src/hooks/useNitroMarker.ts +49 -10
  191. package/src/hooks/useNitroOverlay.ts +68 -0
  192. package/src/hooks/useNitroPolygon.ts +25 -0
  193. package/src/hooks/useNitroPolyline.ts +25 -0
  194. package/src/index.tsx +23 -2
  195. package/src/specs/NitroMap.nitro.ts +294 -5
  196. package/src/types/map.ts +36 -4
  197. package/src/types/marker.ts +24 -44
  198. package/src/types/overlay.ts +77 -0
  199. package/src/types/theme.ts +101 -0
  200. package/src/utils/colors.ts +48 -16
  201. package/src/utils/validation.ts +69 -0
  202. package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
  203. package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
  204. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
  205. package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
  206. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
  207. package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
  208. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
  209. package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
  210. package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
  211. package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
  212. package/cpp/QuadTree.hpp +0 -246
  213. package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
  214. package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
  215. package/ios/Providers/GoogleMapProvider.swift +0 -924
  216. package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
  217. package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
  218. package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +0 -88
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 alisher rakhimov
3
+ Copyright (c) 2025 Maydon Tech LLC
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
6
6
  in the Software without restriction, including without limitation the rights
package/NitroMap.podspec CHANGED
@@ -20,7 +20,7 @@ Pod::Spec.new do |s|
20
20
 
21
21
  # C++ settings for ClusterEngine
22
22
  s.pod_target_xcconfig = {
23
- 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
23
+ 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++20',
24
24
  'CLANG_CXX_LIBRARY' => 'libc++',
25
25
  'HEADER_SEARCH_PATHS' => '"${PODS_TARGET_SRCROOT}/cpp"',
26
26
  'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited)'
package/README.md CHANGED
@@ -50,14 +50,18 @@ import {
50
50
  NitroMap,
51
51
  NitroMapInitialize,
52
52
  PriceMarker,
53
+ type NitroMapRef,
53
54
  } from '@maydon_tech/react-native-nitro-maps';
54
55
 
55
56
  // Initialize once at app startup
56
- NitroMapInitialize('YOUR_API_KEY', 'google');
57
+ NitroMapInitialize({ provider: 'google', googleApiKey: 'YOUR_API_KEY' });
57
58
 
58
59
  export default function App() {
60
+ const mapRef = useRef<NitroMapRef>(null);
61
+
59
62
  return (
60
63
  <NitroMap
64
+ ref={mapRef}
61
65
  provider="google"
62
66
  initialRegion={{
63
67
  latitude: 41.2995,
@@ -81,11 +85,36 @@ export default function App() {
81
85
  }
82
86
  ```
83
87
 
88
+ ### Imperative Methods (via ref)
89
+
90
+ ```tsx
91
+ // Animate to a region
92
+ mapRef.current?.animateToRegion({
93
+ latitude: 41.31,
94
+ longitude: 69.28,
95
+ latitudeDelta: 0.01,
96
+ longitudeDelta: 0.01,
97
+ }, 500);
98
+
99
+ // Fit to coordinates
100
+ mapRef.current?.fitToCoordinates([
101
+ { latitude: 41.29, longitude: 69.24 },
102
+ { latitude: 41.31, longitude: 69.28 },
103
+ ]);
104
+
105
+ // Get current camera
106
+ const camera = await mapRef.current?.getCamera();
107
+
108
+ // Center on user's current location
109
+ // (requires showsUserLocation={true} and location permissions)
110
+ mapRef.current?.centerOnUserLocation();
111
+ ```
112
+
84
113
  ## Providers
85
114
 
86
115
  | Provider | iOS | Android | API Key | Notes |
87
116
  |-----------------|-----|---------|----------|------------------------|
88
- | **Google Maps** | ✅ | 🔜 | Required | Best global coverage |
117
+ | **Google Maps** | ✅ | | Required | Best global coverage |
89
118
  | **Apple Maps** | 🔜 | — | Free | iOS only, zero SDK |
90
119
  | **Yandex Maps** | 🔜 | 🔜 | Required | Best for CIS countries |
91
120
 
@@ -126,14 +155,57 @@ Best for real estate, hospitality — what Zillow and Airbnb use.
126
155
 
127
156
  ## Documentation
128
157
 
158
+ ### Getting Started
159
+
160
+ | Guide | Description |
161
+ |---|---|
162
+ | [**Installation**](docs-new/getting-started/installation.md) | Package install, peer dependencies, platform setup |
163
+ | [**Google Maps Setup**](docs-new/getting-started/google-maps-setup.md) | API keys, iOS Podfile, Android manifest |
164
+ | [**Quick Start**](docs-new/getting-started/quick-start.md) | Minimal working example in 30 lines |
165
+
166
+ ### Guides
167
+
168
+ | Guide | Description |
169
+ |---|---|
170
+ | [**Map Configuration**](docs-new/guides/map-configuration.md) | Map type, gestures, traffic, buildings, padding, dark mode |
171
+ | [**Camera & Regions**](docs-new/guides/camera-and-regions.md) | initialRegion vs region, controlled camera, fit to coordinates |
172
+ | [**Markers**](docs-new/guides/markers.md) | Marker, PriceMarker, ImageMarker — all 3 types |
173
+ | [**Marker Selection**](docs-new/guides/marker-selection.md) | Select/deselect, visual states, info windows |
174
+ | [**Clustering**](docs-new/guides/clustering.md) | Supercluster vs hideOnOverlap, config, performance |
175
+ | [**Overlays**](docs-new/guides/overlays.md) | Polylines, polygons, circles |
176
+ | [**User Location**](docs-new/guides/user-location.md) | Blue dot, custom marker, tracking modes, permissions |
177
+ | [**Styling & Themes**](docs-new/guides/styling-and-themes.md) | Provider-aware themes, Google JSON styles, dark mode |
178
+ | [**Colors**](docs-new/guides/colors.md) | ColorValue, hex(), rgb(), color presets |
179
+
180
+ ### API Reference
181
+
182
+ | Reference | Description |
183
+ |---|---|
184
+ | [**NitroMap**](docs-new/api-reference/nitro-map.md) | All props, events, and ref methods |
185
+ | [**Marker**](docs-new/api-reference/marker.md) | Default pin marker props |
186
+ | [**PriceMarker**](docs-new/api-reference/price-marker.md) | Price tag marker props |
187
+ | [**ImageMarker**](docs-new/api-reference/image-marker.md) | Custom image marker props |
188
+ | [**NitroPolyline**](docs-new/api-reference/polyline.md) | Polyline overlay props |
189
+ | [**NitroPolygon**](docs-new/api-reference/polygon.md) | Polygon overlay props |
190
+ | [**NitroCircle**](docs-new/api-reference/circle.md) | Circle overlay props |
191
+ | [**Initialization**](docs-new/api-reference/initialization.md) | NitroMapInitialize, config |
192
+ | [**Types**](docs-new/api-reference/types.md) | All exported TypeScript types |
193
+
194
+ ### Advanced
195
+
196
+ | Guide | Description |
197
+ |---|---|
198
+ | [**Imperative API**](docs-new/advanced/imperative-api.md) | Ref methods, declarative vs imperative |
199
+ | [**Performance**](docs-new/advanced/performance.md) | Large datasets, clustering tuning, memo optimization |
200
+ | [**Provider System**](docs-new/advanced/provider-system.md) | Multi-provider architecture, roadmap |
201
+ | [**Accessibility**](docs-new/advanced/accessibility.md) | VoiceOver, TalkBack, best practices |
202
+
203
+ ### Other
204
+
129
205
  | Guide | Description |
130
206
  |---|---|
131
- | [**Setup & Installation**](docs/setup.md) | Per-vendor setup for iOS and Android |
132
- | [**API Reference**](docs/api.md) | Components, props, methods, types, events |
133
- | [**Clustering**](docs/clustering.md) | Strategies, live clustering, render buffer, performance |
134
- | [**Feature Support**](docs/features.md) | What's available on each provider |
135
- | [**Examples**](docs/examples.md) | Selection, dragging, clustering, overlays |
136
- | [**Migration**](docs/migration.md) | Breaking changes between versions |
207
+ | [**Migration**](docs-new/migration.md) | Breaking changes, migrating from react-native-maps |
208
+ | [**Troubleshooting**](docs-new/troubleshooting.md) | Common errors, platform gotchas, FAQ |
137
209
 
138
210
  ## Architecture
139
211
 
@@ -157,7 +229,8 @@ Best for real estate, hospitality — what Zillow and Airbnb use.
157
229
  ▼ ▼ ▼
158
230
  Google Apple Yandex
159
231
  Provider Provider Provider
160
- (Swift) (Swift) (Swift)
232
+ (Swift/ (Swift) (Swift/
233
+ Kotlin) Kotlin)
161
234
  │ │ │
162
235
  ▼ ▼ ▼
163
236
  GMSMapView MKMapView YMKMapView
@@ -9,7 +9,10 @@ set(CMAKE_CXX_STANDARD 20)
9
9
  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384")
10
10
 
11
11
  # Define C++ library and add all sources
12
- add_library(${PACKAGE_NAME} SHARED src/main/cpp/cpp-adapter.cpp)
12
+ add_library(${PACKAGE_NAME} SHARED
13
+ src/main/cpp/cpp-adapter.cpp
14
+ src/main/cpp/ClusterEngineJNI.cpp
15
+ )
13
16
 
14
17
  # Add Nitrogen specs :)
15
18
  include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/nitromap+autolinking.cmake)
@@ -1,5 +1,5 @@
1
- NitroMap_kotlinVersion=2.0.21
2
- NitroMap_minSdkVersion=24
3
- NitroMap_targetSdkVersion=34
4
- NitroMap_compileSdkVersion=35
1
+ NitroMap_kotlinVersion=2.1.20
2
+ NitroMap_minSdkVersion=26
3
+ NitroMap_targetSdkVersion=36
4
+ NitroMap_compileSdkVersion=36
5
5
  NitroMap_ndkVersion=27.1.12297006
@@ -0,0 +1,198 @@
1
+ /**
2
+ * JNI bridge for C++ ClusterEngine.
3
+ * Mirrors iOS ClusterEngineWrapper.mm — same C++ engine, JNI interface.
4
+ *
5
+ * L-6: JNI class/method IDs are cached on first use to avoid repeated lookups.
6
+ */
7
+
8
+ #include <jni.h>
9
+ #include <string>
10
+ #include <mutex>
11
+ #include "ClusterEngine.hpp"
12
+
13
+ using namespace nitromap;
14
+
15
+ // ============================================================================
16
+ // L-6: Cached JNI class/method IDs (populated once, thread-safe)
17
+ // ============================================================================
18
+
19
+ static struct {
20
+ jclass resultClass = nullptr;
21
+ jclass clusterClass = nullptr;
22
+ jclass singleClass = nullptr;
23
+ jclass stringClass = nullptr;
24
+ jmethodID resultCtor = nullptr;
25
+ jmethodID clusterCtor = nullptr;
26
+ jmethodID singleCtor = nullptr;
27
+ std::once_flag initFlag;
28
+ } jniCache;
29
+
30
+ static void ensureJniCacheInitialized(JNIEnv *env) {
31
+ std::call_once(jniCache.initFlag, [env]() {
32
+ // Use global refs so they survive across JNI calls
33
+ jclass localResult = env->FindClass("com/margelo/nitro/nitromap/clustering/NitroClusterEngine$ClusteringResultJNI");
34
+ jclass localCluster = env->FindClass("com/margelo/nitro/nitromap/clustering/NitroClusterEngine$ClusterDataJNI");
35
+ jclass localSingle = env->FindClass("com/margelo/nitro/nitromap/clustering/NitroClusterEngine$SingleMarkerJNI");
36
+ jclass localString = env->FindClass("java/lang/String");
37
+
38
+ jniCache.resultClass = (jclass)env->NewGlobalRef(localResult);
39
+ jniCache.clusterClass = (jclass)env->NewGlobalRef(localCluster);
40
+ jniCache.singleClass = (jclass)env->NewGlobalRef(localSingle);
41
+ jniCache.stringClass = (jclass)env->NewGlobalRef(localString);
42
+
43
+ jniCache.resultCtor = env->GetMethodID(jniCache.resultClass, "<init>",
44
+ "([Lcom/margelo/nitro/nitromap/clustering/NitroClusterEngine$ClusterDataJNI;"
45
+ "[Lcom/margelo/nitro/nitromap/clustering/NitroClusterEngine$SingleMarkerJNI;)V");
46
+ jniCache.clusterCtor = env->GetMethodID(jniCache.clusterClass, "<init>", "(DDI[Ljava/lang/String;D)V");
47
+ jniCache.singleCtor = env->GetMethodID(jniCache.singleClass, "<init>", "(Ljava/lang/String;DD)V");
48
+
49
+ env->DeleteLocalRef(localResult);
50
+ env->DeleteLocalRef(localCluster);
51
+ env->DeleteLocalRef(localSingle);
52
+ env->DeleteLocalRef(localString);
53
+ });
54
+ }
55
+
56
+ extern "C" {
57
+
58
+ // ============================================================================
59
+ // Lifecycle
60
+ // ============================================================================
61
+
62
+ JNIEXPORT jlong JNICALL
63
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeCreate(JNIEnv *, jobject) {
64
+ return reinterpret_cast<jlong>(new ClusterEngine());
65
+ }
66
+
67
+ JNIEXPORT void JNICALL
68
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeDestroy(JNIEnv *, jobject, jlong ptr) {
69
+ delete reinterpret_cast<ClusterEngine *>(ptr);
70
+ }
71
+
72
+ // ============================================================================
73
+ // Configuration
74
+ // ============================================================================
75
+
76
+ JNIEXPORT void JNICALL
77
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeSetClusterRadius(
78
+ JNIEnv *, jobject, jlong ptr, jdouble radius) {
79
+ reinterpret_cast<ClusterEngine *>(ptr)->setClusterRadius(radius);
80
+ }
81
+
82
+ JNIEXPORT void JNICALL
83
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeSetMinClusterSize(
84
+ JNIEnv *, jobject, jlong ptr, jint size) {
85
+ reinterpret_cast<ClusterEngine *>(ptr)->setMinClusterSize(size);
86
+ }
87
+
88
+ JNIEXPORT void JNICALL
89
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeSetMaxZoom(
90
+ JNIEnv *, jobject, jlong ptr, jdouble zoom) {
91
+ reinterpret_cast<ClusterEngine *>(ptr)->setMaxZoom(zoom);
92
+ }
93
+
94
+ // ============================================================================
95
+ // Marker Management
96
+ // ============================================================================
97
+
98
+ JNIEXPORT void JNICALL
99
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeAddMarker(
100
+ JNIEnv *env, jobject, jlong ptr, jstring jId, jdouble lat, jdouble lon) {
101
+ const char *idChars = env->GetStringUTFChars(jId, nullptr);
102
+ std::string id(idChars);
103
+ env->ReleaseStringUTFChars(jId, idChars);
104
+
105
+ MarkerPoint marker(id, lat, lon);
106
+ reinterpret_cast<ClusterEngine *>(ptr)->addMarker(marker);
107
+ }
108
+
109
+ JNIEXPORT void JNICALL
110
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeRemoveMarker(
111
+ JNIEnv *env, jobject, jlong ptr, jstring jId) {
112
+ const char *idChars = env->GetStringUTFChars(jId, nullptr);
113
+ std::string id(idChars);
114
+ env->ReleaseStringUTFChars(jId, idChars);
115
+
116
+ reinterpret_cast<ClusterEngine *>(ptr)->removeMarker(id);
117
+ }
118
+
119
+ JNIEXPORT void JNICALL
120
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeClearMarkers(
121
+ JNIEnv *, jobject, jlong ptr) {
122
+ reinterpret_cast<ClusterEngine *>(ptr)->clearMarkers();
123
+ }
124
+
125
+ JNIEXPORT jint JNICALL
126
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeMarkerCount(
127
+ JNIEnv *, jobject, jlong ptr) {
128
+ return static_cast<jint>(reinterpret_cast<ClusterEngine *>(ptr)->markerCount());
129
+ }
130
+
131
+ // ============================================================================
132
+ // Clustering (L-6: uses cached JNI IDs)
133
+ // ============================================================================
134
+
135
+ JNIEXPORT jobjectArray JNICALL
136
+ Java_com_margelo_nitro_nitromap_clustering_NitroClusterEngine_nativeCluster(
137
+ JNIEnv *env, jobject, jlong ptr,
138
+ jdouble minLat, jdouble maxLat, jdouble minLon, jdouble maxLon,
139
+ jdouble zoom, jdouble mapW, jdouble mapH) {
140
+
141
+ auto *engine = reinterpret_cast<ClusterEngine *>(ptr);
142
+ ClusterResult result = engine->cluster(minLat, maxLat, minLon, maxLon, zoom, mapW, mapH);
143
+
144
+ // L-6: Ensure cached IDs are initialized
145
+ ensureJniCacheInitialized(env);
146
+
147
+ // Build cluster array
148
+ jobjectArray clusterArray = env->NewObjectArray(
149
+ static_cast<jsize>(result.clusters.size()), jniCache.clusterClass, nullptr);
150
+
151
+ for (size_t i = 0; i < result.clusters.size(); i++) {
152
+ const auto &c = result.clusters[i];
153
+
154
+ // Build marker ID string array
155
+ jobjectArray idArray = env->NewObjectArray(
156
+ static_cast<jsize>(c.markerIds.size()),
157
+ jniCache.stringClass, nullptr);
158
+ for (size_t j = 0; j < c.markerIds.size(); j++) {
159
+ jstring jStr = env->NewStringUTF(c.markerIds[j].c_str());
160
+ env->SetObjectArrayElement(idArray, static_cast<jsize>(j), jStr);
161
+ env->DeleteLocalRef(jStr);
162
+ }
163
+
164
+ jobject clusterObj = env->NewObject(jniCache.clusterClass, jniCache.clusterCtor,
165
+ c.latitude, c.longitude, c.count, idArray,
166
+ Cluster::iconSize(c.count));
167
+ env->SetObjectArrayElement(clusterArray, static_cast<jsize>(i), clusterObj);
168
+ env->DeleteLocalRef(idArray);
169
+ env->DeleteLocalRef(clusterObj);
170
+ }
171
+
172
+ // Build single markers array
173
+ jobjectArray singleArray = env->NewObjectArray(
174
+ static_cast<jsize>(result.singleMarkers.size()), jniCache.singleClass, nullptr);
175
+
176
+ for (size_t i = 0; i < result.singleMarkers.size(); i++) {
177
+ const auto &s = result.singleMarkers[i];
178
+ jstring jId = env->NewStringUTF(s.id.c_str());
179
+ jobject singleObj = env->NewObject(jniCache.singleClass, jniCache.singleCtor,
180
+ jId, s.latitude, s.longitude);
181
+ env->SetObjectArrayElement(singleArray, static_cast<jsize>(i), singleObj);
182
+ env->DeleteLocalRef(jId);
183
+ env->DeleteLocalRef(singleObj);
184
+ }
185
+
186
+ // Create result
187
+ jobject resultObj = env->NewObject(jniCache.resultClass, jniCache.resultCtor, clusterArray, singleArray);
188
+ env->DeleteLocalRef(clusterArray);
189
+ env->DeleteLocalRef(singleArray);
190
+
191
+ // Return as single-element array (workaround for returning object)
192
+ jobjectArray wrapper = env->NewObjectArray(1, jniCache.resultClass, resultObj);
193
+ env->DeleteLocalRef(resultObj);
194
+
195
+ return wrapper;
196
+ }
197
+
198
+ } // extern "C"