react-native-push-signal 0.1.0 → 0.1.1

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 (49) hide show
  1. package/README.md +24 -18
  2. package/README.ru.md +24 -18
  3. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignal.kt +9 -15
  4. package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalCenter.kt +33 -104
  5. package/ios/PushSignal.swift +2 -11
  6. package/ios/PushSignalCenter.swift +0 -35
  7. package/lib/module/index.js +1 -1
  8. package/lib/module/index.js.map +1 -1
  9. package/lib/module/pushSignal.js +1 -7
  10. package/lib/module/pushSignal.js.map +1 -1
  11. package/lib/module/pushSignal.native.js +1 -7
  12. package/lib/module/pushSignal.native.js.map +1 -1
  13. package/lib/typescript/src/PushSignal.nitro.d.ts +7 -9
  14. package/lib/typescript/src/PushSignal.nitro.d.ts.map +1 -1
  15. package/lib/typescript/src/index.d.ts +2 -2
  16. package/lib/typescript/src/index.d.ts.map +1 -1
  17. package/lib/typescript/src/pushSignal.d.ts +2 -4
  18. package/lib/typescript/src/pushSignal.d.ts.map +1 -1
  19. package/lib/typescript/src/pushSignal.native.d.ts +2 -4
  20. package/lib/typescript/src/pushSignal.native.d.ts.map +1 -1
  21. package/nitrogen/generated/android/c++/JAndroidFirebaseConfig.hpp +16 -16
  22. package/nitrogen/generated/android/c++/JHybridPushSignalSpec.cpp +7 -31
  23. package/nitrogen/generated/android/c++/JHybridPushSignalSpec.hpp +1 -3
  24. package/nitrogen/generated/android/c++/JPushPlatform.hpp +3 -3
  25. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/AndroidFirebaseConfig.kt +14 -14
  26. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/HybridPushSignalSpec.kt +1 -9
  27. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushPlatform.kt +1 -1
  28. package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.cpp +5 -5
  29. package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.hpp +49 -52
  30. package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Umbrella.hpp +0 -3
  31. package/nitrogen/generated/ios/c++/HybridPushSignalSpecSwift.hpp +2 -19
  32. package/nitrogen/generated/ios/swift/AndroidFirebaseConfig.swift +17 -17
  33. package/nitrogen/generated/ios/swift/{Func_void_PermissionStatus.swift → Func_void.swift} +11 -11
  34. package/nitrogen/generated/ios/swift/HybridPushSignalSpec.swift +1 -3
  35. package/nitrogen/generated/ios/swift/HybridPushSignalSpec_cxx.swift +8 -38
  36. package/nitrogen/generated/ios/swift/PushPlatform.swift +4 -4
  37. package/nitrogen/generated/shared/c++/AndroidFirebaseConfig.hpp +17 -17
  38. package/nitrogen/generated/shared/c++/HybridPushSignalSpec.cpp +0 -2
  39. package/nitrogen/generated/shared/c++/HybridPushSignalSpec.hpp +2 -7
  40. package/nitrogen/generated/shared/c++/PushPlatform.hpp +4 -4
  41. package/package.json +2 -2
  42. package/src/PushSignal.nitro.ts +7 -9
  43. package/src/index.tsx +0 -3
  44. package/src/pushSignal.native.tsx +2 -11
  45. package/src/pushSignal.tsx +3 -10
  46. package/nitrogen/generated/android/c++/JPermissionStatus.hpp +0 -61
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PermissionStatus.kt +0 -24
  48. package/nitrogen/generated/ios/swift/PermissionStatus.swift +0 -44
  49. package/nitrogen/generated/shared/c++/PermissionStatus.hpp +0 -80
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  English | [Русский](README.ru.md)
4
4
 
5
- Get push permission, device credentials for your server, and listen for incoming notifications or taps. The library does not send pushes — your backend talks to APNs and FCM.
5
+ Get device credentials for your server and listen for incoming notifications or taps. The library does not send pushes — your backend talks to APNs and FCM. Request notification permission yourself with [`react-native-permissions`](https://github.com/zoontek/react-native-permissions).
6
6
 
7
7
  ## Installation
8
8
 
@@ -15,24 +15,30 @@ npm install react-native-push-signal react-native-nitro-modules
15
15
  ## Usage
16
16
 
17
17
  ```ts
18
+ import {
19
+ checkNotifications,
20
+ requestNotifications,
21
+ RESULTS,
22
+ } from 'react-native-permissions';
18
23
  import {
19
24
  getCredentials,
20
- getPermissionStatus,
21
25
  initialize,
22
26
  onMessage,
23
27
  onNotificationPress,
24
- requestPermission,
25
28
  } from 'react-native-push-signal';
26
29
 
27
- initialize({
28
- projectId: 'my-project',
29
- applicationId: '1:123456789:android:abcd',
30
- apiKey: 'AIza...',
31
- gcmSenderId: '123456789',
30
+ await initialize({
31
+ project_id: 'my-project',
32
+ mobilesdk_app_id: '1:123456789:android:abcd',
33
+ current_key: 'AIza...',
34
+ project_number: '123456789',
32
35
  });
33
36
 
34
- const status = await getPermissionStatus();
35
- const afterRequest = await requestPermission();
37
+ const { status } = await checkNotifications();
38
+ if (status !== RESULTS.GRANTED) {
39
+ await requestNotifications(['alert', 'badge', 'sound']);
40
+ }
41
+
36
42
  const credentials = await getCredentials();
37
43
  // POST credentials to your server: { platform, token, environment? }
38
44
 
@@ -75,15 +81,15 @@ Remote Android pushes go through FCM. You can either pass the client Firebase fi
75
81
  Call `initialize` with values from `google-services.json` (not a service account):
76
82
 
77
83
  ```ts
78
- initialize({
79
- projectId: '...', // project_id
80
- applicationId: '...', // mobilesdk_app_id
81
- apiKey: '...', // current_key
82
- gcmSenderId: '...', // project_number
84
+ await initialize({
85
+ project_id: '...',
86
+ mobilesdk_app_id: '...',
87
+ current_key: '...',
88
+ project_number: '...',
83
89
  });
84
90
  ```
85
91
 
86
- All four fields are required for Firebase to start. If any is missing, `initialize` does nothing and does not throw. iOS ignores this call.
92
+ All four fields are required for Firebase to start. If any is missing, `initialize` resolves and does nothing. iOS ignores the config and still resolves the promise.
87
93
 
88
94
  Keep the Firebase service account on your server. Do not put it in the app.
89
95
 
@@ -100,7 +106,7 @@ apply plugin: "com.google.gms.google-services"
100
106
 
101
107
  3. Add the plugin classpath in `android/build.gradle` / `settings.gradle` as in the [Firebase Android setup](https://firebase.google.com/docs/android/setup).
102
108
 
103
- Without `initialize(...)` or that file, `getCredentials()` throws. Notification permission (`POST_NOTIFICATIONS`) is requested on API 33+.
109
+ Without `initialize(...)` or that file, `getCredentials()` throws.
104
110
 
105
111
  If the host app already declares its own `FirebaseMessagingService`, only one service can handle `com.google.firebase.MESSAGING_EVENT`. Prefer this library’s service or forward events into it.
106
112
 
@@ -112,7 +118,7 @@ If the host app already declares its own `FirebaseMessagingService`, only one se
112
118
 
113
119
  ## Web
114
120
 
115
- Permission helpers resolve to `denied`. `getCredentials()` throws. Listeners are no-ops.
121
+ `initialize()` resolves. `getCredentials()` throws. Listeners are no-ops.
116
122
 
117
123
  ## Contributing
118
124
 
package/README.ru.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | Русский
4
4
 
5
- Библиотека запрашивает разрешение на пуши, отдаёт токен устройства для вашего сервера и сообщает о входящем уведомлении или нажатии на него. Сами пуши она не отправляет — в APNs и FCM ходит бэкенд.
5
+ Библиотека отдаёт токен устройства для вашего сервера и сообщает о входящем уведомлении или нажатии на него. Сами пуши она не отправляет — в APNs и FCM ходит бэкенд. Разрешение на уведомления запрашивайте сами через [`react-native-permissions`](https://github.com/zoontek/react-native-permissions).
6
6
 
7
7
  ## Установка
8
8
 
@@ -15,24 +15,30 @@ npm install react-native-push-signal react-native-nitro-modules
15
15
  ## Использование
16
16
 
17
17
  ```ts
18
+ import {
19
+ checkNotifications,
20
+ requestNotifications,
21
+ RESULTS,
22
+ } from 'react-native-permissions';
18
23
  import {
19
24
  getCredentials,
20
- getPermissionStatus,
21
25
  initialize,
22
26
  onMessage,
23
27
  onNotificationPress,
24
- requestPermission,
25
28
  } from 'react-native-push-signal';
26
29
 
27
- initialize({
28
- projectId: 'my-project',
29
- applicationId: '1:123456789:android:abcd',
30
- apiKey: 'AIza...',
31
- gcmSenderId: '123456789',
30
+ await initialize({
31
+ project_id: 'my-project',
32
+ mobilesdk_app_id: '1:123456789:android:abcd',
33
+ current_key: 'AIza...',
34
+ project_number: '123456789',
32
35
  });
33
36
 
34
- const status = await getPermissionStatus();
35
- const afterRequest = await requestPermission();
37
+ const { status } = await checkNotifications();
38
+ if (status !== RESULTS.GRANTED) {
39
+ await requestNotifications(['alert', 'badge', 'sound']);
40
+ }
41
+
36
42
  const credentials = await getCredentials();
37
43
  // POST credentials на сервер: { platform, token, environment? }
38
44
 
@@ -75,15 +81,15 @@ const stopPress = onNotificationPress((message) => {
75
81
  Вызовите `initialize` со значениями из `google-services.json` (не из service account):
76
82
 
77
83
  ```ts
78
- initialize({
79
- projectId: '...', // project_id
80
- applicationId: '...', // mobilesdk_app_id
81
- apiKey: '...', // current_key
82
- gcmSenderId: '...', // project_number
84
+ await initialize({
85
+ project_id: '...',
86
+ mobilesdk_app_id: '...',
87
+ current_key: '...',
88
+ project_number: '...',
83
89
  });
84
90
  ```
85
91
 
86
- Нужны все четыре поля. Если чего-то нет, `initialize` тихо ничего не делает и не бросает ошибку. На iOS вызов игнорируется.
92
+ Нужны все четыре поля. Если чего-то нет, `initialize` резолвится и ничего не делает. На iOS конфиг игнорируется, промис всё равно резолвится.
87
93
 
88
94
  Service account Firebase оставляйте на сервере. В приложение его класть нельзя.
89
95
 
@@ -100,7 +106,7 @@ apply plugin: "com.google.gms.google-services"
100
106
 
101
107
  3. Добавьте classpath плагина в `android/build.gradle` / `settings.gradle` по [инструкции Firebase для Android](https://firebase.google.com/docs/android/setup).
102
108
 
103
- Без `initialize(...)` или этого файла `getCredentials()` бросит ошибку. Разрешение на уведомления (`POST_NOTIFICATIONS`) запрашивается на API 33+.
109
+ Без `initialize(...)` или этого файла `getCredentials()` бросит ошибку.
104
110
 
105
111
  Если в хост-приложении уже есть свой `FirebaseMessagingService`, обработать `com.google.firebase.MESSAGING_EVENT` может только один сервис. Оставьте сервис этой библиотеки или пробрасывайте события в него.
106
112
 
@@ -112,7 +118,7 @@ apply plugin: "com.google.gms.google-services"
112
118
 
113
119
  ## Web
114
120
 
115
- Методы разрешения возвращают `denied`. `getCredentials()` бросает ошибку. Слушатели ничего не делают.
121
+ `initialize()` резолвится. `getCredentials()` бросает ошибку. Слушатели ничего не делают.
116
122
 
117
123
  ## Contributing
118
124
 
@@ -5,20 +5,14 @@ import com.margelo.nitro.core.Promise
5
5
 
6
6
  @DoNotStrip
7
7
  class PushSignal : HybridPushSignalSpec() {
8
- override fun initialize(config: AndroidFirebaseConfig) {
9
- PushSignalCenter.initialize(config)
10
- }
11
-
12
- override fun getPermissionStatus(): Promise<PermissionStatus> {
13
- return Promise.async {
14
- PushSignalCenter.getPermissionStatus()
15
- }
16
- }
17
-
18
- override fun requestPermission(): Promise<PermissionStatus> {
19
- val promise = Promise<PermissionStatus>()
20
- PushSignalCenter.requestPermission { status ->
21
- promise.resolve(status)
8
+ override fun initialize(config: AndroidFirebaseConfig): Promise<Unit> {
9
+ val promise = Promise<Unit>()
10
+ PushSignalCenter.initialize(config) { error ->
11
+ if (error == null) {
12
+ promise.resolve(Unit)
13
+ } else {
14
+ promise.reject(error)
15
+ }
22
16
  }
23
17
  return promise
24
18
  }
@@ -27,7 +21,7 @@ class PushSignal : HybridPushSignalSpec() {
27
21
  return Promise.async {
28
22
  val token = PushSignalCenter.fetchToken()
29
23
  PushCredentials(
30
- PushPlatform.ANDROID,
24
+ PushPlatform.ANDROID_OS,
31
25
  token,
32
26
  null
33
27
  )
@@ -1,18 +1,11 @@
1
1
  package com.margelo.nitro.pushsignal
2
2
 
3
- import android.Manifest
4
3
  import android.app.Activity
5
4
  import android.app.Application
6
5
  import android.content.Context
7
6
  import android.content.Intent
8
- import android.content.pm.PackageManager
9
- import android.os.Build
10
7
  import android.os.Bundle
11
8
  import androidx.activity.ComponentActivity
12
- import androidx.activity.result.ActivityResultLauncher
13
- import androidx.activity.result.contract.ActivityResultContracts
14
- import androidx.core.app.NotificationManagerCompat
15
- import androidx.core.content.ContextCompat
16
9
  import com.google.firebase.FirebaseApp
17
10
  import com.google.firebase.FirebaseOptions
18
11
  import com.google.firebase.messaging.FirebaseMessaging
@@ -23,21 +16,17 @@ import java.util.WeakHashMap
23
16
  import java.util.concurrent.CopyOnWriteArrayList
24
17
 
25
18
  internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
26
- private const val PREFS_NAME = "pushsignal"
27
- private const val PREF_ASKED_PERMISSION = "asked_notifications"
28
19
  private const val EXTRA_HANDLED = "pushsignal.handled"
29
- private const val PERMISSION_LAUNCHER_KEY = "com.margelo.nitro.pushsignal.permission"
30
20
 
31
21
  private val lock = Any()
32
22
  @Volatile private var application: Application? = null
33
23
  @Volatile private var currentActivity: Activity? = null
34
- @Volatile private var permissionLauncher: ActivityResultLauncher<String>? = null
35
24
  @Volatile private var onMessage: ((PushMessage) -> Unit)? = null
36
25
  @Volatile private var onNotificationPress: ((PushMessage) -> Unit)? = null
37
26
  @Volatile private var pendingPress: PushMessage? = null
38
- private val permissionWaiters = CopyOnWriteArrayList<(PermissionStatus) -> Unit>()
39
27
  private val registeredActivities = Collections.newSetFromMap(WeakHashMap<Activity, Boolean>())
40
28
  @Volatile private var pendingFirebaseConfig: AndroidFirebaseConfig? = null
29
+ private val initializeWaiters = CopyOnWriteArrayList<(Exception?) -> Unit>()
41
30
 
42
31
  fun attach(context: Context) {
43
32
  val app = context.applicationContext as? Application ?: return
@@ -54,22 +43,24 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
54
43
  }
55
44
  pendingFirebaseConfig?.let { config ->
56
45
  pendingFirebaseConfig = null
57
- applyFirebaseConfig(app, config)
46
+ finishInitialize(applyFirebaseConfig(app, config))
58
47
  }
59
48
  }
60
49
 
61
- fun initialize(config: AndroidFirebaseConfig) {
50
+ fun initialize(config: AndroidFirebaseConfig, onDone: (Exception?) -> Unit) {
62
51
  if (!config.hasRequiredFields()) {
52
+ onDone(null)
63
53
  return
64
54
  }
65
55
 
66
56
  val context = application
67
57
  if (context == null) {
68
58
  pendingFirebaseConfig = config
59
+ initializeWaiters.add(onDone)
69
60
  return
70
61
  }
71
62
 
72
- applyFirebaseConfig(context, config)
63
+ onDone(applyFirebaseConfig(context, config))
73
64
  }
74
65
 
75
66
  fun setOnMessage(callback: (PushMessage) -> Unit) {
@@ -88,60 +79,6 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
88
79
  }
89
80
  }
90
81
 
91
- fun getPermissionStatus(): PermissionStatus {
92
- val context = application ?: return PermissionStatus.NOTDETERMINED
93
- val notificationsEnabled = NotificationManagerCompat.from(context).areNotificationsEnabled()
94
-
95
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
96
- return if (notificationsEnabled) {
97
- PermissionStatus.AUTHORIZED
98
- } else {
99
- PermissionStatus.DENIED
100
- }
101
- }
102
-
103
- val granted =
104
- ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) ==
105
- PackageManager.PERMISSION_GRANTED
106
- if (granted && notificationsEnabled) {
107
- return PermissionStatus.AUTHORIZED
108
- }
109
-
110
- val asked =
111
- context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
112
- .getBoolean(PREF_ASKED_PERMISSION, false)
113
- return if (!asked && !granted) {
114
- PermissionStatus.NOTDETERMINED
115
- } else {
116
- PermissionStatus.DENIED
117
- }
118
- }
119
-
120
- fun requestPermission(onResult: (PermissionStatus) -> Unit) {
121
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
122
- onResult(getPermissionStatus())
123
- return
124
- }
125
-
126
- val activity = currentActivity
127
- val launcher = permissionLauncher
128
- if (activity == null || launcher == null) {
129
- onResult(getPermissionStatus())
130
- return
131
- }
132
-
133
- if (
134
- ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) ==
135
- PackageManager.PERMISSION_GRANTED
136
- ) {
137
- onResult(getPermissionStatus())
138
- return
139
- }
140
-
141
- permissionWaiters.add(onResult)
142
- launcher.launch(Manifest.permission.POST_NOTIFICATIONS)
143
- }
144
-
145
82
  fun fetchToken(): String {
146
83
  val context = application
147
84
  ?: throw IllegalStateException("PushSignal is not initialized")
@@ -153,7 +90,7 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
153
90
  FirebaseApp.getInstance()
154
91
  } catch (error: IllegalStateException) {
155
92
  throw IllegalStateException(
156
- "Firebase is not configured. Call initialize({ projectId, applicationId, apiKey, gcmSenderId }) or add google-services.json.",
93
+ "Firebase is not configured. Call initialize({ project_id, mobilesdk_app_id, current_key, project_number }) or add google-services.json.",
157
94
  error
158
95
  )
159
96
  }
@@ -163,7 +100,7 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
163
100
  Tasks.await(task)
164
101
  } catch (error: Exception) {
165
102
  throw IllegalStateException(
166
- "Failed to get an FCM token. Call initialize({ projectId, applicationId, apiKey, gcmSenderId }) or add google-services.json.",
103
+ "Failed to get an FCM token. Call initialize({ project_id, mobilesdk_app_id, current_key, project_number }) or add google-services.json.",
167
104
  error
168
105
  )
169
106
  }
@@ -209,7 +146,6 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
209
146
  override fun onActivityDestroyed(activity: Activity) {
210
147
  if (currentActivity === activity) {
211
148
  currentActivity = null
212
- permissionLauncher = null
213
149
  }
214
150
  }
215
151
 
@@ -219,24 +155,6 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
219
155
  }
220
156
 
221
157
  val componentActivity = activity as? ComponentActivity ?: return
222
-
223
- permissionLauncher =
224
- componentActivity.activityResultRegistry.register(
225
- PERMISSION_LAUNCHER_KEY,
226
- componentActivity,
227
- ActivityResultContracts.RequestPermission()
228
- ) {
229
- activity
230
- .getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
231
- .edit()
232
- .putBoolean(PREF_ASKED_PERMISSION, true)
233
- .apply()
234
- val status = getPermissionStatus()
235
- val waiters = permissionWaiters.toList()
236
- permissionWaiters.clear()
237
- waiters.forEach { it(status) }
238
- }
239
-
240
158
  componentActivity.addOnNewIntentListener { intent ->
241
159
  handleIntent(intent)
242
160
  }
@@ -251,25 +169,36 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
251
169
  emitPress(intent.toPushMessage())
252
170
  }
253
171
 
254
- private fun applyFirebaseConfig(context: Context, config: AndroidFirebaseConfig) {
255
- if (!config.hasRequiredFields() || FirebaseApp.getApps(context).isNotEmpty()) {
256
- return
172
+ private fun applyFirebaseConfig(context: Context, config: AndroidFirebaseConfig): Exception? {
173
+ if (FirebaseApp.getApps(context).isNotEmpty()) {
174
+ return null
257
175
  }
258
176
 
259
- try {
177
+ if (!config.hasRequiredFields()) {
178
+ return null
179
+ }
180
+
181
+ return try {
260
182
  val options =
261
183
  FirebaseOptions.Builder()
262
- .setProjectId(config.projectId!!.trim())
263
- .setApplicationId(config.applicationId!!.trim())
264
- .setApiKey(config.apiKey!!.trim())
265
- .setGcmSenderId(config.gcmSenderId!!.trim())
184
+ .setProjectId(config.project_id!!.trim())
185
+ .setApplicationId(config.mobilesdk_app_id!!.trim())
186
+ .setApiKey(config.current_key!!.trim())
187
+ .setGcmSenderId(config.project_number!!.trim())
266
188
  .build()
267
189
  FirebaseApp.initializeApp(context, options)
268
- } catch (_: Exception) {
269
- // Keep initialize quiet; getCredentials reports a missing Firebase app.
190
+ null
191
+ } catch (error: Exception) {
192
+ error
270
193
  }
271
194
  }
272
195
 
196
+ private fun finishInitialize(error: Exception?) {
197
+ val waiters = initializeWaiters.toList()
198
+ initializeWaiters.clear()
199
+ waiters.forEach { it(error) }
200
+ }
201
+
273
202
  private fun emitPress(message: PushMessage) {
274
203
  val listener = onNotificationPress
275
204
  if (listener != null) {
@@ -335,10 +264,10 @@ private fun Intent.toPushMessage(): PushMessage {
335
264
  }
336
265
 
337
266
  private fun AndroidFirebaseConfig.hasRequiredFields(): Boolean {
338
- return !projectId.isNullOrBlank() &&
339
- !applicationId.isNullOrBlank() &&
340
- !apiKey.isNullOrBlank() &&
341
- !gcmSenderId.isNullOrBlank()
267
+ return !project_id.isNullOrBlank() &&
268
+ !mobilesdk_app_id.isNullOrBlank() &&
269
+ !current_key.isNullOrBlank() &&
270
+ !project_number.isNullOrBlank()
342
271
  }
343
272
 
344
273
  private const val EXTRA_HANDLED_KEY = "pushsignal.handled"
@@ -6,19 +6,10 @@ class PushSignal: HybridPushSignalSpec {
6
6
  PushSignalCenter.shared.install()
7
7
  }
8
8
 
9
- func initialize(config: AndroidFirebaseConfig) throws {
9
+ func initialize(config: AndroidFirebaseConfig) throws -> Promise<Void> {
10
10
  _ = config
11
- }
12
-
13
- func getPermissionStatus() throws -> Promise<PermissionStatus> {
14
- return Promise.async {
15
- await PushSignalCenter.shared.permissionStatus()
16
- }
17
- }
18
-
19
- func requestPermission() throws -> Promise<PermissionStatus> {
20
11
  return Promise.async {
21
- await PushSignalCenter.shared.requestPermission()
12
+ ()
22
13
  }
23
14
  }
24
15
 
@@ -46,28 +46,6 @@ final class PushSignalCenter: NSObject, UNUserNotificationCenterDelegate {
46
46
  captureLaunchNotificationIfNeeded()
47
47
  }
48
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
49
  func fetchCredentials() async throws -> PushCredentials {
72
50
  await MainActor.run {
73
51
  self.installOnMain()
@@ -267,19 +245,6 @@ final class PushSignalCenter: NSObject, UNUserNotificationCenterDelegate {
267
245
  }
268
246
  }
269
247
 
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
248
  private static func message(from notification: UNNotification) -> PushMessage {
284
249
  let content = notification.request.content
285
250
  return message(
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
 
3
- export { getCredentials, getPermissionStatus, initialize, onMessage, onNotificationPress, requestPermission } from './pushSignal';
3
+ export { getCredentials, initialize, onMessage, onNotificationPress } from './pushSignal';
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +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":[]}
1
+ {"version":3,"names":["getCredentials","initialize","onMessage","onNotificationPress"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAOA,SACEA,cAAc,EACdC,UAAU,EACVC,SAAS,EACTC,mBAAmB,QACd,cAAc","ignoreList":[]}
@@ -1,12 +1,6 @@
1
1
  "use strict";
2
2
 
3
- export function initialize(_config = {}) {}
4
- export async function getPermissionStatus() {
5
- return 'denied';
6
- }
7
- export async function requestPermission() {
8
- return 'denied';
9
- }
3
+ export async function initialize(_config = {}) {}
10
4
  export async function getCredentials() {
11
5
  throw new Error('Push credentials are not supported on web');
12
6
  }
@@ -1 +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":[]}
1
+ {"version":3,"names":["initialize","_config","getCredentials","Error","onMessage","_listener","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.tsx"],"mappings":";;AAMA,OAAO,eAAeA,UAAUA,CAC9BC,OAA8B,GAAG,CAAC,CAAC,EACpB,CAAC;AAElB,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":[]}
@@ -18,13 +18,7 @@ function bindNativeCallbacks() {
18
18
  });
19
19
  }
20
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();
21
+ return PushSignalHybridObject.initialize(config);
28
22
  }
29
23
  export function getCredentials() {
30
24
  return PushSignalHybridObject.getCredentials();
@@ -1 +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":[]}
1
+ {"version":3,"names":["NitroModules","PushSignalHybridObject","createHybridObject","messageListeners","Set","pressListeners","nativeCallbacksBound","bindNativeCallbacks","setOnMessage","message","forEach","listener","setOnNotificationPress","initialize","config","getCredentials","onMessage","add","delete","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.native.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAQzD,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,EAAiB;EAC5E,OAAOb,sBAAsB,CAACY,UAAU,CAACC,MAAM,CAAC;AAClD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAA6B;EACzD,OAAOd,sBAAsB,CAACc,cAAc,CAAC,CAAC;AAChD;AAEA,OAAO,SAASC,SAASA,CACvBL,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBJ,gBAAgB,CAACc,GAAG,CAACN,QAAQ,CAAC;EAC9B,OAAO,MAAM;IACXR,gBAAgB,CAACe,MAAM,CAACP,QAAQ,CAAC;EACnC,CAAC;AACH;AAEA,OAAO,SAASQ,mBAAmBA,CACjCR,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBF,cAAc,CAACY,GAAG,CAACN,QAAQ,CAAC;EAC5B,OAAO,MAAM;IACXN,cAAc,CAACa,MAAM,CAACP,QAAQ,CAAC;EACjC,CAAC;AACH","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import type { HybridObject } from 'react-native-nitro-modules';
2
- export type PermissionStatus = 'authorized' | 'denied' | 'notDetermined';
3
- export type PushPlatform = 'ios' | 'android';
2
+ /** JS/C++ name cannot be `android`: NDK defines `-DANDROID` and breaks the generated enum. */
3
+ export type PushPlatform = 'ios' | 'android_os';
4
4
  export type PushEnvironment = 'sandbox' | 'production';
5
5
  export interface PushCredentials {
6
6
  platform: PushPlatform;
@@ -14,18 +14,16 @@ export interface PushMessage {
14
14
  data: Record<string, string>;
15
15
  }
16
16
  export interface AndroidFirebaseConfig {
17
- projectId?: string;
18
- applicationId?: string;
19
- apiKey?: string;
20
- gcmSenderId?: string;
17
+ project_id?: string;
18
+ mobilesdk_app_id?: string;
19
+ current_key?: string;
20
+ project_number?: string;
21
21
  }
22
22
  export interface PushSignal extends HybridObject<{
23
23
  ios: 'swift';
24
24
  android: 'kotlin';
25
25
  }> {
26
- initialize(config: AndroidFirebaseConfig): void;
27
- getPermissionStatus(): Promise<PermissionStatus>;
28
- requestPermission(): Promise<PermissionStatus>;
26
+ initialize(config: AndroidFirebaseConfig): Promise<void>;
29
27
  getCredentials(): Promise<PushCredentials>;
30
28
  setOnMessage(callback: (message: PushMessage) => void): void;
31
29
  setOnNotificationPress(callback: (message: PushMessage) => void): void;
@@ -1 +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"}
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,8FAA8F;AAC9F,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,YAAY,CAAC;AAChD,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,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;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,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,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"}
@@ -1,3 +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';
1
+ export type { AndroidFirebaseConfig, PushCredentials, PushEnvironment, PushMessage, PushPlatform, } from './PushSignal.nitro.js';
2
+ export { getCredentials, initialize, onMessage, onNotificationPress, } from './pushSignal';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,uBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,UAAU,EACV,SAAS,EACT,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
@@ -1,7 +1,5 @@
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>;
1
+ import type { AndroidFirebaseConfig, PushCredentials, PushMessage } from './PushSignal.nitro.js';
2
+ export declare function initialize(_config?: AndroidFirebaseConfig): Promise<void>;
5
3
  export declare function getCredentials(): Promise<PushCredentials>;
6
4
  export declare function onMessage(_listener: (message: PushMessage) => void): () => void;
7
5
  export declare function onNotificationPress(_listener: (message: PushMessage) => void): () => void;