react-native-push-signal 0.1.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 (91) hide show
  1. package/LICENSE +20 -0
  2. package/PushSignal.podspec +31 -0
  3. package/README.md +125 -0
  4. package/README.ru.md +125 -0
  5. package/android/CMakeLists.txt +24 -0
  6. package/android/build.gradle +115 -0
  7. package/android/src/main/AndroidManifest.xml +18 -0
  8. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  9. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignal.kt +44 -0
  10. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalCenter.kt +353 -0
  11. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalInitProvider.kt +34 -0
  12. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalMessagingService.kt +15 -0
  13. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalPackage.kt +22 -0
  14. package/ios/PushSignal.swift +38 -0
  15. package/ios/PushSignalCenter.swift +430 -0
  16. package/ios/PushSignalLaunchStore.h +21 -0
  17. package/ios/PushSignalLaunchStore.m +26 -0
  18. package/lib/module/PushSignal.nitro.js +4 -0
  19. package/lib/module/PushSignal.nitro.js.map +1 -0
  20. package/lib/module/index.js +4 -0
  21. package/lib/module/index.js.map +1 -0
  22. package/lib/module/package.json +1 -0
  23. package/lib/module/pushSignal.js +19 -0
  24. package/lib/module/pushSignal.js.map +1 -0
  25. package/lib/module/pushSignal.native.js +46 -0
  26. package/lib/module/pushSignal.native.js.map +1 -0
  27. package/lib/typescript/package.json +1 -0
  28. package/lib/typescript/src/PushSignal.nitro.d.ts +33 -0
  29. package/lib/typescript/src/PushSignal.nitro.d.ts.map +1 -0
  30. package/lib/typescript/src/index.d.ts +3 -0
  31. package/lib/typescript/src/index.d.ts.map +1 -0
  32. package/lib/typescript/src/pushSignal.d.ts +8 -0
  33. package/lib/typescript/src/pushSignal.d.ts.map +1 -0
  34. package/lib/typescript/src/pushSignal.native.d.ts +8 -0
  35. package/lib/typescript/src/pushSignal.native.d.ts.map +1 -0
  36. package/nitro.json +23 -0
  37. package/nitrogen/generated/android/c++/JAndroidFirebaseConfig.hpp +70 -0
  38. package/nitrogen/generated/android/c++/JFunc_void_PushMessage.hpp +80 -0
  39. package/nitrogen/generated/android/c++/JHybridPushSignalSpec.cpp +138 -0
  40. package/nitrogen/generated/android/c++/JHybridPushSignalSpec.hpp +68 -0
  41. package/nitrogen/generated/android/c++/JPermissionStatus.hpp +61 -0
  42. package/nitrogen/generated/android/c++/JPushCredentials.hpp +70 -0
  43. package/nitrogen/generated/android/c++/JPushEnvironment.hpp +58 -0
  44. package/nitrogen/generated/android/c++/JPushMessage.hpp +84 -0
  45. package/nitrogen/generated/android/c++/JPushPlatform.hpp +58 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/AndroidFirebaseConfig.kt +66 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/Func_void_PushMessage.kt +78 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/HybridPushSignalSpec.kt +87 -0
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PermissionStatus.kt +24 -0
  50. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushCredentials.kt +61 -0
  51. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushEnvironment.kt +23 -0
  52. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushMessage.kt +66 -0
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushPlatform.kt +23 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/pushsignalOnLoad.kt +35 -0
  55. package/nitrogen/generated/android/pushsignal+autolinking.cmake +81 -0
  56. package/nitrogen/generated/android/pushsignal+autolinking.gradle +27 -0
  57. package/nitrogen/generated/android/pushsignalOnLoad.cpp +56 -0
  58. package/nitrogen/generated/android/pushsignalOnLoad.hpp +34 -0
  59. package/nitrogen/generated/ios/PushSignal+autolinking.rb +62 -0
  60. package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.cpp +65 -0
  61. package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.hpp +257 -0
  62. package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Umbrella.hpp +66 -0
  63. package/nitrogen/generated/ios/PushSignalAutolinking.mm +33 -0
  64. package/nitrogen/generated/ios/PushSignalAutolinking.swift +26 -0
  65. package/nitrogen/generated/ios/c++/HybridPushSignalSpecSwift.cpp +11 -0
  66. package/nitrogen/generated/ios/c++/HybridPushSignalSpecSwift.hpp +137 -0
  67. package/nitrogen/generated/ios/swift/AndroidFirebaseConfig.swift +96 -0
  68. package/nitrogen/generated/ios/swift/Func_void_PermissionStatus.swift +46 -0
  69. package/nitrogen/generated/ios/swift/Func_void_PushCredentials.swift +46 -0
  70. package/nitrogen/generated/ios/swift/Func_void_PushMessage.swift +46 -0
  71. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  72. package/nitrogen/generated/ios/swift/HybridPushSignalSpec.swift +60 -0
  73. package/nitrogen/generated/ios/swift/HybridPushSignalSpec_cxx.swift +226 -0
  74. package/nitrogen/generated/ios/swift/PermissionStatus.swift +44 -0
  75. package/nitrogen/generated/ios/swift/PushCredentials.swift +45 -0
  76. package/nitrogen/generated/ios/swift/PushEnvironment.swift +40 -0
  77. package/nitrogen/generated/ios/swift/PushMessage.swift +97 -0
  78. package/nitrogen/generated/ios/swift/PushPlatform.swift +40 -0
  79. package/nitrogen/generated/shared/c++/AndroidFirebaseConfig.hpp +96 -0
  80. package/nitrogen/generated/shared/c++/HybridPushSignalSpec.cpp +26 -0
  81. package/nitrogen/generated/shared/c++/HybridPushSignalSpec.hpp +79 -0
  82. package/nitrogen/generated/shared/c++/PermissionStatus.hpp +80 -0
  83. package/nitrogen/generated/shared/c++/PushCredentials.hpp +97 -0
  84. package/nitrogen/generated/shared/c++/PushEnvironment.hpp +76 -0
  85. package/nitrogen/generated/shared/c++/PushMessage.hpp +97 -0
  86. package/nitrogen/generated/shared/c++/PushPlatform.hpp +76 -0
  87. package/package.json +187 -0
  88. package/src/PushSignal.nitro.ts +37 -0
  89. package/src/index.tsx +16 -0
  90. package/src/pushSignal.native.tsx +67 -0
  91. package/src/pushSignal.tsx +32 -0
@@ -0,0 +1,430 @@
1
+ import Foundation
2
+ import ObjectiveC
3
+ import UIKit
4
+ import UserNotifications
5
+
6
+ @objc(PushSignalCenter)
7
+ final class PushSignalCenter: NSObject, UNUserNotificationCenterDelegate {
8
+ @objc static let shared = PushSignalCenter()
9
+
10
+ @objc static func bootstrap(launchOptions: [AnyHashable: Any]?) {
11
+ shared.pendingLaunchOptions = launchOptions
12
+ shared.install()
13
+ }
14
+
15
+ private let lock = NSLock()
16
+ private var didInstall = false
17
+ private var deviceToken: String?
18
+ private var registrationError: Error?
19
+ private var tokenWaiters: [(Result<String, Error>) -> Void] = []
20
+ private var pendingPress: PushMessage?
21
+ private var pendingLaunchOptions: [AnyHashable: Any]?
22
+ private var didCaptureLaunchNotification = false
23
+
24
+ var onMessage: ((PushMessage) -> Void)?
25
+ var onNotificationPress: ((PushMessage) -> Void)? {
26
+ didSet {
27
+ flushPendingPress()
28
+ }
29
+ }
30
+
31
+ func install() {
32
+ DispatchQueue.main.async {
33
+ self.installOnMain()
34
+ }
35
+ }
36
+
37
+ private func installOnMain() {
38
+ guard !didInstall else {
39
+ captureLaunchNotificationIfNeeded()
40
+ return
41
+ }
42
+
43
+ didInstall = true
44
+ UNUserNotificationCenter.current().delegate = self
45
+ swizzleAppDelegate()
46
+ captureLaunchNotificationIfNeeded()
47
+ }
48
+
49
+ func permissionStatus() async -> PermissionStatus {
50
+ await withCheckedContinuation { continuation in
51
+ UNUserNotificationCenter.current().getNotificationSettings { settings in
52
+ continuation.resume(returning: Self.map(settings.authorizationStatus))
53
+ }
54
+ }
55
+ }
56
+
57
+ func requestPermission() async -> PermissionStatus {
58
+ do {
59
+ let granted = try await UNUserNotificationCenter.current()
60
+ .requestAuthorization(options: [.alert, .badge, .sound])
61
+ if granted {
62
+ return await permissionStatus()
63
+ }
64
+
65
+ return await permissionStatus()
66
+ } catch {
67
+ return .denied
68
+ }
69
+ }
70
+
71
+ func fetchCredentials() async throws -> PushCredentials {
72
+ await MainActor.run {
73
+ self.installOnMain()
74
+ UIApplication.shared.registerForRemoteNotifications()
75
+ }
76
+
77
+ let token = try await waitForToken()
78
+ return PushCredentials(
79
+ platform: .ios,
80
+ token: token,
81
+ environment: currentEnvironment()
82
+ )
83
+ }
84
+
85
+ func handleDeviceToken(_ deviceToken: Data) {
86
+ let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
87
+ finishRegistration(result: .success(token))
88
+ }
89
+
90
+ func handleRegistrationError(_ error: Error) {
91
+ finishRegistration(result: .failure(error))
92
+ }
93
+
94
+ func userNotificationCenter(
95
+ _ center: UNUserNotificationCenter,
96
+ willPresent notification: UNNotification,
97
+ withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
98
+ ) {
99
+ emitMessage(Self.message(from: notification))
100
+ completionHandler([])
101
+ }
102
+
103
+ func userNotificationCenter(
104
+ _ center: UNUserNotificationCenter,
105
+ didReceive response: UNNotificationResponse,
106
+ withCompletionHandler completionHandler: @escaping () -> Void
107
+ ) {
108
+ emitPress(Self.message(from: response.notification))
109
+ completionHandler()
110
+ }
111
+
112
+ private func waitForToken() async throws -> String {
113
+ if let deviceToken {
114
+ return deviceToken
115
+ }
116
+
117
+ if let registrationError {
118
+ throw registrationError
119
+ }
120
+
121
+ return try await withCheckedThrowingContinuation { continuation in
122
+ var didResume = false
123
+ let finish: (Result<String, Error>) -> Void = { result in
124
+ guard !didResume else {
125
+ return
126
+ }
127
+ didResume = true
128
+ continuation.resume(with: result)
129
+ }
130
+
131
+ lock.lock()
132
+ if let deviceToken {
133
+ lock.unlock()
134
+ finish(.success(deviceToken))
135
+ return
136
+ }
137
+ if let registrationError {
138
+ lock.unlock()
139
+ finish(.failure(registrationError))
140
+ return
141
+ }
142
+ tokenWaiters.append(finish)
143
+ lock.unlock()
144
+
145
+ DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
146
+ let timeout = NSError(
147
+ domain: "PushSignal",
148
+ code: 1,
149
+ userInfo: [
150
+ NSLocalizedDescriptionKey:
151
+ "APNs registration timed out. Use a physical iOS device and enable the Push Notifications capability.",
152
+ ]
153
+ )
154
+ PushSignalCenter.shared.finishRegistration(result: .failure(timeout))
155
+ }
156
+ }
157
+ }
158
+
159
+ private func finishRegistration(result: Result<String, Error>) {
160
+ lock.lock()
161
+ switch result {
162
+ case let .success(token):
163
+ deviceToken = token
164
+ registrationError = nil
165
+ case let .failure(error):
166
+ if deviceToken == nil {
167
+ registrationError = error
168
+ }
169
+ }
170
+ let waiters = tokenWaiters
171
+ tokenWaiters.removeAll()
172
+ lock.unlock()
173
+
174
+ waiters.forEach { $0(result) }
175
+ }
176
+
177
+ private func emitMessage(_ message: PushMessage) {
178
+ DispatchQueue.main.async {
179
+ self.onMessage?(message)
180
+ }
181
+ }
182
+
183
+ private func emitPress(_ message: PushMessage) {
184
+ DispatchQueue.main.async {
185
+ if let onNotificationPress = self.onNotificationPress {
186
+ onNotificationPress(message)
187
+ } else {
188
+ self.pendingPress = message
189
+ }
190
+ }
191
+ }
192
+
193
+ private func flushPendingPress() {
194
+ DispatchQueue.main.async {
195
+ guard let pendingPress = self.pendingPress, let onNotificationPress = self.onNotificationPress else {
196
+ return
197
+ }
198
+
199
+ self.pendingPress = nil
200
+ onNotificationPress(pendingPress)
201
+ }
202
+ }
203
+
204
+ private func captureLaunchNotificationIfNeeded() {
205
+ guard !didCaptureLaunchNotification else {
206
+ return
207
+ }
208
+
209
+ if pendingLaunchOptions == nil {
210
+ pendingLaunchOptions = PushSignalCopyLaunchOptions() as? [AnyHashable: Any]
211
+ }
212
+
213
+ let launchOptions = pendingLaunchOptions
214
+ guard let launchOptions else {
215
+ return
216
+ }
217
+
218
+ didCaptureLaunchNotification = true
219
+
220
+ let key = UIApplication.LaunchOptionsKey.remoteNotification
221
+ let payload = launchOptions[key] as? [AnyHashable: Any]
222
+ ?? launchOptions[key.rawValue] as? [AnyHashable: Any]
223
+ guard let payload else {
224
+ return
225
+ }
226
+
227
+ emitPress(Self.message(from: payload, fallbackId: "launch"))
228
+ }
229
+
230
+ private func currentEnvironment() -> PushEnvironment {
231
+ if let environment = Self.apsEnvironment() {
232
+ return environment
233
+ }
234
+
235
+ #if DEBUG
236
+ return .sandbox
237
+ #else
238
+ return .production
239
+ #endif
240
+ }
241
+
242
+ private static func apsEnvironment() -> PushEnvironment? {
243
+ guard let url = Bundle.main.url(forResource: "embedded", withExtension: "mobileprovision"),
244
+ let data = try? Data(contentsOf: url),
245
+ let contents = String(data: data, encoding: .ascii),
246
+ let regex = try? NSRegularExpression(
247
+ pattern: "<key>aps-environment</key>\\s*<string>(\\w+)</string>"
248
+ )
249
+ else {
250
+ return nil
251
+ }
252
+
253
+ let range = NSRange(contents.startIndex..<contents.endIndex, in: contents)
254
+ guard let match = regex.firstMatch(in: contents, range: range),
255
+ let valueRange = Range(match.range(at: 1), in: contents)
256
+ else {
257
+ return nil
258
+ }
259
+
260
+ switch contents[valueRange] {
261
+ case "development":
262
+ return .sandbox
263
+ case "production":
264
+ return .production
265
+ default:
266
+ return nil
267
+ }
268
+ }
269
+
270
+ private static func map(_ status: UNAuthorizationStatus) -> PermissionStatus {
271
+ switch status {
272
+ case .authorized, .provisional, .ephemeral:
273
+ return .authorized
274
+ case .denied:
275
+ return .denied
276
+ case .notDetermined:
277
+ return .notdetermined
278
+ @unknown default:
279
+ return .denied
280
+ }
281
+ }
282
+
283
+ private static func message(from notification: UNNotification) -> PushMessage {
284
+ let content = notification.request.content
285
+ return message(
286
+ from: content.userInfo,
287
+ fallbackId: notification.request.identifier,
288
+ title: content.title.isEmpty ? nil : content.title,
289
+ body: content.body.isEmpty ? nil : content.body
290
+ )
291
+ }
292
+
293
+ private static func message(
294
+ from userInfo: [AnyHashable: Any],
295
+ fallbackId: String? = nil,
296
+ title: String? = nil,
297
+ body: String? = nil
298
+ ) -> PushMessage {
299
+ let aps = userInfo["aps"] as? [AnyHashable: Any]
300
+ let alert = aps?["alert"]
301
+ var resolvedTitle = title
302
+ var resolvedBody = body
303
+
304
+ if let alertText = alert as? String {
305
+ resolvedBody = resolvedBody ?? alertText
306
+ } else if let alertDict = alert as? [AnyHashable: Any] {
307
+ resolvedTitle = resolvedTitle ?? stringify(alertDict["title"])
308
+ resolvedBody = resolvedBody ?? stringify(alertDict["body"])
309
+ }
310
+
311
+ var data: [String: String] = [:]
312
+ for (key, value) in userInfo {
313
+ let stringKey = String(describing: key)
314
+ if stringKey == "aps" {
315
+ continue
316
+ }
317
+ if let stringValue = stringify(value) {
318
+ data[stringKey] = stringValue
319
+ }
320
+ }
321
+
322
+ return PushMessage(
323
+ id: stringify(userInfo["gcm.message_id"]) ?? fallbackId,
324
+ title: resolvedTitle,
325
+ body: resolvedBody,
326
+ data: data
327
+ )
328
+ }
329
+
330
+ private static func stringify(_ value: Any?) -> String? {
331
+ guard let value else {
332
+ return nil
333
+ }
334
+ if let value = value as? String {
335
+ return value
336
+ }
337
+ if let value = value as? NSNumber {
338
+ return value.stringValue
339
+ }
340
+ if JSONSerialization.isValidJSONObject(value),
341
+ let data = try? JSONSerialization.data(withJSONObject: value),
342
+ let json = String(data: data, encoding: .utf8)
343
+ {
344
+ return json
345
+ }
346
+ return String(describing: value)
347
+ }
348
+
349
+ private func swizzleAppDelegate() {
350
+ guard let appDelegate = UIApplication.shared.delegate else {
351
+ return
352
+ }
353
+
354
+ let target: AnyClass = type(of: appDelegate)
355
+ let source: AnyClass = PushSignalAppDelegateHook.self
356
+
357
+ swizzle(
358
+ target: target,
359
+ original: #selector(UIApplicationDelegate.application(_:didRegisterForRemoteNotificationsWithDeviceToken:)),
360
+ replacement: #selector(PushSignalAppDelegateHook.pushSignal_application(_:didRegisterForRemoteNotificationsWithDeviceToken:)),
361
+ source: source
362
+ )
363
+ swizzle(
364
+ target: target,
365
+ original: #selector(UIApplicationDelegate.application(_:didFailToRegisterForRemoteNotificationsWithError:)),
366
+ replacement: #selector(PushSignalAppDelegateHook.pushSignal_application(_:didFailToRegisterForRemoteNotificationsWithError:)),
367
+ source: source
368
+ )
369
+ }
370
+
371
+ private func swizzle(target: AnyClass, original: Selector, replacement: Selector, source: AnyClass) {
372
+ guard let replacementMethod = class_getInstanceMethod(source, replacement) else {
373
+ return
374
+ }
375
+
376
+ let replacementImp = method_getImplementation(replacementMethod)
377
+ let types = method_getTypeEncoding(replacementMethod)
378
+
379
+ if class_addMethod(target, original, replacementImp, types) {
380
+ return
381
+ }
382
+
383
+ guard class_addMethod(target, replacement, replacementImp, types),
384
+ let originalMethod = class_getInstanceMethod(target, original),
385
+ let addedReplacement = class_getInstanceMethod(target, replacement)
386
+ else {
387
+ return
388
+ }
389
+
390
+ method_exchangeImplementations(originalMethod, addedReplacement)
391
+ }
392
+ }
393
+
394
+ private final class PushSignalAppDelegateHook: NSObject {
395
+ @objc func pushSignal_application(
396
+ _ application: UIApplication,
397
+ didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
398
+ ) {
399
+ PushSignalCenter.shared.handleDeviceToken(deviceToken)
400
+ let selector = #selector(
401
+ PushSignalAppDelegateHook.pushSignal_application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
402
+ )
403
+ guard responds(to: selector),
404
+ let method = class_getInstanceMethod(type(of: self), selector)
405
+ else {
406
+ return
407
+ }
408
+
409
+ typealias Fn = @convention(c) (Any, Selector, UIApplication, Data) -> Void
410
+ unsafeBitCast(method_getImplementation(method), to: Fn.self)(self, selector, application, deviceToken)
411
+ }
412
+
413
+ @objc func pushSignal_application(
414
+ _ application: UIApplication,
415
+ didFailToRegisterForRemoteNotificationsWithError error: Error
416
+ ) {
417
+ PushSignalCenter.shared.handleRegistrationError(error)
418
+ let selector = #selector(
419
+ PushSignalAppDelegateHook.pushSignal_application(_:didFailToRegisterForRemoteNotificationsWithError:)
420
+ )
421
+ guard responds(to: selector),
422
+ let method = class_getInstanceMethod(type(of: self), selector)
423
+ else {
424
+ return
425
+ }
426
+
427
+ typealias Fn = @convention(c) (Any, Selector, UIApplication, NSError) -> Void
428
+ unsafeBitCast(method_getImplementation(method), to: Fn.self)(self, selector, application, error as NSError)
429
+ }
430
+ }
@@ -0,0 +1,21 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ #ifdef __cplusplus
6
+ extern "C" {
7
+ #endif
8
+
9
+ NSDictionary * _Nullable PushSignalCopyLaunchOptions(void);
10
+
11
+ #ifdef __cplusplus
12
+ }
13
+ #endif
14
+
15
+ @interface PushSignalLaunchStore : NSObject
16
+
17
+ + (nullable NSDictionary *)launchOptions;
18
+
19
+ @end
20
+
21
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,26 @@
1
+ #import "PushSignalLaunchStore.h"
2
+ #import <UIKit/UIKit.h>
3
+
4
+ static NSDictionary *sLaunchOptions;
5
+
6
+ NSDictionary *PushSignalCopyLaunchOptions(void) {
7
+ return sLaunchOptions;
8
+ }
9
+
10
+ @implementation PushSignalLaunchStore
11
+
12
+ + (void)load {
13
+ [[NSNotificationCenter defaultCenter]
14
+ addObserverForName:UIApplicationDidFinishLaunchingNotification
15
+ object:nil
16
+ queue:nil
17
+ usingBlock:^(NSNotification *notification) {
18
+ sLaunchOptions = [notification.userInfo copy];
19
+ }];
20
+ }
21
+
22
+ + (NSDictionary *)launchOptions {
23
+ return sLaunchOptions;
24
+ }
25
+
26
+ @end
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=PushSignal.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["PushSignal.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export { getCredentials, getPermissionStatus, initialize, onMessage, onNotificationPress, requestPermission } from './pushSignal';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getCredentials","getPermissionStatus","initialize","onMessage","onNotificationPress","requestPermission"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAQA,SACEA,cAAc,EACdC,mBAAmB,EACnBC,UAAU,EACVC,SAAS,EACTC,mBAAmB,EACnBC,iBAAiB,QACZ,cAAc","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ export function initialize(_config = {}) {}
4
+ export async function getPermissionStatus() {
5
+ return 'denied';
6
+ }
7
+ export async function requestPermission() {
8
+ return 'denied';
9
+ }
10
+ export async function getCredentials() {
11
+ throw new Error('Push credentials are not supported on web');
12
+ }
13
+ export function onMessage(_listener) {
14
+ return () => {};
15
+ }
16
+ export function onNotificationPress(_listener) {
17
+ return () => {};
18
+ }
19
+ //# sourceMappingURL=pushSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["initialize","_config","getPermissionStatus","requestPermission","getCredentials","Error","onMessage","_listener","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.tsx"],"mappings":";;AAOA,OAAO,SAASA,UAAUA,CAACC,OAA8B,GAAG,CAAC,CAAC,EAAQ,CAAC;AAEvE,OAAO,eAAeC,mBAAmBA,CAAA,EAA8B;EACrE,OAAO,QAAQ;AACjB;AAEA,OAAO,eAAeC,iBAAiBA,CAAA,EAA8B;EACnE,OAAO,QAAQ;AACjB;AAEA,OAAO,eAAeC,cAAcA,CAAA,EAA6B;EAC/D,MAAM,IAAIC,KAAK,CAAC,2CAA2C,CAAC;AAC9D;AAEA,OAAO,SAASC,SAASA,CACvBC,SAAyC,EAC7B;EACZ,OAAO,MAAM,CAAC,CAAC;AACjB;AAEA,OAAO,SAASC,mBAAmBA,CACjCD,SAAyC,EAC7B;EACZ,OAAO,MAAM,CAAC,CAAC;AACjB","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ const PushSignalHybridObject = NitroModules.createHybridObject('PushSignal');
5
+ const messageListeners = new Set();
6
+ const pressListeners = new Set();
7
+ let nativeCallbacksBound = false;
8
+ function bindNativeCallbacks() {
9
+ if (nativeCallbacksBound) {
10
+ return;
11
+ }
12
+ nativeCallbacksBound = true;
13
+ PushSignalHybridObject.setOnMessage(message => {
14
+ messageListeners.forEach(listener => listener(message));
15
+ });
16
+ PushSignalHybridObject.setOnNotificationPress(message => {
17
+ pressListeners.forEach(listener => listener(message));
18
+ });
19
+ }
20
+ export function initialize(config = {}) {
21
+ PushSignalHybridObject.initialize(config);
22
+ }
23
+ export function getPermissionStatus() {
24
+ return PushSignalHybridObject.getPermissionStatus();
25
+ }
26
+ export function requestPermission() {
27
+ return PushSignalHybridObject.requestPermission();
28
+ }
29
+ export function getCredentials() {
30
+ return PushSignalHybridObject.getCredentials();
31
+ }
32
+ export function onMessage(listener) {
33
+ bindNativeCallbacks();
34
+ messageListeners.add(listener);
35
+ return () => {
36
+ messageListeners.delete(listener);
37
+ };
38
+ }
39
+ export function onNotificationPress(listener) {
40
+ bindNativeCallbacks();
41
+ pressListeners.add(listener);
42
+ return () => {
43
+ pressListeners.delete(listener);
44
+ };
45
+ }
46
+ //# sourceMappingURL=pushSignal.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","PushSignalHybridObject","createHybridObject","messageListeners","Set","pressListeners","nativeCallbacksBound","bindNativeCallbacks","setOnMessage","message","forEach","listener","setOnNotificationPress","initialize","config","getPermissionStatus","requestPermission","getCredentials","onMessage","add","delete","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.native.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AASzD,MAAMC,sBAAsB,GAC1BD,YAAY,CAACE,kBAAkB,CAAa,YAAY,CAAC;AAE3D,MAAMC,gBAAgB,GAAG,IAAIC,GAAG,CAAiC,CAAC;AAClE,MAAMC,cAAc,GAAG,IAAID,GAAG,CAAiC,CAAC;AAChE,IAAIE,oBAAoB,GAAG,KAAK;AAEhC,SAASC,mBAAmBA,CAAA,EAAG;EAC7B,IAAID,oBAAoB,EAAE;IACxB;EACF;EAEAA,oBAAoB,GAAG,IAAI;EAE3BL,sBAAsB,CAACO,YAAY,CAAEC,OAAO,IAAK;IAC/CN,gBAAgB,CAACO,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACF,OAAO,CAAC,CAAC;EAC3D,CAAC,CAAC;EAEFR,sBAAsB,CAACW,sBAAsB,CAAEH,OAAO,IAAK;IACzDJ,cAAc,CAACK,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACF,OAAO,CAAC,CAAC;EACzD,CAAC,CAAC;AACJ;AAEA,OAAO,SAASI,UAAUA,CAACC,MAA6B,GAAG,CAAC,CAAC,EAAQ;EACnEb,sBAAsB,CAACY,UAAU,CAACC,MAAM,CAAC;AAC3C;AAEA,OAAO,SAASC,mBAAmBA,CAAA,EAA8B;EAC/D,OAAOd,sBAAsB,CAACc,mBAAmB,CAAC,CAAC;AACrD;AAEA,OAAO,SAASC,iBAAiBA,CAAA,EAA8B;EAC7D,OAAOf,sBAAsB,CAACe,iBAAiB,CAAC,CAAC;AACnD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAA6B;EACzD,OAAOhB,sBAAsB,CAACgB,cAAc,CAAC,CAAC;AAChD;AAEA,OAAO,SAASC,SAASA,CACvBP,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBJ,gBAAgB,CAACgB,GAAG,CAACR,QAAQ,CAAC;EAC9B,OAAO,MAAM;IACXR,gBAAgB,CAACiB,MAAM,CAACT,QAAQ,CAAC;EACnC,CAAC;AACH;AAEA,OAAO,SAASU,mBAAmBA,CACjCV,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBF,cAAc,CAACc,GAAG,CAACR,QAAQ,CAAC;EAC5B,OAAO,MAAM;IACXN,cAAc,CAACe,MAAM,CAACT,QAAQ,CAAC;EACjC,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,33 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ export type PermissionStatus = 'authorized' | 'denied' | 'notDetermined';
3
+ export type PushPlatform = 'ios' | 'android';
4
+ export type PushEnvironment = 'sandbox' | 'production';
5
+ export interface PushCredentials {
6
+ platform: PushPlatform;
7
+ token: string;
8
+ environment?: PushEnvironment;
9
+ }
10
+ export interface PushMessage {
11
+ id?: string;
12
+ title?: string;
13
+ body?: string;
14
+ data: Record<string, string>;
15
+ }
16
+ export interface AndroidFirebaseConfig {
17
+ projectId?: string;
18
+ applicationId?: string;
19
+ apiKey?: string;
20
+ gcmSenderId?: string;
21
+ }
22
+ export interface PushSignal extends HybridObject<{
23
+ ios: 'swift';
24
+ android: 'kotlin';
25
+ }> {
26
+ initialize(config: AndroidFirebaseConfig): void;
27
+ getPermissionStatus(): Promise<PermissionStatus>;
28
+ requestPermission(): Promise<PermissionStatus>;
29
+ getCredentials(): Promise<PushCredentials>;
30
+ setOnMessage(callback: (message: PushMessage) => void): void;
31
+ setOnNotificationPress(callback: (message: PushMessage) => void): void;
32
+ }
33
+ //# sourceMappingURL=PushSignal.nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushSignal.nitro.d.ts","sourceRoot":"","sources":["../../../src/PushSignal.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,QAAQ,GAAG,eAAe,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;AAC7C,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY,CAAC;IAC/C,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;IACA,UAAU,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAChD,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjD,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/C,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,sBAAsB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;CACxE"}
@@ -0,0 +1,3 @@
1
+ export type { AndroidFirebaseConfig, PermissionStatus, PushCredentials, PushEnvironment, PushMessage, PushPlatform, } from './PushSignal.nitro.js';
2
+ export { getCredentials, getPermissionStatus, initialize, onMessage, onNotificationPress, requestPermission, } from './pushSignal';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,uBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AndroidFirebaseConfig, PermissionStatus, PushCredentials, PushMessage } from './PushSignal.nitro.js';
2
+ export declare function initialize(_config?: AndroidFirebaseConfig): void;
3
+ export declare function getPermissionStatus(): Promise<PermissionStatus>;
4
+ export declare function requestPermission(): Promise<PermissionStatus>;
5
+ export declare function getCredentials(): Promise<PushCredentials>;
6
+ export declare function onMessage(_listener: (message: PushMessage) => void): () => void;
7
+ export declare function onNotificationPress(_listener: (message: PushMessage) => void): () => void;
8
+ //# sourceMappingURL=pushSignal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pushSignal.d.ts","sourceRoot":"","sources":["../../../src/pushSignal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACZ,MAAM,uBAAoB,CAAC;AAE5B,wBAAgB,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI,CAAG;AAExE,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAErE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAEnE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAE/D;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACxC,MAAM,IAAI,CAEZ;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACxC,MAAM,IAAI,CAEZ"}
@@ -0,0 +1,8 @@
1
+ import type { AndroidFirebaseConfig, PermissionStatus, PushCredentials, PushMessage } from './PushSignal.nitro.js';
2
+ export declare function initialize(config?: AndroidFirebaseConfig): void;
3
+ export declare function getPermissionStatus(): Promise<PermissionStatus>;
4
+ export declare function requestPermission(): Promise<PermissionStatus>;
5
+ export declare function getCredentials(): Promise<PushCredentials>;
6
+ export declare function onMessage(listener: (message: PushMessage) => void): () => void;
7
+ export declare function onNotificationPress(listener: (message: PushMessage) => void): () => void;
8
+ //# sourceMappingURL=pushSignal.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pushSignal.native.d.ts","sourceRoot":"","sources":["../../../src/pushSignal.native.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEZ,MAAM,uBAAoB,CAAC;AAyB5B,wBAAgB,UAAU,CAAC,MAAM,GAAE,qBAA0B,GAAG,IAAI,CAEnE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAE/D;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAEzD;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACvC,MAAM,IAAI,CAMZ;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACvC,MAAM,IAAI,CAMZ"}
package/nitro.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "cxxNamespace": ["pushsignal"],
3
+ "ios": {
4
+ "iosModuleName": "PushSignal"
5
+ },
6
+ "android": {
7
+ "androidNamespace": ["pushsignal"],
8
+ "androidCxxLibName": "pushsignal"
9
+ },
10
+ "autolinking": {
11
+ "PushSignal": {
12
+ "ios": {
13
+ "language": "swift",
14
+ "implementationClassName": "PushSignal"
15
+ },
16
+ "android": {
17
+ "language": "kotlin",
18
+ "implementationClassName": "PushSignal"
19
+ }
20
+ }
21
+ },
22
+ "ignorePaths": ["node_modules"]
23
+ }