@doorstepai/dropoff-sdk 1.0.10 → 1.0.12

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 (38) hide show
  1. package/README.md +22 -9
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/doorstepai/dropoffsdk/DoorstepAIModule.kt +5 -0
  4. package/ios/DoorstepAI.swift +105 -92
  5. package/ios/DoorstepDropoffSDK.xcframework/Info.plist +5 -5
  6. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/DoorstepDropoffSDK +0 -0
  7. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/Headers/DoorstepDropoffSDK.h +1 -1
  8. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/Info.plist +0 -0
  9. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios.abi.json +285 -184
  10. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios.private.swiftinterface +8 -15
  11. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  12. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios.swiftinterface +8 -15
  13. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/DoorstepDropoffSDK.framework/_CodeSignature/CodeResources +13 -13
  14. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/dSYMs/DoorstepDropoffSDK.framework.dSYM/Contents/Resources/DWARF/DoorstepDropoffSDK +0 -0
  15. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64/dSYMs/DoorstepDropoffSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/DoorstepDropoffSDK.yml +737 -823
  16. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/DoorstepDropoffSDK +0 -0
  17. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Headers/DoorstepDropoffSDK.h +1 -1
  18. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Info.plist +0 -0
  19. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios-simulator.abi.json +285 -184
  20. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +8 -15
  21. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  22. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/arm64-apple-ios-simulator.swiftinterface +8 -15
  23. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/x86_64-apple-ios-simulator.abi.json +285 -184
  24. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +8 -15
  25. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  26. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/Modules/DoorstepDropoffSDK.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +8 -15
  27. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/DoorstepDropoffSDK.framework/_CodeSignature/CodeResources +23 -23
  28. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/DoorstepDropoffSDK.framework.dSYM/Contents/Resources/DWARF/DoorstepDropoffSDK +0 -0
  29. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/DoorstepDropoffSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/DoorstepDropoffSDK.yml +737 -823
  30. package/ios/DoorstepDropoffSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/DoorstepDropoffSDK.framework.dSYM/Contents/Resources/Relocations/x86_64/DoorstepDropoffSDK.yml +738 -823
  31. package/lib/module/DoorstepAI.js.map +1 -1
  32. package/lib/module/RootDoorstepAI.js +2 -2
  33. package/lib/module/RootDoorstepAI.js.map +1 -1
  34. package/lib/typescript/src/DoorstepAI.d.ts.map +1 -1
  35. package/lib/typescript/src/RootDoorstepAI.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/src/DoorstepAI.tsx +4 -1
  38. package/src/RootDoorstepAI.tsx +10 -3
package/README.md CHANGED
@@ -31,7 +31,11 @@ import { RootDoorstepAI } from "@doorstepai/dropoff-sdk"
31
31
  const App = () => {
32
32
  return (
33
33
  <View>
34
- <RootDoorstepAI apiKey="YOUR_API_KEY_HERE" />
34
+ <RootDoorstepAI
35
+ apiKey="YOUR_API_KEY_HERE"
36
+ notificationTitle="Some Notification Title"
37
+ notificationText="Some Notification Text"
38
+ />
35
39
  {/** Your App Components */}
36
40
  )
37
41
  }
@@ -39,6 +43,8 @@ const App = () => {
39
43
 
40
44
  This sets the API key and initializes the SDK when the app launches.
41
45
 
46
+ The notification title/text is meant to be passed into the Foreground Service for Android. This alows for greater customization over exact text.
47
+
42
48
  ---
43
49
 
44
50
  ## 📲 Example Usage
@@ -176,17 +182,21 @@ To use the `@doorstepai/dropoff-sdk` effectively, you must include the appropria
176
182
  In your `Info.plist`, include the following usage descriptions:
177
183
 
178
184
  ```xml
185
+ <!-- Location Usage Descriptions -->
179
186
  <key>NSLocationWhenInUseUsageDescription</key>
180
- <string>This app requires access to your location while in use to track deliveries.</string>
181
-
182
- <key>NSLocationAlwaysUsageDescription</key>
183
- <string>This app requires continuous location access to ensure accurate delivery tracking.</string>
184
-
185
- <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
186
- <string>This app requires location access at all times to support delivery tracking.</string>
187
+ <string>This app requires access to your location for delivery tracking.</string>
188
+ <key>NSLocationAlwaysAndWhenInUseUsage</key>
189
+ <string>This app requires access to your location to provide continuous tracking even in the background.</string>
187
190
 
191
+ <!-- Optional: Motion & Sensor Data (if applicable) -->
188
192
  <key>NSMotionUsageDescription</key>
189
- <string>This app uses motion data to improve delivery tracking accuracy.</string>
193
+ <string>This app uses motion data to enhance delivery tracking accuracy.</string>
194
+
195
+ <!-- Background Location Mode -->
196
+ <key>UIBackgroundModes</key>
197
+ <array>
198
+ <string>location</string>
199
+ </array>
190
200
  ```
191
201
 
192
202
  ### 🤖 Android
@@ -200,6 +210,9 @@ In your `AndroidManifest.xml`, include the following permissions:
200
210
  <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
201
211
  <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
202
212
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
213
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
214
+ <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
215
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
203
216
 
204
217
  <uses-feature android:name="android.hardware.sensor.accelerometer" />
205
218
  <uses-feature android:name="android.hardware.sensor.gyroscope" />
@@ -86,7 +86,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
86
86
  dependencies {
87
87
  implementation "com.facebook.react:react-android"
88
88
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
89
- implementation("ai.doorstep.com:doorstepai-dropoff-sdk:1.0.3")
89
+ implementation("ai.doorstep.com:doorstepai-dropoff-sdk:1.0.5")
90
90
  api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
91
91
  }
92
92
 
@@ -122,6 +122,11 @@ class DoorstepAIModule(private val reactContext: ReactApplicationContext) :
122
122
  DoorstepAI.setAPIKey(key)
123
123
  }
124
124
 
125
+ @ReactMethod
126
+ fun setDevMode(enabled: Boolean) {
127
+ DoorstepAI.devMode = enabled
128
+ }
129
+
125
130
  companion object {
126
131
  const val NAME = "DoorstepAI"
127
132
  }
@@ -1,115 +1,128 @@
1
1
  import Foundation
2
2
  import React
3
3
  import DoorstepDropoffSDK
4
+ import CoreLocation
4
5
 
5
6
  @objc(DoorstepAI)
6
7
  class DoorstepAIBridge: NSObject {
8
+ private let locationManager = CLLocationManager()
7
9
 
8
- @objc
9
- static func requiresMainQueueSetup() -> Bool {
10
- return true
11
- }
10
+ override init() {
11
+ super.init()
12
+ locationManager.showsBackgroundLocationIndicator = true
13
+ locationManager.allowsBackgroundLocationUpdates = true
14
+ locationManager.pausesLocationUpdatesAutomatically = false
15
+
16
+ // Request authorization
17
+ locationManager.requestAlwaysAuthorization()
18
+
19
+ }
12
20
 
13
- @objc
14
- func setDevMode(_ devModeEnabled: Bool) {
15
- DoorstepAI.devMode = devModeEnabled
16
- }
21
+ @objc
22
+ static func requiresMainQueueSetup() -> Bool {
23
+ return true
24
+ }
17
25
 
18
- @objc
19
- func setApiKey(_ apiKey: String) {
20
- DoorstepAI.setApiKey(key: apiKey)
21
- }
26
+ @objc
27
+ func setDevMode(_ devModeEnabled: Bool) {
28
+ DoorstepAI.devMode = devModeEnabled
29
+ }
22
30
 
23
- @objc
24
- func startDeliveryByPlaceID(_ placeID: NSString,
25
- deliveryId: NSString,
26
- resolver resolve: @escaping RCTPromiseResolveBlock,
27
- rejecter reject: @escaping RCTPromiseRejectBlock) {
28
- // Use Swift's concurrency support to call the async method.
29
- Task {
30
- do {
31
- try await DoorstepAI.startDeliveryByPlaceID(placeID: placeID as String, deliveryId: deliveryId as String)
32
- resolve(nil)
33
- } catch {
34
- reject("E_START_DELIVERY", "Failed to start delivery by Place ID: \(error.localizedDescription)", error)
35
- }
31
+ @objc
32
+ func setApiKey(_ apiKey: String) {
33
+ DoorstepAI.setApiKey(key: apiKey)
36
34
  }
37
- }
38
35
 
39
- @objc
40
- func startDeliveryByPlusCode(_ plusCode: NSString,
41
- deliveryId: NSString,
42
- resolver resolve: @escaping RCTPromiseResolveBlock,
43
- rejecter reject: @escaping RCTPromiseRejectBlock) {
44
- Task {
45
- do {
46
- try await DoorstepAI.startDeliveryByPlusCode(plusCode: plusCode as String, deliveryId: deliveryId as String)
47
- resolve(nil)
48
- } catch {
49
- reject("E_START_DELIVERY", "Failed to start delivery by Plus Code: \(error.localizedDescription)", error)
50
- }
36
+ @objc
37
+ func startDeliveryByPlaceID(_ placeID: NSString,
38
+ deliveryId: NSString,
39
+ resolver resolve: @escaping RCTPromiseResolveBlock,
40
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
41
+ // Use Swift's concurrency support to call the async method.
42
+ Task {
43
+ do {
44
+ try await DoorstepAI.startDeliveryByPlaceID(placeID: placeID as String, deliveryId: deliveryId as String)
45
+ resolve(nil)
46
+ } catch {
47
+ reject("E_START_DELIVERY", "Failed to start delivery by Place ID: \(error.localizedDescription)", error)
48
+ }
49
+ }
51
50
  }
52
- }
53
51
 
54
- @objc
55
- func startDeliveryByAddress(_ address: [String: Any],
56
- deliveryId: NSString,
57
- resolver resolve: @escaping RCTPromiseResolveBlock,
58
- rejecter reject: @escaping RCTPromiseRejectBlock) {
59
- Task {
60
- print("Starting delivery by address: \(address)")
61
- do {
62
- guard let streetNumber = address["streetNumber"] as? String,
63
- let route = address["route"] as? String,
64
- let subPremise = address["subPremise"] as? String,
65
- let locality = address["locality"] as? String,
66
- let administrativeAreaLevel1 = address["administrativeAreaLevel1"] as? String,
67
- let postalCode = address["postalCode"] as? String else {
68
- reject("E_INVALID_ADDRESS", "Missing or invalid fields in address dictionary.", nil)
69
- return
52
+ @objc
53
+ func startDeliveryByPlusCode(_ plusCode: NSString,
54
+ deliveryId: NSString,
55
+ resolver resolve: @escaping RCTPromiseResolveBlock,
56
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
57
+ Task {
58
+ do {
59
+ try await DoorstepAI.startDeliveryByPlusCode(plusCode: plusCode as String, deliveryId: deliveryId as String)
60
+ resolve(nil)
61
+ } catch {
62
+ reject("E_START_DELIVERY", "Failed to start delivery by Plus Code: \(error.localizedDescription)", error)
70
63
  }
64
+ }
65
+ }
71
66
 
72
- let addressStruct = AddressType(streetNumber: streetNumber,
73
- route: route,
74
- subPremise: subPremise,
75
- locality: locality,
76
- administrativeAreaLevel1: administrativeAreaLevel1,
77
- postalCode: postalCode)
67
+ @objc
68
+ func startDeliveryByAddress(_ address: [String: Any],
69
+ deliveryId: NSString,
70
+ resolver resolve: @escaping RCTPromiseResolveBlock,
71
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
72
+ Task {
73
+ print("Starting delivery by address: \(address)")
74
+ do {
75
+ guard let streetNumber = address["streetNumber"] as? String,
76
+ let route = address["route"] as? String,
77
+ let subPremise = address["subPremise"] as? String,
78
+ let locality = address["locality"] as? String,
79
+ let administrativeAreaLevel1 = address["administrativeAreaLevel1"] as? String,
80
+ let postalCode = address["postalCode"] as? String else {
81
+ reject("E_INVALID_ADDRESS", "Missing or invalid fields in address dictionary.", nil)
82
+ return
83
+ }
78
84
 
79
- try await DoorstepAI.startDeliveryByAddressType(address: addressStruct, deliveryId: deliveryId as String)
80
- resolve(nil)
81
- } catch let error as DoorstepAIError {
82
- reject("E_START_DELIVERY", "Failed to start delivery by address: \(error.localizedDescription)", error)
83
- } catch {
84
- reject("E_UNKNOWN", "An unexpected error occurred: \(error.localizedDescription)", error)
85
+ let addressStruct = AddressType(streetNumber: streetNumber,
86
+ route: route,
87
+ subPremise: subPremise,
88
+ locality: locality,
89
+ administrativeAreaLevel1: administrativeAreaLevel1,
90
+ postalCode: postalCode)
91
+
92
+ try await DoorstepAI.startDeliveryByAddressType(address: addressStruct, deliveryId: deliveryId as String)
93
+ resolve(nil)
94
+ } catch let error as DoorstepAIError {
95
+ reject("E_START_DELIVERY", "Failed to start delivery by address: \(error.localizedDescription)", error)
96
+ } catch {
97
+ reject("E_UNKNOWN", "An unexpected error occurred: \(error.localizedDescription)", error)
98
+ }
85
99
  }
86
- }
87
- }
100
+ }
88
101
 
89
- @objc
90
- func newEvent(_ eventName: NSString,
91
- deliveryId: NSString,
92
- resolver resolve: @escaping RCTPromiseResolveBlock,
93
- rejecter reject: @escaping RCTPromiseRejectBlock) {
94
- Task {
95
- do {
96
- try await DoorstepAI.newEvent(eventName: eventName as String, deliveryId: deliveryId as String)
97
- resolve(nil)
98
- } catch {
99
- reject("E_NEW_EVENT", "Failed to send event: \(error.localizedDescription)", error)
100
- }
101
- }
102
- }
102
+ @objc
103
+ func newEvent(_ eventName: NSString,
104
+ deliveryId: NSString,
105
+ resolver resolve: @escaping RCTPromiseResolveBlock,
106
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
107
+ Task {
108
+ do {
109
+ try await DoorstepAI.newEvent(eventName: eventName as String, deliveryId: deliveryId as String)
110
+ resolve(nil)
111
+ } catch {
112
+ reject("E_NEW_EVENT", "Failed to send event: \(error.localizedDescription)", error)
113
+ }
114
+ }
115
+ }
103
116
 
104
- @objc
105
- func stopDelivery(_ deliveryId: NSString,
106
- resolver resolve: @escaping RCTPromiseResolveBlock,
107
- rejecter reject: @escaping RCTPromiseRejectBlock) {
108
- Task {
109
- // stopDelivery does not throw so we simply await its completion
110
- await DoorstepAI.stopDelivery(deliveryId: deliveryId as String)
111
- resolve(nil)
117
+ @objc
118
+ func stopDelivery(_ deliveryId: NSString,
119
+ resolver resolve: @escaping RCTPromiseResolveBlock,
120
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
121
+ Task {
122
+ // stopDelivery does not throw so we simply await its completion
123
+ await DoorstepAI.stopDelivery(deliveryId: deliveryId as String)
124
+ resolve(nil)
125
+ }
112
126
  }
113
- }
114
127
 
115
128
  }
@@ -10,15 +10,18 @@
10
10
  <key>DebugSymbolsPath</key>
11
11
  <string>dSYMs</string>
12
12
  <key>LibraryIdentifier</key>
13
- <string>ios-arm64</string>
13
+ <string>ios-arm64_x86_64-simulator</string>
14
14
  <key>LibraryPath</key>
15
15
  <string>DoorstepDropoffSDK.framework</string>
16
16
  <key>SupportedArchitectures</key>
17
17
  <array>
18
18
  <string>arm64</string>
19
+ <string>x86_64</string>
19
20
  </array>
20
21
  <key>SupportedPlatform</key>
21
22
  <string>ios</string>
23
+ <key>SupportedPlatformVariant</key>
24
+ <string>simulator</string>
22
25
  </dict>
23
26
  <dict>
24
27
  <key>BinaryPath</key>
@@ -26,18 +29,15 @@
26
29
  <key>DebugSymbolsPath</key>
27
30
  <string>dSYMs</string>
28
31
  <key>LibraryIdentifier</key>
29
- <string>ios-arm64_x86_64-simulator</string>
32
+ <string>ios-arm64</string>
30
33
  <key>LibraryPath</key>
31
34
  <string>DoorstepDropoffSDK.framework</string>
32
35
  <key>SupportedArchitectures</key>
33
36
  <array>
34
37
  <string>arm64</string>
35
- <string>x86_64</string>
36
38
  </array>
37
39
  <key>SupportedPlatform</key>
38
40
  <string>ios</string>
39
- <key>SupportedPlatformVariant</key>
40
- <string>simulator</string>
41
41
  </dict>
42
42
  </array>
43
43
  <key>CFBundlePackageType</key>
@@ -2,7 +2,7 @@
2
2
  // DoorstepDropoffSDK.h
3
3
  // DoorstepDropoffSDK
4
4
  //
5
- // Created by Sheel Patel on 3/13/25.
5
+ // Created by Sheel Patel on 5/1/25.
6
6
  //
7
7
 
8
8
  #import <Foundation/Foundation.h>