vibes-react-native 1.1.8 → 5.0.1-rc1

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 (32) hide show
  1. package/android/build.gradle +16 -8
  2. package/android/libs/maven/com/vibes/vibes-android-push-sdk/5.0.0/vibes-android-push-sdk-5.0.0.aar +0 -0
  3. package/android/libs/maven/com/vibes/vibes-android-push-sdk/5.0.0/vibes-android-push-sdk-5.0.0.pom +32 -0
  4. package/android/src/main/java/com/vibes/push/rn/plugin/VibesModule.java +38 -55
  5. package/android/src/main/java/com/vibes/push/rn/plugin/notifications/VibesPushReceiver.java +30 -0
  6. package/ios/Vibes.m +6 -2
  7. package/ios/Vibes.swift +67 -14
  8. package/ios/VibesPluginLogger.swift +2 -4
  9. package/lib/commonjs/index.js +64 -18
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/types.js +2 -0
  12. package/lib/commonjs/types.js.map +1 -0
  13. package/lib/module/index.js +63 -19
  14. package/lib/module/index.js.map +1 -1
  15. package/lib/module/types.js +2 -0
  16. package/lib/module/types.js.map +1 -0
  17. package/lib/typescript/index.d.ts +23 -28
  18. package/lib/typescript/types.d.ts +27 -0
  19. package/package.json +31 -6
  20. package/src/index.tsx +85 -44
  21. package/src/types.ts +31 -0
  22. package/vibes-react-native.podspec +2 -2
  23. package/android/.gradle/6.8/fileChanges/last-build.bin +0 -0
  24. package/android/.gradle/6.8/fileHashes/fileHashes.lock +0 -0
  25. package/android/.gradle/6.8/gc.properties +0 -0
  26. package/android/.gradle/checksums/checksums.lock +0 -0
  27. package/android/.gradle/configuration-cache/gc.properties +0 -0
  28. package/android/.gradle/nb-cache/trust/0FE3017D1D91C06BBB23B2D967E1CF942770CADF1DE28563D6C5A7D96E872CFD +0 -1
  29. package/android/.gradle/vcs-1/gc.properties +0 -0
  30. package/ios/Vibes.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  31. package/ios/Vibes.xcodeproj/project.xcworkspace/xcuserdata/ed.lafoy.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  32. package/ios/Vibes.xcodeproj/xcuserdata/ed.lafoy.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
@@ -29,14 +29,22 @@ repositories {
29
29
  mavenLocal()
30
30
  google()
31
31
  mavenCentral()
32
+ // Vendored AAR ships with this package for builds without private Maven access
32
33
  maven {
33
- url "https://raw.githubusercontent.com/vibes/android-sdk-repository/releases/"
34
+ url new File(projectDir, "libs/maven").absolutePath
34
35
  }
35
36
  maven {
36
- url "https://maven.pkg.github.com/vibes/android-sdk-repository"
37
- credentials {
38
- username = System.getenv("VIBES_GITHUB_USERNAME") ?: ""
39
- password = System.getenv("VIBES_GITHUB_PASSWORD") ?: ""
37
+ url "https://raw.githubusercontent.com/vibes/android-sdk-repository/releases/"
38
+ }
39
+ def githubUser = System.getenv("VIBES_GITHUB_USERNAME")
40
+ def githubPass = System.getenv("VIBES_GITHUB_PASSWORD")
41
+ if (githubUser && githubPass) {
42
+ maven {
43
+ url "https://maven.pkg.github.com/vibes/android-sdk-repository"
44
+ credentials {
45
+ username = githubUser
46
+ password = githubPass
47
+ }
40
48
  }
41
49
  }
42
50
  }
@@ -44,8 +52,8 @@ repositories {
44
52
  dependencies {
45
53
  implementation "com.facebook.react:react-android"
46
54
  // Exposed to the sample app (MainActivity uses com.vibes.vibes.*); use implementation if app does not import SDK directly.
47
- api "com.vibes.vibes:vibes:4.10.0"
48
- implementation "com.google.firebase:firebase-iid:21.1.0"
49
- implementation "com.google.firebase:firebase-messaging:23.0.8"
55
+ api "com.vibes:vibes-android-push-sdk:5.0.0"
56
+ implementation "com.google.firebase:firebase-messaging:23.4.1"
50
57
  implementation "com.google.code.gson:gson:2.9.0"
51
58
  }
59
+
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+ <modelVersion>4.0.0</modelVersion>
6
+
7
+ <groupId>com.vibes</groupId>
8
+ <artifactId>vibes-android-push-sdk</artifactId>
9
+ <version>5.0.0</version>
10
+ <packaging>aar</packaging>
11
+
12
+ <dependencies>
13
+ <dependency>
14
+ <groupId>androidx.preference</groupId>
15
+ <artifactId>preference</artifactId>
16
+ <version>1.1.1</version>
17
+ <scope>compile</scope>
18
+ </dependency>
19
+ <dependency>
20
+ <groupId>androidx.appcompat</groupId>
21
+ <artifactId>appcompat</artifactId>
22
+ <version>1.2.0</version>
23
+ <scope>compile</scope>
24
+ </dependency>
25
+ <dependency>
26
+ <groupId>com.google.code.gson</groupId>
27
+ <artifactId>gson</artifactId>
28
+ <version>2.8.6</version>
29
+ <scope>compile</scope>
30
+ </dependency>
31
+ </dependencies>
32
+ </project>
@@ -10,8 +10,7 @@ import com.facebook.react.bridge.*;
10
10
  import com.facebook.react.module.annotations.ReactModule;
11
11
  import com.google.android.gms.tasks.OnFailureListener;
12
12
  import com.google.android.gms.tasks.OnSuccessListener;
13
- import com.google.firebase.iid.FirebaseInstanceId;
14
- import com.google.firebase.iid.InstanceIdResult;
13
+ import com.google.firebase.messaging.FirebaseMessaging;
15
14
  import com.google.gson.Gson;
16
15
  import com.vibes.vibes.*;
17
16
  import org.json.JSONException;
@@ -58,15 +57,14 @@ public class VibesModule extends ReactContextBaseJavaModule {
58
57
 
59
58
  @Override
60
59
  public void initialize() {
61
- FirebaseInstanceId.getInstance().getInstanceId()
60
+ FirebaseMessaging.getInstance().getToken()
62
61
  .addOnSuccessListener(
63
- new OnSuccessListener<InstanceIdResult>() {
62
+ new OnSuccessListener<String>() {
64
63
  @Override
65
- public void onSuccess(InstanceIdResult instanceIdResult) {
66
- String instanceToken = instanceIdResult.getToken();
64
+ public void onSuccess(String instanceToken) {
67
65
  if (instanceToken != null) {
68
66
  appHelper.saveString(VibesModule.TOKEN_KEY, instanceToken);
69
- Log.d(TAG, "Push token obtained from FirebaseInstanceId --> " + instanceToken);
67
+ Log.d(TAG, "Push token obtained from FirebaseMessaging --> " + instanceToken);
70
68
  }
71
69
  }
72
70
  })
@@ -74,7 +72,7 @@ public class VibesModule extends ReactContextBaseJavaModule {
74
72
  new OnFailureListener() {
75
73
  @Override
76
74
  public void onFailure(Exception e) {
77
- Log.d(TAG, "Failed to fetch token from FirebaseInstanceId: " + e.getLocalizedMessage());
75
+ Log.d(TAG, "Failed to fetch token from FirebaseMessaging: " + e.getLocalizedMessage());
78
76
  }
79
77
  });
80
78
 
@@ -112,6 +110,11 @@ public class VibesModule extends ReactContextBaseJavaModule {
112
110
 
113
111
  }
114
112
 
113
+ @ReactMethod
114
+ public void getSDKVersion(final Promise promise) {
115
+ promise.resolve("1.2.0");
116
+ }
117
+
115
118
  @ReactMethod
116
119
  public void registerDevice(final Promise promise) {
117
120
  Log.d(TAG, "Plugin called to register device");
@@ -132,17 +135,16 @@ public class VibesModule extends ReactContextBaseJavaModule {
132
135
  VibesListener<Void> listener = getRegisterPushListener(promise);
133
136
  String pushToken = appHelper.getPushToken();
134
137
  if (pushToken == null) {
135
- FirebaseInstanceId.getInstance().getInstanceId()
138
+ FirebaseMessaging.getInstance().getToken()
136
139
  .addOnSuccessListener(
137
- new OnSuccessListener<InstanceIdResult>() {
140
+ new OnSuccessListener<String>() {
138
141
  @Override
139
- public void onSuccess(InstanceIdResult instanceIdResult) {
140
- String instanceToken = instanceIdResult.getToken();
142
+ public void onSuccess(String instanceToken) {
141
143
  if (instanceToken == null) {
142
144
  promise.reject(REGISTER_PUSH_ERROR_KEY, "No push token available for registration yet");
143
145
  } else {
144
146
  appHelper.saveString(VibesModule.TOKEN_KEY, instanceToken);
145
- Log.d(TAG, "Push token obtianed from FirebaseInstanceId --> " + instanceToken);
147
+ Log.d(TAG, "Push token obtained from FirebaseMessaging --> " + instanceToken);
146
148
  VibesListener<Void> listener = getRegisterPushListener(promise);
147
149
  registerPush(instanceToken, listener);
148
150
  }
@@ -152,7 +154,7 @@ public class VibesModule extends ReactContextBaseJavaModule {
152
154
  new OnFailureListener() {
153
155
  @Override
154
156
  public void onFailure(Exception e) {
155
- Log.d(TAG, "Failed to fetch token from FirebaseInstanceId: " + e.getLocalizedMessage());
157
+ Log.d(TAG, "Failed to fetch token from FirebaseMessaging: " + e.getLocalizedMessage());
156
158
  promise.reject(REGISTER_DEVICE_ERROR_KEY, "No push token available for registration yet");
157
159
  }
158
160
  });
@@ -294,8 +296,10 @@ public class VibesModule extends ReactContextBaseJavaModule {
294
296
  Log.d(TAG, "Associating Person --> " + externalPersonId);
295
297
  VibesListener<Void> listener = new VibesListener<Void>() {
296
298
  public void onSuccess(Void value) {
297
- promise.resolve("Success");
298
- ;
299
+ WritableMap map = Arguments.createMap();
300
+ map.putString("externalPersonId", externalPersonId);
301
+ map.putString("status", "success");
302
+ promise.resolve(map);
299
303
  }
300
304
 
301
305
  public void onFailure(String errorText) {
@@ -356,16 +360,9 @@ public class VibesModule extends ReactContextBaseJavaModule {
356
360
  VibesListener<Collection<InboxMessage>> listener = new VibesListener<Collection<InboxMessage>>() {
357
361
  public void onSuccess(Collection<InboxMessage> values) {
358
362
  Log.d(TAG, "Fetch inbox messages success");
359
- Gson gson = new Gson();
360
363
  WritableArray array = Arguments.createArray();
361
364
  for (InboxMessage message : values) {
362
- try {
363
- JSONObject jsonObject = new JSONObject(gson.toJson(message));
364
- WritableMap writableMap = appHelper.convertJsonToMap(jsonObject);
365
- array.pushMap(writableMap);
366
- } catch (JSONException e) {
367
- Log.e(TAG, e.getLocalizedMessage());
368
- }
365
+ array.pushMap(mapInboxMessage(message));
369
366
  }
370
367
  if (promise != null) {
371
368
  promise.resolve(array);
@@ -385,16 +382,8 @@ public class VibesModule extends ReactContextBaseJavaModule {
385
382
  VibesListener<InboxMessage> listener = new VibesListener<InboxMessage>() {
386
383
  public void onSuccess(InboxMessage message) {
387
384
  Log.d(TAG, "Fetch single inbox message success");
388
- Gson gson = new Gson();
389
- try {
390
- JSONObject jsonObject = new JSONObject(gson.toJson(message));
391
- WritableMap writableMap = appHelper.convertJsonToMap(jsonObject);
392
- if (promise != null) {
393
- promise.resolve(writableMap);
394
- }
395
- } catch (JSONException e) {
396
- Log.e(TAG, e.getLocalizedMessage());
397
- promise.reject(FETCH_SINGLE_INBOX_MESSAGE_ERROR, e.getLocalizedMessage());
385
+ if (promise != null) {
386
+ promise.resolve(mapInboxMessage(message));
398
387
  }
399
388
  }
400
389
 
@@ -411,16 +400,8 @@ public class VibesModule extends ReactContextBaseJavaModule {
411
400
  VibesListener<InboxMessage> listener = new VibesListener<InboxMessage>() {
412
401
  public void onSuccess(InboxMessage message) {
413
402
  Log.d(TAG, "Mark inbox message as read");
414
- Gson gson = new Gson();
415
- try {
416
- JSONObject jsonObject = new JSONObject(gson.toJson(message));
417
- WritableMap writableMap = appHelper.convertJsonToMap(jsonObject);
418
- if (promise != null) {
419
- promise.resolve(writableMap);
420
- }
421
- } catch (JSONException e) {
422
- Log.e(TAG, e.getLocalizedMessage());
423
- promise.reject(MARK_INBOX_MESSAGE_AS_READ_ERROR, e.getLocalizedMessage());
403
+ if (promise != null) {
404
+ promise.resolve(mapInboxMessage(message));
424
405
  }
425
406
  }
426
407
 
@@ -437,16 +418,8 @@ public class VibesModule extends ReactContextBaseJavaModule {
437
418
  VibesListener<InboxMessage> listener = new VibesListener<InboxMessage>() {
438
419
  public void onSuccess(InboxMessage message) {
439
420
  Log.d(TAG, "Expiring inbox message successful");
440
- Gson gson = new Gson();
441
- try {
442
- JSONObject jsonObject = new JSONObject(gson.toJson(message));
443
- WritableMap writableMap = appHelper.convertJsonToMap(jsonObject);
444
- if (promise != null) {
445
- promise.resolve(writableMap);
446
- }
447
- } catch (JSONException e) {
448
- Log.e(TAG, e.getLocalizedMessage());
449
- promise.reject(EXPIRE_INBOX_MESSAGE_ERROR, e.getLocalizedMessage());
421
+ if (promise != null) {
422
+ promise.resolve(mapInboxMessage(message));
450
423
  }
451
424
  }
452
425
 
@@ -474,7 +447,6 @@ public class VibesModule extends ReactContextBaseJavaModule {
474
447
  Log.e(TAG, "Error recording inbox_open event: " + e.getLocalizedMessage());
475
448
  promise.reject(INBOX_MESSAGE_OPEN_ERROR, e.getLocalizedMessage());
476
449
  }
477
-
478
450
  }
479
451
 
480
452
  @ReactMethod
@@ -487,4 +459,15 @@ public class VibesModule extends ReactContextBaseJavaModule {
487
459
  }
488
460
  }
489
461
 
462
+ private WritableMap mapInboxMessage(InboxMessage message) {
463
+ Gson gson = new Gson();
464
+ try {
465
+ JSONObject jsonObject = new JSONObject(gson.toJson(message));
466
+ return appHelper.convertJsonToMap(jsonObject);
467
+ } catch (JSONException e) {
468
+ Log.e(TAG, e.getLocalizedMessage());
469
+ return Arguments.createMap();
470
+ }
471
+ }
472
+
490
473
  }
@@ -59,4 +59,34 @@ public class VibesPushReceiver extends VibesReceiver {
59
59
  }
60
60
  });
61
61
  }
62
+
63
+ /**
64
+ * Called from MainActivity.onCreate when a notification launch intent may
65
+ * contain Vibes push payload data (Android 12+).
66
+ */
67
+ @SuppressWarnings("unchecked")
68
+ public static void handlePushOpened(Context context, android.content.Intent intent) {
69
+ Log.d(TAG, "Checking if Vibes push message exists in intent");
70
+ if (intent == null) {
71
+ return;
72
+ }
73
+ java.util.HashMap<String, String> pushMap = null;
74
+ try {
75
+ pushMap = (java.util.HashMap<String, String>) intent
76
+ .getSerializableExtra(Vibes.VIBES_REMOTE_MESSAGE_DATA);
77
+ } catch (ClassCastException e) {
78
+ Log.e(TAG, "Unexpected push payload type in intent", e);
79
+ }
80
+ if (pushMap != null) {
81
+ PushPayloadParser pushModel = new PushPayloadParser(pushMap);
82
+ try {
83
+ Vibes.getInstance().onPushMessageOpened(pushModel, context);
84
+ } catch (IllegalStateException e) {
85
+ Log.e(TAG, "Vibes not initialized yet; emitting push without SDK callback", e);
86
+ }
87
+ emitPayload(context, pushModel);
88
+ } else {
89
+ Log.d(TAG, "No push received");
90
+ }
91
+ }
62
92
  }
package/ios/Vibes.m CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  @interface RCT_EXTERN_MODULE(Vibes, NSObject)
4
4
 
5
+ RCT_EXTERN_METHOD(getSDKVersion: (RCTPromiseResolveBlock *)resolve
6
+ rejecter:(RCTPromiseRejectBlock *)reject)
7
+
5
8
  RCT_EXTERN_METHOD(registerDevice: (RCTPromiseResolveBlock *)resolve
6
9
  rejecter:(RCTPromiseRejectBlock *)reject)
7
10
 
@@ -30,7 +33,6 @@ RCT_EXTERN_METHOD(updateDevice: (BOOL ) updateCredentials
30
33
  RCT_EXTERN_METHOD(getPerson: (RCTPromiseResolveBlock *)resolve
31
34
  rejecter:(RCTPromiseRejectBlock *)reject)
32
35
 
33
-
34
36
  RCT_EXTERN_METHOD(fetchInboxMessages: (RCTPromiseResolveBlock *)resolve
35
37
  rejecter:(RCTPromiseRejectBlock *)reject)
36
38
 
@@ -52,5 +54,7 @@ RCT_EXTERN_METHOD(onInboxMessageOpen: (NSDictionary *) message
52
54
 
53
55
  RCT_EXTERN_METHOD(onInboxMessagesFetched: (RCTPromiseResolveBlock *)resolve
54
56
  reject:(RCTPromiseRejectBlock *)reject)
55
- @end
56
57
 
58
+ RCT_EXTERN_METHOD(requestNotificationPermissions: (RCTPromiseResolveBlock *)resolve
59
+ rejecter:(RCTPromiseRejectBlock *)reject)
60
+ @end
package/ios/Vibes.swift CHANGED
@@ -24,6 +24,7 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
24
24
  var unregisterPushRejecter: RCTPromiseRejectBlock?
25
25
  var associatePersonResolver: RCTPromiseResolveBlock?
26
26
  var associatePersonRejecter: RCTPromiseRejectBlock?
27
+ var currentExternalPersonId: String?
27
28
  var updateDeviceResolver: RCTPromiseResolveBlock?
28
29
  var updateDeviceRejecter: RCTPromiseRejectBlock?
29
30
 
@@ -117,6 +118,7 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
117
118
  rejecter reject: @escaping RCTPromiseRejectBlock) {
118
119
  associatePersonResolver = resolve
119
120
  associatePersonRejecter = reject
121
+ currentExternalPersonId = externalPersonId
120
122
  vibes.associatePerson(externalPersonId: externalPersonId)
121
123
  }
122
124
 
@@ -142,12 +144,60 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
142
144
  /// - reject: promise rejector
143
145
  func getVibesDeviceInfo(_ resolve: @escaping RCTPromiseResolveBlock,
144
146
  rejecter reject: @escaping RCTPromiseRejectBlock) {
145
- if let deviceId = userDefaults.object(forKey: "vibesDeviceId") {
146
- if let pushToken = vibes.pushToken {
147
- resolve(["device_id": deviceId, "push_token": pushToken])
148
- return
147
+ let deviceId = userDefaults.string(forKey: "vibesDeviceId") ?? ""
148
+ if let pushToken = vibes.pushToken, !pushToken.isEmpty {
149
+ resolve([
150
+ "device_id": deviceId,
151
+ "push_token": pushToken,
152
+ ])
153
+ return
154
+ }
155
+ resolve([
156
+ "device_id": deviceId,
157
+ ])
158
+ }
159
+
160
+ @objc
161
+ func getSDKVersion(_ resolve: @escaping RCTPromiseResolveBlock,
162
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
163
+ resolve("1.2.0")
164
+ }
165
+
166
+ @objc
167
+ func requestNotificationPermissions(_ resolve: @escaping RCTPromiseResolveBlock,
168
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
169
+ let center = UNUserNotificationCenter.current()
170
+ center.getNotificationSettings { settings in
171
+ switch settings.authorizationStatus {
172
+ case .notDetermined:
173
+ center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
174
+ if granted {
175
+ DispatchQueue.main.async {
176
+ UIApplication.shared.registerForRemoteNotifications()
177
+ }
178
+ resolve(nil)
179
+ } else {
180
+ reject(
181
+ "NOTIFICATION_PERMISSIONS_ERROR",
182
+ error?.localizedDescription ?? "Notification permissions denied",
183
+ error
184
+ )
185
+ }
186
+ }
187
+ case .authorized, .provisional, .ephemeral:
188
+ DispatchQueue.main.async {
189
+ UIApplication.shared.registerForRemoteNotifications()
190
+ }
191
+ resolve(nil)
192
+ case .denied:
193
+ reject(
194
+ "NOTIFICATION_PERMISSIONS_ERROR",
195
+ "Notification permissions previously denied",
196
+ nil
197
+ )
198
+ @unknown default:
199
+ resolve(nil)
149
200
  }
150
- resolve(["device_id": deviceId])
151
201
  }
152
202
  }
153
203
 
@@ -162,7 +212,10 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
162
212
  if let error = error {
163
213
  reject("GET_PERSON_ERROR", error.localizedDescription, error)
164
214
  } else {
165
- resolve(["external_person_id": person?.externalPersonId, "person_key": person?.personKey])
215
+ resolve([
216
+ "person_key": person?.personKey ?? "",
217
+ "external_person_id": person?.externalPersonId ?? "",
218
+ ])
166
219
  }
167
220
  }
168
221
  }
@@ -179,11 +232,7 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
179
232
  if let error = error {
180
233
  reject("FETCH_INBOX_MESSAGES_ERROR", error.localizedDescription, error)
181
234
  } else {
182
- var msgs: [JSONDictionary] = []
183
- for msg in messages {
184
- msgs.append(msg.encodeJSON())
185
- }
186
- resolve(msgs)
235
+ resolve(messages.map { $0.encodeJSON() })
187
236
  }
188
237
  })
189
238
  }
@@ -264,10 +313,10 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
264
313
  /// Inbox Message Opened
265
314
  ///
266
315
  /// - Parameters:
267
- /// - message: The Inbox Message
316
+ /// - message: inbox message dictionary
268
317
  /// - resolve: promise resolver
269
318
  /// - reject: promise rejector
270
- func onInboxMessageOpen(_ message: VibesJSONDictionary,
319
+ func onInboxMessageOpen(_ message: [String: Any],
271
320
  resolve: @escaping RCTPromiseResolveBlock,
272
321
  reject: @escaping RCTPromiseRejectBlock ) -> Void {
273
322
  guard let inboxMessage = InboxMessage(attributes: message) else {
@@ -360,12 +409,16 @@ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
360
409
  }
361
410
  } else {
362
411
  if let associatePersonResolver = associatePersonResolver {
363
- associatePersonResolver("Successs")
412
+ associatePersonResolver([
413
+ "externalPersonId": self.currentExternalPersonId ?? "",
414
+ "status": "success",
415
+ ])
364
416
  }
365
417
  NotificationCenter.default.post(name: Notification.Name.vibesPushDidAssociatePerson, object: nil)
366
418
  }
367
419
  associatePersonRejecter = nil
368
420
  associatePersonResolver = nil
421
+ currentExternalPersonId = nil
369
422
  }
370
423
  }
371
424
 
@@ -35,10 +35,8 @@ class VibesPluginLogger: NSObject {
35
35
  if let devId = UserDefaults.standard.vibesDeviceId {
36
36
  deviceId = devId
37
37
  }
38
- // get env from plist config file if set, else throw fatal error
39
- guard let env = Configuration.configValue(.vibesAppEnv) else {
40
- fatalError("`\(ConfigKey.vibesAppEnv.value())` must be set in plist file of current build configuration")
41
- }
38
+ // Prefer VibesAppEnv from Info.plist; default to production when unset.
39
+ let env = Configuration.configValue(.vibesAppEnv) ?? "PROD"
42
40
  let jsonObj: [String: Any] = ["os_type": "iOS",
43
41
  "device_id": deviceId ?? " - ",
44
42
  "env": env,
@@ -9,12 +9,14 @@ exports.expireInboxMessage = expireInboxMessage;
9
9
  exports.fetchInboxMessage = fetchInboxMessage;
10
10
  exports.fetchInboxMessages = fetchInboxMessages;
11
11
  exports.getPerson = getPerson;
12
+ exports.getSDKVersion = getSDKVersion;
12
13
  exports.getVibesDeviceInfo = getVibesDeviceInfo;
13
14
  exports.markInboxMessageAsRead = markInboxMessageAsRead;
14
15
  exports.onInboxMessageOpen = onInboxMessageOpen;
15
16
  exports.onInboxMessagesFetched = onInboxMessagesFetched;
16
17
  exports.registerDevice = registerDevice;
17
18
  exports.registerPush = registerPush;
19
+ exports.requestNotificationPermissions = requestNotificationPermissions;
18
20
  exports.unregisterDevice = unregisterDevice;
19
21
  exports.unregisterPush = unregisterPush;
20
22
  exports.updateDevice = updateDevice;
@@ -23,18 +25,28 @@ const LINKING_ERROR = `The package 'vibes-react-native' doesn't seem to be linke
23
25
  ios: "- You have run 'pod install'\n",
24
26
  default: ''
25
27
  }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo managed workflow\n';
26
- const Vibes = _reactNative.NativeModules.Vibes ? _reactNative.NativeModules.Vibes : new Proxy({}, {
28
+ const NativeVibes = _reactNative.NativeModules.Vibes ? _reactNative.NativeModules.Vibes : new Proxy({}, {
27
29
  get() {
28
30
  throw new Error(LINKING_ERROR);
29
31
  }
30
32
  });
33
+
34
+ /**
35
+ * Returns the wrapper SDK version string.
36
+ *
37
+ * @return {Promise<string>}
38
+ */
39
+ function getSDKVersion() {
40
+ return NativeVibes.getSDKVersion();
41
+ }
42
+
31
43
  /**
32
44
  * Register this device with the Vibes platform
33
45
  *
34
46
  * @return {Promise<DeviceResponse>}
35
47
  */
36
48
  function registerDevice() {
37
- return Vibes.registerDevice();
49
+ return NativeVibes.registerDevice();
38
50
  }
39
51
  /**
40
52
  * Unregister this device with the Vibes platform
@@ -42,7 +54,7 @@ function registerDevice() {
42
54
  * @return {Promise<void>}
43
55
  */
44
56
  function unregisterDevice() {
45
- return Vibes.unregisterDevice();
57
+ return NativeVibes.unregisterDevice();
46
58
  }
47
59
 
48
60
  /**
@@ -51,7 +63,7 @@ function unregisterDevice() {
51
63
  * @return {Promise<void>}
52
64
  */
53
65
  function registerPush() {
54
- return Vibes.registerPush();
66
+ return NativeVibes.registerPush();
55
67
  }
56
68
 
57
69
  /**
@@ -60,7 +72,7 @@ function registerPush() {
60
72
  * @return {Promise<void>}
61
73
  */
62
74
  function unregisterPush() {
63
- return Vibes.registerPush();
75
+ return NativeVibes.unregisterPush();
64
76
  }
65
77
 
66
78
  /**
@@ -69,7 +81,7 @@ function unregisterPush() {
69
81
  * @return {Promise<DeviceInfoResponse>}
70
82
  */
71
83
  function getVibesDeviceInfo() {
72
- return Vibes.getVibesDeviceInfo();
84
+ return NativeVibes.getVibesDeviceInfo();
73
85
  }
74
86
 
75
87
  /**
@@ -81,17 +93,17 @@ function getVibesDeviceInfo() {
81
93
  * @returns {Promise<void>}
82
94
  */
83
95
  function updateDevice(updateCredential, latitude, longitude) {
84
- return Vibes.updateDevice(updateCredential, latitude, longitude);
96
+ return NativeVibes.updateDevice(updateCredential, latitude, longitude);
85
97
  }
86
98
 
87
99
  /**
88
100
  * Associate an external ID with the current person.
89
101
  *
90
102
  * @param {string} externalPersonId
91
- * @return {Promise<void>}
103
+ * @return {Promise<AssociatePersonResponse>}
92
104
  */
93
105
  function associatePerson(externalPersonId) {
94
- return Vibes.associatePerson(externalPersonId);
106
+ return NativeVibes.associatePerson(externalPersonId);
95
107
  }
96
108
 
97
109
  /**
@@ -100,7 +112,7 @@ function associatePerson(externalPersonId) {
100
112
  * @return {Promise<PersonResponse>}
101
113
  */
102
114
  function getPerson() {
103
- return Vibes.getPerson();
115
+ return NativeVibes.getPerson();
104
116
  }
105
117
  /**
106
118
  * Fetches an array of inbox messages for the person associated with this device.
@@ -108,7 +120,7 @@ function getPerson() {
108
120
  * @return {Promise<InboxMessage[]>}
109
121
  */
110
122
  function fetchInboxMessages() {
111
- return Vibes.fetchInboxMessages();
123
+ return NativeVibes.fetchInboxMessages();
112
124
  }
113
125
 
114
126
  /**
@@ -118,7 +130,7 @@ function fetchInboxMessages() {
118
130
  * @return {Promise<InboxMessage>}
119
131
  */
120
132
  function fetchInboxMessage(message_uid) {
121
- return Vibes.fetchInboxMessage(message_uid);
133
+ return NativeVibes.fetchInboxMessage(message_uid);
122
134
  }
123
135
 
124
136
  /**
@@ -128,7 +140,7 @@ function fetchInboxMessage(message_uid) {
128
140
  * @return {Promise<InboxMessage>} an updated version of the InboxMessage with read field updated
129
141
  */
130
142
  function markInboxMessageAsRead(message_uid) {
131
- return Vibes.markInboxMessageAsRead(message_uid);
143
+ return NativeVibes.markInboxMessageAsRead(message_uid);
132
144
  }
133
145
 
134
146
  /**
@@ -138,17 +150,17 @@ function markInboxMessageAsRead(message_uid) {
138
150
  * @return {Promise<InboxMessage>} an updated version of the InboxMessage with expires_at date updated
139
151
  */
140
152
  function expireInboxMessage(message_uid) {
141
- return Vibes.expireInboxMessage(message_uid);
153
+ return NativeVibes.expireInboxMessage(message_uid);
142
154
  }
143
155
 
144
156
  /**
145
157
  * Records an event for when the user opens an inbox message.
146
158
  *
147
- * @param inboxMap json map of the InboxMessage
159
+ * @param inboxMessage - json map of the InboxMessage
148
160
  * @return {Promise<void>}
149
161
  */
150
- function onInboxMessageOpen(inboxMap) {
151
- return Vibes.onInboxMessageOpen(inboxMap);
162
+ function onInboxMessageOpen(inboxMessage) {
163
+ return NativeVibes.onInboxMessageOpen(inboxMessage);
152
164
  }
153
165
 
154
166
  /**
@@ -157,7 +169,41 @@ function onInboxMessageOpen(inboxMap) {
157
169
  * @return {Promise<void>}
158
170
  */
159
171
  function onInboxMessagesFetched() {
160
- return Vibes.onInboxMessagesFetched();
172
+ return NativeVibes.onInboxMessagesFetched();
161
173
  }
174
+
175
+ /**
176
+ * Requests notification permissions from the OS.
177
+ *
178
+ * - iOS: prompts via UNUserNotificationCenter and registers for remote notifications
179
+ * - Android 13+: requests POST_NOTIFICATIONS via PermissionsAndroid
180
+ * - Android 12 and below: no-op (permission not required)
181
+ *
182
+ * @return {Promise<void>}
183
+ */
184
+ async function requestNotificationPermissions() {
185
+ if (_reactNative.Platform.OS === 'android') {
186
+ const apiLevel = typeof _reactNative.Platform.Version === 'number' ? _reactNative.Platform.Version : parseInt(String(_reactNative.Platform.Version), 10);
187
+ // POST_NOTIFICATIONS is only required on Android 13+ (API 33)
188
+ if (!Number.isNaN(apiLevel) && apiLevel < 33) {
189
+ return;
190
+ }
191
+ const result = await _reactNative.PermissionsAndroid.request(_reactNative.PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS);
192
+ if (result !== _reactNative.PermissionsAndroid.RESULTS.GRANTED) {
193
+ throw new Error('Notification permissions denied');
194
+ }
195
+ return;
196
+ }
197
+ return NativeVibes.requestNotificationPermissions();
198
+ }
199
+ const Vibes = new Proxy(NativeVibes, {
200
+ get(target, prop, receiver) {
201
+ if (prop === 'requestNotificationPermissions') {
202
+ return requestNotificationPermissions;
203
+ }
204
+ const value = Reflect.get(target, prop, receiver);
205
+ return typeof value === 'function' ? value.bind(target) : value;
206
+ }
207
+ });
162
208
  var _default = exports.default = Vibes;
163
209
  //# sourceMappingURL=index.js.map