vibes-react-native 1.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.
Files changed (31) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -0
  3. package/android/build.gradle +61 -0
  4. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  5. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  6. package/android/gradlew +185 -0
  7. package/android/gradlew.bat +89 -0
  8. package/android/src/main/AndroidManifest.xml +28 -0
  9. package/android/src/main/java/com/vibes/push/rn/plugin/PushEvtEmitter.java +65 -0
  10. package/android/src/main/java/com/vibes/push/rn/plugin/VibesAppHelper.java +100 -0
  11. package/android/src/main/java/com/vibes/push/rn/plugin/VibesModule.java +327 -0
  12. package/android/src/main/java/com/vibes/push/rn/plugin/VibesPackage.java +28 -0
  13. package/android/src/main/java/com/vibes/push/rn/plugin/notifications/Fms.java +116 -0
  14. package/android/src/main/java/com/vibes/push/rn/plugin/notifications/PayloadWrapper.java +23 -0
  15. package/android/src/main/java/com/vibes/push/rn/plugin/notifications/VibesPushReceiver.java +60 -0
  16. package/ios/Configuration.swift +68 -0
  17. package/ios/Notifications.swift +72 -0
  18. package/ios/Vibes-Bridging-Header.h +2 -0
  19. package/ios/Vibes.m +31 -0
  20. package/ios/Vibes.swift +236 -0
  21. package/ios/Vibes.xcodeproj/project.pbxproj +293 -0
  22. package/ios/VibesClient.swift +35 -0
  23. package/ios/VibesPluginLogger.swift +160 -0
  24. package/lib/commonjs/index.js +53 -0
  25. package/lib/commonjs/index.js.map +1 -0
  26. package/lib/module/index.js +31 -0
  27. package/lib/module/index.js.map +1 -0
  28. package/lib/typescript/index.d.ts +8 -0
  29. package/package.json +149 -0
  30. package/src/index.tsx +48 -0
  31. package/vibes-react-native.podspec +20 -0
@@ -0,0 +1,60 @@
1
+ package com.vibes.push.rn.plugin.notifications;
2
+
3
+ import android.content.Context;
4
+ import android.os.Handler;
5
+ import android.os.Looper;
6
+ import android.util.Log;
7
+
8
+ import com.facebook.react.ReactApplication;
9
+ import com.facebook.react.ReactInstanceManager;
10
+ import com.facebook.react.bridge.ReactContext;
11
+ import com.vibes.push.rn.plugin.VibesModule;
12
+ import com.vibes.push.rn.plugin.PushEvtEmitter;
13
+ import com.vibes.vibes.PushPayloadParser;
14
+ import com.vibes.vibes.Vibes;
15
+ import com.vibes.vibes.VibesReceiver;
16
+
17
+ import static com.vibes.push.rn.plugin.VibesModule.TAG;
18
+
19
+ public class VibesPushReceiver extends VibesReceiver{
20
+
21
+ @Override
22
+ protected void onPushOpened(Context context, PushPayloadParser pushModel) {
23
+ super.onPushOpened(context, pushModel);
24
+ Log.d(TAG, "Push message tapped. Emitting event");
25
+ emitPayload(context, pushModel);
26
+ }
27
+
28
+ private void emitPayload(Context context, PushPayloadParser pushModel) {
29
+ final VibesPushReceiver serviceRef = this;
30
+ // We need to run this on the main thread, as the React code assumes that is true.
31
+ // Namely, DevServerHelper constructs a Handler() without a Looper, which triggers:
32
+ // "Can't create handler inside thread that has not called Looper.prepare()"
33
+ Handler handler = new Handler(Looper.getMainLooper());
34
+ handler.post(new Runnable() {
35
+ public void run() {
36
+ // Construct and load our normal React JS code bundle
37
+ final ReactInstanceManager mReactInstanceManager = ((ReactApplication) context.getApplicationContext()).getReactNativeHost().getReactInstanceManager();
38
+ ReactContext context = mReactInstanceManager.getCurrentReactContext();
39
+ // If it's constructed, send a notification
40
+ if (context != null) {
41
+ PushEvtEmitter pushEmitter = new PushEvtEmitter(context);
42
+ pushEmitter.notifyPushOpened(pushModel);
43
+ } else {
44
+ // Otherwise wait for construction, then send the notification
45
+ mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
46
+ public void onReactContextInitialized(ReactContext context) {
47
+ PushEvtEmitter pushEmitter = new PushEvtEmitter(context);
48
+ pushEmitter.notifyPushOpened(pushModel);
49
+ mReactInstanceManager.removeReactInstanceEventListener(this);
50
+ }
51
+ });
52
+ if (!mReactInstanceManager.hasStartedCreatingInitialContext()) {
53
+ // Construct it in the background
54
+ mReactInstanceManager.createReactContextInBackground();
55
+ }
56
+ }
57
+ }
58
+ });
59
+ }
60
+ }
@@ -0,0 +1,68 @@
1
+ //
2
+ // Configuration.swift
3
+ // Vibes
4
+ //
5
+ // Created by DHwty on 22/04/2022.
6
+ // Copyright © 2022 Facebook. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+
11
+ /// Keys found in <Configuration>.plist file i.e in UAT.plist and Production.plist
12
+ ///
13
+ /// - appBuildNumber: The app build number
14
+ /// - appVersionNumber: The app version number
15
+ /// - vibesAppURL: Vibes app url
16
+ /// - vibesAppId: Vibes app id
17
+ /// - vibesAppEnv: Vibes app env: UAT or PROD
18
+ /// - logseneToken: Logsene token
19
+ public enum ConfigKey {
20
+ case appBuildNumber
21
+ case appVersionNumber
22
+ case vibesApiURL
23
+ case vibesAppId
24
+ case vibesAppEnv
25
+ case logseneToken
26
+
27
+ /// Actual string vakue for this enum as used in plist file
28
+ ///
29
+ /// - Returns: The string value
30
+ func value() -> String {
31
+ switch self {
32
+ case .appBuildNumber:
33
+ return "CFBundleShortVersionString"
34
+ case .appVersionNumber:
35
+ return "CFBundleVersion"
36
+ case .vibesApiURL:
37
+ return "VibesApiURL"
38
+ case .vibesAppEnv:
39
+ return "VibesAppEnv"
40
+ case .vibesAppId:
41
+ return "VibesAppId"
42
+ case .logseneToken:
43
+ return "LogseneToken"
44
+ }
45
+ }
46
+ }
47
+
48
+ /// This struct will load the plist file for current build
49
+ public struct Configuration {
50
+
51
+ fileprivate static var infoDict: [String: Any] {
52
+ get {
53
+ if let dict = Bundle.main.infoDictionary {
54
+ return dict
55
+ } else {
56
+ fatalError("Plist file not found")
57
+ }
58
+ }
59
+ }
60
+
61
+ /// Get the config value of a certain config key from current configuration
62
+ ///
63
+ /// - Parameter key: The key to get value for
64
+ /// - Returns: The value or nil if not found
65
+ public static func configValue(_ key: ConfigKey) -> String? {
66
+ return infoDict[key.value()] as? String
67
+ }
68
+ }
@@ -0,0 +1,72 @@
1
+ //
2
+ // Notifications.swift
3
+ // Vibes
4
+ //
5
+ // Created by DHwty on 22/04/2022.
6
+ // Copyright © 2022 Facebook. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+ import UserNotifications
11
+
12
+ @objc(Notifications)
13
+ @available(iOS 10.0, *)
14
+ class Notifications: NSObject {
15
+ let current = UNUserNotificationCenter.current()
16
+
17
+ @objc
18
+ static func requiresMainQueueSetup() -> Bool {
19
+ return true
20
+ }
21
+
22
+ @objc(isPushEnabled:reject:)
23
+ func isPushEnabled(resolve: @escaping RCTPromiseResolveBlock,
24
+ rejecter reject: @escaping RCTPromiseRejectBlock) -> Void{
25
+ current.getNotificationSettings { (settings) in
26
+ if settings.authorizationStatus == .notDetermined {
27
+ resolve("Notifications not determined")
28
+ } else if settings.authorizationStatus == .denied {
29
+ resolve("Notifications denied")
30
+ } else if settings.authorizationStatus == .authorized {
31
+ resolve(true)
32
+ }
33
+ }
34
+ }
35
+
36
+ @objc(getDeviceId:reject:)
37
+ func getDeviceId(resolve: @escaping RCTPromiseResolveBlock,
38
+ rejecter reject: @escaping RCTPromiseRejectBlock) -> Void{
39
+ let deviceID = getDeviceId()
40
+ resolve(deviceID)
41
+ }
42
+
43
+ private func getDeviceId (_ tries: Int = 0) -> String? {
44
+ if let deviceID = UserDefaults.standard.vibesDeviceId {
45
+ return deviceID
46
+ } else {
47
+ if tries == 5 {
48
+ print("Error: Unable to get a string after 25secs delay")
49
+ return nil
50
+ }
51
+ sleep(5)
52
+ return getDeviceId(tries + 1)
53
+ }
54
+ }
55
+
56
+ @objc(getEnvironment:reject:)
57
+ func getEnvironment(resolve: @escaping RCTPromiseResolveBlock,
58
+ rejecter reject: @escaping RCTPromiseRejectBlock) -> Void{
59
+ let env = Configuration.configValue(.vibesAppEnv)
60
+ resolve(env)
61
+ }
62
+ }
63
+
64
+ // MARK: - UserDefaults helpers
65
+ extension UserDefaults {
66
+
67
+ /// The vibes device id, if stored in this UserDefaults, else nil
68
+ public var vibesDeviceId: String? {
69
+ return self.string(forKey: "vibesDeviceId")
70
+ }
71
+
72
+ }
@@ -0,0 +1,2 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
package/ios/Vibes.m ADDED
@@ -0,0 +1,31 @@
1
+ #import <React/RCTBridgeModule.h>
2
+
3
+ @interface RCT_EXTERN_MODULE(Vibes, NSObject)
4
+
5
+ RCT_EXTERN_METHOD(registerDevice: (RCTPromiseResolveBlock *)resolve
6
+ rejecter:(RCTPromiseRejectBlock *)reject)
7
+
8
+ RCT_EXTERN_METHOD(unregisterDevice: (RCTPromiseResolveBlock *)resolve
9
+ rejecter:(RCTPromiseRejectBlock *)reject)
10
+
11
+ RCT_EXTERN_METHOD(registerPush: (RCTPromiseResolveBlock *)resolve
12
+ rejecter:(RCTPromiseRejectBlock *)reject)
13
+
14
+ RCT_EXTERN_METHOD(unregisterPush: (RCTPromiseResolveBlock *)resolve
15
+ rejecter:(RCTPromiseRejectBlock *)reject)
16
+
17
+ RCT_EXTERN_METHOD(getVibesDeviceInfo: (RCTPromiseResolveBlock *)resolve
18
+ rejecter:(RCTPromiseRejectBlock *)reject)
19
+
20
+ RCT_EXTERN_METHOD(associatePerson: (NSString *) externalPersonId
21
+ resolver:(RCTPromiseResolveBlock *)resolve
22
+ rejecter:(RCTPromiseRejectBlock *)reject)
23
+
24
+ RCT_EXTERN_METHOD(updateDevice: (BOOL ) updateCredentials
25
+ lat:(nonnull NSNumber *)lat
26
+ lon:(nonnull NSNumber *)lon
27
+ resolver:(RCTPromiseResolveBlock *)resolve
28
+ rejecter:(RCTPromiseRejectBlock *)reject)
29
+
30
+ @end
31
+
@@ -0,0 +1,236 @@
1
+ import Foundation
2
+ import UserNotifications
3
+ import VibesPush
4
+
5
+ @objc(Vibes)
6
+ class Vibes: NSObject, RCTBridgeModule, VibesPush.VibesAPIDelegate {
7
+ static func moduleName() -> String! {
8
+ return "Vibes"
9
+ }
10
+
11
+ let userDefaults = UserDefaults.standard
12
+
13
+ var vibes: VibesPush.Vibes
14
+ var registerDeviceResolver: RCTPromiseResolveBlock?
15
+ var registerDeviceRejecter: RCTPromiseRejectBlock?
16
+ var unregisterDeviceResolver: RCTPromiseResolveBlock?
17
+ var unregisterDeviceRejecter: RCTPromiseRejectBlock?
18
+
19
+ var registerPushResolver: RCTPromiseResolveBlock?
20
+ var registerPushRejecter: RCTPromiseRejectBlock?
21
+ var unregisterPushResolver: RCTPromiseResolveBlock?
22
+ var unregisterPushRejecter: RCTPromiseRejectBlock?
23
+ var associatePersonResolver: RCTPromiseResolveBlock?
24
+ var associatePersonRejecter: RCTPromiseRejectBlock?
25
+ var updateDeviceResolver: RCTPromiseResolveBlock?
26
+ var updateDeviceRejecter: RCTPromiseRejectBlock?
27
+
28
+ static func requiresMainQueueSetup() -> Bool {
29
+ return true
30
+ }
31
+
32
+ override init() {
33
+ vibes = VibesClient.standard.vibes
34
+ super.init()
35
+
36
+ vibes.delegate = self
37
+ vibes.registerDevice()
38
+ }
39
+
40
+ // MARK: - Register device
41
+
42
+ @objc
43
+ /// Register Device
44
+ /// - Parameters:
45
+ /// - resolve: promise resolver
46
+ /// - reject: promise rejecter
47
+ func registerDevice(_ resolve: @escaping RCTPromiseResolveBlock,
48
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
49
+ registerDeviceResolver = resolve
50
+ registerDeviceRejecter = reject
51
+ if vibes.isDeviceRegistered(),
52
+ let registerDeviceResolver = registerDeviceResolver,
53
+ let deviceId = userDefaults.object(forKey: "vibesDeviceId") {
54
+ registerDeviceResolver(["device_id": deviceId])
55
+ return
56
+ }
57
+ vibes.registerDevice()
58
+ }
59
+
60
+ @objc
61
+ /// Un-register Device
62
+ /// - Parameters:
63
+ /// - resolve: promise resolver
64
+ /// - reject: promise rejecter
65
+ func unregisterDevice(_ resolve: @escaping RCTPromiseResolveBlock,
66
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
67
+ unregisterDeviceResolver = resolve
68
+ unregisterDeviceRejecter = reject
69
+ vibes.unregisterDevice()
70
+ }
71
+
72
+ @objc
73
+ /// Register Push
74
+ /// - Parameters:
75
+ /// - resolve: promise resolver
76
+ /// - reject: promise rejecter
77
+ func registerPush(_ resolve: @escaping RCTPromiseResolveBlock,
78
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
79
+ registerPushResolver = resolve
80
+ registerPushRejecter = reject
81
+ if vibes.isDeviceRegistered() {
82
+ vibes.registerPush()
83
+ } else {
84
+ if let registerPushRejecter = registerPushRejecter {
85
+ registerPushRejecter("REGISTER_PUSH_ERROR", "Device Not Registered: \(VibesError.noCredentials)", VibesError.noCredentials)
86
+ }
87
+ }
88
+ }
89
+
90
+ @objc
91
+ /// Un-register Push
92
+ /// - Parameters:
93
+ /// - resolve: promise resolver
94
+ /// - reject: promise rejecter
95
+ func unregisterPush(_ resolve: @escaping RCTPromiseResolveBlock,
96
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
97
+ unregisterPushResolver = resolve
98
+ unregisterPushRejecter = reject
99
+ if vibes.isDevicePushRegistered() {
100
+ vibes.unregisterPush()
101
+ } else {
102
+ if let unregisterPushRejecter = unregisterPushRejecter {
103
+ unregisterPushRejecter("UNREGISTER_PUSH_ERROR", "Push Not Registered: \(VibesError.noPushToken)", VibesError.noPushToken)
104
+ }
105
+ }
106
+ }
107
+
108
+ @objc
109
+ /// Associate device to person
110
+ /// - Parameters:
111
+ /// - externalPersonId: External person ID
112
+ /// - resolve: promise resolver
113
+ /// - reject: promise rejecter
114
+ func associatePerson(_ externalPersonId: String, resolver resolve: @escaping RCTPromiseResolveBlock,
115
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
116
+ associatePersonResolver = resolve
117
+ associatePersonRejecter = reject
118
+ vibes.associatePerson(externalPersonId: externalPersonId)
119
+ }
120
+
121
+ @objc
122
+ /// Update device
123
+ /// - Parameters:
124
+ /// - updateCredentials: a boolean indicating if it's a token update or device info update. Specify false if not certain
125
+ /// - lat: Latitude
126
+ /// - lon: Longitude
127
+ /// - resolve: promise resolver
128
+ /// - reject: promise rejecter
129
+ func updateDevice(_ updateCredentials: Bool, lat: NSNumber, lon: NSNumber, resolver resolve: @escaping RCTPromiseResolveBlock,
130
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
131
+ updateDeviceResolver = resolve
132
+ updateDeviceRejecter = reject
133
+ vibes.updateDevice(lat: lat, long: lon, updateCredentials: updateCredentials)
134
+ }
135
+
136
+ @objc
137
+ /// Get Vibes Device Info
138
+ /// - Parameters:
139
+ /// - resolve: promose resolver
140
+ /// - reject: promise rejector
141
+ func getVibesDeviceInfo(_ resolve: @escaping RCTPromiseResolveBlock,
142
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
143
+ if let deviceId = userDefaults.object(forKey: "vibesDeviceId") {
144
+ if let pushToken = vibes.pushToken {
145
+ resolve(["device_id": deviceId, "push_token": pushToken])
146
+ return
147
+ }
148
+ resolve(["device_id": deviceId])
149
+ }
150
+ }
151
+
152
+ func didRegisterDevice(deviceId: String?, error: Error?) {
153
+ if let error = error {
154
+ if let registerDeviceRejecter = registerDeviceRejecter {
155
+ registerDeviceRejecter("REGISTER_DEVICE_ERROR", error.localizedDescription, error)
156
+ }
157
+ } else {
158
+ if let registerDeviceResolver = registerDeviceResolver {
159
+ userDefaults.set(deviceId, forKey: "vibesDeviceId")
160
+ registerDeviceResolver(["device_id": deviceId])
161
+ }
162
+ NotificationCenter.default.post(name: Notification.Name.vibesDeviceRegistered, object: deviceId)
163
+ }
164
+ registerDeviceRejecter = nil
165
+ registerDeviceResolver = nil
166
+ }
167
+
168
+ func didUnregisterDevice(error: Error?) {
169
+ if let error = error {
170
+ if let unregisterDeviceRejecter = unregisterDeviceRejecter {
171
+ unregisterDeviceRejecter("UNREGISTER_DEVICE_ERROR", error.localizedDescription, error)
172
+ }
173
+ } else {
174
+ if let unregisterDeviceResolver = unregisterDeviceResolver {
175
+ userDefaults.removeObject(forKey: "vibesDeviceId")
176
+ unregisterDeviceResolver(["success"])
177
+ }
178
+ NotificationCenter.default.post(name: Notification.Name.vibesDeviceUnregistered, object: nil)
179
+ }
180
+ unregisterDeviceRejecter = nil
181
+ unregisterDeviceResolver = nil
182
+ }
183
+
184
+ func didRegisterPush(error: Error?) {
185
+ if let error = error {
186
+ if let registerPushRejecter = registerPushRejecter {
187
+ registerPushRejecter("REGISTER_PUSH_ERROR", error.localizedDescription, error)
188
+ }
189
+ } else {
190
+ if let registerPushResolver = registerPushResolver {
191
+ registerPushResolver("Successs")
192
+ }
193
+ NotificationCenter.default.post(name: Notification.Name.vibesPushRegistered, object: vibes.pushToken)
194
+ }
195
+ registerPushRejecter = nil
196
+ registerPushResolver = nil
197
+ }
198
+
199
+ func didUnregisterPush(error: Error?) {
200
+ if let error = error {
201
+ if let unregisterPushRejecter = unregisterPushRejecter {
202
+ unregisterPushRejecter("UNREGISTER_PUSH_ERROR", error.localizedDescription, error)
203
+ }
204
+ } else {
205
+ if let unregisterPushResolver = unregisterPushResolver {
206
+ unregisterPushResolver("Successs")
207
+ }
208
+ NotificationCenter.default.post(name: Notification.Name.vibesPushUnregistered, object: nil)
209
+ }
210
+ unregisterPushRejecter = nil
211
+ unregisterPushResolver = nil
212
+ }
213
+
214
+ func didAssociatePerson(error: Error?) {
215
+ if let error = error {
216
+ if let associatePersonRejecter = associatePersonRejecter {
217
+ associatePersonRejecter("ASSOCIATE_PERSON_ERROR", error.localizedDescription, error)
218
+ }
219
+ } else {
220
+ if let associatePersonResolver = associatePersonResolver {
221
+ associatePersonResolver("Successs")
222
+ }
223
+ NotificationCenter.default.post(name: Notification.Name.vibesPushDidAssociatePerson, object: nil)
224
+ }
225
+ associatePersonRejecter = nil
226
+ associatePersonResolver = nil
227
+ }
228
+ }
229
+
230
+ extension Notification.Name {
231
+ static let vibesDeviceRegistered = Notification.Name("vibesDeviceRegistered")
232
+ static let vibesDeviceUnregistered = Notification.Name("vibesDeviceUnregistered")
233
+ static let vibesPushRegistered = Notification.Name("vibesPushRegistered")
234
+ static let vibesPushUnregistered = Notification.Name("vibesPushUnregistered")
235
+ static let vibesPushDidAssociatePerson = Notification.Name("vibesPushDidAssociatePerson")
236
+ }