@lugg/maps 0.2.0-alpha.8 → 1.0.0-beta.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 (173) hide show
  1. package/README.md +20 -19
  2. package/android/src/main/java/com/luggmaps/LuggMapView.kt +290 -0
  3. package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt} +99 -36
  4. package/android/src/main/java/com/luggmaps/LuggMapWrapperView.kt +13 -5
  5. package/android/src/main/java/com/luggmaps/LuggMarkerView.kt +157 -13
  6. package/android/src/main/java/com/luggmaps/LuggMarkerViewManager.kt +28 -0
  7. package/android/src/main/java/com/luggmaps/LuggPackage.kt +1 -4
  8. package/android/src/main/java/com/luggmaps/LuggPolygonView.kt +85 -0
  9. package/android/src/main/java/com/luggmaps/LuggPolygonViewManager.kt +100 -0
  10. package/android/src/main/java/com/luggmaps/LuggPolylineView.kt +16 -0
  11. package/android/src/main/java/com/luggmaps/LuggPolylineViewManager.kt +22 -0
  12. package/android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt +698 -0
  13. package/android/src/main/java/com/luggmaps/core/MapProviderDelegate.kt +60 -0
  14. package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -24
  15. package/android/src/main/java/com/luggmaps/events/LongPressEvent.kt +29 -0
  16. package/android/src/main/java/com/luggmaps/events/MarkerDragEvent.kt +41 -0
  17. package/android/src/main/java/com/luggmaps/events/MarkerPressEvent.kt +34 -0
  18. package/android/src/main/java/com/luggmaps/events/PolygonPressEvent.kt +12 -0
  19. package/android/src/main/java/com/luggmaps/events/PressEvent.kt +29 -0
  20. package/ios/LuggMapView.h +9 -0
  21. package/ios/LuggMapView.mm +343 -0
  22. package/ios/LuggMarkerView.h +13 -0
  23. package/ios/LuggMarkerView.mm +119 -0
  24. package/ios/LuggPolygonView.h +31 -0
  25. package/ios/LuggPolygonView.mm +151 -0
  26. package/ios/LuggPolylineView.h +4 -0
  27. package/ios/LuggPolylineView.mm +23 -0
  28. package/ios/core/AppleMapProvider.h +15 -0
  29. package/ios/core/AppleMapProvider.mm +1029 -0
  30. package/ios/core/GMSPolylineAnimator.h +3 -0
  31. package/ios/core/GMSPolylineAnimator.m +101 -15
  32. package/ios/core/GoogleMapProvider.h +13 -0
  33. package/ios/core/GoogleMapProvider.mm +689 -0
  34. package/ios/core/MKPolylineAnimator.h +4 -0
  35. package/ios/core/MKPolylineAnimator.m +167 -42
  36. package/ios/core/MapProviderDelegate.h +84 -0
  37. package/ios/core/PolylineAnimatorBase.h +24 -1
  38. package/ios/core/PolylineAnimatorBase.m +82 -19
  39. package/ios/events/LongPressEvent.h +29 -0
  40. package/ios/events/MarkerDragEvent.h +69 -0
  41. package/ios/events/MarkerPressEvent.h +29 -0
  42. package/ios/events/PolygonPressEvent.h +20 -0
  43. package/ios/events/PressEvent.h +29 -0
  44. package/ios/extensions/MKMapView+Zoom.h +2 -0
  45. package/ios/extensions/MKMapView+Zoom.m +14 -4
  46. package/lib/module/MapProvider.js +2 -4
  47. package/lib/module/MapProvider.js.map +1 -1
  48. package/lib/module/MapProvider.web.js +12 -7
  49. package/lib/module/MapProvider.web.js.map +1 -1
  50. package/lib/module/MapView.js +33 -16
  51. package/lib/module/MapView.js.map +1 -1
  52. package/lib/module/MapView.web.js +315 -217
  53. package/lib/module/MapView.web.js.map +1 -1
  54. package/lib/module/components/GeoJson.js +159 -0
  55. package/lib/module/components/GeoJson.js.map +1 -0
  56. package/lib/module/components/GeoJson.types.js +4 -0
  57. package/lib/module/components/GeoJson.types.js.map +1 -0
  58. package/lib/module/components/Marker.js +28 -4
  59. package/lib/module/components/Marker.js.map +1 -1
  60. package/lib/module/components/Marker.types.js +4 -0
  61. package/lib/module/components/Marker.types.js.map +1 -0
  62. package/lib/module/components/Marker.web.js +98 -27
  63. package/lib/module/components/Marker.web.js.map +1 -1
  64. package/lib/module/components/Polygon.js +46 -0
  65. package/lib/module/components/Polygon.js.map +1 -0
  66. package/lib/module/components/Polygon.types.js +4 -0
  67. package/lib/module/components/Polygon.types.js.map +1 -0
  68. package/lib/module/components/Polygon.web.js +87 -0
  69. package/lib/module/components/Polygon.web.js.map +1 -0
  70. package/lib/module/components/Polyline.js +17 -4
  71. package/lib/module/components/Polyline.js.map +1 -1
  72. package/lib/module/components/Polyline.types.js +4 -0
  73. package/lib/module/components/Polyline.types.js.map +1 -0
  74. package/lib/module/components/Polyline.web.js +108 -31
  75. package/lib/module/components/Polyline.web.js.map +1 -1
  76. package/lib/module/components/index.js +4 -2
  77. package/lib/module/components/index.js.map +1 -1
  78. package/lib/module/components/index.web.js +2 -0
  79. package/lib/module/components/index.web.js.map +1 -1
  80. package/lib/module/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  81. package/lib/module/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  82. package/lib/module/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  83. package/lib/module/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  84. package/lib/module/index.js +4 -1
  85. package/lib/module/index.js.map +1 -1
  86. package/lib/module/index.web.js +4 -1
  87. package/lib/module/index.web.js.map +1 -1
  88. package/lib/typescript/src/MapProvider.d.ts +1 -1
  89. package/lib/typescript/src/MapProvider.d.ts.map +1 -1
  90. package/lib/typescript/src/MapProvider.web.d.ts +17 -1
  91. package/lib/typescript/src/MapProvider.web.d.ts.map +1 -1
  92. package/lib/typescript/src/MapView.d.ts +4 -4
  93. package/lib/typescript/src/MapView.d.ts.map +1 -1
  94. package/lib/typescript/src/MapView.types.d.ts +35 -9
  95. package/lib/typescript/src/MapView.types.d.ts.map +1 -1
  96. package/lib/typescript/src/MapView.web.d.ts +2 -11
  97. package/lib/typescript/src/MapView.web.d.ts.map +1 -1
  98. package/lib/typescript/src/components/GeoJson.d.ts +4 -0
  99. package/lib/typescript/src/components/GeoJson.d.ts.map +1 -0
  100. package/lib/typescript/src/components/GeoJson.types.d.ts +79 -0
  101. package/lib/typescript/src/components/GeoJson.types.d.ts.map +1 -0
  102. package/lib/typescript/src/components/Marker.d.ts +6 -33
  103. package/lib/typescript/src/components/Marker.d.ts.map +1 -1
  104. package/lib/typescript/src/components/Marker.types.d.ts +74 -0
  105. package/lib/typescript/src/components/Marker.types.d.ts.map +1 -0
  106. package/lib/typescript/src/components/Marker.web.d.ts +2 -5
  107. package/lib/typescript/src/components/Marker.web.d.ts.map +1 -1
  108. package/lib/typescript/src/components/Polygon.d.ts +10 -0
  109. package/lib/typescript/src/components/Polygon.d.ts.map +1 -0
  110. package/lib/typescript/src/components/Polygon.types.d.ts +33 -0
  111. package/lib/typescript/src/components/Polygon.types.d.ts.map +1 -0
  112. package/lib/typescript/src/components/Polygon.web.d.ts +3 -0
  113. package/lib/typescript/src/components/Polygon.web.d.ts.map +1 -0
  114. package/lib/typescript/src/components/Polyline.d.ts +6 -21
  115. package/lib/typescript/src/components/Polyline.d.ts.map +1 -1
  116. package/lib/typescript/src/components/Polyline.types.d.ts +53 -0
  117. package/lib/typescript/src/components/Polyline.types.d.ts.map +1 -0
  118. package/lib/typescript/src/components/Polyline.web.d.ts +2 -5
  119. package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -1
  120. package/lib/typescript/src/components/index.d.ts +8 -2
  121. package/lib/typescript/src/components/index.d.ts.map +1 -1
  122. package/lib/typescript/src/components/index.web.d.ts +6 -2
  123. package/lib/typescript/src/components/index.web.d.ts.map +1 -1
  124. package/lib/typescript/src/fabric/{LuggGoogleMapViewNativeComponent.d.ts → LuggMapViewNativeComponent.d.ts} +30 -4
  125. package/lib/typescript/src/fabric/LuggMapViewNativeComponent.d.ts.map +1 -0
  126. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts +45 -1
  127. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -1
  128. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts +18 -0
  129. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts.map +1 -0
  130. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts +7 -0
  131. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -1
  132. package/lib/typescript/src/index.d.ts +11 -3
  133. package/lib/typescript/src/index.d.ts.map +1 -1
  134. package/lib/typescript/src/index.web.d.ts +9 -1
  135. package/lib/typescript/src/index.web.d.ts.map +1 -1
  136. package/lib/typescript/src/types.d.ts +11 -0
  137. package/lib/typescript/src/types.d.ts.map +1 -1
  138. package/package.json +10 -9
  139. package/src/MapProvider.tsx +1 -3
  140. package/src/MapProvider.web.tsx +12 -3
  141. package/src/MapView.tsx +32 -26
  142. package/src/MapView.types.ts +43 -9
  143. package/src/MapView.web.tsx +376 -244
  144. package/src/components/GeoJson.tsx +221 -0
  145. package/src/components/GeoJson.types.ts +107 -0
  146. package/src/components/Marker.tsx +45 -36
  147. package/src/components/Marker.types.ts +75 -0
  148. package/src/components/Marker.web.tsx +116 -28
  149. package/src/components/Polygon.tsx +52 -0
  150. package/src/components/Polygon.types.ts +33 -0
  151. package/src/components/Polygon.web.tsx +104 -0
  152. package/src/components/Polyline.tsx +23 -22
  153. package/src/components/Polyline.types.ts +55 -0
  154. package/src/components/Polyline.web.tsx +151 -37
  155. package/src/components/index.ts +16 -2
  156. package/src/components/index.web.ts +6 -2
  157. package/src/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  158. package/src/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  159. package/src/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  160. package/src/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  161. package/src/index.ts +28 -1
  162. package/src/index.web.ts +15 -1
  163. package/src/types.ts +13 -0
  164. package/android/src/main/java/com/luggmaps/LuggGoogleMapView.kt +0 -511
  165. package/ios/LuggAppleMapView.h +0 -16
  166. package/ios/LuggAppleMapView.mm +0 -592
  167. package/ios/LuggGoogleMapView.h +0 -13
  168. package/ios/LuggGoogleMapView.mm +0 -455
  169. package/lib/module/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
  170. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts +0 -54
  171. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +0 -1
  172. package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +0 -1
  173. package/src/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
@@ -0,0 +1,343 @@
1
+ #import "LuggMapView.h"
2
+ #import "LuggMapWrapperView.h"
3
+ #import "LuggMarkerView.h"
4
+ #import "LuggPolygonView.h"
5
+ #import "LuggPolylineView.h"
6
+ #import "core/AppleMapProvider.h"
7
+ #import "core/GoogleMapProvider.h"
8
+ #import "core/MapProviderDelegate.h"
9
+ #import "events/CameraIdleEvent.h"
10
+ #import "events/CameraMoveEvent.h"
11
+ #import "events/LongPressEvent.h"
12
+ #import "events/PressEvent.h"
13
+ #import "events/ReadyEvent.h"
14
+
15
+ #import <react/renderer/components/RNMapsSpec/ComponentDescriptors.h>
16
+ #import <react/renderer/components/RNMapsSpec/EventEmitters.h>
17
+ #import <react/renderer/components/RNMapsSpec/Props.h>
18
+ #import <react/renderer/components/RNMapsSpec/RCTComponentViewHelpers.h>
19
+
20
+ #import "RCTFabricComponentsPlugins.h"
21
+
22
+ using namespace facebook::react;
23
+ using namespace luggmaps::events;
24
+
25
+ @interface LuggMapView () <RCTLuggMapViewViewProtocol, MapProviderDelegate>
26
+ @end
27
+
28
+ @implementation LuggMapView {
29
+ id<MapProvider> _provider;
30
+ LuggMapWrapperView *_mapWrapperView;
31
+ LuggMapViewProvider _providerType;
32
+ NSString *_mapId;
33
+ BOOL _initialized;
34
+ // Cached props to apply after content creation
35
+ BOOL _zoomEnabled;
36
+ BOOL _scrollEnabled;
37
+ BOOL _rotateEnabled;
38
+ BOOL _pitchEnabled;
39
+ BOOL _userLocationEnabled;
40
+ LuggMapViewTheme _theme;
41
+ double _minZoom;
42
+ double _maxZoom;
43
+ UIEdgeInsets _edgeInsets;
44
+ UIEdgeInsets _oldEdgeInsets;
45
+ }
46
+
47
+ + (ComponentDescriptorProvider)componentDescriptorProvider {
48
+ return concreteComponentDescriptorProvider<LuggMapViewComponentDescriptor>();
49
+ }
50
+
51
+ - (instancetype)initWithFrame:(CGRect)frame {
52
+ if (self = [super initWithFrame:frame]) {
53
+ static const auto defaultProps = std::make_shared<const LuggMapViewProps>();
54
+ _props = defaultProps;
55
+
56
+ _initialized = NO;
57
+ _mapId = @"";
58
+ _providerType = LuggMapViewProvider::Google;
59
+ _zoomEnabled = YES;
60
+ _scrollEnabled = YES;
61
+ _rotateEnabled = YES;
62
+ _pitchEnabled = YES;
63
+ _userLocationEnabled = NO;
64
+ _theme = LuggMapViewTheme::System;
65
+ _edgeInsets = UIEdgeInsetsZero;
66
+ }
67
+ return self;
68
+ }
69
+
70
+ #pragma mark - View Lifecycle
71
+
72
+ - (void)mountChildComponentView:
73
+ (UIView<RCTComponentViewProtocol> *)childComponentView
74
+ index:(NSInteger)index {
75
+ [super mountChildComponentView:childComponentView index:index];
76
+
77
+ if ([childComponentView isKindOfClass:[LuggMapWrapperView class]]) {
78
+ _mapWrapperView = (LuggMapWrapperView *)childComponentView;
79
+ } else if ([childComponentView isKindOfClass:[LuggMarkerView class]]) {
80
+ LuggMarkerView *markerView = (LuggMarkerView *)childComponentView;
81
+ if (_provider) {
82
+ [_provider addMarkerView:markerView];
83
+ }
84
+ } else if ([childComponentView isKindOfClass:[LuggPolylineView class]]) {
85
+ LuggPolylineView *polylineView = (LuggPolylineView *)childComponentView;
86
+ if (_provider) {
87
+ [_provider addPolylineView:polylineView];
88
+ }
89
+ } else if ([childComponentView isKindOfClass:[LuggPolygonView class]]) {
90
+ LuggPolygonView *polygonView = (LuggPolygonView *)childComponentView;
91
+ if (_provider) {
92
+ [_provider addPolygonView:polygonView];
93
+ }
94
+ }
95
+ }
96
+
97
+ - (void)unmountChildComponentView:
98
+ (UIView<RCTComponentViewProtocol> *)childComponentView
99
+ index:(NSInteger)index {
100
+ if ([childComponentView isKindOfClass:[LuggMarkerView class]]) {
101
+ LuggMarkerView *markerView = (LuggMarkerView *)childComponentView;
102
+ if (_provider) {
103
+ [_provider removeMarkerView:markerView];
104
+ }
105
+ } else if ([childComponentView isKindOfClass:[LuggPolylineView class]]) {
106
+ LuggPolylineView *polylineView = (LuggPolylineView *)childComponentView;
107
+ if (_provider) {
108
+ [_provider removePolylineView:polylineView];
109
+ }
110
+ } else if ([childComponentView isKindOfClass:[LuggPolygonView class]]) {
111
+ LuggPolygonView *polygonView = (LuggPolygonView *)childComponentView;
112
+ if (_provider) {
113
+ [_provider removePolygonView:polygonView];
114
+ }
115
+ }
116
+
117
+ [super unmountChildComponentView:childComponentView index:index];
118
+ }
119
+
120
+ - (void)didMoveToWindow {
121
+ [super didMoveToWindow];
122
+ if (self.window) {
123
+ if (!_provider && _mapWrapperView) {
124
+ [self initializeProvider];
125
+ }
126
+ [_provider resumeAnimations];
127
+ } else {
128
+ [_provider pauseAnimations];
129
+ }
130
+ }
131
+
132
+ - (void)prepareForRecycle {
133
+ [super prepareForRecycle];
134
+
135
+ [_provider destroy];
136
+ _provider = nil;
137
+ _mapWrapperView = nil;
138
+ _initialized = NO;
139
+ }
140
+
141
+ #pragma mark - Provider Initialization
142
+
143
+ - (void)initializeProvider {
144
+ if (_provider || !_mapWrapperView)
145
+ return;
146
+
147
+ const auto &viewProps =
148
+ *std::static_pointer_cast<LuggMapViewProps const>(_props);
149
+
150
+ if (_providerType == LuggMapViewProvider::Apple) {
151
+ _provider = [[AppleMapProvider alloc] init];
152
+ } else {
153
+ GoogleMapProvider *google = [[GoogleMapProvider alloc] init];
154
+ google.mapId = _mapId;
155
+ _provider = google;
156
+ }
157
+
158
+ _provider.delegate = self;
159
+
160
+ CLLocationCoordinate2D coordinate =
161
+ CLLocationCoordinate2DMake(viewProps.initialCoordinate.latitude,
162
+ viewProps.initialCoordinate.longitude);
163
+
164
+ [_provider initializeMapInView:_mapWrapperView
165
+ initialCoordinate:coordinate
166
+ initialZoom:viewProps.initialZoom];
167
+
168
+ // Apply cached props after map view is created
169
+ [self applyProps];
170
+ [_provider setEdgeInsets:_edgeInsets oldEdgeInsets:UIEdgeInsetsZero];
171
+
172
+ _initialized = YES;
173
+
174
+ // Flush any children that were mounted before content was created
175
+ for (UIView *subview in self.subviews) {
176
+ if ([subview isKindOfClass:[LuggMarkerView class]]) {
177
+ [_provider addMarkerView:(LuggMarkerView *)subview];
178
+ } else if ([subview isKindOfClass:[LuggPolylineView class]]) {
179
+ [_provider addPolylineView:(LuggPolylineView *)subview];
180
+ } else if ([subview isKindOfClass:[LuggPolygonView class]]) {
181
+ [_provider addPolygonView:(LuggPolygonView *)subview];
182
+ }
183
+ }
184
+ }
185
+
186
+ #pragma mark - MapProviderDelegate
187
+
188
+ - (void)mapProviderDidReady {
189
+ ReadyEvent::emit<LuggMapViewEventEmitter>(_eventEmitter);
190
+ }
191
+
192
+ - (void)mapProviderDidMoveCamera:(double)latitude
193
+ longitude:(double)longitude
194
+ zoom:(double)zoom
195
+ gesture:(BOOL)gesture {
196
+ CameraMoveEvent{latitude, longitude, zoom, static_cast<bool>(gesture)}
197
+ .emit<LuggMapViewEventEmitter>(_eventEmitter);
198
+ }
199
+
200
+ - (void)mapProviderDidIdleCamera:(double)latitude
201
+ longitude:(double)longitude
202
+ zoom:(double)zoom
203
+ gesture:(BOOL)gesture {
204
+ CameraIdleEvent{latitude, longitude, zoom, static_cast<bool>(gesture)}
205
+ .emit<LuggMapViewEventEmitter>(_eventEmitter);
206
+ }
207
+
208
+ - (void)mapProviderDidPress:(double)latitude
209
+ longitude:(double)longitude
210
+ x:(double)x
211
+ y:(double)y {
212
+ PressEvent{latitude, longitude, x, y}.emit<LuggMapViewEventEmitter>(
213
+ _eventEmitter);
214
+ }
215
+
216
+ - (void)mapProviderDidLongPress:(double)latitude
217
+ longitude:(double)longitude
218
+ x:(double)x
219
+ y:(double)y {
220
+ LongPressEvent{latitude, longitude, x, y}.emit<LuggMapViewEventEmitter>(
221
+ _eventEmitter);
222
+ }
223
+
224
+ #pragma mark - Property Setters
225
+
226
+ - (void)applyProps {
227
+ [_provider setZoomEnabled:_zoomEnabled];
228
+ [_provider setScrollEnabled:_scrollEnabled];
229
+ [_provider setRotateEnabled:_rotateEnabled];
230
+ [_provider setPitchEnabled:_pitchEnabled];
231
+ [_provider setUserLocationEnabled:_userLocationEnabled];
232
+ [_provider setTheme:(NSInteger)_theme];
233
+ [_provider setMinZoom:_minZoom];
234
+ [_provider setMaxZoom:_maxZoom];
235
+ }
236
+
237
+ - (void)updateProps:(Props::Shared const &)props
238
+ oldProps:(Props::Shared const &)oldProps {
239
+ const auto &newViewProps =
240
+ *std::static_pointer_cast<LuggMapViewProps const>(props);
241
+ const auto &prevViewProps =
242
+ *std::static_pointer_cast<LuggMapViewProps const>(_props);
243
+
244
+ _providerType = newViewProps.provider;
245
+
246
+ NSString *newMapId =
247
+ [NSString stringWithUTF8String:newViewProps.mapId.c_str()];
248
+ if (newMapId.length > 0) {
249
+ _mapId = newMapId;
250
+ }
251
+
252
+ if (newViewProps.zoomEnabled != prevViewProps.zoomEnabled) {
253
+ _zoomEnabled = newViewProps.zoomEnabled;
254
+ [_provider setZoomEnabled:_zoomEnabled];
255
+ }
256
+ if (newViewProps.scrollEnabled != prevViewProps.scrollEnabled) {
257
+ _scrollEnabled = newViewProps.scrollEnabled;
258
+ [_provider setScrollEnabled:_scrollEnabled];
259
+ }
260
+ if (newViewProps.rotateEnabled != prevViewProps.rotateEnabled) {
261
+ _rotateEnabled = newViewProps.rotateEnabled;
262
+ [_provider setRotateEnabled:_rotateEnabled];
263
+ }
264
+ if (newViewProps.pitchEnabled != prevViewProps.pitchEnabled) {
265
+ _pitchEnabled = newViewProps.pitchEnabled;
266
+ [_provider setPitchEnabled:_pitchEnabled];
267
+ }
268
+ if (newViewProps.userLocationEnabled != prevViewProps.userLocationEnabled) {
269
+ _userLocationEnabled = newViewProps.userLocationEnabled;
270
+ [_provider setUserLocationEnabled:_userLocationEnabled];
271
+ }
272
+ if (newViewProps.minZoom != prevViewProps.minZoom) {
273
+ _minZoom = newViewProps.minZoom;
274
+ [_provider setMinZoom:_minZoom];
275
+ }
276
+ if (newViewProps.maxZoom != prevViewProps.maxZoom) {
277
+ _maxZoom = newViewProps.maxZoom;
278
+ [_provider setMaxZoom:_maxZoom];
279
+ }
280
+ if (newViewProps.theme != prevViewProps.theme) {
281
+ _theme = newViewProps.theme;
282
+ [_provider setTheme:(NSInteger)_theme];
283
+ }
284
+
285
+ UIEdgeInsets newEdgeInsets = UIEdgeInsetsMake(
286
+ newViewProps.edgeInsets.top, newViewProps.edgeInsets.left,
287
+ newViewProps.edgeInsets.bottom, newViewProps.edgeInsets.right);
288
+ if (!UIEdgeInsetsEqualToEdgeInsets(newEdgeInsets, _edgeInsets)) {
289
+ _oldEdgeInsets = _edgeInsets;
290
+ _edgeInsets = newEdgeInsets;
291
+ [_provider setEdgeInsets:_edgeInsets oldEdgeInsets:_oldEdgeInsets];
292
+ }
293
+
294
+ [super updateProps:props oldProps:oldProps];
295
+ }
296
+
297
+ #pragma mark - Commands
298
+
299
+ - (void)moveCamera:(double)latitude
300
+ longitude:(double)longitude
301
+ zoom:(double)zoom
302
+ duration:(double)duration {
303
+ [_provider moveCamera:latitude
304
+ longitude:longitude
305
+ zoom:zoom
306
+ duration:duration];
307
+ }
308
+
309
+ - (void)fitCoordinates:(NSArray *)coordinates
310
+ edgeInsetsTop:(double)edgeInsetsTop
311
+ edgeInsetsLeft:(double)edgeInsetsLeft
312
+ edgeInsetsBottom:(double)edgeInsetsBottom
313
+ edgeInsetsRight:(double)edgeInsetsRight
314
+ duration:(double)duration {
315
+ [_provider fitCoordinates:coordinates
316
+ edgeInsetsTop:edgeInsetsTop
317
+ edgeInsetsLeft:edgeInsetsLeft
318
+ edgeInsetsBottom:edgeInsetsBottom
319
+ edgeInsetsRight:edgeInsetsRight
320
+ duration:duration];
321
+ }
322
+
323
+ - (void)setEdgeInsets:(double)top
324
+ left:(double)left
325
+ bottom:(double)bottom
326
+ right:(double)right
327
+ duration:(double)duration {
328
+ UIEdgeInsets oldInsets = _edgeInsets;
329
+ _edgeInsets = UIEdgeInsetsMake(top, left, bottom, right);
330
+ [_provider setEdgeInsets:_edgeInsets
331
+ oldEdgeInsets:oldInsets
332
+ duration:duration];
333
+ }
334
+
335
+ - (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args {
336
+ RCTLuggMapViewHandleCommand(self, commandName, args);
337
+ }
338
+
339
+ Class<RCTComponentViewProtocol> LuggMapViewCls(void) {
340
+ return LuggMapView.class;
341
+ }
342
+
343
+ @end
@@ -20,12 +20,25 @@ NS_ASSUME_NONNULL_BEGIN
20
20
  @property(nonatomic, readonly, nullable) NSString *markerDescription;
21
21
  @property(nonatomic, readonly) CGPoint anchor;
22
22
  @property(nonatomic, readonly) NSInteger zIndex;
23
+ @property(nonatomic, readonly) CLLocationDegrees rotate;
24
+ @property(nonatomic, readonly) CGFloat scale;
25
+ @property(nonatomic, readonly) BOOL rasterize;
26
+ @property(nonatomic, readonly) BOOL draggable;
23
27
  @property(nonatomic, readonly) BOOL hasCustomView;
24
28
  @property(nonatomic, readonly) BOOL didLayout;
25
29
  @property(nonatomic, readonly) UIView *iconView;
26
30
  @property(nonatomic, weak, nullable) id<LuggMarkerViewDelegate> delegate;
27
31
  @property(nonatomic, strong, nullable) NSObject *marker;
28
32
 
33
+ - (nullable UIImage *)createIconImage;
34
+ - (nullable UIImage *)createScaledIconImage;
35
+ - (void)resetIconViewTransform;
36
+ - (void)emitPressEventWithPoint:(CGPoint)point;
37
+ - (void)emitDragStartEventWithPoint:(CGPoint)point;
38
+ - (void)emitDragChangeEventWithPoint:(CGPoint)point;
39
+ - (void)emitDragEndEventWithPoint:(CGPoint)point;
40
+ - (void)updateCoordinate:(CLLocationCoordinate2D)coordinate;
41
+
29
42
  @end
30
43
 
31
44
  NS_ASSUME_NONNULL_END
@@ -1,4 +1,6 @@
1
1
  #import "LuggMarkerView.h"
2
+ #import "events/MarkerDragEvent.h"
3
+ #import "events/MarkerPressEvent.h"
2
4
 
3
5
  #import <react/renderer/components/RNMapsSpec/ComponentDescriptors.h>
4
6
  #import <react/renderer/components/RNMapsSpec/EventEmitters.h>
@@ -8,6 +10,7 @@
8
10
  #import "RCTFabricComponentsPlugins.h"
9
11
 
10
12
  using namespace facebook::react;
13
+ using namespace luggmaps::events;
11
14
 
12
15
  @interface LuggMarkerView () <RCTLuggMarkerViewViewProtocol>
13
16
  @end
@@ -19,6 +22,10 @@ using namespace facebook::react;
19
22
  NSString *_markerDescription;
20
23
  CGPoint _anchor;
21
24
  NSInteger _zIndex;
25
+ CLLocationDegrees _rotate;
26
+ CGFloat _scale;
27
+ BOOL _rasterize;
28
+ BOOL _draggable;
22
29
  BOOL _didLayout;
23
30
  UIView *_iconView;
24
31
  }
@@ -37,6 +44,9 @@ using namespace facebook::react;
37
44
  _coordinate = CLLocationCoordinate2DMake(0, 0);
38
45
  _anchor = CGPointMake(0.5, 1.0);
39
46
  _zIndex = 0;
47
+ _rotate = 0;
48
+ _scale = 1;
49
+ _rasterize = YES;
40
50
  _didLayout = NO;
41
51
 
42
52
  _iconView = [[UIView alloc] init];
@@ -63,6 +73,10 @@ using namespace facebook::react;
63
73
  [NSString stringWithUTF8String:newViewProps.description.c_str()];
64
74
  _anchor = CGPointMake(newViewProps.anchor.x, newViewProps.anchor.y);
65
75
  _zIndex = newViewProps.zIndex.value_or(0);
76
+ _rotate = newViewProps.rotate;
77
+ _scale = newViewProps.scale;
78
+ _rasterize = newViewProps.rasterize;
79
+ _draggable = newViewProps.draggable;
66
80
  }
67
81
 
68
82
  - (void)finalizeUpdates:(RNComponentViewUpdateMask)updateMask {
@@ -138,6 +152,22 @@ using namespace facebook::react;
138
152
  return _zIndex;
139
153
  }
140
154
 
155
+ - (CLLocationDegrees)rotate {
156
+ return _rotate;
157
+ }
158
+
159
+ - (CGFloat)scale {
160
+ return _scale;
161
+ }
162
+
163
+ - (BOOL)rasterize {
164
+ return _rasterize;
165
+ }
166
+
167
+ - (BOOL)draggable {
168
+ return _draggable;
169
+ }
170
+
141
171
  - (BOOL)hasCustomView {
142
172
  return _iconView.subviews.count > 0;
143
173
  }
@@ -150,11 +180,100 @@ using namespace facebook::react;
150
180
  return _iconView;
151
181
  }
152
182
 
183
+ - (UIImage *)createIconImage {
184
+ CGSize size = _iconView.bounds.size;
185
+ if (size.width <= 0 || size.height <= 0) {
186
+ return nil;
187
+ }
188
+
189
+ UIGraphicsImageRendererFormat *format =
190
+ [UIGraphicsImageRendererFormat defaultFormat];
191
+ format.scale = [UIScreen mainScreen].scale;
192
+ UIGraphicsImageRenderer *renderer =
193
+ [[UIGraphicsImageRenderer alloc] initWithSize:size format:format];
194
+
195
+ return [renderer imageWithActions:^(UIGraphicsImageRendererContext *context) {
196
+ [self->_iconView.layer renderInContext:context.CGContext];
197
+ }];
198
+ }
199
+
200
+ - (UIImage *)createScaledIconImage {
201
+ CGSize size = _iconView.bounds.size;
202
+ if (size.width <= 0 || size.height <= 0) {
203
+ return nil;
204
+ }
205
+
206
+ CGSize scaledSize = CGSizeMake(size.width * _scale, size.height * _scale);
207
+
208
+ UIGraphicsImageRendererFormat *format =
209
+ [UIGraphicsImageRendererFormat defaultFormat];
210
+ format.scale = [UIScreen mainScreen].scale;
211
+ UIGraphicsImageRenderer *renderer =
212
+ [[UIGraphicsImageRenderer alloc] initWithSize:scaledSize format:format];
213
+
214
+ return [renderer imageWithActions:^(UIGraphicsImageRendererContext *context) {
215
+ CGContextScaleCTM(context.CGContext, self->_scale, self->_scale);
216
+ [self->_iconView.layer renderInContext:context.CGContext];
217
+ }];
218
+ }
219
+
220
+ - (void)emitPressEventWithPoint:(CGPoint)point {
221
+ MarkerPressEvent event{
222
+ .latitude = _coordinate.latitude,
223
+ .longitude = _coordinate.longitude,
224
+ .x = point.x,
225
+ .y = point.y,
226
+ };
227
+ event.emit<LuggMarkerViewEventEmitter>(_eventEmitter);
228
+ }
229
+
230
+ - (void)emitDragStartEventWithPoint:(CGPoint)point {
231
+ MarkerDragStartEvent event{
232
+ .latitude = _coordinate.latitude,
233
+ .longitude = _coordinate.longitude,
234
+ .x = point.x,
235
+ .y = point.y,
236
+ };
237
+ event.emit<LuggMarkerViewEventEmitter>(_eventEmitter);
238
+ }
239
+
240
+ - (void)emitDragChangeEventWithPoint:(CGPoint)point {
241
+ MarkerDragChangeEvent event{
242
+ .latitude = _coordinate.latitude,
243
+ .longitude = _coordinate.longitude,
244
+ .x = point.x,
245
+ .y = point.y,
246
+ };
247
+ event.emit<LuggMarkerViewEventEmitter>(_eventEmitter);
248
+ }
249
+
250
+ - (void)emitDragEndEventWithPoint:(CGPoint)point {
251
+ MarkerDragEndEvent event{
252
+ .latitude = _coordinate.latitude,
253
+ .longitude = _coordinate.longitude,
254
+ .x = point.x,
255
+ .y = point.y,
256
+ };
257
+ event.emit<LuggMarkerViewEventEmitter>(_eventEmitter);
258
+ }
259
+
260
+ - (void)updateCoordinate:(CLLocationCoordinate2D)coordinate {
261
+ _coordinate = coordinate;
262
+ }
263
+
264
+ - (void)resetIconViewTransform {
265
+ _iconView.transform = CGAffineTransformIdentity;
266
+ _iconView.layer.anchorPoint = CGPointMake(0.5, 0.5);
267
+ _iconView.frame = CGRectMake(0, 0, _iconView.bounds.size.width,
268
+ _iconView.bounds.size.height);
269
+ }
270
+
153
271
  - (void)prepareForRecycle {
154
272
  [super prepareForRecycle];
155
273
  _didLayout = NO;
156
274
  self.marker = nil;
157
275
  self.delegate = nil;
276
+ [self resetIconViewTransform];
158
277
  for (UIView *subview in _iconView.subviews) {
159
278
  [subview removeFromSuperview];
160
279
  }
@@ -0,0 +1,31 @@
1
+ #import <CoreLocation/CoreLocation.h>
2
+ #import <React/RCTViewComponentView.h>
3
+ #import <UIKit/UIKit.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @class LuggPolygonView;
8
+
9
+ @protocol LuggPolygonViewDelegate <NSObject>
10
+ @optional
11
+ - (void)polygonViewDidUpdate:(LuggPolygonView *)polygonView;
12
+ @end
13
+
14
+ @interface LuggPolygonView : RCTViewComponentView
15
+
16
+ @property(nonatomic, readonly) NSArray<CLLocation *> *coordinates;
17
+ @property(nonatomic, readonly) NSArray<NSArray<CLLocation *> *> *holes;
18
+ @property(nonatomic, readonly) UIColor *strokeColor;
19
+ @property(nonatomic, readonly) UIColor *fillColor;
20
+ @property(nonatomic, readonly) CGFloat strokeWidth;
21
+ @property(nonatomic, readonly) NSInteger zIndex;
22
+ @property(nonatomic, readonly) BOOL tappable;
23
+ @property(nonatomic, weak, nullable) id<LuggPolygonViewDelegate> delegate;
24
+ @property(nonatomic, strong, nullable) NSObject *polygon;
25
+ @property(nonatomic, weak, nullable) NSObject *renderer;
26
+
27
+ - (void)emitPressEvent;
28
+
29
+ @end
30
+
31
+ NS_ASSUME_NONNULL_END