@maplibre/maplibre-react-native 10.1.0 → 10.1.2

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 (185) hide show
  1. package/ios/MLRN/CameraStop.h +1 -1
  2. package/ios/MLRN/CameraStop.m +58 -60
  3. package/ios/MLRN/CameraUpdateItem.h +2 -1
  4. package/ios/MLRN/CameraUpdateItem.m +132 -132
  5. package/ios/MLRN/CameraUpdateQueue.m +43 -47
  6. package/ios/MLRN/FilterParser.h +1 -1
  7. package/ios/MLRN/FilterParser.m +5 -6
  8. package/ios/MLRN/MLRNBackgroundLayer.m +10 -9
  9. package/ios/MLRN/MLRNBackgroundLayerManager.m +4 -5
  10. package/ios/MLRN/MLRNCallout.h +1 -1
  11. package/ios/MLRN/MLRNCallout.m +37 -36
  12. package/ios/MLRN/MLRNCalloutManager.m +2 -3
  13. package/ios/MLRN/MLRNCamera.h +1 -1
  14. package/ios/MLRN/MLRNCamera.m +169 -182
  15. package/ios/MLRN/MLRNCameraManager.m +4 -6
  16. package/ios/MLRN/MLRNCircleLayer.m +17 -14
  17. package/ios/MLRN/MLRNCircleLayerManager.m +4 -5
  18. package/ios/MLRN/MLRNCustomHeaders.h +2 -2
  19. package/ios/MLRN/MLRNCustomHeaders.m +63 -63
  20. package/ios/MLRN/MLRNEvent.h +3 -3
  21. package/ios/MLRN/MLRNEvent.m +19 -24
  22. package/ios/MLRN/MLRNEventProtocol.h +1 -1
  23. package/ios/MLRN/MLRNFillExtrusionLayer.m +18 -14
  24. package/ios/MLRN/MLRNFillExtrusionLayerManager.m +4 -5
  25. package/ios/MLRN/MLRNFillLayer.m +16 -14
  26. package/ios/MLRN/MLRNFillLayerManager.m +4 -5
  27. package/ios/MLRN/MLRNHeatmapLayer.m +17 -14
  28. package/ios/MLRN/MLRNHeatmapLayerManager.m +4 -5
  29. package/ios/MLRN/MLRNImageQueue.h +4 -1
  30. package/ios/MLRN/MLRNImageQueue.m +29 -32
  31. package/ios/MLRN/MLRNImageQueueOperation.h +1 -1
  32. package/ios/MLRN/MLRNImageQueueOperation.m +92 -91
  33. package/ios/MLRN/MLRNImageSource.m +36 -38
  34. package/ios/MLRN/MLRNImageSourceManager.m +2 -3
  35. package/ios/MLRN/MLRNImageUtils.h +3 -3
  36. package/ios/MLRN/MLRNImageUtils.m +15 -14
  37. package/ios/MLRN/MLRNImages.h +0 -1
  38. package/ios/MLRN/MLRNImages.m +89 -91
  39. package/ios/MLRN/MLRNImagesManager.m +4 -5
  40. package/ios/MLRN/MLRNLayer.h +9 -11
  41. package/ios/MLRN/MLRNLayer.m +170 -182
  42. package/ios/MLRN/MLRNLight.m +21 -23
  43. package/ios/MLRN/MLRNLightManager.m +2 -3
  44. package/ios/MLRN/MLRNLineLayer.m +17 -15
  45. package/ios/MLRN/MLRNLineLayerManager.m +4 -6
  46. package/ios/MLRN/MLRNLocation.h +1 -1
  47. package/ios/MLRN/MLRNLocation.m +16 -17
  48. package/ios/MLRN/MLRNLocationManager.m +109 -124
  49. package/ios/MLRN/MLRNLocationManagerDelegate.h +3 -3
  50. package/ios/MLRN/MLRNLocationModule.h +1 -1
  51. package/ios/MLRN/MLRNLocationModule.m +40 -55
  52. package/ios/MLRN/MLRNLogging.h +1 -4
  53. package/ios/MLRN/MLRNLogging.m +84 -89
  54. package/ios/MLRN/MLRNMapTouchEvent.h +2 -2
  55. package/ios/MLRN/MLRNMapTouchEvent.m +50 -49
  56. package/ios/MLRN/MLRNMapView.h +43 -36
  57. package/ios/MLRN/MLRNMapView.m +409 -440
  58. package/ios/MLRN/MLRNMapViewManager.m +489 -502
  59. package/ios/MLRN/MLRNModule.h +1 -1
  60. package/ios/MLRN/MLRNModule.m +111 -105
  61. package/ios/MLRN/MLRNNativeUserLocation.m +24 -27
  62. package/ios/MLRN/MLRNNativeUserLocationManager.m +4 -8
  63. package/ios/MLRN/MLRNOfflineModule.h +1 -1
  64. package/ios/MLRN/MLRNOfflineModule.m +416 -421
  65. package/ios/MLRN/MLRNPointAnnotation.h +2 -2
  66. package/ios/MLRN/MLRNPointAnnotation.m +154 -175
  67. package/ios/MLRN/MLRNPointAnnotationManager.m +2 -3
  68. package/ios/MLRN/MLRNRasterLayer.m +16 -12
  69. package/ios/MLRN/MLRNRasterLayerManager.m +4 -5
  70. package/ios/MLRN/MLRNRasterSource.m +21 -17
  71. package/ios/MLRN/MLRNRasterSourceManager.m +2 -3
  72. package/ios/MLRN/MLRNShapeSource.h +17 -16
  73. package/ios/MLRN/MLRNShapeSource.m +94 -102
  74. package/ios/MLRN/MLRNShapeSourceManager.h +2 -2
  75. package/ios/MLRN/MLRNShapeSourceManager.m +86 -90
  76. package/ios/MLRN/MLRNSnapshotModule.h +1 -1
  77. package/ios/MLRN/MLRNSnapshotModule.m +51 -53
  78. package/ios/MLRN/MLRNSource.h +12 -12
  79. package/ios/MLRN/MLRNSource.m +82 -88
  80. package/ios/MLRN/MLRNStyleValue.h +1 -1
  81. package/ios/MLRN/MLRNStyleValue.m +128 -128
  82. package/ios/MLRN/MLRNSymbolLayer.m +17 -13
  83. package/ios/MLRN/MLRNSymbolLayerManager.m +4 -5
  84. package/ios/MLRN/MLRNTileSource.h +1 -1
  85. package/ios/MLRN/MLRNTileSource.m +21 -20
  86. package/ios/MLRN/MLRNUserLocation.h +1 -1
  87. package/ios/MLRN/MLRNUserLocation.m +10 -12
  88. package/ios/MLRN/MLRNUtils.h +18 -11
  89. package/ios/MLRN/MLRNUtils.m +168 -160
  90. package/ios/MLRN/MLRNVectorLayer.m +28 -34
  91. package/ios/MLRN/MLRNVectorSource.h +3 -1
  92. package/ios/MLRN/MLRNVectorSource.m +14 -11
  93. package/ios/MLRN/MLRNVectorSourceManager.h +2 -2
  94. package/ios/MLRN/MLRNVectorSourceManager.m +36 -39
  95. package/ios/MLRN/ViewManager.h +1 -1
  96. package/ios/MLRN/ViewManager.m +29 -35
  97. package/lib/commonjs/components/MarkerView.js +1 -1
  98. package/lib/commonjs/components/ShapeSource.js +2 -1
  99. package/lib/commonjs/components/ShapeSource.js.map +1 -1
  100. package/lib/commonjs/components/UserLocation.js +8 -38
  101. package/lib/commonjs/components/UserLocation.js.map +1 -1
  102. package/lib/commonjs/components/UserLocationPuck.js +52 -0
  103. package/lib/commonjs/components/UserLocationPuck.js.map +1 -0
  104. package/lib/commonjs/components/{HeadingIndicator.js → UserLocationPuckHeading.js} +12 -9
  105. package/lib/commonjs/components/UserLocationPuckHeading.js.map +1 -0
  106. package/lib/commonjs/utils/animated/AbstractAnimatedCoordinates.js +8 -7
  107. package/lib/commonjs/utils/animated/AbstractAnimatedCoordinates.js.map +1 -1
  108. package/lib/commonjs/utils/animated/AnimatedExtractCoordinateFromArray.js +1 -2
  109. package/lib/commonjs/utils/animated/AnimatedExtractCoordinateFromArray.js.map +1 -1
  110. package/lib/commonjs/utils/animated/AnimatedRouteCoordinatesArray.js +28 -38
  111. package/lib/commonjs/utils/animated/AnimatedRouteCoordinatesArray.js.map +1 -1
  112. package/lib/commonjs/utils/animated/AnimatedShape.js +11 -7
  113. package/lib/commonjs/utils/animated/AnimatedShape.js.map +1 -1
  114. package/lib/module/components/MarkerView.js +1 -1
  115. package/lib/module/components/ShapeSource.js +2 -1
  116. package/lib/module/components/ShapeSource.js.map +1 -1
  117. package/lib/module/components/UserLocation.js +7 -36
  118. package/lib/module/components/UserLocation.js.map +1 -1
  119. package/lib/module/components/UserLocationPuck.js +48 -0
  120. package/lib/module/components/UserLocationPuck.js.map +1 -0
  121. package/lib/module/components/{HeadingIndicator.js → UserLocationPuckHeading.js} +11 -7
  122. package/lib/module/components/UserLocationPuckHeading.js.map +1 -0
  123. package/lib/module/utils/animated/AbstractAnimatedCoordinates.js +8 -7
  124. package/lib/module/utils/animated/AbstractAnimatedCoordinates.js.map +1 -1
  125. package/lib/module/utils/animated/AnimatedExtractCoordinateFromArray.js +1 -3
  126. package/lib/module/utils/animated/AnimatedExtractCoordinateFromArray.js.map +1 -1
  127. package/lib/module/utils/animated/AnimatedRouteCoordinatesArray.js +29 -39
  128. package/lib/module/utils/animated/AnimatedRouteCoordinatesArray.js.map +1 -1
  129. package/lib/module/utils/animated/AnimatedShape.js +11 -7
  130. package/lib/module/utils/animated/AnimatedShape.js.map +1 -1
  131. package/lib/typescript/commonjs/src/components/MarkerView.d.ts +1 -1
  132. package/lib/typescript/commonjs/src/components/ShapeSource.d.ts +1 -1
  133. package/lib/typescript/commonjs/src/components/ShapeSource.d.ts.map +1 -1
  134. package/lib/typescript/commonjs/src/components/UserLocation.d.ts +0 -1
  135. package/lib/typescript/commonjs/src/components/UserLocation.d.ts.map +1 -1
  136. package/lib/typescript/commonjs/src/components/UserLocationPuck.d.ts +9 -0
  137. package/lib/typescript/commonjs/src/components/UserLocationPuck.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/src/components/UserLocationPuckHeading.d.ts +9 -0
  139. package/lib/typescript/commonjs/src/components/UserLocationPuckHeading.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/src/utils/animated/AbstractAnimatedCoordinates.d.ts +12 -13
  141. package/lib/typescript/commonjs/src/utils/animated/AbstractAnimatedCoordinates.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts +5 -4
  143. package/lib/typescript/commonjs/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/src/utils/animated/AnimatedPoint.d.ts +0 -1
  145. package/lib/typescript/commonjs/src/utils/animated/AnimatedPoint.d.ts.map +1 -1
  146. package/lib/typescript/commonjs/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts +33 -21
  147. package/lib/typescript/commonjs/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts.map +1 -1
  148. package/lib/typescript/commonjs/src/utils/animated/AnimatedShape.d.ts +8 -5
  149. package/lib/typescript/commonjs/src/utils/animated/AnimatedShape.d.ts.map +1 -1
  150. package/lib/typescript/module/src/components/MarkerView.d.ts +1 -1
  151. package/lib/typescript/module/src/components/ShapeSource.d.ts +1 -1
  152. package/lib/typescript/module/src/components/ShapeSource.d.ts.map +1 -1
  153. package/lib/typescript/module/src/components/UserLocation.d.ts +0 -1
  154. package/lib/typescript/module/src/components/UserLocation.d.ts.map +1 -1
  155. package/lib/typescript/module/src/components/UserLocationPuck.d.ts +9 -0
  156. package/lib/typescript/module/src/components/UserLocationPuck.d.ts.map +1 -0
  157. package/lib/typescript/module/src/components/UserLocationPuckHeading.d.ts +9 -0
  158. package/lib/typescript/module/src/components/UserLocationPuckHeading.d.ts.map +1 -0
  159. package/lib/typescript/module/src/utils/animated/AbstractAnimatedCoordinates.d.ts +12 -13
  160. package/lib/typescript/module/src/utils/animated/AbstractAnimatedCoordinates.d.ts.map +1 -1
  161. package/lib/typescript/module/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts +5 -4
  162. package/lib/typescript/module/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts.map +1 -1
  163. package/lib/typescript/module/src/utils/animated/AnimatedPoint.d.ts +0 -1
  164. package/lib/typescript/module/src/utils/animated/AnimatedPoint.d.ts.map +1 -1
  165. package/lib/typescript/module/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts +33 -21
  166. package/lib/typescript/module/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts.map +1 -1
  167. package/lib/typescript/module/src/utils/animated/AnimatedShape.d.ts +8 -5
  168. package/lib/typescript/module/src/utils/animated/AnimatedShape.d.ts.map +1 -1
  169. package/package.json +8 -8
  170. package/src/components/MarkerView.tsx +1 -1
  171. package/src/components/ShapeSource.tsx +58 -53
  172. package/src/components/UserLocation.tsx +13 -51
  173. package/src/components/UserLocationPuck.tsx +62 -0
  174. package/src/components/UserLocationPuckHeading.tsx +33 -0
  175. package/src/utils/animated/AbstractAnimatedCoordinates.ts +26 -15
  176. package/src/utils/animated/AnimatedExtractCoordinateFromArray.ts +10 -6
  177. package/src/utils/animated/AnimatedRouteCoordinatesArray.ts +63 -51
  178. package/src/utils/animated/AnimatedShape.ts +22 -13
  179. package/lib/commonjs/components/HeadingIndicator.js.map +0 -1
  180. package/lib/module/components/HeadingIndicator.js.map +0 -1
  181. package/lib/typescript/commonjs/src/components/HeadingIndicator.d.ts +0 -7
  182. package/lib/typescript/commonjs/src/components/HeadingIndicator.d.ts.map +0 -1
  183. package/lib/typescript/module/src/components/HeadingIndicator.d.ts +0 -7
  184. package/lib/typescript/module/src/components/HeadingIndicator.d.ts.map +0 -1
  185. package/src/components/HeadingIndicator.tsx +0 -26
@@ -1,529 +1,524 @@
1
1
  #import "MLRNOfflineModule.h"
2
- #import "MLRNUtils.h"
3
2
  #import "MLRNEvent.h"
4
3
  #import "MLRNEventTypes.h"
4
+ #import "MLRNUtils.h"
5
5
 
6
- @implementation MLRNOfflineModule
7
- {
8
- NSUInteger lastPackState;
9
- double lastPackTimestamp;
10
- double eventThrottle;
11
- BOOL hasListeners;
12
- NSMutableArray<RCTPromiseResolveBlock> *packRequestQueue;
6
+ @implementation MLRNOfflineModule {
7
+ NSUInteger lastPackState;
8
+ double lastPackTimestamp;
9
+ double eventThrottle;
10
+ BOOL hasListeners;
11
+ NSMutableArray<RCTPromiseResolveBlock> *packRequestQueue;
13
12
  }
14
13
 
15
14
  RCT_EXPORT_MODULE()
16
15
 
17
- + (BOOL)requiresMainQueueSetup
18
- {
19
- return YES;
16
+ + (BOOL)requiresMainQueueSetup {
17
+ return YES;
20
18
  }
21
19
 
22
- - (void)startObserving
23
- {
24
- [super startObserving];
25
- hasListeners = YES;
20
+ - (void)startObserving {
21
+ [super startObserving];
22
+ hasListeners = YES;
26
23
  }
27
24
 
28
- - (void)stopObserving
29
- {
30
- [super stopObserving];
31
- hasListeners = NO;
25
+ - (void)stopObserving {
26
+ [super stopObserving];
27
+ hasListeners = NO;
32
28
  }
33
29
 
34
30
  NSString *const RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS = @"MapboxOfflineRegionProgress";
35
31
  NSString *const RCT_MAPBOX_OFFLINE_CALLBACK_ERROR = @"MapboOfflineRegionError";
36
32
 
37
- - (instancetype)init
38
- {
39
- if (self = [super init]) {
40
- packRequestQueue = [NSMutableArray new];
41
- eventThrottle = 300;
42
- lastPackState = -1;
43
-
44
- NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
45
- [defaultCenter addObserver:self selector:@selector(offlinePackProgressDidChange:) name:MLNOfflinePackProgressChangedNotification object:nil];
46
- [defaultCenter addObserver:self selector:@selector(offlinePackDidReceiveError:) name:MLNOfflinePackErrorNotification object:nil];
47
- [defaultCenter addObserver:self selector:@selector(offlinePackDidReceiveMaxAllowedMapboxTiles:) name:MLNOfflinePackMaximumMapboxTilesReachedNotification object:nil];
48
-
49
- [[MLNOfflineStorage sharedOfflineStorage] addObserver:self forKeyPath:@"packs" options:NSKeyValueObservingOptionInitial context:NULL];
50
- }
51
- return self;
52
- }
53
-
54
- - (void)dealloc
55
- {
56
- [[MLNOfflineStorage sharedOfflineStorage] removeObserver:self forKeyPath:@"packs"];
57
- [[NSNotificationCenter defaultCenter] removeObserver:self];
58
- }
59
-
60
- - (NSArray<NSString *> *)supportedEvents
61
- {
62
- return @[RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS, RCT_MAPBOX_OFFLINE_CALLBACK_ERROR];
63
- }
64
-
65
- - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
66
- {
67
- if ([keyPath isEqualToString:@"state"] && [object isKindOfClass:[MLNOfflinePack class]]) {
68
- MLNOfflinePack* pack = (MLNOfflinePack*)object;
69
- [self observerStateForPack:pack context:context];
70
- return;
71
- }
72
-
73
- if (packRequestQueue.count == 0) {
74
- return;
75
- }
76
-
77
- NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
78
- if (packs == nil) {
79
- return;
80
- }
81
-
82
- while (packRequestQueue.count > 0) {
83
- RCTPromiseResolveBlock resolve = [packRequestQueue objectAtIndex:0];
84
- resolve([self _convertPacksToJson:packs]);
85
- [packRequestQueue removeObjectAtIndex:0];
86
- }
87
- }
88
-
89
- RCT_EXPORT_METHOD(createPack:(NSDictionary *)options
90
- resolver:(RCTPromiseResolveBlock)resolve
91
- rejecter:(RCTPromiseRejectBlock)reject)
92
- {
93
- NSString *styleURL = options[@"styleURL"];
94
- MLNCoordinateBounds bounds = [MLRNUtils fromFeatureCollection:options[@"bounds"]];
95
-
96
- id<MLNOfflineRegion> offlineRegion = [[MLNTilePyramidOfflineRegion alloc] initWithStyleURL:[NSURL URLWithString:styleURL]
97
- bounds:bounds
98
- fromZoomLevel:[options[@"minZoom"] doubleValue]
99
- toZoomLevel:[options[@"maxZoom"] doubleValue]];
100
- NSData *context = [self _archiveMetadata:options[@"metadata"]];
101
-
102
- [[MLNOfflineStorage sharedOfflineStorage] addPackForRegion:offlineRegion
103
- withContext:context
104
- completionHandler:^(MLNOfflinePack *pack, NSError *error) {
105
- if (error != nil) {
106
- reject(@"createPack", error.description, error);
107
- return;
108
- }
109
- resolve([self _convertPackToDict:pack]);
110
- [pack resume];
111
- }];
112
- }
113
-
114
- RCT_EXPORT_METHOD(mergeOfflineRegions:(NSString *)path
115
- resolver:(RCTPromiseResolveBlock)resolve
116
- rejecter:(RCTPromiseRejectBlock)reject)
117
- {
118
- NSString *absolutePath;
119
- if ([path isAbsolutePath]) {
120
- absolutePath = path;
121
- } else {
122
- NSBundle *mainBundle = [NSBundle mainBundle];
123
- NSString *fileName = [path stringByDeletingPathExtension];
124
- NSString *extension = [path pathExtension];
125
- absolutePath = [mainBundle pathForResource:fileName ofType:extension];
126
- if (!absolutePath) {
127
- return reject(@"asset_does_not_exist", [NSString stringWithFormat:@"The given assetName, %@, can't be found in the app's bundle.", path], nil);
33
+ - (instancetype)init {
34
+ if (self = [super init]) {
35
+ packRequestQueue = [NSMutableArray new];
36
+ eventThrottle = 300;
37
+ lastPackState = -1;
38
+
39
+ NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
40
+ [defaultCenter addObserver:self
41
+ selector:@selector(offlinePackProgressDidChange:)
42
+ name:MLNOfflinePackProgressChangedNotification
43
+ object:nil];
44
+ [defaultCenter addObserver:self
45
+ selector:@selector(offlinePackDidReceiveError:)
46
+ name:MLNOfflinePackErrorNotification
47
+ object:nil];
48
+ [defaultCenter addObserver:self
49
+ selector:@selector(offlinePackDidReceiveMaxAllowedMapboxTiles:)
50
+ name:MLNOfflinePackMaximumMapboxTilesReachedNotification
51
+ object:nil];
52
+
53
+ [[MLNOfflineStorage sharedOfflineStorage] addObserver:self
54
+ forKeyPath:@"packs"
55
+ options:NSKeyValueObservingOptionInitial
56
+ context:NULL];
57
+ }
58
+ return self;
59
+ }
60
+
61
+ - (void)dealloc {
62
+ [[MLNOfflineStorage sharedOfflineStorage] removeObserver:self forKeyPath:@"packs"];
63
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
64
+ }
65
+
66
+ - (NSArray<NSString *> *)supportedEvents {
67
+ return @[ RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS, RCT_MAPBOX_OFFLINE_CALLBACK_ERROR ];
68
+ }
69
+
70
+ - (void)observeValueForKeyPath:(NSString *)keyPath
71
+ ofObject:(id)object
72
+ change:(NSDictionary<NSKeyValueChangeKey, id> *)change
73
+ context:(void *)context {
74
+ if ([keyPath isEqualToString:@"state"] && [object isKindOfClass:[MLNOfflinePack class]]) {
75
+ MLNOfflinePack *pack = (MLNOfflinePack *)object;
76
+ [self observerStateForPack:pack context:context];
77
+ return;
78
+ }
79
+
80
+ if (packRequestQueue.count == 0) {
81
+ return;
82
+ }
83
+
84
+ NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
85
+ if (packs == nil) {
86
+ return;
87
+ }
88
+
89
+ while (packRequestQueue.count > 0) {
90
+ RCTPromiseResolveBlock resolve = [packRequestQueue objectAtIndex:0];
91
+ resolve([self _convertPacksToJson:packs]);
92
+ [packRequestQueue removeObjectAtIndex:0];
93
+ }
94
+ }
95
+
96
+ RCT_EXPORT_METHOD(createPack : (NSDictionary *)options resolver : (RCTPromiseResolveBlock)
97
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
98
+ NSString *styleURL = options[@"styleURL"];
99
+ MLNCoordinateBounds bounds = [MLRNUtils fromFeatureCollection:options[@"bounds"]];
100
+
101
+ id<MLNOfflineRegion> offlineRegion =
102
+ [[MLNTilePyramidOfflineRegion alloc] initWithStyleURL:[NSURL URLWithString:styleURL]
103
+ bounds:bounds
104
+ fromZoomLevel:[options[@"minZoom"] doubleValue]
105
+ toZoomLevel:[options[@"maxZoom"] doubleValue]];
106
+ NSData *context = [self _archiveMetadata:options[@"metadata"]];
107
+
108
+ [[MLNOfflineStorage sharedOfflineStorage]
109
+ addPackForRegion:offlineRegion
110
+ withContext:context
111
+ completionHandler:^(MLNOfflinePack *pack, NSError *error) {
112
+ if (error != nil) {
113
+ reject(@"createPack", error.description, error);
114
+ return;
128
115
  }
129
- }
130
-
131
- [[MLNOfflineStorage sharedOfflineStorage] addContentsOfFile:absolutePath withCompletionHandler:^(NSURL *fileURL, NSArray<MLNOfflinePack *> *packs, NSError *error) {
116
+ resolve([self _convertPackToDict:pack]);
117
+ [pack resume];
118
+ }];
119
+ }
120
+
121
+ RCT_EXPORT_METHOD(mergeOfflineRegions : (NSString *)path resolver : (RCTPromiseResolveBlock)
122
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
123
+ NSString *absolutePath;
124
+ if ([path isAbsolutePath]) {
125
+ absolutePath = path;
126
+ } else {
127
+ NSBundle *mainBundle = [NSBundle mainBundle];
128
+ NSString *fileName = [path stringByDeletingPathExtension];
129
+ NSString *extension = [path pathExtension];
130
+ absolutePath = [mainBundle pathForResource:fileName ofType:extension];
131
+ if (!absolutePath) {
132
+ return reject(
133
+ @"asset_does_not_exist",
134
+ [NSString
135
+ stringWithFormat:@"The given assetName, %@, can't be found in the app's bundle.",
136
+ path],
137
+ nil);
138
+ }
139
+ }
140
+
141
+ [[MLNOfflineStorage sharedOfflineStorage]
142
+ addContentsOfFile:absolutePath
143
+ withCompletionHandler:^(NSURL *fileURL, NSArray<MLNOfflinePack *> *packs, NSError *error) {
132
144
  if (error != nil) {
133
- reject(@"mergeOfflineRegions", error.description, error);
134
- return;
145
+ reject(@"mergeOfflineRegions", error.description, error);
146
+ return;
135
147
  }
136
148
  resolve(nil);
137
- }];
149
+ }];
138
150
  }
139
151
 
140
- RCT_EXPORT_METHOD(getPacks:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
141
- {
142
- dispatch_async(dispatch_get_main_queue(), ^{
143
- NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
144
-
145
- if (packs == nil) {
146
- // packs have not loaded yet
147
- [self->packRequestQueue addObject:resolve];
148
- return;
149
- }
150
-
151
- resolve([self _convertPacksToJson:packs]);
152
- });
153
- }
152
+ RCT_EXPORT_METHOD(getPacks : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)
153
+ reject) {
154
+ dispatch_async(dispatch_get_main_queue(), ^{
155
+ NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
154
156
 
155
- RCT_EXPORT_METHOD(invalidateAmbientCache:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
156
- {
157
- [[MLNOfflineStorage sharedOfflineStorage] invalidateAmbientCacheWithCompletionHandler:^(NSError *error) {
158
- if (error != nil) {
159
- reject(@"invalidateAmbientCache", error.description, error);
160
- return;
161
- }
162
- resolve(nil);
163
- }];
164
- }
157
+ if (packs == nil) {
158
+ // packs have not loaded yet
159
+ [self->packRequestQueue addObject:resolve];
160
+ return;
161
+ }
165
162
 
166
- RCT_EXPORT_METHOD(clearAmbientCache:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
167
- {
168
- [[MLNOfflineStorage sharedOfflineStorage] clearAmbientCacheWithCompletionHandler:^(NSError *error) {
169
- if (error != nil) {
170
- reject(@"clearAmbientCache", error.description, error);
171
- return;
172
- }
173
- resolve(nil);
174
- }];
163
+ resolve([self _convertPacksToJson:packs]);
164
+ });
175
165
  }
176
166
 
177
- RCT_EXPORT_METHOD(setMaximumAmbientCacheSize:(NSUInteger)cacheSize
178
- resolver:(RCTPromiseResolveBlock)resolve
179
- rejecter:(RCTPromiseRejectBlock)reject)
180
- {
181
- [[MLNOfflineStorage sharedOfflineStorage] setMaximumAmbientCacheSize:cacheSize withCompletionHandler:^(NSError *error) {
167
+ RCT_EXPORT_METHOD(invalidateAmbientCache : (RCTPromiseResolveBlock)
168
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
169
+ [[MLNOfflineStorage sharedOfflineStorage]
170
+ invalidateAmbientCacheWithCompletionHandler:^(NSError *error) {
182
171
  if (error != nil) {
183
- reject(@"setMaximumAmbientCacheSize", error.description, error);
184
- return;
172
+ reject(@"invalidateAmbientCache", error.description, error);
173
+ return;
185
174
  }
186
175
  resolve(nil);
187
- }];
188
-
176
+ }];
189
177
  }
190
178
 
191
- RCT_EXPORT_METHOD(resetDatabase:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
192
- {
193
- [[MLNOfflineStorage sharedOfflineStorage] resetDatabaseWithCompletionHandler:^(NSError *error) {
179
+ RCT_EXPORT_METHOD(clearAmbientCache : (RCTPromiseResolveBlock)
180
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
181
+ [[MLNOfflineStorage sharedOfflineStorage]
182
+ clearAmbientCacheWithCompletionHandler:^(NSError *error) {
194
183
  if (error != nil) {
195
- reject(@"resetDatabase", error.description, error);
196
- return;
184
+ reject(@"clearAmbientCache", error.description, error);
185
+ return;
197
186
  }
198
187
  resolve(nil);
199
- }];
200
-
201
- }
202
-
203
- RCT_EXPORT_METHOD(getPackStatus:(NSString *)name
204
- resolver:(RCTPromiseResolveBlock)resolve
205
- rejecter:(RCTPromiseRejectBlock)reject)
206
- {
207
- MLNOfflinePack *pack = [self _getPackFromName:name];
208
-
209
- if (pack == nil) {
210
- resolve(nil);
211
- NSLog(@"getPackStatus - Unknown offline region");
212
- return;
213
- }
214
-
215
- if (pack.state == MLNOfflinePackStateUnknown) {
216
- [pack addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:(__bridge_retained void*)resolve];
217
- [pack requestProgress];
218
- } else {
219
- resolve([self _makeRegionStatusPayload:name pack:pack]);
220
- }
188
+ }];
221
189
  }
222
190
 
223
- -(void)observerStateForPack:(MLNOfflinePack*)pack context:(nullable void*) context {
224
- RCTPromiseResolveBlock resolve = (__bridge_transfer RCTPromiseResolveBlock)context;
225
- dispatch_async(dispatch_get_main_queue(), ^{
226
- NSDictionary* metadata = [self _unarchiveMetadata:pack];
227
- NSString* name = metadata[@"name"];
228
- resolve([self _makeRegionStatusPayload:name pack:pack]);
229
- });
230
- [pack removeObserver:self forKeyPath:@"state" context:context];
191
+ RCT_EXPORT_METHOD(setMaximumAmbientCacheSize : (NSUInteger)cacheSize resolver : (
192
+ RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) {
193
+ [[MLNOfflineStorage sharedOfflineStorage]
194
+ setMaximumAmbientCacheSize:cacheSize
195
+ withCompletionHandler:^(NSError *error) {
196
+ if (error != nil) {
197
+ reject(@"setMaximumAmbientCacheSize", error.description, error);
198
+ return;
199
+ }
200
+ resolve(nil);
201
+ }];
231
202
  }
232
203
 
233
- RCT_EXPORT_METHOD(invalidatePack:(NSString *)name
234
- resolver:(RCTPromiseResolveBlock)resolve
235
- rejecter:(RCTPromiseRejectBlock)reject)
236
- {
237
- MLNOfflinePack *pack = [self _getPackFromName:name];
238
-
239
- if (pack == nil) {
240
- resolve(nil);
241
- return;
204
+ RCT_EXPORT_METHOD(resetDatabase : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)
205
+ reject) {
206
+ [[MLNOfflineStorage sharedOfflineStorage] resetDatabaseWithCompletionHandler:^(NSError *error) {
207
+ if (error != nil) {
208
+ reject(@"resetDatabase", error.description, error);
209
+ return;
242
210
  }
243
- [[MLNOfflineStorage sharedOfflineStorage] invalidatePack:pack withCompletionHandler:^(NSError *error) {
244
- if (error != nil) {
245
- reject(@"invalidatePack", error.description, error);
246
- return;
247
- }
248
- resolve(nil);
249
- }];
211
+ resolve(nil);
212
+ }];
250
213
  }
251
214
 
252
- RCT_EXPORT_METHOD(deletePack:(NSString *)name
253
- resolver:(RCTPromiseResolveBlock)resolve
254
- rejecter:(RCTPromiseRejectBlock)reject)
255
- {
256
- MLNOfflinePack *pack = [self _getPackFromName:name];
215
+ RCT_EXPORT_METHOD(getPackStatus : (NSString *)name resolver : (RCTPromiseResolveBlock)
216
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
217
+ MLNOfflinePack *pack = [self _getPackFromName:name];
257
218
 
258
- if (pack == nil) {
259
- resolve(nil);
260
- return;
261
- }
262
- if (pack.state == MLNOfflinePackStateInvalid) {
263
- NSError *error = [NSError errorWithDomain:MLNErrorDomain code:1 userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"Pack has already been deleted", nil)}];
264
- reject(@"deletePack", error.description, error);
265
- return;
266
- }
267
- [[MLNOfflineStorage sharedOfflineStorage] removePack:pack withCompletionHandler:^(NSError *error) {
268
- if (error != nil) {
269
- reject(@"deletePack", error.description, error);
270
- return;
271
- }
272
- resolve(nil);
273
- }];
219
+ if (pack == nil) {
220
+ resolve(nil);
221
+ NSLog(@"getPackStatus - Unknown offline region");
222
+ return;
223
+ }
224
+
225
+ if (pack.state == MLNOfflinePackStateUnknown) {
226
+ [pack addObserver:self
227
+ forKeyPath:@"state"
228
+ options:NSKeyValueObservingOptionNew
229
+ context:(__bridge_retained void *)resolve];
230
+ [pack requestProgress];
231
+ } else {
232
+ resolve([self _makeRegionStatusPayload:name pack:pack]);
233
+ }
234
+ }
235
+
236
+ - (void)observerStateForPack:(MLNOfflinePack *)pack context:(nullable void *)context {
237
+ RCTPromiseResolveBlock resolve = (__bridge_transfer RCTPromiseResolveBlock)context;
238
+ dispatch_async(dispatch_get_main_queue(), ^{
239
+ NSDictionary *metadata = [self _unarchiveMetadata:pack];
240
+ NSString *name = metadata[@"name"];
241
+ resolve([self _makeRegionStatusPayload:name pack:pack]);
242
+ });
243
+ [pack removeObserver:self forKeyPath:@"state" context:context];
274
244
  }
275
245
 
276
- RCT_EXPORT_METHOD(pausePackDownload:(NSString *)name
277
- resolver:(RCTPromiseResolveBlock)resolve
278
- rejecter:(RCTPromiseRejectBlock)reject)
279
- {
280
- MLNOfflinePack *pack = [self _getPackFromName:name];
246
+ RCT_EXPORT_METHOD(invalidatePack : (NSString *)name resolver : (RCTPromiseResolveBlock)
247
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
248
+ MLNOfflinePack *pack = [self _getPackFromName:name];
281
249
 
282
- if (pack == nil) {
283
- reject(@"pausePackDownload", @"Unknown offline region", nil);
284
- return;
285
- }
286
-
287
- if (pack.state == MLNOfflinePackStateInactive || pack.state == MLNOfflinePackStateComplete) {
288
- resolve(nil);
289
- return;
290
- }
291
-
292
- [pack suspend];
250
+ if (pack == nil) {
293
251
  resolve(nil);
294
- }
252
+ return;
253
+ }
254
+ [[MLNOfflineStorage sharedOfflineStorage] invalidatePack:pack
255
+ withCompletionHandler:^(NSError *error) {
256
+ if (error != nil) {
257
+ reject(@"invalidatePack", error.description, error);
258
+ return;
259
+ }
260
+ resolve(nil);
261
+ }];
262
+ }
263
+
264
+ RCT_EXPORT_METHOD(deletePack : (NSString *)name resolver : (RCTPromiseResolveBlock)
265
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
266
+ MLNOfflinePack *pack = [self _getPackFromName:name];
267
+
268
+ if (pack == nil) {
269
+ resolve(nil);
270
+ return;
271
+ }
272
+ if (pack.state == MLNOfflinePackStateInvalid) {
273
+ NSError *error = [NSError errorWithDomain:MLNErrorDomain
274
+ code:1
275
+ userInfo:@{
276
+ NSLocalizedDescriptionKey :
277
+ NSLocalizedString(@"Pack has already been deleted", nil)
278
+ }];
279
+ reject(@"deletePack", error.description, error);
280
+ return;
281
+ }
282
+ [[MLNOfflineStorage sharedOfflineStorage] removePack:pack
283
+ withCompletionHandler:^(NSError *error) {
284
+ if (error != nil) {
285
+ reject(@"deletePack", error.description, error);
286
+ return;
287
+ }
288
+ resolve(nil);
289
+ }];
290
+ }
291
+
292
+ RCT_EXPORT_METHOD(pausePackDownload : (NSString *)name resolver : (RCTPromiseResolveBlock)
293
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
294
+ MLNOfflinePack *pack = [self _getPackFromName:name];
295
+
296
+ if (pack == nil) {
297
+ reject(@"pausePackDownload", @"Unknown offline region", nil);
298
+ return;
299
+ }
300
+
301
+ if (pack.state == MLNOfflinePackStateInactive || pack.state == MLNOfflinePackStateComplete) {
302
+ resolve(nil);
303
+ return;
304
+ }
295
305
 
296
- RCT_EXPORT_METHOD(resumePackDownload:(NSString *)name
297
- resolver:(RCTPromiseResolveBlock)resolve
298
- rejecter:(RCTPromiseRejectBlock)reject)
299
- {
300
- MLNOfflinePack *pack = [self _getPackFromName:name];
306
+ [pack suspend];
307
+ resolve(nil);
308
+ }
301
309
 
302
- if (pack == nil) {
303
- reject(@"resumePack", @"Unknown offline region", nil);
304
- return;
305
- }
310
+ RCT_EXPORT_METHOD(resumePackDownload : (NSString *)name resolver : (RCTPromiseResolveBlock)
311
+ resolve rejecter : (RCTPromiseRejectBlock)reject) {
312
+ MLNOfflinePack *pack = [self _getPackFromName:name];
306
313
 
307
- if (pack.state == MLNOfflinePackStateActive || pack.state == MLNOfflinePackStateComplete) {
308
- resolve(nil);
309
- return;
310
- }
314
+ if (pack == nil) {
315
+ reject(@"resumePack", @"Unknown offline region", nil);
316
+ return;
317
+ }
311
318
 
312
- [pack resume];
319
+ if (pack.state == MLNOfflinePackStateActive || pack.state == MLNOfflinePackStateComplete) {
313
320
  resolve(nil);
314
- }
321
+ return;
322
+ }
315
323
 
316
- RCT_EXPORT_METHOD(setTileCountLimit:(nonnull NSNumber *)limit)
317
- {
318
- [[MLNOfflineStorage sharedOfflineStorage] setMaximumAllowedMapboxTiles:[limit intValue]];
324
+ [pack resume];
325
+ resolve(nil);
319
326
  }
320
327
 
321
- RCT_EXPORT_METHOD(setProgressEventThrottle:(nonnull NSNumber *)throttleValue)
322
- {
323
- eventThrottle = [throttleValue doubleValue];
328
+ RCT_EXPORT_METHOD(setTileCountLimit : (nonnull NSNumber *)limit) {
329
+ [[MLNOfflineStorage sharedOfflineStorage] setMaximumAllowedMapboxTiles:[limit intValue]];
324
330
  }
325
331
 
326
- - (void)offlinePackProgressDidChange:(NSNotification *)notification
327
- {
328
- MLNOfflinePack *pack = notification.object;
332
+ RCT_EXPORT_METHOD(setProgressEventThrottle : (nonnull NSNumber *)throttleValue) {
333
+ eventThrottle = [throttleValue doubleValue];
334
+ }
329
335
 
330
- if (pack.state == MLNOfflinePackStateInvalid) {
331
- return; // Avoid invalid offline pack exception
332
- }
336
+ - (void)offlinePackProgressDidChange:(NSNotification *)notification {
337
+ MLNOfflinePack *pack = notification.object;
333
338
 
334
- if ([self _shouldSendProgressEvent:[self _getCurrentTimestamp] pack:pack]) {
335
- NSDictionary *metadata = [self _unarchiveMetadata:pack];
336
- MLRNEvent *event = [self _makeProgressEvent:metadata[@"name"] pack:pack];
337
- [self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS event:event];
338
- lastPackTimestamp = [self _getCurrentTimestamp];
339
- }
339
+ if (pack.state == MLNOfflinePackStateInvalid) {
340
+ return; // Avoid invalid offline pack exception
341
+ }
340
342
 
341
- lastPackState = pack.state;
343
+ if ([self _shouldSendProgressEvent:[self _getCurrentTimestamp] pack:pack]) {
344
+ NSDictionary *metadata = [self _unarchiveMetadata:pack];
345
+ MLRNEvent *event = [self _makeProgressEvent:metadata[@"name"] pack:pack];
346
+ [self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_PROGRESS event:event];
347
+ lastPackTimestamp = [self _getCurrentTimestamp];
348
+ }
349
+
350
+ lastPackState = pack.state;
342
351
  }
343
352
 
344
- - (void)offlinePackDidReceiveError:(NSNotification *)notification
345
- {
346
- MLNOfflinePack *pack = notification.object;
347
- if (pack.state == MLNOfflinePackStateInvalid) {
348
- return; // Avoid invalid offline pack exception
349
- }
350
- NSDictionary *metadata = [self _unarchiveMetadata:pack];
353
+ - (void)offlinePackDidReceiveError:(NSNotification *)notification {
354
+ MLNOfflinePack *pack = notification.object;
355
+ if (pack.state == MLNOfflinePackStateInvalid) {
356
+ return; // Avoid invalid offline pack exception
357
+ }
358
+ NSDictionary *metadata = [self _unarchiveMetadata:pack];
351
359
 
352
- NSString *name = metadata[@"name"];
353
- if (name != nil) {
354
- NSError *error = notification.userInfo[MLNOfflinePackUserInfoKeyError];
355
- MLRNEvent *event = [self _makeErrorEvent:name
356
- type:RCT_MAPBOX_OFFLINE_ERROR
357
- message:error.description];
358
- [self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_ERROR event:event];
359
- }
360
+ NSString *name = metadata[@"name"];
361
+ if (name != nil) {
362
+ NSError *error = notification.userInfo[MLNOfflinePackUserInfoKeyError];
363
+ MLRNEvent *event = [self _makeErrorEvent:name
364
+ type:RCT_MAPBOX_OFFLINE_ERROR
365
+ message:error.description];
366
+ [self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_ERROR event:event];
367
+ }
360
368
  }
361
369
 
362
- - (void)offlinePackDidReceiveMaxAllowedMapboxTiles:(NSNotification *)notification
363
- {
364
- MLNOfflinePack *pack = notification.object;
365
- NSDictionary *metadata = [self _unarchiveMetadata:pack];
370
+ - (void)offlinePackDidReceiveMaxAllowedMapboxTiles:(NSNotification *)notification {
371
+ MLNOfflinePack *pack = notification.object;
372
+ NSDictionary *metadata = [self _unarchiveMetadata:pack];
366
373
 
367
- NSString *name = metadata[@"name"];
368
- if (name != nil) {
369
- MLRNEvent *event = [self _makeErrorEvent:name
370
- type:RCT_MAPBOX_OFFLINE_ERROR
371
- message:@"Mapbox tile limit exceeded"];
372
- [self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_ERROR event:event];
373
- }
374
+ NSString *name = metadata[@"name"];
375
+ if (name != nil) {
376
+ MLRNEvent *event = [self _makeErrorEvent:name
377
+ type:RCT_MAPBOX_OFFLINE_ERROR
378
+ message:@"Mapbox tile limit exceeded"];
379
+ [self _sendEvent:RCT_MAPBOX_OFFLINE_CALLBACK_ERROR event:event];
380
+ }
374
381
  }
375
382
 
376
- - (double)_getCurrentTimestamp
377
- {
378
- return CACurrentMediaTime() * 1000;
383
+ - (double)_getCurrentTimestamp {
384
+ return CACurrentMediaTime() * 1000;
379
385
  }
380
386
 
381
- - (NSData *)_archiveMetadata:(NSString *)metadata
382
- {
383
- return [NSKeyedArchiver archivedDataWithRootObject:metadata];
387
+ - (NSData *)_archiveMetadata:(NSString *)metadata {
388
+ return [NSKeyedArchiver archivedDataWithRootObject:metadata];
384
389
  }
385
390
 
386
- - (NSDictionary *)_unarchiveMetadata:(MLNOfflinePack *)pack
387
- {
388
- id data = [NSKeyedUnarchiver unarchiveObjectWithData:pack.context];
389
- // Version v5 store data as NSDictionary while v6 store data as JSON string.
390
- // User might save offline pack in v5 and then try to read in v6.
391
- // In v5 are metadata stored nested which need to be handled in JS.
392
- // Example of how data are stored in v5
393
- // {
394
- // name: "New York",
395
- // metadata: {
396
- // customMeta: "...",
397
- // }
398
- // }
399
- if ([data isKindOfClass:[NSDictionary class]]) {
400
- return data;
401
- }
391
+ - (NSDictionary *)_unarchiveMetadata:(MLNOfflinePack *)pack {
392
+ id data = [NSKeyedUnarchiver unarchiveObjectWithData:pack.context];
393
+ // Version v5 store data as NSDictionary while v6 store data as JSON string.
394
+ // User might save offline pack in v5 and then try to read in v6.
395
+ // In v5 are metadata stored nested which need to be handled in JS.
396
+ // Example of how data are stored in v5
397
+ // {
398
+ // name: "New York",
399
+ // metadata: {
400
+ // customMeta: "...",
401
+ // }
402
+ // }
403
+ if ([data isKindOfClass:[NSDictionary class]]) {
404
+ return data;
405
+ }
402
406
 
403
- if (data == nil) {
404
- return @{};
405
- }
407
+ if (data == nil) {
408
+ return @{};
409
+ }
406
410
 
407
- return [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding]
408
- options:NSJSONReadingMutableContainers
409
- error:nil];
411
+ return [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding]
412
+ options:NSJSONReadingMutableContainers
413
+ error:nil];
410
414
  }
411
415
 
412
- - (NSDictionary *)_makeRegionStatusPayload:(NSString *)name pack:(MLNOfflinePack *)pack
413
- {
414
- uint64_t completedResources = pack.progress.countOfResourcesCompleted;
415
- uint64_t expectedResources = pack.progress.countOfResourcesExpected;
416
- float progressPercentage = (float)completedResources / expectedResources;
416
+ - (NSDictionary *)_makeRegionStatusPayload:(NSString *)name pack:(MLNOfflinePack *)pack {
417
+ uint64_t completedResources = pack.progress.countOfResourcesCompleted;
418
+ uint64_t expectedResources = pack.progress.countOfResourcesExpected;
419
+ float progressPercentage = (float)completedResources / expectedResources;
417
420
 
418
- // prevent NaN errors when expectedResources is 0
419
- if(expectedResources == 0) {
420
- progressPercentage = 0;
421
- }
421
+ // prevent NaN errors when expectedResources is 0
422
+ if (expectedResources == 0) {
423
+ progressPercentage = 0;
424
+ }
422
425
 
423
- return @{
424
- @"state": @(pack.state),
425
- @"name": name,
426
- @"percentage": @(ceilf(progressPercentage * 100.0)),
427
- @"completedResourceCount": @(pack.progress.countOfResourcesCompleted),
428
- @"completedResourceSize": @(pack.progress.countOfBytesCompleted),
429
- @"completedTileSize": @(pack.progress.countOfTileBytesCompleted),
430
- @"completedTileCount": @(pack.progress.countOfTilesCompleted),
431
- @"requiredResourceCount": @(pack.progress.maximumResourcesExpected)
432
- };
426
+ return @{
427
+ @"state" : @(pack.state),
428
+ @"name" : name,
429
+ @"percentage" : @(ceilf(progressPercentage * 100.0)),
430
+ @"completedResourceCount" : @(pack.progress.countOfResourcesCompleted),
431
+ @"completedResourceSize" : @(pack.progress.countOfBytesCompleted),
432
+ @"completedTileSize" : @(pack.progress.countOfTileBytesCompleted),
433
+ @"completedTileCount" : @(pack.progress.countOfTilesCompleted),
434
+ @"requiredResourceCount" : @(pack.progress.maximumResourcesExpected)
435
+ };
433
436
  }
434
437
 
435
- - (MLRNEvent *)_makeProgressEvent:(NSString *)name pack:(MLNOfflinePack *)pack
436
- {
437
- return [MLRNEvent makeEvent:RCT_MAPBOX_OFFLINE_PROGRESS withPayload:[self _makeRegionStatusPayload:name pack:pack]];
438
+ - (MLRNEvent *)_makeProgressEvent:(NSString *)name pack:(MLNOfflinePack *)pack {
439
+ return [MLRNEvent makeEvent:RCT_MAPBOX_OFFLINE_PROGRESS
440
+ withPayload:[self _makeRegionStatusPayload:name pack:pack]];
438
441
  }
439
442
 
440
- - (MLRNEvent *)_makeErrorEvent:(NSString *)name type:(NSString *)type message:(NSString *)message
441
- {
442
- NSDictionary *payload = @{ @"name": name, @"message": message };
443
- return [MLRNEvent makeEvent:type withPayload:payload];
443
+ - (MLRNEvent *)_makeErrorEvent:(NSString *)name type:(NSString *)type message:(NSString *)message {
444
+ NSDictionary *payload = @{@"name" : name, @"message" : message};
445
+ return [MLRNEvent makeEvent:type withPayload:payload];
444
446
  }
445
447
 
446
- - (NSArray<NSDictionary *> *)_convertPacksToJson:(NSArray<MLNOfflinePack *> *)packs
447
- {
448
- NSMutableArray<NSDictionary *> *jsonPacks = [NSMutableArray new];
448
+ - (NSArray<NSDictionary *> *)_convertPacksToJson:(NSArray<MLNOfflinePack *> *)packs {
449
+ NSMutableArray<NSDictionary *> *jsonPacks = [NSMutableArray new];
449
450
 
450
- if (packs == nil) {
451
- return jsonPacks;
452
- }
451
+ if (packs == nil) {
452
+ return jsonPacks;
453
+ }
453
454
 
454
- for (MLNOfflinePack *pack in packs) {
455
- [jsonPacks addObject:[self _convertPackToDict:pack]];
456
- }
455
+ for (MLNOfflinePack *pack in packs) {
456
+ [jsonPacks addObject:[self _convertPackToDict:pack]];
457
+ }
457
458
 
458
- return jsonPacks;
459
+ return jsonPacks;
459
460
  }
460
461
 
461
- - (NSDictionary *)_convertPackToDict:(MLNOfflinePack *)pack
462
- {
463
- // format bounds
464
- MLNTilePyramidOfflineRegion *region = (MLNTilePyramidOfflineRegion *)pack.region;
465
- if (region == nil) {
466
- return nil;
467
- }
462
+ - (NSDictionary *)_convertPackToDict:(MLNOfflinePack *)pack {
463
+ // format bounds
464
+ MLNTilePyramidOfflineRegion *region = (MLNTilePyramidOfflineRegion *)pack.region;
465
+ if (region == nil) {
466
+ return nil;
467
+ }
468
468
 
469
- NSArray *jsonBounds = @[
470
- @[@(region.bounds.ne.longitude), @(region.bounds.ne.latitude)],
471
- @[@(region.bounds.sw.longitude), @(region.bounds.sw.latitude)]
472
- ];
469
+ NSArray *jsonBounds = @[
470
+ @[ @(region.bounds.ne.longitude), @(region.bounds.ne.latitude) ],
471
+ @[ @(region.bounds.sw.longitude), @(region.bounds.sw.latitude) ]
472
+ ];
473
473
 
474
- // format metadata
475
- NSDictionary *metadata = [self _unarchiveMetadata:pack];
476
- NSData *jsonMetadata = [NSJSONSerialization dataWithJSONObject:metadata
477
- options:0
478
- error:nil];
479
- return @{
480
- @"metadata": [[NSString alloc] initWithData:jsonMetadata encoding:NSUTF8StringEncoding],
481
- @"bounds": jsonBounds
482
- };
474
+ // format metadata
475
+ NSDictionary *metadata = [self _unarchiveMetadata:pack];
476
+ NSData *jsonMetadata = [NSJSONSerialization dataWithJSONObject:metadata options:0 error:nil];
477
+ return @{
478
+ @"metadata" : [[NSString alloc] initWithData:jsonMetadata encoding:NSUTF8StringEncoding],
479
+ @"bounds" : jsonBounds
480
+ };
483
481
  }
484
482
 
485
- - (MLNOfflinePack *)_getPackFromName:(NSString *)name
486
- {
487
- NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
483
+ - (MLNOfflinePack *)_getPackFromName:(NSString *)name {
484
+ NSArray<MLNOfflinePack *> *packs = [[MLNOfflineStorage sharedOfflineStorage] packs];
488
485
 
489
- if (packs == nil) {
490
- return nil;
491
- }
486
+ if (packs == nil) {
487
+ return nil;
488
+ }
492
489
 
493
- for (MLNOfflinePack *pack in packs) {
494
- NSDictionary *metadata = [self _unarchiveMetadata:pack];
490
+ for (MLNOfflinePack *pack in packs) {
491
+ NSDictionary *metadata = [self _unarchiveMetadata:pack];
495
492
 
496
- if ([name isEqualToString:metadata[@"name"]]) {
497
- return pack;
498
- }
493
+ if ([name isEqualToString:metadata[@"name"]]) {
494
+ return pack;
499
495
  }
496
+ }
500
497
 
501
- return nil;
498
+ return nil;
502
499
  }
503
500
 
504
- - (void)_sendEvent:(NSString *)eventName event:(MLRNEvent *)event
505
- {
506
- if (!hasListeners) {
507
- return;
508
- }
509
- [self sendEventWithName:eventName body:[event toJSON]];
501
+ - (void)_sendEvent:(NSString *)eventName event:(MLRNEvent *)event {
502
+ if (!hasListeners) {
503
+ return;
504
+ }
505
+ [self sendEventWithName:eventName body:[event toJSON]];
510
506
  }
511
507
 
512
- - (BOOL)_shouldSendProgressEvent:(double)currentTimestamp pack:(MLNOfflinePack *)currentPack
513
- {
514
- if (lastPackState == -1) {
515
- return YES;
516
- }
508
+ - (BOOL)_shouldSendProgressEvent:(double)currentTimestamp pack:(MLNOfflinePack *)currentPack {
509
+ if (lastPackState == -1) {
510
+ return YES;
511
+ }
517
512
 
518
- if (lastPackState != currentPack.state) {
519
- return YES;
520
- }
513
+ if (lastPackState != currentPack.state) {
514
+ return YES;
515
+ }
521
516
 
522
- if (currentTimestamp - lastPackTimestamp > eventThrottle) {
523
- return YES;
524
- }
517
+ if (currentTimestamp - lastPackTimestamp > eventThrottle) {
518
+ return YES;
519
+ }
525
520
 
526
- return NO;
521
+ return NO;
527
522
  }
528
523
 
529
524
  @end