vibes-react-native 1.1.8 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +16 -8
- package/android/libs/maven/com/vibes/vibes-android-push-sdk/5.0.0/vibes-android-push-sdk-5.0.0.aar +0 -0
- package/android/libs/maven/com/vibes/vibes-android-push-sdk/5.0.0/vibes-android-push-sdk-5.0.0.pom +32 -0
- package/android/src/main/java/com/vibes/push/rn/plugin/VibesModule.java +38 -55
- package/android/src/main/java/com/vibes/push/rn/plugin/notifications/VibesPushReceiver.java +30 -0
- package/ios/Vibes.m +6 -2
- package/ios/Vibes.swift +67 -14
- package/lib/commonjs/index.js +64 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/index.js +63 -19
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/index.d.ts +23 -28
- package/lib/typescript/types.d.ts +27 -0
- package/package.json +31 -6
- package/src/index.tsx +85 -44
- package/src/types.ts +31 -0
- package/vibes-react-native.podspec +2 -2
- package/android/.gradle/6.8/fileChanges/last-build.bin +0 -0
- package/android/.gradle/6.8/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/6.8/gc.properties +0 -0
- package/android/.gradle/checksums/checksums.lock +0 -0
- package/android/.gradle/configuration-cache/gc.properties +0 -0
- package/android/.gradle/nb-cache/trust/0FE3017D1D91C06BBB23B2D967E1CF942770CADF1DE28563D6C5A7D96E872CFD +0 -1
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/ios/Vibes.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/ios/Vibes.xcodeproj/project.xcworkspace/xcuserdata/ed.lafoy.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/Vibes.xcodeproj/xcuserdata/ed.lafoy.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
package/android/build.gradle
CHANGED
|
@@ -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 "
|
|
34
|
+
url new File(projectDir, "libs/maven").absolutePath
|
|
34
35
|
}
|
|
35
36
|
maven {
|
|
36
|
-
url "https://
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
48
|
-
implementation "com.google.firebase:firebase-
|
|
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
|
+
|
package/android/libs/maven/com/vibes/vibes-android-push-sdk/5.0.0/vibes-android-push-sdk-5.0.0.aar
ADDED
|
Binary file
|
package/android/libs/maven/com/vibes/vibes-android-push-sdk/5.0.0/vibes-android-push-sdk-5.0.0.pom
ADDED
|
@@ -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.
|
|
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
|
-
|
|
60
|
+
FirebaseMessaging.getInstance().getToken()
|
|
62
61
|
.addOnSuccessListener(
|
|
63
|
-
new OnSuccessListener<
|
|
62
|
+
new OnSuccessListener<String>() {
|
|
64
63
|
@Override
|
|
65
|
-
public void onSuccess(
|
|
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
|
|
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
|
|
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
|
-
|
|
138
|
+
FirebaseMessaging.getInstance().getToken()
|
|
136
139
|
.addOnSuccessListener(
|
|
137
|
-
new OnSuccessListener<
|
|
140
|
+
new OnSuccessListener<String>() {
|
|
138
141
|
@Override
|
|
139
|
-
public void onSuccess(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
389
|
-
|
|
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
|
-
|
|
415
|
-
|
|
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
|
-
|
|
441
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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([
|
|
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
|
-
|
|
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:
|
|
316
|
+
/// - message: inbox message dictionary
|
|
268
317
|
/// - resolve: promise resolver
|
|
269
318
|
/// - reject: promise rejector
|
|
270
|
-
func onInboxMessageOpen(_ message:
|
|
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(
|
|
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
|
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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<
|
|
103
|
+
* @return {Promise<AssociatePersonResponse>}
|
|
92
104
|
*/
|
|
93
105
|
function associatePerson(externalPersonId) {
|
|
94
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
159
|
+
* @param inboxMessage - json map of the InboxMessage
|
|
148
160
|
* @return {Promise<void>}
|
|
149
161
|
*/
|
|
150
|
-
function onInboxMessageOpen(
|
|
151
|
-
return
|
|
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
|
|
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
|