@lugg/maps 0.2.0-alpha.0 → 0.2.0-alpha.10

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 (152) hide show
  1. package/README.md +17 -4
  2. package/android/src/main/java/com/luggmaps/{LuggMapsGoogleMapView.kt → LuggGoogleMapView.kt} +111 -36
  3. package/android/src/main/java/com/luggmaps/{LuggMapsGoogleMapViewManager.kt → LuggGoogleMapViewManager.kt} +66 -39
  4. package/android/src/main/java/com/luggmaps/{LuggMapsWrapperView.kt → LuggMapWrapperView.kt} +1 -1
  5. package/android/src/main/java/com/luggmaps/LuggMapWrapperViewManager.kt +25 -0
  6. package/android/src/main/java/com/luggmaps/{LuggMapsMarkerView.kt → LuggMarkerView.kt} +13 -7
  7. package/android/src/main/java/com/luggmaps/{LuggMapsMarkerViewManager.kt → LuggMarkerViewManager.kt} +23 -17
  8. package/android/src/main/java/com/luggmaps/{LuggMapsPackage.kt → LuggPackage.kt} +2 -2
  9. package/android/src/main/java/com/luggmaps/{LuggMapsPolylineView.kt → LuggPolylineView.kt} +11 -4
  10. package/android/src/main/java/com/luggmaps/{LuggMapsPolylineViewManager.kt → LuggPolylineViewManager.kt} +22 -16
  11. package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -43
  12. package/android/src/main/java/com/luggmaps/events/CameraIdleEvent.kt +10 -2
  13. package/android/src/main/java/com/luggmaps/events/CameraMoveEvent.kt +6 -5
  14. package/android/src/main/java/com/luggmaps/events/ReadyEvent.kt +12 -0
  15. package/android/src/main/java/com/luggmaps/extensions/ViewExtensions.kt +14 -0
  16. package/ios/{LuggMapsAppleMapView.h → LuggAppleMapView.h} +2 -2
  17. package/ios/{LuggMapsAppleMapView.mm → LuggAppleMapView.mm} +140 -71
  18. package/ios/{LuggMapsGoogleMapView.h → LuggGoogleMapView.h} +1 -1
  19. package/ios/{LuggMapsGoogleMapView.mm → LuggGoogleMapView.mm} +82 -64
  20. package/ios/{LuggMapsWrapperView.h → LuggMapWrapperView.h} +1 -1
  21. package/ios/{LuggMapsWrapperView.mm → LuggMapWrapperView.mm} +7 -7
  22. package/ios/{LuggMapsMarkerView.h → LuggMarkerView.h} +8 -6
  23. package/ios/{LuggMapsMarkerView.mm → LuggMarkerView.mm} +21 -8
  24. package/ios/{LuggMapsPolylineView.h → LuggPolylineView.h} +6 -5
  25. package/ios/{LuggMapsPolylineView.mm → LuggPolylineView.mm} +14 -9
  26. package/ios/core/GMSPolylineAnimator.m +85 -36
  27. package/ios/core/MKPolylineAnimator.m +63 -32
  28. package/ios/events/CameraIdleEvent.h +6 -1
  29. package/ios/events/CameraMoveEvent.h +6 -3
  30. package/ios/events/ReadyEvent.h +20 -0
  31. package/lib/module/MapProvider.js +13 -0
  32. package/lib/module/MapProvider.js.map +1 -0
  33. package/lib/module/MapProvider.types.js +4 -0
  34. package/lib/module/MapProvider.types.js.map +1 -0
  35. package/lib/module/MapProvider.web.js +14 -0
  36. package/lib/module/MapProvider.web.js.map +1 -0
  37. package/lib/module/MapView.js +21 -7
  38. package/lib/module/MapView.js.map +1 -1
  39. package/lib/module/MapView.web.js +266 -0
  40. package/lib/module/MapView.web.js.map +1 -0
  41. package/lib/module/{Marker.js → components/Marker.js} +6 -3
  42. package/lib/module/components/Marker.js.map +1 -0
  43. package/lib/module/components/Marker.web.js +34 -0
  44. package/lib/module/components/Marker.web.js.map +1 -0
  45. package/lib/module/{Polyline.js → components/Polyline.js} +7 -4
  46. package/lib/module/components/Polyline.js.map +1 -0
  47. package/lib/module/components/Polyline.web.js +177 -0
  48. package/lib/module/components/Polyline.web.js.map +1 -0
  49. package/lib/module/components/index.js +5 -0
  50. package/lib/module/components/index.js.map +1 -0
  51. package/lib/module/components/index.web.js +5 -0
  52. package/lib/module/components/index.web.js.map +1 -0
  53. package/{src/fabric/LuggMapsAppleMapViewNativeComponent.ts → lib/module/fabric/LuggAppleMapViewNativeComponent.ts} +13 -3
  54. package/lib/module/fabric/{LuggMapsGoogleMapViewNativeComponent.ts → LuggGoogleMapViewNativeComponent.ts} +13 -3
  55. package/{src/fabric/LuggMapsWrapperViewNativeComponent.ts → lib/module/fabric/LuggMapWrapperViewNativeComponent.ts} +1 -1
  56. package/lib/module/fabric/{LuggMapsMarkerViewNativeComponent.ts → LuggMarkerViewNativeComponent.ts} +1 -1
  57. package/{src/fabric/LuggMapsPolylineViewNativeComponent.ts → lib/module/fabric/LuggPolylineViewNativeComponent.ts} +1 -1
  58. package/lib/module/index.js +3 -3
  59. package/lib/module/index.js.map +1 -1
  60. package/lib/module/index.web.js +6 -0
  61. package/lib/module/index.web.js.map +1 -0
  62. package/lib/typescript/plugin/src/withLuggMapsAndroid.d.ts +6 -0
  63. package/lib/typescript/plugin/src/withLuggMapsAndroid.d.ts.map +1 -0
  64. package/lib/typescript/plugin/src/withLuggMapsIOS.d.ts +6 -0
  65. package/lib/typescript/plugin/src/withLuggMapsIOS.d.ts.map +1 -0
  66. package/lib/typescript/src/MapProvider.d.ts +8 -0
  67. package/lib/typescript/src/MapProvider.d.ts.map +1 -0
  68. package/lib/typescript/src/MapProvider.types.d.ts +16 -0
  69. package/lib/typescript/src/MapProvider.types.d.ts.map +1 -0
  70. package/lib/typescript/src/MapProvider.web.d.ts +3 -0
  71. package/lib/typescript/src/MapProvider.web.d.ts.map +1 -0
  72. package/lib/typescript/src/MapView.d.ts.map +1 -1
  73. package/lib/typescript/src/MapView.types.d.ts +24 -14
  74. package/lib/typescript/src/MapView.types.d.ts.map +1 -1
  75. package/lib/typescript/src/MapView.web.d.ts +12 -0
  76. package/lib/typescript/src/MapView.web.d.ts.map +1 -0
  77. package/lib/typescript/src/{Marker.types.d.ts → components/Marker.d.ts} +10 -5
  78. package/lib/typescript/src/components/Marker.d.ts.map +1 -0
  79. package/lib/typescript/src/{Marker.d.ts → components/Marker.web.d.ts} +2 -2
  80. package/lib/typescript/src/components/Marker.web.d.ts.map +1 -0
  81. package/lib/typescript/src/{Polyline.types.d.ts → components/Polyline.d.ts} +10 -5
  82. package/lib/typescript/src/components/Polyline.d.ts.map +1 -0
  83. package/lib/typescript/src/components/Polyline.web.d.ts +6 -0
  84. package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -0
  85. package/lib/typescript/src/components/index.d.ts +3 -0
  86. package/lib/typescript/src/components/index.d.ts.map +1 -0
  87. package/lib/typescript/src/components/index.web.d.ts +5 -0
  88. package/lib/typescript/src/components/index.web.d.ts.map +1 -0
  89. package/lib/typescript/src/fabric/{LuggMapsAppleMapViewNativeComponent.d.ts → LuggAppleMapViewNativeComponent.d.ts} +10 -3
  90. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +1 -0
  91. package/lib/typescript/src/fabric/{LuggMapsGoogleMapViewNativeComponent.d.ts → LuggGoogleMapViewNativeComponent.d.ts} +10 -3
  92. package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +1 -0
  93. package/lib/typescript/src/fabric/{LuggMapsWrapperViewNativeComponent.d.ts → LuggMapWrapperViewNativeComponent.d.ts} +1 -1
  94. package/lib/typescript/src/fabric/LuggMapWrapperViewNativeComponent.d.ts.map +1 -0
  95. package/lib/typescript/src/fabric/{LuggMapsMarkerViewNativeComponent.d.ts → LuggMarkerViewNativeComponent.d.ts} +1 -1
  96. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -0
  97. package/lib/typescript/src/fabric/{LuggMapsPolylineViewNativeComponent.d.ts → LuggPolylineViewNativeComponent.d.ts} +1 -1
  98. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -0
  99. package/lib/typescript/src/index.d.ts +5 -6
  100. package/lib/typescript/src/index.d.ts.map +1 -1
  101. package/lib/typescript/src/index.web.d.ts +7 -0
  102. package/lib/typescript/src/index.web.d.ts.map +1 -0
  103. package/package.json +20 -7
  104. package/plugin/build/index.js +4 -4
  105. package/{lib/typescript/plugin/src/withMapsAndroid.d.ts → plugin/build/withLuggMapsAndroid.d.ts} +0 -1
  106. package/plugin/build/withLuggMapsAndroid.js +15 -0
  107. package/{lib/typescript/plugin/src/withMapsIOS.d.ts → plugin/build/withLuggMapsIOS.d.ts} +0 -1
  108. package/plugin/build/withLuggMapsIOS.js +27 -0
  109. package/plugin/build/withMapsAndroid.d.ts +1 -1
  110. package/plugin/build/withMapsIOS.d.ts +1 -1
  111. package/src/MapProvider.tsx +10 -0
  112. package/src/MapProvider.types.ts +16 -0
  113. package/src/MapProvider.web.tsx +6 -0
  114. package/src/MapView.tsx +27 -10
  115. package/src/MapView.types.ts +24 -15
  116. package/src/MapView.web.tsx +319 -0
  117. package/src/components/Marker.tsx +63 -0
  118. package/src/components/Marker.web.tsx +32 -0
  119. package/src/components/Polyline.tsx +57 -0
  120. package/src/components/Polyline.web.tsx +222 -0
  121. package/src/components/index.ts +2 -0
  122. package/src/components/index.web.ts +4 -0
  123. package/{lib/module/fabric/LuggMapsAppleMapViewNativeComponent.ts → src/fabric/LuggAppleMapViewNativeComponent.ts} +13 -3
  124. package/src/fabric/{LuggMapsGoogleMapViewNativeComponent.ts → LuggGoogleMapViewNativeComponent.ts} +13 -3
  125. package/{lib/module/fabric/LuggMapsWrapperViewNativeComponent.ts → src/fabric/LuggMapWrapperViewNativeComponent.ts} +1 -1
  126. package/src/fabric/{LuggMapsMarkerViewNativeComponent.ts → LuggMarkerViewNativeComponent.ts} +1 -1
  127. package/{lib/module/fabric/LuggMapsPolylineViewNativeComponent.ts → src/fabric/LuggPolylineViewNativeComponent.ts} +1 -1
  128. package/src/index.ts +11 -7
  129. package/src/index.web.ts +17 -0
  130. package/android/src/main/java/com/luggmaps/LuggMapsWrapperViewManager.kt +0 -25
  131. package/lib/module/Marker.js.map +0 -1
  132. package/lib/module/Marker.types.js +0 -4
  133. package/lib/module/Marker.types.js.map +0 -1
  134. package/lib/module/Polyline.js.map +0 -1
  135. package/lib/module/Polyline.types.js +0 -4
  136. package/lib/module/Polyline.types.js.map +0 -1
  137. package/lib/typescript/plugin/src/withMapsAndroid.d.ts.map +0 -1
  138. package/lib/typescript/plugin/src/withMapsIOS.d.ts.map +0 -1
  139. package/lib/typescript/src/Marker.d.ts.map +0 -1
  140. package/lib/typescript/src/Marker.types.d.ts.map +0 -1
  141. package/lib/typescript/src/Polyline.d.ts +0 -6
  142. package/lib/typescript/src/Polyline.d.ts.map +0 -1
  143. package/lib/typescript/src/Polyline.types.d.ts.map +0 -1
  144. package/lib/typescript/src/fabric/LuggMapsAppleMapViewNativeComponent.d.ts.map +0 -1
  145. package/lib/typescript/src/fabric/LuggMapsGoogleMapViewNativeComponent.d.ts.map +0 -1
  146. package/lib/typescript/src/fabric/LuggMapsMarkerViewNativeComponent.d.ts.map +0 -1
  147. package/lib/typescript/src/fabric/LuggMapsPolylineViewNativeComponent.d.ts.map +0 -1
  148. package/lib/typescript/src/fabric/LuggMapsWrapperViewNativeComponent.d.ts.map +0 -1
  149. package/src/Marker.tsx +0 -31
  150. package/src/Marker.types.ts +0 -32
  151. package/src/Polyline.tsx +0 -32
  152. package/src/Polyline.types.ts +0 -24
@@ -4,12 +4,21 @@
4
4
  @implementation GMSPolylineAnimator {
5
5
  CADisplayLink *_displayLink;
6
6
  CGFloat _animationProgress;
7
+ NSArray<NSNumber *> *_cumulativeDistances;
8
+ CGFloat _totalLength;
7
9
  }
8
10
 
9
11
  - (void)dealloc {
10
12
  [self stopAnimation];
11
13
  }
12
14
 
15
+ - (void)setCoordinates:(NSArray<CLLocation *> *)coordinates {
16
+ [super setCoordinates:coordinates];
17
+ if (_animated && _displayLink) {
18
+ [self computeCumulativeDistances];
19
+ }
20
+ }
21
+
13
22
  - (void)setAnimated:(BOOL)animated {
14
23
  if (_animated == animated) {
15
24
  return;
@@ -28,18 +37,35 @@
28
37
  if (_displayLink) {
29
38
  return;
30
39
  }
40
+ [self computeCumulativeDistances];
31
41
  _animationProgress = 0;
32
42
  _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animationTick:)];
33
43
  [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
34
44
  }
35
45
 
46
+ - (void)computeCumulativeDistances {
47
+ NSMutableArray<NSNumber *> *distances = [NSMutableArray array];
48
+ CGFloat total = 0;
49
+ [distances addObject:@(0)];
50
+
51
+ for (NSUInteger i = 1; i < self.coordinates.count; i++) {
52
+ CLLocation *prev = self.coordinates[i - 1];
53
+ CLLocation *curr = self.coordinates[i];
54
+ total += [prev distanceFromLocation:curr];
55
+ [distances addObject:@(total)];
56
+ }
57
+
58
+ _cumulativeDistances = [distances copy];
59
+ _totalLength = total;
60
+ }
61
+
36
62
  - (void)stopAnimation {
37
63
  [_displayLink invalidate];
38
64
  _displayLink = nil;
39
65
  }
40
66
 
41
67
  - (void)animationTick:(CADisplayLink *)displayLink {
42
- CGFloat speed = displayLink.duration / 1.75;
68
+ CGFloat speed = displayLink.duration / 1.0;
43
69
  _animationProgress += speed;
44
70
 
45
71
  if (_animationProgress >= 2.15) {
@@ -71,63 +97,86 @@
71
97
  }
72
98
  }
73
99
 
100
+ - (NSUInteger)indexForDistance:(CGFloat)distance {
101
+ for (NSUInteger i = 1; i < _cumulativeDistances.count; i++) {
102
+ if (_cumulativeDistances[i].doubleValue >= distance) {
103
+ return i - 1;
104
+ }
105
+ }
106
+ return _cumulativeDistances.count - 2;
107
+ }
108
+
109
+ - (CLLocationCoordinate2D)coordinateAtDistance:(CGFloat)distance {
110
+ if (distance <= 0) {
111
+ return self.coordinates.firstObject.coordinate;
112
+ }
113
+ if (distance >= _totalLength) {
114
+ return self.coordinates.lastObject.coordinate;
115
+ }
116
+
117
+ NSUInteger idx = [self indexForDistance:distance];
118
+ CGFloat segStart = _cumulativeDistances[idx].doubleValue;
119
+ CGFloat segEnd = _cumulativeDistances[idx + 1].doubleValue;
120
+ CGFloat segLength = segEnd - segStart;
121
+
122
+ CGFloat t = (segLength > 0) ? (distance - segStart) / segLength : 0;
123
+ CLLocationCoordinate2D c1 = self.coordinates[idx].coordinate;
124
+ CLLocationCoordinate2D c2 = self.coordinates[idx + 1].coordinate;
125
+
126
+ return CLLocationCoordinate2DMake(c1.latitude + (c2.latitude - c1.latitude) * t,
127
+ c1.longitude + (c2.longitude - c1.longitude) * t);
128
+ }
129
+
74
130
  - (void)updateAnimatedPolyline {
75
- if (!_polyline || self.coordinates.count < 2) {
131
+ if (!_polyline || self.coordinates.count < 2 || _totalLength <= 0) {
76
132
  return;
77
133
  }
78
134
 
79
- NSUInteger segmentCount = self.coordinates.count - 1;
80
135
  CGFloat progress = MIN(_animationProgress, 2.0);
81
- CGFloat headPos, tailPos;
136
+ CGFloat headDist, tailDist;
82
137
 
83
138
  if (progress <= 1.0) {
84
- tailPos = 0;
85
- headPos = progress * segmentCount;
139
+ tailDist = 0;
140
+ headDist = progress * _totalLength;
86
141
  } else {
87
142
  CGFloat shrinkProgress = progress - 1.0;
88
- tailPos = shrinkProgress * segmentCount;
89
- headPos = segmentCount;
143
+ tailDist = shrinkProgress * _totalLength;
144
+ headDist = _totalLength;
90
145
  }
91
146
 
92
- if (headPos <= tailPos) {
147
+ if (headDist <= tailDist) {
93
148
  _polyline.path = [GMSMutablePath path];
94
149
  return;
95
150
  }
96
151
 
97
- NSUInteger startIndex = (NSUInteger)floor(tailPos);
98
- NSUInteger endIndex = (NSUInteger)ceil(headPos);
99
- CGFloat visibleLength = headPos - tailPos;
152
+ CGFloat visibleLength = headDist - tailDist;
153
+ NSUInteger startIndex = [self indexForDistance:tailDist];
154
+ NSUInteger endIndex = [self indexForDistance:headDist];
100
155
 
101
156
  GMSMutablePath *path = [GMSMutablePath path];
102
157
  NSMutableArray<GMSStyleSpan *> *spans = [NSMutableArray array];
103
158
 
104
- for (NSUInteger i = startIndex; i <= endIndex && i < self.coordinates.count; i++) {
105
- CLLocationCoordinate2D coord = self.coordinates[i].coordinate;
106
-
107
- if (i == startIndex && tailPos > (CGFloat)startIndex) {
108
- CGFloat t = tailPos - (CGFloat)startIndex;
109
- CLLocationCoordinate2D nextCoord = self.coordinates[i + 1].coordinate;
110
- coord.latitude = coord.latitude + (nextCoord.latitude - coord.latitude) * t;
111
- coord.longitude = coord.longitude + (nextCoord.longitude - coord.longitude) * t;
112
- }
159
+ CLLocationCoordinate2D startCoord = [self coordinateAtDistance:tailDist];
160
+ [path addCoordinate:startCoord];
113
161
 
114
- if (i == endIndex && headPos < (CGFloat)endIndex && i > 0) {
115
- CGFloat t = headPos - (CGFloat)(endIndex - 1);
116
- CLLocationCoordinate2D prevCoord = self.coordinates[i - 1].coordinate;
117
- coord.latitude = prevCoord.latitude + (coord.latitude - prevCoord.latitude) * t;
118
- coord.longitude = prevCoord.longitude + (coord.longitude - prevCoord.longitude) * t;
119
- }
162
+ for (NSUInteger i = startIndex + 1; i <= endIndex; i++) {
163
+ [path addCoordinate:self.coordinates[i].coordinate];
164
+ }
120
165
 
121
- [path addCoordinate:coord];
166
+ CLLocationCoordinate2D endCoord = [self coordinateAtDistance:headDist];
167
+ CLLocationCoordinate2D lastAdded =
168
+ (endIndex < self.coordinates.count) ? self.coordinates[endIndex].coordinate : endCoord;
169
+ if (endCoord.latitude != lastAdded.latitude || endCoord.longitude != lastAdded.longitude) {
170
+ [path addCoordinate:endCoord];
171
+ }
122
172
 
123
- if (i < endIndex && i < segmentCount) {
124
- CGFloat segStartPos = MAX((CGFloat)i, tailPos);
125
- CGFloat segEndPos = MIN((CGFloat)(i + 1), headPos);
126
- CGFloat gradientMid = ((segStartPos + segEndPos) / 2.0 - tailPos) / visibleLength;
127
- UIColor *color = [self colorAtGradientPosition:gradientMid];
128
- GMSStrokeStyle *style = [GMSStrokeStyle solidColor:color];
129
- [spans addObject:[GMSStyleSpan spanWithStyle:style]];
130
- }
173
+ NSUInteger pathCount = path.count;
174
+ for (NSUInteger i = 0; i < pathCount - 1; i++) {
175
+ CGFloat segMidDist = tailDist + visibleLength * ((CGFloat)i + 0.5) / (CGFloat)(pathCount - 1);
176
+ CGFloat gradientPos = (segMidDist - tailDist) / visibleLength;
177
+ UIColor *color = [self colorAtGradientPosition:gradientPos];
178
+ GMSStrokeStyle *style = [GMSStrokeStyle solidColor:color];
179
+ [spans addObject:[GMSStyleSpan spanWithStyle:style]];
131
180
  }
132
181
 
133
182
  _polyline.path = path;
@@ -4,7 +4,9 @@
4
4
  @implementation MKPolylineAnimator {
5
5
  MKPolyline *_polyline;
6
6
  CADisplayLink *_displayLink;
7
- CGFloat _animationProgress; // 0→1 grow, 1→2 shrink
7
+ CGFloat _animationProgress;
8
+ NSArray<NSNumber *> *_cumulativeDistances;
9
+ CGFloat _totalLength;
8
10
  }
9
11
 
10
12
  - (id)initWithPolyline:(MKPolyline *)polyline {
@@ -38,23 +40,47 @@
38
40
  if (_displayLink) {
39
41
  return;
40
42
  }
43
+ [self computeCumulativeDistances];
41
44
  _animationProgress = 0;
42
45
  _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animationTick:)];
43
46
  [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
44
47
  }
45
48
 
49
+ - (void)computeCumulativeDistances {
50
+ NSMutableArray<NSNumber *> *distances = [NSMutableArray array];
51
+ CGFloat total = 0;
52
+ [distances addObject:@(0)];
53
+
54
+ for (NSUInteger i = 1; i < _polyline.pointCount; i++) {
55
+ MKMapPoint p1 = _polyline.points[i - 1];
56
+ MKMapPoint p2 = _polyline.points[i];
57
+ total += MKMetersBetweenMapPoints(p1, p2);
58
+ [distances addObject:@(total)];
59
+ }
60
+
61
+ _cumulativeDistances = [distances copy];
62
+ _totalLength = total;
63
+ }
64
+
46
65
  - (void)stopAnimation {
47
66
  [_displayLink invalidate];
48
67
  _displayLink = nil;
49
68
  }
50
69
 
70
+ - (NSUInteger)indexForDistance:(CGFloat)distance {
71
+ for (NSUInteger i = 1; i < _cumulativeDistances.count; i++) {
72
+ if (_cumulativeDistances[i].doubleValue >= distance) {
73
+ return i - 1;
74
+ }
75
+ }
76
+ return _cumulativeDistances.count - 2;
77
+ }
78
+
51
79
  - (void)animationTick:(CADisplayLink *)displayLink {
52
- // ~1.75s per phase (grow or shrink), matching JS duration
53
- CGFloat speed = displayLink.duration / 1.75;
80
+ CGFloat speed = displayLink.duration / 1.0;
54
81
  _animationProgress += speed;
55
82
 
56
- // 0→1 grow, 1→2 shrink, then reset with small pause
57
- if (_animationProgress >= 2.15) { // 2.0 + 0.15 pause (~300ms at this speed)
83
+ if (_animationProgress >= 2.15) {
58
84
  _animationProgress = 0;
59
85
  }
60
86
 
@@ -67,6 +93,9 @@
67
93
  _polyline = polyline;
68
94
  [self invalidatePath];
69
95
  [self createPath];
96
+ if (_animated) {
97
+ [self computeCumulativeDistances];
98
+ }
70
99
  [self setNeedsDisplay];
71
100
  }
72
101
 
@@ -135,62 +164,64 @@
135
164
  }
136
165
 
137
166
  // Snake animation: grow from start, then shrink from start
138
- if (_animated && _polyline.pointCount > 1) {
167
+ if (_animated && _polyline.pointCount > 1 && _totalLength > 0) {
139
168
  CGFloat progress = MIN(_animationProgress, 2.0);
140
- CGFloat headPos, tailPos;
169
+ CGFloat headDist, tailDist;
141
170
 
142
171
  if (progress <= 1.0) {
143
- // Phase 1: grow from start to end
144
- tailPos = 0;
145
- headPos = progress * segmentCount;
172
+ tailDist = 0;
173
+ headDist = progress * _totalLength;
146
174
  } else {
147
- // Phase 2: shrink from start
148
175
  CGFloat shrinkProgress = progress - 1.0;
149
- tailPos = shrinkProgress * segmentCount;
150
- headPos = segmentCount;
176
+ tailDist = shrinkProgress * _totalLength;
177
+ headDist = _totalLength;
151
178
  }
152
179
 
153
- if (headPos <= tailPos) {
180
+ if (headDist <= tailDist) {
154
181
  return;
155
182
  }
156
183
 
157
- NSUInteger startIndex = (NSUInteger)floor(tailPos);
158
- NSUInteger endIndex = (NSUInteger)ceil(headPos);
159
- CGFloat visibleLength = headPos - tailPos;
184
+ CGFloat visibleLength = headDist - tailDist;
185
+ NSUInteger startIndex = [self indexForDistance:tailDist];
186
+ NSUInteger endIndex = [self indexForDistance:headDist];
187
+
188
+ for (NSUInteger i = startIndex; i <= endIndex && i < segmentCount; i++) {
189
+ CGFloat segStartDist = _cumulativeDistances[i].doubleValue;
190
+ CGFloat segEndDist = _cumulativeDistances[i + 1].doubleValue;
191
+
192
+ if (segEndDist <= tailDist || segStartDist >= headDist) {
193
+ continue;
194
+ }
160
195
 
161
- for (NSUInteger i = startIndex; i < endIndex && i < segmentCount; i++) {
162
196
  CGPoint segStart = [self pointForMapPoint:_polyline.points[i]];
163
197
  CGPoint segEnd = [self pointForMapPoint:_polyline.points[i + 1]];
164
198
 
165
199
  CGPoint drawStart = segStart;
166
200
  CGPoint drawEnd = segEnd;
167
- CGFloat segStartPos = (CGFloat)i;
168
- CGFloat segEndPos = (CGFloat)(i + 1);
201
+ CGFloat drawStartDist = segStartDist;
202
+ CGFloat drawEndDist = segEndDist;
203
+ CGFloat segLength = segEndDist - segStartDist;
169
204
 
170
- // Interpolate tail (partial segment at start)
171
- if (segStartPos < tailPos) {
172
- CGFloat t = tailPos - segStartPos;
205
+ if (segStartDist < tailDist && segLength > 0) {
206
+ CGFloat t = (tailDist - segStartDist) / segLength;
173
207
  drawStart.x = segStart.x + (segEnd.x - segStart.x) * t;
174
208
  drawStart.y = segStart.y + (segEnd.y - segStart.y) * t;
175
- segStartPos = tailPos;
209
+ drawStartDist = tailDist;
176
210
  }
177
211
 
178
- // Interpolate head (partial segment at end)
179
- if (segEndPos > headPos) {
180
- CGFloat t = headPos - (CGFloat)i;
212
+ if (segEndDist > headDist && segLength > 0) {
213
+ CGFloat t = (headDist - segStartDist) / segLength;
181
214
  drawEnd.x = segStart.x + (segEnd.x - segStart.x) * t;
182
215
  drawEnd.y = segStart.y + (segEnd.y - segStart.y) * t;
183
- segEndPos = headPos;
216
+ drawEndDist = headDist;
184
217
  }
185
218
 
186
- // Calculate gradient position (0-1) within visible portion
187
- CGFloat gradientStart = (segStartPos - tailPos) / visibleLength;
188
- CGFloat gradientEnd = (segEndPos - tailPos) / visibleLength;
219
+ CGFloat gradientStart = (drawStartDist - tailDist) / visibleLength;
220
+ CGFloat gradientEnd = (drawEndDist - tailDist) / visibleLength;
189
221
 
190
222
  UIColor *startColor = [self colorAtGradientPosition:gradientStart];
191
223
  UIColor *endColor = [self colorAtGradientPosition:gradientEnd];
192
224
 
193
- // Draw gradient line segment
194
225
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
195
226
  NSArray *colors = @[(__bridge id)startColor.CGColor, (__bridge id)endColor.CGColor];
196
227
  CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, NULL);
@@ -9,13 +9,18 @@ struct CameraIdleEvent {
9
9
  double latitude;
10
10
  double longitude;
11
11
  double zoom;
12
+ bool gesture;
12
13
 
13
14
  template <typename Emitter>
14
- void emit(std::shared_ptr<Emitter const> emitter) const {
15
+ void emit(const facebook::react::SharedEventEmitter &eventEmitter) const {
16
+ if (!eventEmitter)
17
+ return;
18
+ auto emitter = std::static_pointer_cast<Emitter const>(eventEmitter);
15
19
  typename Emitter::OnCameraIdle event;
16
20
  event.coordinate.latitude = latitude;
17
21
  event.coordinate.longitude = longitude;
18
22
  event.zoom = zoom;
23
+ event.gesture = gesture;
19
24
  emitter->onCameraIdle(event);
20
25
  }
21
26
  };
@@ -9,15 +9,18 @@ struct CameraMoveEvent {
9
9
  double latitude;
10
10
  double longitude;
11
11
  double zoom;
12
- bool dragging;
12
+ bool gesture;
13
13
 
14
14
  template <typename Emitter>
15
- void emit(std::shared_ptr<Emitter const> emitter) const {
15
+ void emit(const facebook::react::SharedEventEmitter &eventEmitter) const {
16
+ if (!eventEmitter)
17
+ return;
18
+ auto emitter = std::static_pointer_cast<Emitter const>(eventEmitter);
16
19
  typename Emitter::OnCameraMove event;
17
20
  event.coordinate.latitude = latitude;
18
21
  event.coordinate.longitude = longitude;
19
22
  event.zoom = zoom;
20
- event.dragging = dragging;
23
+ event.gesture = gesture;
21
24
  emitter->onCameraMove(event);
22
25
  }
23
26
  };
@@ -0,0 +1,20 @@
1
+ #pragma once
2
+
3
+ #import <react/renderer/components/RNMapsSpec/EventEmitters.h>
4
+
5
+ namespace luggmaps {
6
+ namespace events {
7
+
8
+ struct ReadyEvent {
9
+ template <typename Emitter>
10
+ static void emit(const facebook::react::SharedEventEmitter &eventEmitter) {
11
+ if (!eventEmitter)
12
+ return;
13
+ auto emitter = std::static_pointer_cast<Emitter const>(eventEmitter);
14
+ typename Emitter::OnReady event;
15
+ emitter->onReady(event);
16
+ }
17
+ };
18
+
19
+ } // namespace events
20
+ } // namespace luggmaps
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Provider component for map configuration.
5
+ * On web, wraps children with Google Maps APIProvider.
6
+ * On native, passes children through.
7
+ */
8
+ export function MapProvider({
9
+ children
10
+ }) {
11
+ return children;
12
+ }
13
+ //# sourceMappingURL=MapProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MapProvider","children"],"sourceRoot":"../../src","sources":["MapProvider.tsx"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,WAAWA,CAAC;EAAEC;AAA2B,CAAC,EAAE;EAC1D,OAAOA,QAAQ;AACjB","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=MapProvider.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["MapProvider.types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ import { APIProvider } from '@vis.gl/react-google-maps';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ export function MapProvider({
6
+ apiKey = '',
7
+ children
8
+ }) {
9
+ return /*#__PURE__*/_jsx(APIProvider, {
10
+ apiKey: apiKey,
11
+ children: children
12
+ });
13
+ }
14
+ //# sourceMappingURL=MapProvider.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["APIProvider","jsx","_jsx","MapProvider","apiKey","children"],"sourceRoot":"../../src","sources":["MapProvider.web.tsx"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,2BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGxD,OAAO,SAASC,WAAWA,CAAC;EAAEC,MAAM,GAAG,EAAE;EAAEC;AAA2B,CAAC,EAAE;EACvE,oBAAOH,IAAA,CAACF,WAAW;IAACI,MAAM,EAAEA,MAAO;IAAAC,QAAA,EAAEA;EAAQ,CAAc,CAAC;AAC9D","ignoreList":[]}
@@ -2,9 +2,9 @@
2
2
 
3
3
  import React from 'react';
4
4
  import { Platform, StyleSheet } from 'react-native';
5
- import LuggMapsGoogleMapViewNativeComponent, { Commands as GoogleMapCommands } from './fabric/LuggMapsGoogleMapViewNativeComponent';
6
- import LuggMapsAppleMapViewNativeComponent, { Commands as AppleMapCommands } from './fabric/LuggMapsAppleMapViewNativeComponent';
7
- import LuggMapsWrapperViewNativeComponent from './fabric/LuggMapsWrapperViewNativeComponent';
5
+ import LuggGoogleMapViewNativeComponent, { Commands as GoogleMapCommands } from './fabric/LuggGoogleMapViewNativeComponent';
6
+ import LuggAppleMapViewNativeComponent, { Commands as AppleMapCommands } from './fabric/LuggAppleMapViewNativeComponent';
7
+ import LuggMapWrapperViewNativeComponent from './fabric/LuggMapWrapperViewNativeComponent';
8
8
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  export class MapView extends React.Component {
10
10
  static defaultProps = {
@@ -35,9 +35,15 @@ export class MapView extends React.Component {
35
35
  const first = coordinates[0];
36
36
  if (!ref || !first) return;
37
37
  const {
38
- padding = 0,
38
+ padding,
39
39
  duration = -1
40
40
  } = options ?? {};
41
+ const {
42
+ top = 0,
43
+ left = 0,
44
+ bottom = 0,
45
+ right = 0
46
+ } = padding ?? {};
41
47
  if (coordinates.length === 1) {
42
48
  const zoom = this.props.initialZoom ?? 10;
43
49
  this.moveCamera(first, {
@@ -46,7 +52,7 @@ export class MapView extends React.Component {
46
52
  });
47
53
  return;
48
54
  }
49
- this.nativeCommands.fitCoordinates(ref, coordinates, padding, duration);
55
+ this.nativeCommands.fitCoordinates(ref, coordinates, top, left, bottom, right, duration);
50
56
  }
51
57
  render() {
52
58
  const {
@@ -54,31 +60,39 @@ export class MapView extends React.Component {
54
60
  mapId,
55
61
  initialCoordinate,
56
62
  initialZoom,
63
+ minZoom,
64
+ maxZoom,
57
65
  zoomEnabled,
58
66
  scrollEnabled,
59
67
  rotateEnabled,
60
68
  pitchEnabled,
61
69
  padding,
70
+ userLocationEnabled,
62
71
  onCameraMove,
63
72
  onCameraIdle,
73
+ onReady,
64
74
  children,
65
75
  ...rest
66
76
  } = this.props;
67
- const NativeMapView = Platform.OS === 'ios' && provider === 'apple' ? LuggMapsAppleMapViewNativeComponent : LuggMapsGoogleMapViewNativeComponent;
77
+ const NativeMapView = Platform.OS === 'ios' && provider === 'apple' ? LuggAppleMapViewNativeComponent : LuggGoogleMapViewNativeComponent;
68
78
  return /*#__PURE__*/_jsxs(NativeMapView, {
69
79
  ref: this.nativeRef,
70
80
  ...rest,
71
81
  mapId: mapId,
72
82
  initialCoordinate: initialCoordinate,
73
83
  initialZoom: initialZoom,
84
+ minZoom: minZoom,
85
+ maxZoom: maxZoom,
74
86
  zoomEnabled: zoomEnabled,
75
87
  scrollEnabled: scrollEnabled,
76
88
  rotateEnabled: rotateEnabled,
77
89
  pitchEnabled: pitchEnabled,
78
90
  padding: padding,
91
+ userLocationEnabled: userLocationEnabled,
79
92
  onCameraMove: onCameraMove,
80
93
  onCameraIdle: onCameraIdle,
81
- children: [/*#__PURE__*/_jsx(LuggMapsWrapperViewNativeComponent, {
94
+ onReady: onReady,
95
+ children: [/*#__PURE__*/_jsx(LuggMapWrapperViewNativeComponent, {
82
96
  style: StyleSheet.absoluteFill
83
97
  }), children]
84
98
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","Platform","StyleSheet","LuggMapsGoogleMapViewNativeComponent","Commands","GoogleMapCommands","LuggMapsAppleMapViewNativeComponent","AppleMapCommands","LuggMapsWrapperViewNativeComponent","jsx","_jsx","jsxs","_jsxs","MapView","Component","defaultProps","provider","OS","initialZoom","zoomEnabled","scrollEnabled","rotateEnabled","pitchEnabled","nativeRef","createRef","nativeCommands","props","isApple","moveCamera","coordinate","options","ref","current","zoom","duration","latitude","longitude","fitCoordinates","coordinates","first","padding","length","render","mapId","initialCoordinate","onCameraMove","onCameraIdle","children","rest","NativeMapView","style","absoluteFill"],"sourceRoot":"../../src","sources":["MapView.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Platform","StyleSheet","LuggGoogleMapViewNativeComponent","Commands","GoogleMapCommands","LuggAppleMapViewNativeComponent","AppleMapCommands","LuggMapWrapperViewNativeComponent","jsx","_jsx","jsxs","_jsxs","MapView","Component","defaultProps","provider","OS","initialZoom","zoomEnabled","scrollEnabled","rotateEnabled","pitchEnabled","nativeRef","createRef","nativeCommands","props","isApple","moveCamera","coordinate","options","ref","current","zoom","duration","latitude","longitude","fitCoordinates","coordinates","first","padding","top","left","bottom","right","length","render","mapId","initialCoordinate","minZoom","maxZoom","userLocationEnabled","onCameraMove","onCameraIdle","onReady","children","rest","NativeMapView","style","absoluteFill"],"sourceRoot":"../../src","sources":["MapView.tsx"],"mappings":"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","ignoreList":[]}