react-native-nitro-geolocation 1.2.6 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +61 -272
  2. package/android/build.gradle +1 -0
  3. package/android/src/main/AndroidManifest.xml +39 -0
  4. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidFusedLocationProvider.kt +310 -0
  5. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidFusedRequestFactory.kt +31 -0
  6. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidGeolocationConversions.kt +71 -0
  7. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidGeolocationErrors.kt +85 -0
  8. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidGeolocationOptions.kt +92 -0
  9. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidLocationSettings.kt +3 -0
  10. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/AndroidProviderRoute.kt +74 -0
  11. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroBackgroundLocation.kt +132 -0
  12. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/NitroGeolocation.kt +219 -476
  13. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/AndroidBackgroundHttpSync.kt +134 -0
  14. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/AndroidBackgroundPermissions.kt +196 -0
  15. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/AndroidBackgroundSerialization.kt +266 -0
  16. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroActivityRecognitionReceiver.kt +13 -0
  17. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundEventHub.kt +65 -0
  18. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundHeadlessTaskService.kt +58 -0
  19. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundLocationController.kt +711 -0
  20. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundLocationService.kt +48 -0
  21. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundNotificationFactory.kt +37 -0
  22. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBackgroundStore.kt +655 -0
  23. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroBootReceiver.kt +26 -0
  24. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroGeofenceReceiver.kt +14 -0
  25. package/android/src/main/java/com/margelo/nitro/nitrogeolocation/background/NitroLocationUpdateReceiver.kt +37 -0
  26. package/android/src/test/java/com/margelo/nitro/nitrogeolocation/AndroidFusedLocationProviderTest.kt +64 -0
  27. package/android/src/test/java/com/margelo/nitro/nitrogeolocation/AndroidProviderRouteTest.kt +116 -0
  28. package/ios/IOSBackgroundHttpSync.swift +126 -0
  29. package/ios/IOSBackgroundLocationDelegate.swift +36 -0
  30. package/ios/IOSBackgroundMotion.swift +55 -0
  31. package/ios/IOSBackgroundSerialization.swift +539 -0
  32. package/ios/IOSGeolocationConversions.swift +131 -0
  33. package/ios/IOSGeolocationDelegate.swift +31 -0
  34. package/ios/IOSGeolocationErrors.swift +39 -0
  35. package/ios/IOSGeolocationOptions.swift +135 -0
  36. package/ios/NitroBackgroundLocation.swift +849 -0
  37. package/ios/NitroGeolocation.swift +14 -347
  38. package/nitrogen/generated/android/c++/JActivityRecognitionOptions.hpp +69 -0
  39. package/nitrogen/generated/android/c++/JAndroidBackgroundLocationOptions.hpp +74 -0
  40. package/nitrogen/generated/android/c++/JAndroidBackgroundLocationStatus.hpp +67 -0
  41. package/nitrogen/generated/android/c++/JAndroidBackgroundProvider.hpp +61 -0
  42. package/nitrogen/generated/android/c++/JAndroidForegroundServiceOptions.hpp +90 -0
  43. package/nitrogen/generated/android/c++/JBackgroundEventEnvelope.hpp +129 -0
  44. package/nitrogen/generated/android/c++/JBackgroundEventType.hpp +70 -0
  45. package/nitrogen/generated/android/c++/JBackgroundHttpMethod.hpp +61 -0
  46. package/nitrogen/generated/android/c++/JBackgroundHttpSyncOptions.hpp +131 -0
  47. package/nitrogen/generated/android/c++/JBackgroundHttpSyncResult.hpp +111 -0
  48. package/nitrogen/generated/android/c++/JBackgroundLocation.hpp +110 -0
  49. package/nitrogen/generated/android/c++/JBackgroundLocationOptions.hpp +162 -0
  50. package/nitrogen/generated/android/c++/JBackgroundLocationSource.hpp +73 -0
  51. package/nitrogen/generated/android/c++/JBackgroundLocationState.hpp +70 -0
  52. package/nitrogen/generated/android/c++/JBackgroundLocationStatus.hpp +126 -0
  53. package/nitrogen/generated/android/c++/JBackgroundPermissionResult.hpp +79 -0
  54. package/nitrogen/generated/android/c++/JBackgroundPermissionStatus.hpp +64 -0
  55. package/nitrogen/generated/android/c++/JBackgroundTrackingMode.hpp +61 -0
  56. package/nitrogen/generated/android/c++/JBatterySnapshot.hpp +61 -0
  57. package/nitrogen/generated/android/c++/JDetectedActivity.hpp +66 -0
  58. package/nitrogen/generated/android/c++/JDetectedActivityType.hpp +76 -0
  59. package/nitrogen/generated/android/c++/JFunc_void_BackgroundEventEnvelope.hpp +114 -0
  60. package/nitrogen/generated/android/c++/JFunc_void_BackgroundLocation.hpp +95 -0
  61. package/nitrogen/generated/android/c++/JGeofenceEvent.hpp +94 -0
  62. package/nitrogen/generated/android/c++/JGeofenceRegion.hpp +112 -0
  63. package/nitrogen/generated/android/c++/JGeofenceTransition.hpp +61 -0
  64. package/nitrogen/generated/android/c++/JGeofencingOptions.hpp +82 -0
  65. package/nitrogen/generated/android/c++/JGetStoredBackgroundEventsOptions.hpp +90 -0
  66. package/nitrogen/generated/android/c++/JGetStoredBackgroundLocationsOptions.hpp +69 -0
  67. package/nitrogen/generated/android/c++/JHybridNitroBackgroundLocationSpec.cpp +662 -0
  68. package/nitrogen/generated/android/c++/JHybridNitroBackgroundLocationSpec.hpp +89 -0
  69. package/nitrogen/generated/android/c++/JIOSBackgroundActivityType.hpp +67 -0
  70. package/nitrogen/generated/android/c++/JIOSBackgroundLocationOptions.hpp +79 -0
  71. package/nitrogen/generated/android/c++/JIOSBackgroundLocationStatus.hpp +61 -0
  72. package/nitrogen/generated/android/c++/JLocationProviderStatus.hpp +5 -1
  73. package/nitrogen/generated/android/c++/JStoredBackgroundEventEnvelope.hpp +115 -0
  74. package/nitrogen/generated/android/c++/JStoredBackgroundLocation.hpp +122 -0
  75. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean_String_Double.cpp +34 -0
  76. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean_String_Double.hpp +100 -0
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/ActivityRecognitionOptions.kt +66 -0
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidBackgroundLocationOptions.kt +66 -0
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidBackgroundLocationStatus.kt +61 -0
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidBackgroundProvider.kt +24 -0
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/AndroidForegroundServiceOptions.kt +91 -0
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundEventEnvelope.kt +96 -0
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundEventType.kt +27 -0
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundHttpMethod.kt +24 -0
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundHttpSyncOptions.kt +101 -0
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundHttpSyncResult.kt +71 -0
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocation.kt +96 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationOptions.kt +136 -0
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationSource.kt +28 -0
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationState.kt +27 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundLocationStatus.kt +116 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundPermissionResult.kt +71 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundPermissionStatus.kt +25 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BackgroundTrackingMode.kt +24 -0
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/BatterySnapshot.kt +56 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/DetectedActivity.kt +61 -0
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/DetectedActivityType.kt +29 -0
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_BackgroundEventEnvelope.kt +80 -0
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Func_void_BackgroundLocation.kt +80 -0
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofenceEvent.kt +66 -0
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofenceRegion.kt +96 -0
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofenceTransition.kt +24 -0
  103. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GeofencingOptions.kt +56 -0
  104. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GetStoredBackgroundEventsOptions.kt +66 -0
  105. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/GetStoredBackgroundLocationsOptions.kt +66 -0
  106. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/HybridNitroBackgroundLocationSpec.kt +174 -0
  107. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSBackgroundActivityType.kt +26 -0
  108. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSBackgroundLocationOptions.kt +76 -0
  109. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/IOSBackgroundLocationStatus.kt +56 -0
  110. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/LocationProviderStatus.kt +7 -2
  111. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/StoredBackgroundEventEnvelope.kt +76 -0
  112. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/StoredBackgroundLocation.kt +111 -0
  113. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrogeolocation/Variant_NullType_Boolean_String_Double.kt +88 -0
  114. package/nitrogen/generated/android/nitrogeolocation+autolinking.cmake +3 -0
  115. package/nitrogen/generated/android/nitrogeolocationOnLoad.cpp +20 -0
  116. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.cpp +104 -15
  117. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Bridge.hpp +1107 -50
  118. package/nitrogen/generated/ios/NitroGeolocation-Swift-Cxx-Umbrella.hpp +102 -0
  119. package/nitrogen/generated/ios/NitroGeolocationAutolinking.mm +8 -0
  120. package/nitrogen/generated/ios/NitroGeolocationAutolinking.swift +15 -3
  121. package/nitrogen/generated/ios/c++/HybridNitroBackgroundLocationSpecSwift.cpp +11 -0
  122. package/nitrogen/generated/ios/c++/HybridNitroBackgroundLocationSpecSwift.hpp +416 -0
  123. package/nitrogen/generated/ios/swift/ActivityRecognitionOptions.swift +96 -0
  124. package/nitrogen/generated/ios/swift/AndroidBackgroundLocationOptions.swift +76 -0
  125. package/nitrogen/generated/ios/swift/AndroidBackgroundLocationStatus.swift +58 -0
  126. package/nitrogen/generated/ios/swift/AndroidBackgroundProvider.swift +44 -0
  127. package/nitrogen/generated/ios/swift/AndroidForegroundServiceOptions.swift +160 -0
  128. package/nitrogen/generated/ios/swift/BackgroundEventEnvelope.swift +110 -0
  129. package/nitrogen/generated/ios/swift/BackgroundEventType.swift +56 -0
  130. package/nitrogen/generated/ios/swift/BackgroundHttpMethod.swift +44 -0
  131. package/nitrogen/generated/ios/swift/BackgroundHttpSyncOptions.swift +259 -0
  132. package/nitrogen/generated/ios/swift/BackgroundHttpSyncResult.swift +87 -0
  133. package/nitrogen/generated/ios/swift/BackgroundLocation.swift +118 -0
  134. package/nitrogen/generated/ios/swift/BackgroundLocationOptions.swift +292 -0
  135. package/nitrogen/generated/ios/swift/BackgroundLocationSource.swift +60 -0
  136. package/nitrogen/generated/ios/swift/BackgroundLocationState.swift +56 -0
  137. package/nitrogen/generated/ios/swift/BackgroundLocationStatus.swift +124 -0
  138. package/nitrogen/generated/ios/swift/BackgroundPermissionResult.swift +81 -0
  139. package/nitrogen/generated/ios/swift/BackgroundPermissionStatus.swift +48 -0
  140. package/nitrogen/generated/ios/swift/BackgroundTrackingMode.swift +44 -0
  141. package/nitrogen/generated/ios/swift/BatterySnapshot.swift +60 -0
  142. package/nitrogen/generated/ios/swift/DetectedActivity.swift +39 -0
  143. package/nitrogen/generated/ios/swift/DetectedActivityType.swift +64 -0
  144. package/nitrogen/generated/ios/swift/Func_void_BackgroundEventEnvelope.swift +46 -0
  145. package/nitrogen/generated/ios/swift/Func_void_BackgroundHttpSyncResult.swift +46 -0
  146. package/nitrogen/generated/ios/swift/Func_void_BackgroundLocation.swift +46 -0
  147. package/nitrogen/generated/ios/swift/Func_void_BackgroundLocationStatus.swift +46 -0
  148. package/nitrogen/generated/ios/swift/Func_void_BackgroundPermissionResult.swift +46 -0
  149. package/nitrogen/generated/ios/swift/Func_void_std__optional_BackgroundLocationOptions_.swift +46 -0
  150. package/nitrogen/generated/ios/swift/Func_void_std__vector_GeofenceRegion_.swift +46 -0
  151. package/nitrogen/generated/ios/swift/Func_void_std__vector_StoredBackgroundEventEnvelope_.swift +46 -0
  152. package/nitrogen/generated/ios/swift/Func_void_std__vector_StoredBackgroundLocation_.swift +46 -0
  153. package/nitrogen/generated/ios/swift/GeofenceEvent.swift +50 -0
  154. package/nitrogen/generated/ios/swift/GeofenceRegion.swift +195 -0
  155. package/nitrogen/generated/ios/swift/GeofenceTransition.swift +44 -0
  156. package/nitrogen/generated/ios/swift/GeofencingOptions.swift +66 -0
  157. package/nitrogen/generated/ios/swift/GetStoredBackgroundEventsOptions.swift +102 -0
  158. package/nitrogen/generated/ios/swift/GetStoredBackgroundLocationsOptions.swift +96 -0
  159. package/nitrogen/generated/ios/swift/HybridNitroBackgroundLocationSpec.swift +81 -0
  160. package/nitrogen/generated/ios/swift/HybridNitroBackgroundLocationSpec_cxx.swift +654 -0
  161. package/nitrogen/generated/ios/swift/IOSBackgroundActivityType.swift +52 -0
  162. package/nitrogen/generated/ios/swift/IOSBackgroundLocationOptions.swift +125 -0
  163. package/nitrogen/generated/ios/swift/IOSBackgroundLocationStatus.swift +34 -0
  164. package/nitrogen/generated/ios/swift/LocationProviderStatus.swift +19 -1
  165. package/nitrogen/generated/ios/swift/StoredBackgroundEventEnvelope.swift +54 -0
  166. package/nitrogen/generated/ios/swift/StoredBackgroundLocation.swift +120 -0
  167. package/nitrogen/generated/ios/swift/Variant_NullType_Bool_String_Double.swift +34 -0
  168. package/nitrogen/generated/shared/c++/ActivityRecognitionOptions.hpp +95 -0
  169. package/nitrogen/generated/shared/c++/AndroidBackgroundLocationOptions.hpp +100 -0
  170. package/nitrogen/generated/shared/c++/AndroidBackgroundLocationStatus.hpp +93 -0
  171. package/nitrogen/generated/shared/c++/AndroidBackgroundProvider.hpp +80 -0
  172. package/nitrogen/generated/shared/c++/AndroidForegroundServiceOptions.hpp +116 -0
  173. package/nitrogen/generated/shared/c++/BackgroundEventEnvelope.hpp +140 -0
  174. package/nitrogen/generated/shared/c++/BackgroundEventType.hpp +92 -0
  175. package/nitrogen/generated/shared/c++/BackgroundHttpMethod.hpp +80 -0
  176. package/nitrogen/generated/shared/c++/BackgroundHttpSyncOptions.hpp +129 -0
  177. package/nitrogen/generated/shared/c++/BackgroundHttpSyncResult.hpp +101 -0
  178. package/nitrogen/generated/shared/c++/BackgroundLocation.hpp +134 -0
  179. package/nitrogen/generated/shared/c++/BackgroundLocationOptions.hpp +174 -0
  180. package/nitrogen/generated/shared/c++/BackgroundLocationSource.hpp +96 -0
  181. package/nitrogen/generated/shared/c++/BackgroundLocationState.hpp +92 -0
  182. package/nitrogen/generated/shared/c++/BackgroundLocationStatus.hpp +158 -0
  183. package/nitrogen/generated/shared/c++/BackgroundPermissionResult.hpp +107 -0
  184. package/nitrogen/generated/shared/c++/BackgroundPermissionStatus.hpp +84 -0
  185. package/nitrogen/generated/shared/c++/BackgroundTrackingMode.hpp +80 -0
  186. package/nitrogen/generated/shared/c++/BatterySnapshot.hpp +87 -0
  187. package/nitrogen/generated/shared/c++/DetectedActivity.hpp +92 -0
  188. package/nitrogen/generated/shared/c++/DetectedActivityType.hpp +100 -0
  189. package/nitrogen/generated/shared/c++/GeofenceEvent.hpp +103 -0
  190. package/nitrogen/generated/shared/c++/GeofenceRegion.hpp +123 -0
  191. package/nitrogen/generated/shared/c++/GeofenceTransition.hpp +80 -0
  192. package/nitrogen/generated/shared/c++/GeofencingOptions.hpp +90 -0
  193. package/nitrogen/generated/shared/c++/GetStoredBackgroundEventsOptions.hpp +98 -0
  194. package/nitrogen/generated/shared/c++/GetStoredBackgroundLocationsOptions.hpp +95 -0
  195. package/nitrogen/generated/shared/c++/HybridNitroBackgroundLocationSpec.cpp +47 -0
  196. package/nitrogen/generated/shared/c++/HybridNitroBackgroundLocationSpec.hpp +133 -0
  197. package/nitrogen/generated/shared/c++/IOSBackgroundActivityType.hpp +88 -0
  198. package/nitrogen/generated/shared/c++/IOSBackgroundLocationOptions.hpp +105 -0
  199. package/nitrogen/generated/shared/c++/IOSBackgroundLocationStatus.hpp +87 -0
  200. package/nitrogen/generated/shared/c++/LocationProviderStatus.hpp +5 -1
  201. package/nitrogen/generated/shared/c++/StoredBackgroundEventEnvelope.hpp +108 -0
  202. package/nitrogen/generated/shared/c++/StoredBackgroundLocation.hpp +146 -0
  203. package/package.json +17 -6
  204. package/src/NitroGeolocation.nitro.ts +4 -4
  205. package/src/api/getCurrentPosition.ts +1 -1
  206. package/src/api/requestLocationSettings.ts +3 -2
  207. package/src/background/NitroBackgroundLocation.nitro.ts +83 -0
  208. package/src/background/index.ts +200 -0
  209. package/src/background/index.web.ts +120 -0
  210. package/src/background/task.ts +13 -0
  211. package/src/background/types.ts +328 -0
  212. package/src/compat/index.web.ts +141 -0
  213. package/src/index.tsx +3 -0
  214. package/src/index.web.tsx +41 -0
  215. package/src/publicTypes.ts +6 -5
  216. package/src/types.ts +3 -0
  217. package/src/web/browser.ts +171 -0
  218. package/src/web/index.ts +167 -0
  219. package/src/web/useWatchPosition.ts +76 -0
  220. package/src/web/watch.ts +81 -0
  221. package/src/devtools/index.test.ts +0 -54
  222. package/src/utils/errors.test.ts +0 -65
  223. package/src/utils/provider.test.ts +0 -303
@@ -0,0 +1,171 @@
1
+ import type {
2
+ LocationError,
3
+ LocationRequestOptions
4
+ } from "../NitroGeolocation.nitro";
5
+ import type { GeolocationResponse } from "../publicTypes";
6
+ import { LocationErrorCode, createLocationError } from "../utils/errors";
7
+
8
+ type BrowserPermissionState = "granted" | "denied" | "prompt";
9
+
10
+ type BrowserPermissionStatus = {
11
+ state: BrowserPermissionState;
12
+ };
13
+
14
+ type BrowserPermissions = {
15
+ query(descriptor: { name: "geolocation" }): Promise<BrowserPermissionStatus>;
16
+ };
17
+
18
+ type BrowserCoordinates = {
19
+ latitude: number;
20
+ longitude: number;
21
+ altitude: number | null;
22
+ accuracy: number;
23
+ altitudeAccuracy: number | null;
24
+ heading: number | null;
25
+ speed: number | null;
26
+ };
27
+
28
+ export type BrowserPosition = {
29
+ coords: BrowserCoordinates;
30
+ timestamp: number;
31
+ };
32
+
33
+ export type BrowserPositionError = {
34
+ code: number;
35
+ message: string;
36
+ };
37
+
38
+ export type BrowserGeolocation = {
39
+ getCurrentPosition(
40
+ success: (position: BrowserPosition) => void,
41
+ error?: (error: BrowserPositionError) => void,
42
+ options?: BrowserPositionOptions
43
+ ): void;
44
+ watchPosition(
45
+ success: (position: BrowserPosition) => void,
46
+ error?: (error: BrowserPositionError) => void,
47
+ options?: BrowserPositionOptions
48
+ ): number;
49
+ clearWatch(watchId: number): void;
50
+ };
51
+
52
+ type BrowserPositionOptions = {
53
+ enableHighAccuracy?: boolean;
54
+ timeout?: number;
55
+ maximumAge?: number;
56
+ };
57
+
58
+ type BrowserNavigator = {
59
+ geolocation?: BrowserGeolocation;
60
+ permissions?: BrowserPermissions;
61
+ };
62
+
63
+ const defaultTimeoutMs = 600000;
64
+
65
+ export function getNavigator(): BrowserNavigator | undefined {
66
+ const globalNavigator = (globalThis as { navigator?: BrowserNavigator })
67
+ .navigator;
68
+ return globalNavigator;
69
+ }
70
+
71
+ export function getGeolocation(): BrowserGeolocation | undefined {
72
+ return getNavigator()?.geolocation;
73
+ }
74
+
75
+ export function toPositionOptions(
76
+ options?: LocationRequestOptions
77
+ ): BrowserPositionOptions {
78
+ const androidAccuracy = options?.accuracy?.android;
79
+
80
+ return {
81
+ enableHighAccuracy:
82
+ androidAccuracy !== undefined
83
+ ? androidAccuracy === "high"
84
+ : options?.enableHighAccuracy,
85
+ timeout: options?.timeout ?? defaultTimeoutMs,
86
+ maximumAge: options?.maximumAge ?? 0
87
+ };
88
+ }
89
+
90
+ export function normalizePosition(
91
+ position: BrowserPosition
92
+ ): GeolocationResponse {
93
+ return {
94
+ coords: {
95
+ latitude: position.coords.latitude,
96
+ longitude: position.coords.longitude,
97
+ altitude: position.coords.altitude ?? null,
98
+ accuracy: position.coords.accuracy,
99
+ altitudeAccuracy: position.coords.altitudeAccuracy ?? null,
100
+ heading: position.coords.heading ?? null,
101
+ speed: position.coords.speed ?? null
102
+ },
103
+ timestamp: position.timestamp,
104
+ provider: "unknown"
105
+ };
106
+ }
107
+
108
+ export function mapPermissionState(
109
+ state: BrowserPermissionState
110
+ ): "granted" | "denied" | "undetermined" {
111
+ if (state === "granted") {
112
+ return "granted";
113
+ }
114
+ if (state === "denied") {
115
+ return "denied";
116
+ }
117
+ return "undetermined";
118
+ }
119
+
120
+ export function createUnsupportedError(): LocationError {
121
+ return createLocationError(
122
+ LocationErrorCode.POSITION_UNAVAILABLE,
123
+ "Browser geolocation is unavailable. Use a secure context and a browser that supports navigator.geolocation."
124
+ );
125
+ }
126
+
127
+ export function mapBrowserError(error: BrowserPositionError): LocationError {
128
+ switch (error.code) {
129
+ case 1:
130
+ return createLocationError(
131
+ LocationErrorCode.PERMISSION_DENIED,
132
+ error.message || "User denied geolocation permission."
133
+ );
134
+ case 3:
135
+ return createLocationError(
136
+ LocationErrorCode.TIMEOUT,
137
+ error.message || "Geolocation request timed out."
138
+ );
139
+ default:
140
+ return createLocationError(
141
+ LocationErrorCode.POSITION_UNAVAILABLE,
142
+ error.message || "Position is unavailable."
143
+ );
144
+ }
145
+ }
146
+
147
+ export function rejectUnsupported<T>(): Promise<T> {
148
+ return Promise.reject(createUnsupportedError());
149
+ }
150
+
151
+ export function distanceMeters(
152
+ first: GeolocationResponse,
153
+ second: GeolocationResponse
154
+ ): number {
155
+ const earthRadiusMeters = 6371000;
156
+ const lat1 = (first.coords.latitude * Math.PI) / 180;
157
+ const lat2 = (second.coords.latitude * Math.PI) / 180;
158
+ const deltaLat =
159
+ ((second.coords.latitude - first.coords.latitude) * Math.PI) / 180;
160
+ const deltaLon =
161
+ ((second.coords.longitude - first.coords.longitude) * Math.PI) / 180;
162
+
163
+ const a =
164
+ Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
165
+ Math.cos(lat1) *
166
+ Math.cos(lat2) *
167
+ Math.sin(deltaLon / 2) *
168
+ Math.sin(deltaLon / 2);
169
+
170
+ return earthRadiusMeters * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
171
+ }
@@ -0,0 +1,167 @@
1
+ import type {
2
+ LocationError,
3
+ LocationRequestOptions,
4
+ LocationSettingsOptions,
5
+ PermissionStatus
6
+ } from "../NitroGeolocation.nitro";
7
+ import type {
8
+ AccuracyAuthorization,
9
+ GeocodedLocation,
10
+ GeocodingCoordinates,
11
+ GeolocationConfiguration,
12
+ GeolocationResponse,
13
+ Heading,
14
+ LocationAvailability,
15
+ LocationProviderStatus,
16
+ ReverseGeocodedAddress
17
+ } from "../publicTypes";
18
+ import { LocationErrorCode, createLocationError } from "../utils/errors";
19
+ import {
20
+ createUnsupportedError,
21
+ getGeolocation,
22
+ getNavigator,
23
+ mapBrowserError,
24
+ mapPermissionState,
25
+ normalizePosition,
26
+ rejectUnsupported,
27
+ toPositionOptions
28
+ } from "./browser";
29
+ export { stopObserving, unwatch, watchHeading, watchPosition } from "./watch";
30
+ export {
31
+ useWatchPosition,
32
+ type UseWatchPositionOptions
33
+ } from "./useWatchPosition";
34
+
35
+ export function setConfiguration(_config: GeolocationConfiguration): void {
36
+ // Browser geolocation has no global configuration API.
37
+ }
38
+
39
+ export async function checkPermission(): Promise<PermissionStatus> {
40
+ const browserNavigator = getNavigator();
41
+ if (!browserNavigator?.geolocation) {
42
+ return "denied";
43
+ }
44
+
45
+ try {
46
+ const status = await browserNavigator.permissions?.query({
47
+ name: "geolocation"
48
+ });
49
+ return status ? mapPermissionState(status.state) : "undetermined";
50
+ } catch {
51
+ return "undetermined";
52
+ }
53
+ }
54
+
55
+ export async function requestPermission(): Promise<PermissionStatus> {
56
+ const currentStatus = await checkPermission();
57
+ if (currentStatus === "granted" || currentStatus === "denied") {
58
+ return currentStatus;
59
+ }
60
+
61
+ try {
62
+ await getCurrentPosition({ maximumAge: 0, timeout: 10000 });
63
+ return "granted";
64
+ } catch (error) {
65
+ if ((error as LocationError).code === LocationErrorCode.PERMISSION_DENIED) {
66
+ return "denied";
67
+ }
68
+ return checkPermission();
69
+ }
70
+ }
71
+
72
+ export function hasServicesEnabled(): Promise<boolean> {
73
+ return Promise.resolve(Boolean(getGeolocation()));
74
+ }
75
+
76
+ export function getProviderStatus(): Promise<LocationProviderStatus> {
77
+ const enabled = Boolean(getGeolocation());
78
+ return Promise.resolve({
79
+ locationServicesEnabled: enabled,
80
+ backgroundModeEnabled: false
81
+ });
82
+ }
83
+
84
+ export async function getLocationAvailability(): Promise<LocationAvailability> {
85
+ if (!getGeolocation()) {
86
+ return {
87
+ available: false,
88
+ reason: createUnsupportedError().message
89
+ };
90
+ }
91
+
92
+ const permission = await checkPermission();
93
+ if (permission === "denied" || permission === "restricted") {
94
+ return {
95
+ available: false,
96
+ reason: "Browser geolocation permission is denied."
97
+ };
98
+ }
99
+
100
+ return { available: true };
101
+ }
102
+
103
+ export function requestLocationSettings(
104
+ _options?: LocationSettingsOptions
105
+ ): Promise<LocationProviderStatus> {
106
+ return getProviderStatus();
107
+ }
108
+
109
+ export function getAccuracyAuthorization(): Promise<AccuracyAuthorization> {
110
+ return checkPermission().then((status) =>
111
+ status === "granted" ? "full" : "unknown"
112
+ );
113
+ }
114
+
115
+ export function requestTemporaryFullAccuracy(
116
+ _purposeKey: string
117
+ ): Promise<AccuracyAuthorization> {
118
+ return getAccuracyAuthorization();
119
+ }
120
+
121
+ export function getCurrentPosition(
122
+ options?: LocationRequestOptions
123
+ ): Promise<GeolocationResponse> {
124
+ const geolocation = getGeolocation();
125
+ if (!geolocation) {
126
+ return rejectUnsupported();
127
+ }
128
+
129
+ return new Promise((resolve, reject) => {
130
+ geolocation.getCurrentPosition(
131
+ (position) => resolve(normalizePosition(position)),
132
+ (error) => reject(mapBrowserError(error)),
133
+ toPositionOptions(options)
134
+ );
135
+ });
136
+ }
137
+
138
+ export function getLastKnownPosition(
139
+ options?: LocationRequestOptions
140
+ ): Promise<GeolocationResponse> {
141
+ const maximumAge = options?.maximumAge ?? Number.POSITIVE_INFINITY;
142
+ return getCurrentPosition({ ...options, maximumAge, timeout: 0 }).catch(
143
+ (error) => {
144
+ if ((error as LocationError).code === LocationErrorCode.TIMEOUT) {
145
+ throw createLocationError(
146
+ LocationErrorCode.POSITION_UNAVAILABLE,
147
+ "No cached browser location is available."
148
+ );
149
+ }
150
+ throw error;
151
+ }
152
+ );
153
+ }
154
+
155
+ export function geocode(_address: string): Promise<GeocodedLocation[]> {
156
+ return rejectUnsupported();
157
+ }
158
+
159
+ export function reverseGeocode(
160
+ _coords: GeocodingCoordinates
161
+ ): Promise<ReverseGeocodedAddress[]> {
162
+ return rejectUnsupported();
163
+ }
164
+
165
+ export function getHeading(): Promise<Heading> {
166
+ return rejectUnsupported();
167
+ }
@@ -0,0 +1,76 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import type {
3
+ LocationError,
4
+ LocationRequestOptions
5
+ } from "../NitroGeolocation.nitro";
6
+ import type { GeolocationResponse } from "../publicTypes";
7
+ import { unwatch, watchPosition } from "./watch";
8
+
9
+ export interface UseWatchPositionOptions extends LocationRequestOptions {
10
+ enabled?: boolean;
11
+ }
12
+
13
+ export function useWatchPosition(options?: UseWatchPositionOptions) {
14
+ const [position, setPosition] = useState<GeolocationResponse | null>(null);
15
+ const [isWatching, setIsWatching] = useState(false);
16
+ const [error, setError] = useState<LocationError | null>(null);
17
+ const tokenRef = useRef<string | null>(null);
18
+ const isMountedRef = useRef(true);
19
+ const optionsRef = useRef(options);
20
+ const enabled = options?.enabled ?? false;
21
+
22
+ useEffect(() => {
23
+ optionsRef.current = options;
24
+ }, [options]);
25
+
26
+ useEffect(() => {
27
+ isMountedRef.current = true;
28
+ return () => {
29
+ isMountedRef.current = false;
30
+ };
31
+ }, []);
32
+
33
+ useEffect(() => {
34
+ if (!enabled) {
35
+ if (tokenRef.current) {
36
+ unwatch(tokenRef.current);
37
+ tokenRef.current = null;
38
+ }
39
+ setIsWatching(false);
40
+ return;
41
+ }
42
+
43
+ setIsWatching(true);
44
+ setError(null);
45
+ const token = watchPosition(
46
+ (nextPosition) => {
47
+ if (!isMountedRef.current) {
48
+ return;
49
+ }
50
+ setPosition(nextPosition);
51
+ setError(null);
52
+ },
53
+ (nextError) => {
54
+ if (!isMountedRef.current) {
55
+ return;
56
+ }
57
+ setError(nextError);
58
+ },
59
+ optionsRef.current
60
+ );
61
+ tokenRef.current = token;
62
+
63
+ return () => {
64
+ unwatch(token);
65
+ if (tokenRef.current === token) {
66
+ tokenRef.current = null;
67
+ }
68
+ };
69
+ }, [enabled]);
70
+
71
+ return {
72
+ position,
73
+ error,
74
+ isWatching
75
+ };
76
+ }
@@ -0,0 +1,81 @@
1
+ import type {
2
+ LocationError,
3
+ LocationRequestOptions
4
+ } from "../NitroGeolocation.nitro";
5
+ import type {
6
+ GeolocationResponse,
7
+ Heading,
8
+ HeadingOptions
9
+ } from "../publicTypes";
10
+ import {
11
+ createUnsupportedError,
12
+ distanceMeters,
13
+ getGeolocation,
14
+ mapBrowserError,
15
+ normalizePosition,
16
+ toPositionOptions
17
+ } from "./browser";
18
+
19
+ const activeWatches = new Map<string, number>();
20
+ let nextWatchId = 1;
21
+
22
+ export function watchHeading(
23
+ _success: (heading: Heading) => void,
24
+ error?: (error: LocationError) => void,
25
+ _options?: HeadingOptions
26
+ ): string {
27
+ const token = `web-heading-${nextWatchId++}`;
28
+ error?.(createUnsupportedError());
29
+ return token;
30
+ }
31
+
32
+ export function watchPosition(
33
+ success: (position: GeolocationResponse) => void,
34
+ error?: (error: LocationError) => void,
35
+ options?: LocationRequestOptions
36
+ ): string {
37
+ const geolocation = getGeolocation();
38
+ const token = `web-${nextWatchId++}`;
39
+
40
+ if (!geolocation) {
41
+ error?.(createUnsupportedError());
42
+ return token;
43
+ }
44
+
45
+ let lastEmitted: GeolocationResponse | null = null;
46
+ const watchId = geolocation.watchPosition(
47
+ (position) => {
48
+ const normalizedPosition = normalizePosition(position);
49
+ const filter = options?.distanceFilter ?? 0;
50
+ if (
51
+ filter <= 0 ||
52
+ !lastEmitted ||
53
+ distanceMeters(lastEmitted, normalizedPosition) >= filter
54
+ ) {
55
+ lastEmitted = normalizedPosition;
56
+ success(normalizedPosition);
57
+ }
58
+ },
59
+ (browserError) => error?.(mapBrowserError(browserError)),
60
+ toPositionOptions(options)
61
+ );
62
+
63
+ activeWatches.set(token, watchId);
64
+ return token;
65
+ }
66
+
67
+ export function unwatch(token: string): void {
68
+ const watchId = activeWatches.get(token);
69
+ if (watchId === undefined) {
70
+ return;
71
+ }
72
+
73
+ getGeolocation()?.clearWatch(watchId);
74
+ activeWatches.delete(token);
75
+ }
76
+
77
+ export function stopObserving(): void {
78
+ for (const token of activeWatches.keys()) {
79
+ unwatch(token);
80
+ }
81
+ }
@@ -1,54 +0,0 @@
1
- import { afterEach, describe, expect, it } from "vitest";
2
- import { isDevtoolsEnabled } from "./index";
3
-
4
- const globalState = globalThis as typeof globalThis & {
5
- __DEV__?: boolean;
6
- __geolocationDevToolsEnabled?: boolean;
7
- };
8
-
9
- const originalState = {
10
- hasDev: Object.prototype.hasOwnProperty.call(globalState, "__DEV__"),
11
- dev: globalState.__DEV__,
12
- hasDevtoolsEnabled: Object.prototype.hasOwnProperty.call(
13
- globalState,
14
- "__geolocationDevToolsEnabled"
15
- ),
16
- devtoolsEnabled: globalState.__geolocationDevToolsEnabled
17
- };
18
-
19
- describe("isDevtoolsEnabled", () => {
20
- afterEach(() => {
21
- if (originalState.hasDev) {
22
- globalState.__DEV__ = originalState.dev;
23
- } else {
24
- globalState.__DEV__ = undefined;
25
- }
26
-
27
- if (originalState.hasDevtoolsEnabled) {
28
- globalState.__geolocationDevToolsEnabled = originalState.devtoolsEnabled;
29
- } else {
30
- globalState.__geolocationDevToolsEnabled = undefined;
31
- }
32
- });
33
-
34
- it("enables devtools only when React Native __DEV__ and the devtools flag are true", () => {
35
- globalState.__DEV__ = true;
36
- globalState.__geolocationDevToolsEnabled = true;
37
-
38
- expect(isDevtoolsEnabled()).toBe(true);
39
- });
40
-
41
- it("ignores the devtools flag outside React Native __DEV__", () => {
42
- globalState.__DEV__ = false;
43
- globalState.__geolocationDevToolsEnabled = true;
44
-
45
- expect(isDevtoolsEnabled()).toBe(false);
46
- });
47
-
48
- it("stays disabled when __DEV__ is unavailable", () => {
49
- globalState.__DEV__ = undefined;
50
- globalState.__geolocationDevToolsEnabled = true;
51
-
52
- expect(isDevtoolsEnabled()).toBe(false);
53
- });
54
- });
@@ -1,65 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- LocationErrorCode,
4
- createLocationError,
5
- getLocationErrorCodeName,
6
- mapAndroidException,
7
- mapCLErrorCode
8
- } from "./errors";
9
-
10
- describe("LocationErrorCode", () => {
11
- it("keeps legacy-compatible codes and adds modern-only error codes", () => {
12
- expect(LocationErrorCode.INTERNAL_ERROR).toBe(-1);
13
- expect(LocationErrorCode.PERMISSION_DENIED).toBe(1);
14
- expect(LocationErrorCode.POSITION_UNAVAILABLE).toBe(2);
15
- expect(LocationErrorCode.TIMEOUT).toBe(3);
16
- expect(LocationErrorCode.PLAY_SERVICE_NOT_AVAILABLE).toBe(4);
17
- expect(LocationErrorCode.SETTINGS_NOT_SATISFIED).toBe(5);
18
- });
19
-
20
- it("creates the same plain LocationError shape native sends to JS", () => {
21
- const error = createLocationError(
22
- LocationErrorCode.SETTINGS_NOT_SATISFIED,
23
- "Location settings are disabled"
24
- );
25
-
26
- expect(error).toEqual({
27
- code: LocationErrorCode.SETTINGS_NOT_SATISFIED,
28
- message: "Location settings are disabled"
29
- });
30
- });
31
-
32
- it("maps platform-specific error sources", () => {
33
- expect(mapCLErrorCode(0)).toBe(LocationErrorCode.POSITION_UNAVAILABLE);
34
- expect(mapCLErrorCode(1)).toBe(LocationErrorCode.PERMISSION_DENIED);
35
- expect(mapAndroidException("SecurityException")).toBe(
36
- LocationErrorCode.PERMISSION_DENIED
37
- );
38
- expect(mapAndroidException("ResolvableApiException")).toBe(
39
- LocationErrorCode.SETTINGS_NOT_SATISFIED
40
- );
41
- expect(mapAndroidException("GooglePlayServicesNotAvailableException")).toBe(
42
- LocationErrorCode.PLAY_SERVICE_NOT_AVAILABLE
43
- );
44
- });
45
-
46
- it("returns stable names for code display", () => {
47
- expect(getLocationErrorCodeName(LocationErrorCode.INTERNAL_ERROR)).toBe(
48
- "INTERNAL_ERROR"
49
- );
50
- expect(getLocationErrorCodeName(LocationErrorCode.PERMISSION_DENIED)).toBe(
51
- "PERMISSION_DENIED"
52
- );
53
- expect(
54
- getLocationErrorCodeName(LocationErrorCode.POSITION_UNAVAILABLE)
55
- ).toBe("POSITION_UNAVAILABLE");
56
- expect(getLocationErrorCodeName(LocationErrorCode.TIMEOUT)).toBe("TIMEOUT");
57
- expect(
58
- getLocationErrorCodeName(LocationErrorCode.PLAY_SERVICE_NOT_AVAILABLE)
59
- ).toBe("PLAY_SERVICE_NOT_AVAILABLE");
60
- expect(
61
- getLocationErrorCodeName(LocationErrorCode.SETTINGS_NOT_SATISFIED)
62
- ).toBe("SETTINGS_NOT_SATISFIED");
63
- expect(getLocationErrorCodeName(999)).toBe("UNKNOWN_LOCATION_ERROR");
64
- });
65
- });