@maydon_tech/react-native-nitro-maps 0.1.4 → 0.2.1
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.
- package/LICENSE +1 -1
- package/NitroMap.podspec +1 -1
- package/README.md +82 -9
- package/android/CMakeLists.txt +4 -1
- package/android/build.gradle +6 -2
- package/android/gradle.properties +4 -4
- package/android/src/main/cpp/ClusterEngineJNI.cpp +198 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMap.kt +397 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapConfig.kt +53 -0
- package/android/src/main/{java → kotlin}/com/margelo/nitro/nitromap/NitroMapPackage.kt +4 -4
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/NitroMapView.kt +73 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/UserLocationManager.kt +295 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusterIconRenderer.kt +111 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/ClusteringManager.kt +104 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +166 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerIconFactory.kt +303 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/MarkerSelectionHandler.kt +72 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/markers/PriceMarkerRenderer.kt +159 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderFactory.kt +24 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +128 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapDelegate.kt +317 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Clustering.kt +524 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Markers.kt +358 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+Overlays.kt +272 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider+UserLocation.kt +296 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/GoogleMapProvider.kt +815 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromap/providers/google/MarkerTagData.kt +19 -0
- package/ios/Location/NitroLocationManager.swift +116 -0
- package/ios/MarkerRenderer/MarkerIconFactory.swift +1 -3
- package/ios/MarkerRenderer/PriceMarkerRenderer.swift +10 -6
- package/ios/NitroMap.swift +279 -13
- package/ios/NitroMapConfig/NitroMapConfig.swift +45 -0
- package/ios/Providers/{GoogleMapDelegate.swift → Google/GoogleMapDelegate.swift} +48 -23
- package/ios/Providers/Google/GoogleMapProvider+Camera.swift +180 -0
- package/ios/Providers/Google/GoogleMapProvider+Clustering.swift +541 -0
- package/ios/Providers/Google/GoogleMapProvider+Markers.swift +270 -0
- package/ios/Providers/Google/GoogleMapProvider+Overlays.swift +245 -0
- package/ios/Providers/Google/GoogleMapProvider+UserLocation.swift +180 -0
- package/ios/Providers/Google/GoogleMapProvider.swift +342 -0
- package/ios/Providers/MapProviderFactory.swift +17 -0
- package/ios/Providers/MapProviderProtocol.swift +48 -1
- package/ios/Shared/ClusterConfig+Factory.swift +2 -2
- package/ios/Shared/MapStyleProvider.swift +6 -4
- package/ios/Shared/MarkerSelectionHandler.swift +4 -1
- package/ios/Utils/ColorValueExtension.swift +46 -67
- package/lib/module/components/ImageMarker.js +39 -29
- package/lib/module/components/ImageMarker.js.map +1 -1
- package/lib/module/components/Marker.js +118 -0
- package/lib/module/components/Marker.js.map +1 -0
- package/lib/module/components/NitroCircle.js +92 -0
- package/lib/module/components/NitroCircle.js.map +1 -0
- package/lib/module/components/NitroMap.js +216 -76
- package/lib/module/components/NitroMap.js.map +1 -1
- package/lib/module/components/NitroPolygon.js +137 -0
- package/lib/module/components/NitroPolygon.js.map +1 -0
- package/lib/module/components/NitroPolyline.js +115 -0
- package/lib/module/components/NitroPolyline.js.map +1 -0
- package/lib/module/components/PriceMarker.js +16 -29
- package/lib/module/components/PriceMarker.js.map +1 -1
- package/lib/module/context/NitroMapContext.js.map +1 -1
- package/lib/module/hooks/useNitroCircle.js +18 -0
- package/lib/module/hooks/useNitroCircle.js.map +1 -0
- package/lib/module/hooks/useNitroMarker.js +26 -9
- package/lib/module/hooks/useNitroMarker.js.map +1 -1
- package/lib/module/hooks/useNitroOverlay.js +59 -0
- package/lib/module/hooks/useNitroOverlay.js.map +1 -0
- package/lib/module/hooks/useNitroPolygon.js +18 -0
- package/lib/module/hooks/useNitroPolygon.js.map +1 -0
- package/lib/module/hooks/useNitroPolyline.js +18 -0
- package/lib/module/hooks/useNitroPolyline.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types/overlay.js +4 -0
- package/lib/module/types/overlay.js.map +1 -0
- package/lib/module/types/theme.js +4 -0
- package/lib/module/types/theme.js.map +1 -0
- package/lib/module/utils/colors.js +41 -13
- package/lib/module/utils/colors.js.map +1 -1
- package/lib/module/utils/validation.js +45 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/typescript/src/components/ImageMarker.d.ts.map +1 -1
- package/lib/typescript/src/components/Marker.d.ts +34 -0
- package/lib/typescript/src/components/Marker.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroCircle.d.ts +70 -0
- package/lib/typescript/src/components/NitroCircle.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroMap.d.ts +60 -3
- package/lib/typescript/src/components/NitroMap.d.ts.map +1 -1
- package/lib/typescript/src/components/NitroPolygon.d.ts +86 -0
- package/lib/typescript/src/components/NitroPolygon.d.ts.map +1 -0
- package/lib/typescript/src/components/NitroPolyline.d.ts +84 -0
- package/lib/typescript/src/components/NitroPolyline.d.ts.map +1 -0
- package/lib/typescript/src/components/PriceMarker.d.ts +0 -5
- package/lib/typescript/src/components/PriceMarker.d.ts.map +1 -1
- package/lib/typescript/src/context/NitroMapContext.d.ts +2 -0
- package/lib/typescript/src/context/NitroMapContext.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useNitroCircle.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroCircle.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts +20 -0
- package/lib/typescript/src/hooks/useNitroMarker.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useNitroOverlay.d.ts +26 -0
- package/lib/typescript/src/hooks/useNitroOverlay.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroPolygon.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroPolygon.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useNitroPolyline.d.ts +7 -0
- package/lib/typescript/src/hooks/useNitroPolyline.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +15 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts +248 -6
- package/lib/typescript/src/specs/NitroMap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/map.d.ts +34 -4
- package/lib/typescript/src/types/map.d.ts.map +1 -1
- package/lib/typescript/src/types/marker.d.ts +24 -36
- package/lib/typescript/src/types/marker.d.ts.map +1 -1
- package/lib/typescript/src/types/overlay.d.ts +84 -0
- package/lib/typescript/src/types/overlay.d.ts.map +1 -0
- package/lib/typescript/src/types/theme.d.ts +93 -0
- package/lib/typescript/src/types/theme.d.ts.map +1 -0
- package/lib/typescript/src/utils/colors.d.ts +6 -8
- package/lib/typescript/src/utils/colors.d.ts.map +1 -1
- package/lib/typescript/src/utils/validation.d.ts +12 -0
- package/lib/typescript/src/utils/validation.d.ts.map +1 -0
- package/nitrogen/generated/android/c++/JCircleData.hpp +94 -0
- package/nitrogen/generated/android/c++/JClusterConfig.hpp +5 -7
- package/nitrogen/generated/android/c++/JCoordinateRing.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_UserLocationChangeEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_UserTrackingMode.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.cpp +332 -21
- package/nitrogen/generated/android/c++/JHybridNitroMapSpec.hpp +53 -2
- package/nitrogen/generated/android/c++/JMarkerAnimation.hpp +3 -6
- package/nitrogen/generated/android/c++/JMarkerData.hpp +15 -3
- package/nitrogen/generated/android/c++/JPolygonData.hpp +133 -0
- package/nitrogen/generated/android/c++/JPolylineData.hpp +113 -0
- package/nitrogen/generated/android/c++/JUserLocationChangeEvent.hpp +70 -0
- package/nitrogen/generated/android/c++/JUserTrackingMode.hpp +62 -0
- package/nitrogen/generated/android/c++/views/JHybridNitroMapStateUpdater.cpp +72 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CircleData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/ClusterConfig.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/CoordinateRing.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserLocationChangeEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_UserTrackingMode.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/Func_void_std__string.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/HybridNitroMapSpec.kt +228 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerAnimation.kt +1 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/MarkerData.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolygonData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/PolylineData.kt +62 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/UserLocationChangeEvent.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromap/{ClusterAnimationStyle.kt → UserTrackingMode.kt} +6 -8
- package/nitrogen/generated/android/nitromapOnLoad.cpp +6 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.cpp +24 -0
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Bridge.hpp +178 -17
- package/nitrogen/generated/ios/NitroMap-Swift-Cxx-Umbrella.hpp +18 -3
- package/nitrogen/generated/ios/c++/HybridNitroMapSpecSwift.hpp +252 -16
- package/nitrogen/generated/ios/c++/views/HybridNitroMapComponent.mm +90 -5
- package/nitrogen/generated/ios/swift/CircleData.swift +143 -0
- package/nitrogen/generated/ios/swift/ClusterConfig.swift +22 -15
- package/nitrogen/generated/ios/swift/CoordinateRing.swift +48 -0
- package/nitrogen/generated/ios/swift/Func_void_UserLocationChangeEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_UserTrackingMode.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec.swift +35 -1
- package/nitrogen/generated/ios/swift/HybridNitroMapSpec_cxx.swift +582 -8
- package/nitrogen/generated/ios/swift/MarkerAnimation.swift +4 -8
- package/nitrogen/generated/ios/swift/MarkerData.swift +54 -2
- package/nitrogen/generated/ios/swift/PolygonData.swift +167 -0
- package/nitrogen/generated/ios/swift/PolylineData.swift +155 -0
- package/nitrogen/generated/ios/swift/UserLocationChangeEvent.swift +69 -0
- package/nitrogen/generated/ios/swift/UserTrackingMode.swift +44 -0
- package/nitrogen/generated/shared/c++/CircleData.hpp +113 -0
- package/nitrogen/generated/shared/c++/ClusterConfig.hpp +5 -8
- package/nitrogen/generated/shared/c++/CoordinateRing.hpp +77 -0
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.cpp +53 -2
- package/nitrogen/generated/shared/c++/HybridNitroMapSpec.hpp +75 -6
- package/nitrogen/generated/shared/c++/MarkerAnimation.hpp +4 -8
- package/nitrogen/generated/shared/c++/MarkerData.hpp +14 -2
- package/nitrogen/generated/shared/c++/PolygonData.hpp +117 -0
- package/nitrogen/generated/shared/c++/PolylineData.hpp +114 -0
- package/nitrogen/generated/shared/c++/UserLocationChangeEvent.hpp +88 -0
- package/nitrogen/generated/shared/c++/UserTrackingMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.cpp +216 -12
- package/nitrogen/generated/shared/c++/views/HybridNitroMapComponent.hpp +23 -1
- package/nitrogen/generated/shared/json/NitroMapConfig.json +18 -1
- package/package.json +36 -5
- package/src/components/ImageMarker.tsx +58 -42
- package/src/components/Marker.tsx +161 -0
- package/src/components/NitroCircle.tsx +183 -0
- package/src/components/NitroMap.tsx +328 -78
- package/src/components/NitroPolygon.tsx +229 -0
- package/src/components/NitroPolyline.tsx +208 -0
- package/src/components/PriceMarker.tsx +23 -48
- package/src/context/NitroMapContext.tsx +4 -0
- package/src/hooks/useNitroCircle.ts +25 -0
- package/src/hooks/useNitroMarker.ts +49 -10
- package/src/hooks/useNitroOverlay.ts +68 -0
- package/src/hooks/useNitroPolygon.ts +25 -0
- package/src/hooks/useNitroPolyline.ts +25 -0
- package/src/index.tsx +28 -2
- package/src/specs/NitroMap.nitro.ts +294 -5
- package/src/types/map.ts +36 -4
- package/src/types/marker.ts +24 -44
- package/src/types/overlay.ts +87 -0
- package/src/types/theme.ts +101 -0
- package/src/utils/colors.ts +48 -16
- package/src/utils/validation.ts +69 -0
- package/android/src/main/java/com/margelo/nitro/nitromap/ClusterIconGenerator.kt +0 -108
- package/android/src/main/java/com/margelo/nitro/nitromap/ColorUtils.kt +0 -63
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMap.kt +0 -408
- package/android/src/main/java/com/margelo/nitro/nitromap/HybridNitroMapConfig.kt +0 -68
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconCache.kt +0 -176
- package/android/src/main/java/com/margelo/nitro/nitromap/MarkerIconFactory.kt +0 -252
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/NitroClusterEngine.kt +0 -252
- package/android/src/main/java/com/margelo/nitro/nitromap/clustering/QuadTree.kt +0 -195
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/GoogleMapProvider.kt +0 -912
- package/android/src/main/java/com/margelo/nitro/nitromap/providers/MapProviderInterface.kt +0 -70
- package/cpp/QuadTree.hpp +0 -246
- package/ios/NitroMapConfig/HybridNitroMapConfig.swift +0 -33
- package/ios/Providers/GoogleMapProvider+Camera.swift +0 -164
- package/ios/Providers/GoogleMapProvider.swift +0 -924
- package/nitrogen/generated/android/c++/JClusterAnimationStyle.hpp +0 -68
- package/nitrogen/generated/ios/swift/ClusterAnimationStyle.swift +0 -52
- package/nitrogen/generated/shared/c++/ClusterAnimationStyle.hpp +0 -88
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
// src/components/ImageMarker.tsx
|
|
4
|
-
import { memo, useCallback,
|
|
5
|
-
import { useNitroMarker } from "../hooks/useNitroMarker.js";
|
|
6
|
-
import { Colors, parseColor } from "../utils/colors.js";
|
|
4
|
+
import { memo, useCallback, useEffect } from 'react';
|
|
5
|
+
import { useNitroMarker, useMarkerHandlers } from "../hooks/useNitroMarker.js";
|
|
6
|
+
import { Colors, parseColor, areColorsEqual } from "../utils/colors.js";
|
|
7
|
+
const MAX_IMAGE_DIMENSION = 512;
|
|
8
|
+
const MIN_IMAGE_DIMENSION = 1;
|
|
9
|
+
|
|
10
|
+
/** Clamp a dimension to [1, 512] and warn in __DEV__ if clamped */
|
|
11
|
+
function clampDimension(value, name) {
|
|
12
|
+
if (value >= MIN_IMAGE_DIMENSION && value <= MAX_IMAGE_DIMENSION) return value;
|
|
13
|
+
if (__DEV__) {
|
|
14
|
+
console.warn(`[ImageMarker] ${name}=${value} clamped to [${MIN_IMAGE_DIMENSION}, ${MAX_IMAGE_DIMENSION}].`);
|
|
15
|
+
}
|
|
16
|
+
return Math.max(MIN_IMAGE_DIMENSION, Math.min(MAX_IMAGE_DIMENSION, value));
|
|
17
|
+
}
|
|
7
18
|
|
|
8
19
|
/**
|
|
9
20
|
* Props for the ImageMarker component
|
|
@@ -11,7 +22,7 @@ import { Colors, parseColor } from "../utils/colors.js";
|
|
|
11
22
|
|
|
12
23
|
// ============ Custom Memo Comparison ============
|
|
13
24
|
const arePropsEqual = (prevProps, nextProps) => {
|
|
14
|
-
if (prevProps.id !== nextProps.id || prevProps.imageUrl !== nextProps.imageUrl || prevProps.imageBase64 !== nextProps.imageBase64 || prevProps.width !== nextProps.width || prevProps.height !== nextProps.height || prevProps.cornerRadius !== nextProps.cornerRadius || prevProps.borderWidth !== nextProps.borderWidth || prevProps.title !== nextProps.title || prevProps.description !== nextProps.description || prevProps.draggable !== nextProps.draggable || prevProps.opacity !== nextProps.opacity || prevProps.rotation !== nextProps.rotation || prevProps.zIndex !== nextProps.zIndex || prevProps.clusteringEnabled !== nextProps.clusteringEnabled || prevProps.animation !== nextProps.animation) {
|
|
25
|
+
if (prevProps.id !== nextProps.id || prevProps.imageUrl !== nextProps.imageUrl || prevProps.imageBase64 !== nextProps.imageBase64 || prevProps.width !== nextProps.width || prevProps.height !== nextProps.height || prevProps.cornerRadius !== nextProps.cornerRadius || prevProps.borderWidth !== nextProps.borderWidth || prevProps.title !== nextProps.title || prevProps.description !== nextProps.description || prevProps.draggable !== nextProps.draggable || prevProps.opacity !== nextProps.opacity || prevProps.rotation !== nextProps.rotation || prevProps.zIndex !== nextProps.zIndex || prevProps.clusteringEnabled !== nextProps.clusteringEnabled || prevProps.animation !== nextProps.animation || prevProps.animationDuration !== nextProps.animationDuration || prevProps.animateOnReappear !== nextProps.animateOnReappear || prevProps.accessibilityLabel !== nextProps.accessibilityLabel) {
|
|
15
26
|
return false;
|
|
16
27
|
}
|
|
17
28
|
if (prevProps.coordinate?.latitude !== nextProps.coordinate?.latitude || prevProps.coordinate?.longitude !== nextProps.coordinate?.longitude) {
|
|
@@ -20,19 +31,7 @@ const arePropsEqual = (prevProps, nextProps) => {
|
|
|
20
31
|
if (prevProps.anchor?.x !== nextProps.anchor?.x || prevProps.anchor?.y !== nextProps.anchor?.y) {
|
|
21
32
|
return false;
|
|
22
33
|
}
|
|
23
|
-
|
|
24
|
-
if (!a && !b) return true;
|
|
25
|
-
if (!a || !b) return false;
|
|
26
|
-
// If both are strings, compare directly
|
|
27
|
-
if (typeof a === 'string' && typeof b === 'string') return a === b;
|
|
28
|
-
// If types differ, not equal
|
|
29
|
-
if (typeof a !== typeof b) return false;
|
|
30
|
-
// Both are MarkerColor objects
|
|
31
|
-
const aColor = a;
|
|
32
|
-
const bColor = b;
|
|
33
|
-
return aColor.r === bColor.r && aColor.g === bColor.g && aColor.b === bColor.b && aColor.a === bColor.a;
|
|
34
|
-
};
|
|
35
|
-
if (!compareColors(prevProps.borderColor, nextProps.borderColor)) {
|
|
34
|
+
if (!areColorsEqual(prevProps.borderColor, nextProps.borderColor)) {
|
|
36
35
|
return false;
|
|
37
36
|
}
|
|
38
37
|
return true;
|
|
@@ -90,21 +89,29 @@ export const ImageMarker = /*#__PURE__*/memo(function ImageMarker({
|
|
|
90
89
|
},
|
|
91
90
|
clusteringEnabled = true,
|
|
92
91
|
animation = 'none',
|
|
92
|
+
animationDuration = 0.3,
|
|
93
|
+
animateOnReappear = true,
|
|
94
|
+
accessibilityLabel,
|
|
93
95
|
// Events
|
|
94
96
|
onPress,
|
|
95
97
|
onDragStart,
|
|
96
98
|
onDrag,
|
|
97
99
|
onDragEnd
|
|
98
100
|
}) {
|
|
99
|
-
//
|
|
101
|
+
// Dev-mode validation: at least one image source is required
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (__DEV__ && !imageUrl && !imageBase64) {
|
|
104
|
+
console.warn('ImageMarker: either imageUrl or imageBase64 must be provided. ' + 'The marker will render without an image.');
|
|
105
|
+
}
|
|
106
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
107
|
+
}, []);
|
|
108
|
+
|
|
109
|
+
// Clamp dimensions to safe range
|
|
110
|
+
const clampedWidth = clampDimension(width, 'width');
|
|
111
|
+
const clampedHeight = clampDimension(height, 'height');
|
|
100
112
|
|
|
101
|
-
// Memoize handlers
|
|
102
|
-
const handlers =
|
|
103
|
-
onPress,
|
|
104
|
-
onDragStart,
|
|
105
|
-
onDrag,
|
|
106
|
-
onDragEnd
|
|
107
|
-
}), [onPress, onDragStart, onDrag, onDragEnd]);
|
|
113
|
+
// Memoize handlers via shared hook
|
|
114
|
+
const handlers = useMarkerHandlers(onPress, onDragStart, onDrag, onDragEnd);
|
|
108
115
|
|
|
109
116
|
// Build full marker data
|
|
110
117
|
const buildMarkerData = useCallback(markerId => ({
|
|
@@ -123,15 +130,18 @@ export const ImageMarker = /*#__PURE__*/memo(function ImageMarker({
|
|
|
123
130
|
image: {
|
|
124
131
|
imageUrl,
|
|
125
132
|
imageBase64,
|
|
126
|
-
width,
|
|
127
|
-
height,
|
|
133
|
+
width: clampedWidth,
|
|
134
|
+
height: clampedHeight,
|
|
128
135
|
cornerRadius,
|
|
129
136
|
borderWidth,
|
|
130
137
|
borderColor: parseColor(borderColor) ?? Colors.gray
|
|
131
138
|
}
|
|
132
139
|
},
|
|
133
|
-
|
|
134
|
-
|
|
140
|
+
accessibilityLabel,
|
|
141
|
+
animation,
|
|
142
|
+
animationDuration,
|
|
143
|
+
animateOnReappear
|
|
144
|
+
}), [coordinate, title, description, draggable, opacity, rotation, zIndex, anchor, clusteringEnabled, imageUrl, imageBase64, clampedWidth, clampedHeight, cornerRadius, borderWidth, borderColor, accessibilityLabel, animation, animationDuration, animateOnReappear]);
|
|
135
145
|
|
|
136
146
|
// Use shared marker hook
|
|
137
147
|
useNitroMarker({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["memo","useCallback","
|
|
1
|
+
{"version":3,"names":["memo","useCallback","useEffect","useNitroMarker","useMarkerHandlers","Colors","parseColor","areColorsEqual","MAX_IMAGE_DIMENSION","MIN_IMAGE_DIMENSION","clampDimension","value","name","__DEV__","console","warn","Math","max","min","arePropsEqual","prevProps","nextProps","id","imageUrl","imageBase64","width","height","cornerRadius","borderWidth","title","description","draggable","opacity","rotation","zIndex","clusteringEnabled","animation","animationDuration","animateOnReappear","accessibilityLabel","coordinate","latitude","longitude","anchor","x","y","borderColor","ImageMarker","onPress","onDragStart","onDrag","onDragEnd","clampedWidth","clampedHeight","handlers","buildMarkerData","markerId","config","style","image","gray","idPrefix","providedId"],"sourceRoot":"../../../src","sources":["components/ImageMarker.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/components/Marker.tsx
|
|
4
|
+
import { memo, useCallback } from 'react';
|
|
5
|
+
import { useNitroMarker, useMarkerHandlers } from "../hooks/useNitroMarker.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Props for the Marker component (default Google Maps pin)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// ============ Custom Memo Comparison ============
|
|
12
|
+
const arePropsEqual = (prevProps, nextProps) => {
|
|
13
|
+
// Compare primitive props
|
|
14
|
+
if (prevProps.id !== nextProps.id || prevProps.title !== nextProps.title || prevProps.description !== nextProps.description || prevProps.draggable !== nextProps.draggable || prevProps.opacity !== nextProps.opacity || prevProps.rotation !== nextProps.rotation || prevProps.zIndex !== nextProps.zIndex || prevProps.clusteringEnabled !== nextProps.clusteringEnabled || prevProps.animation !== nextProps.animation || prevProps.animationDuration !== nextProps.animationDuration || prevProps.animateOnReappear !== nextProps.animateOnReappear || prevProps.accessibilityLabel !== nextProps.accessibilityLabel) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Compare coordinate
|
|
19
|
+
if (prevProps.coordinate?.latitude !== nextProps.coordinate?.latitude || prevProps.coordinate?.longitude !== nextProps.coordinate?.longitude) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Compare anchor
|
|
24
|
+
if (prevProps.anchor?.x !== nextProps.anchor?.x || prevProps.anchor?.y !== nextProps.anchor?.y) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Marker - Display the default Google Maps pin on the map
|
|
32
|
+
*
|
|
33
|
+
* The simplest marker component. Uses the standard red Google Maps pin.
|
|
34
|
+
* For custom images, use `<ImageMarker>`. For price tags, use `<PriceMarker>`.
|
|
35
|
+
*
|
|
36
|
+
* @example Basic marker
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <Marker
|
|
39
|
+
* coordinate={{ latitude: 41.29, longitude: 69.24 }}
|
|
40
|
+
* title="Hello World"
|
|
41
|
+
* description="This is a default marker"
|
|
42
|
+
* />
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @example Draggable marker
|
|
46
|
+
* ```tsx
|
|
47
|
+
* <Marker
|
|
48
|
+
* coordinate={{ latitude: 41.30, longitude: 69.25 }}
|
|
49
|
+
* draggable={true}
|
|
50
|
+
* onDragEnd={(coord) => console.log('Dropped at:', coord)}
|
|
51
|
+
* />
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export const Marker = /*#__PURE__*/memo(function Marker({
|
|
55
|
+
// Required
|
|
56
|
+
coordinate,
|
|
57
|
+
// Identification
|
|
58
|
+
id,
|
|
59
|
+
// Common props
|
|
60
|
+
title,
|
|
61
|
+
description,
|
|
62
|
+
draggable = false,
|
|
63
|
+
opacity = 1,
|
|
64
|
+
rotation = 0,
|
|
65
|
+
zIndex = 0,
|
|
66
|
+
anchor = {
|
|
67
|
+
x: 0.5,
|
|
68
|
+
y: 1.0
|
|
69
|
+
},
|
|
70
|
+
clusteringEnabled = true,
|
|
71
|
+
animation = 'none',
|
|
72
|
+
animationDuration = 0.3,
|
|
73
|
+
animateOnReappear = true,
|
|
74
|
+
accessibilityLabel,
|
|
75
|
+
// Events
|
|
76
|
+
onPress,
|
|
77
|
+
onDragStart,
|
|
78
|
+
onDrag,
|
|
79
|
+
onDragEnd
|
|
80
|
+
}) {
|
|
81
|
+
// Memoize handlers via shared hook
|
|
82
|
+
const handlers = useMarkerHandlers(onPress, onDragStart, onDrag, onDragEnd);
|
|
83
|
+
|
|
84
|
+
// Build full marker data
|
|
85
|
+
const buildMarkerData = useCallback(markerId => ({
|
|
86
|
+
id: markerId,
|
|
87
|
+
coordinate,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
draggable,
|
|
91
|
+
opacity,
|
|
92
|
+
rotation,
|
|
93
|
+
zIndex,
|
|
94
|
+
anchor,
|
|
95
|
+
clusteringEnabled,
|
|
96
|
+
config: {
|
|
97
|
+
style: 'default'
|
|
98
|
+
},
|
|
99
|
+
accessibilityLabel,
|
|
100
|
+
animation,
|
|
101
|
+
animationDuration,
|
|
102
|
+
animateOnReappear
|
|
103
|
+
}), [coordinate, title, description, draggable, opacity, rotation, zIndex, anchor, clusteringEnabled, accessibilityLabel, animation, animationDuration, animateOnReappear]);
|
|
104
|
+
|
|
105
|
+
// Use shared marker hook
|
|
106
|
+
useNitroMarker({
|
|
107
|
+
idPrefix: 'marker',
|
|
108
|
+
providedId: id,
|
|
109
|
+
handlers,
|
|
110
|
+
buildMarkerData
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Render nothing - marker is rendered natively
|
|
114
|
+
return null;
|
|
115
|
+
}, arePropsEqual);
|
|
116
|
+
export { arePropsEqual as areMarkerPropsEqual };
|
|
117
|
+
export default Marker;
|
|
118
|
+
//# sourceMappingURL=Marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["memo","useCallback","useNitroMarker","useMarkerHandlers","arePropsEqual","prevProps","nextProps","id","title","description","draggable","opacity","rotation","zIndex","clusteringEnabled","animation","animationDuration","animateOnReappear","accessibilityLabel","coordinate","latitude","longitude","anchor","x","y","Marker","onPress","onDragStart","onDrag","onDragEnd","handlers","buildMarkerData","markerId","config","style","idPrefix","providedId","areMarkerPropsEqual"],"sourceRoot":"../../../src","sources":["components/Marker.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/components/NitroCircle.tsx
|
|
4
|
+
import { memo, useCallback, useEffect, useRef } from 'react';
|
|
5
|
+
import { useNitroCircle } from "../hooks/useNitroCircle.js";
|
|
6
|
+
import { parseColor, areColorsEqual, Colors } from "../utils/colors.js";
|
|
7
|
+
import { validateCoordinate } from "../utils/validation.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Props for the NitroCircle component
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// ID generator — monotonic counter, unique within a JS runtime session
|
|
14
|
+
let circleIdCounter = 0;
|
|
15
|
+
const generateCircleId = () => `circle_${++circleIdCounter}`;
|
|
16
|
+
|
|
17
|
+
// Default colors
|
|
18
|
+
const defaultFillColor = {
|
|
19
|
+
r: 0,
|
|
20
|
+
g: 0,
|
|
21
|
+
b: 0,
|
|
22
|
+
a: 77
|
|
23
|
+
};
|
|
24
|
+
const defaultStrokeColor = Colors.black;
|
|
25
|
+
|
|
26
|
+
// ============ Custom Memo Comparison ============
|
|
27
|
+
const arePropsEqual = (prev, next) => {
|
|
28
|
+
if (prev.id !== next.id || prev.radius !== next.radius || prev.strokeWidth !== next.strokeWidth || prev.zIndex !== next.zIndex || prev.tappable !== next.tappable || prev.accessibilityLabel !== next.accessibilityLabel) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Compare center
|
|
33
|
+
if (prev.center.latitude !== next.center.latitude || prev.center.longitude !== next.center.longitude) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (!areColorsEqual(prev.fillColor, next.fillColor)) return false;
|
|
37
|
+
if (!areColorsEqual(prev.strokeColor, next.strokeColor)) return false;
|
|
38
|
+
return true;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* NitroCircle - Draw a circle overlay on the map
|
|
43
|
+
*
|
|
44
|
+
* @example Basic circle
|
|
45
|
+
* ```tsx
|
|
46
|
+
* <NitroCircle
|
|
47
|
+
* center={{ latitude: 41.31, longitude: 69.26 }}
|
|
48
|
+
* radius={500}
|
|
49
|
+
* fillColor="#4285F440"
|
|
50
|
+
* strokeColor="#4285F4"
|
|
51
|
+
* strokeWidth={2}
|
|
52
|
+
* />
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export const NitroCircle = /*#__PURE__*/memo(function NitroCircle({
|
|
56
|
+
id,
|
|
57
|
+
center,
|
|
58
|
+
radius,
|
|
59
|
+
fillColor,
|
|
60
|
+
strokeColor,
|
|
61
|
+
strokeWidth = 1,
|
|
62
|
+
zIndex = 0,
|
|
63
|
+
tappable = false,
|
|
64
|
+
accessibilityLabel
|
|
65
|
+
}) {
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (__DEV__) {
|
|
68
|
+
if (radius <= 0) {
|
|
69
|
+
console.warn('NitroCircle: radius must be a positive number. ' + `Received ${radius}.`);
|
|
70
|
+
}
|
|
71
|
+
validateCoordinate(center, 'NitroCircle center');
|
|
72
|
+
}
|
|
73
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
|
+
}, []);
|
|
75
|
+
const circleId = useRef(id || generateCircleId()).current;
|
|
76
|
+
const buildCircleData = useCallback(() => ({
|
|
77
|
+
id: circleId,
|
|
78
|
+
center,
|
|
79
|
+
radius,
|
|
80
|
+
fillColor: parseColor(fillColor) ?? defaultFillColor,
|
|
81
|
+
strokeColor: parseColor(strokeColor) ?? defaultStrokeColor,
|
|
82
|
+
strokeWidth,
|
|
83
|
+
zIndex,
|
|
84
|
+
tappable,
|
|
85
|
+
accessibilityLabel
|
|
86
|
+
}), [circleId, center, radius, fillColor, strokeColor, strokeWidth, zIndex, tappable, accessibilityLabel]);
|
|
87
|
+
useNitroCircle(buildCircleData);
|
|
88
|
+
return null;
|
|
89
|
+
}, arePropsEqual);
|
|
90
|
+
export { arePropsEqual as areCirclePropsEqual };
|
|
91
|
+
export default NitroCircle;
|
|
92
|
+
//# sourceMappingURL=NitroCircle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["memo","useCallback","useEffect","useRef","useNitroCircle","parseColor","areColorsEqual","Colors","validateCoordinate","circleIdCounter","generateCircleId","defaultFillColor","r","g","b","a","defaultStrokeColor","black","arePropsEqual","prev","next","id","radius","strokeWidth","zIndex","tappable","accessibilityLabel","center","latitude","longitude","fillColor","strokeColor","NitroCircle","__DEV__","console","warn","circleId","current","buildCircleData","areCirclePropsEqual"],"sourceRoot":"../../../src","sources":["components/NitroCircle.tsx"],"mappings":"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","ignoreList":[]}
|