react-native-iap 15.2.2 → 15.2.4

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 (35) hide show
  1. package/README.md +2 -2
  2. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +24 -8
  3. package/ios/HybridRnIap.swift +163 -70
  4. package/lib/module/hooks/useIAP.js +1 -1
  5. package/lib/module/hooks/useIAP.js.map +1 -1
  6. package/lib/module/index.js +65 -7
  7. package/lib/module/index.js.map +1 -1
  8. package/lib/module/types.js.map +1 -1
  9. package/lib/typescript/src/hooks/useIAP.d.ts +7 -1
  10. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  11. package/lib/typescript/src/index.d.ts +3 -3
  12. package/lib/typescript/src/index.d.ts.map +1 -1
  13. package/lib/typescript/src/specs/RnIap.nitro.d.ts +6 -4
  14. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  15. package/lib/typescript/src/types.d.ts +16 -2
  16. package/lib/typescript/src/types.d.ts.map +1 -1
  17. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +11 -6
  18. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +2 -2
  19. package/nitrogen/generated/android/c++/JNitroPurchaseUpdatedListenerOptions.hpp +61 -0
  20. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +4 -9
  21. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseUpdatedListenerOptions.kt +38 -0
  22. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +27 -0
  23. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +3 -0
  24. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +9 -4
  25. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +2 -2
  26. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +8 -12
  27. package/nitrogen/generated/ios/swift/NitroPurchaseUpdatedListenerOptions.swift +61 -0
  28. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +5 -2
  29. package/nitrogen/generated/shared/c++/NitroPurchaseUpdatedListenerOptions.hpp +85 -0
  30. package/openiap-versions.json +3 -3
  31. package/package.json +1 -1
  32. package/src/hooks/useIAP.ts +8 -0
  33. package/src/index.ts +105 -11
  34. package/src/specs/RnIap.nitro.ts +10 -5
  35. package/src/types.ts +19 -2
package/README.md CHANGED
@@ -195,11 +195,11 @@ Quick links:
195
195
  React Native IAP conforms to the **[OpenIAP specification](https://openiap.dev)** — an open, vendor-neutral interoperability standard for in-app purchases. OpenIAP provides:
196
196
 
197
197
  - **Shared specification** — Common types, error codes, and purchase flows across all platforms
198
- - **Generated type-safe bindings** — Swift, Kotlin, Dart, and GDScript from a single GraphQL schema
198
+ - **Generated type-safe bindings** — Swift, Kotlin, TypeScript, Dart, C#, and GDScript from a single GraphQL schema
199
199
  - **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x)
200
200
  - **Verification profiles** — Standardized receipt validation and purchase verification patterns
201
201
 
202
- Other libraries built on OpenIAP: [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap)
202
+ Other libraries built on OpenIAP: [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [maui-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/maui-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap)
203
203
 
204
204
  **[Learn more about the OpenIAP standard →](https://openiap.dev/docs/foundation/about)**
205
205
 
@@ -68,6 +68,10 @@ class OpenIapException(private val errorJson: String) : Exception() {
68
68
  }
69
69
 
70
70
  class HybridRnIap : HybridRnIapSpec() {
71
+ private data class PurchaseUpdatedListenerRegistration(
72
+ val token: Double,
73
+ val listener: (NitroPurchase) -> Unit
74
+ )
71
75
 
72
76
  // Get ReactApplicationContext lazily from NitroModules
73
77
  private val context: ReactApplicationContext by lazy {
@@ -79,7 +83,8 @@ class HybridRnIap : HybridRnIapSpec() {
79
83
  private val productTypeBySku = mutableMapOf<String, String>()
80
84
 
81
85
  // Event listeners
82
- private val purchaseUpdatedListeners = mutableListOf<(NitroPurchase) -> Unit>()
86
+ private val purchaseUpdatedListeners = mutableListOf<PurchaseUpdatedListenerRegistration>()
87
+ private var nextPurchaseUpdatedListenerToken = 1.0
83
88
  private val purchaseErrorListeners = mutableListOf<(NitroPurchaseResult) -> Unit>()
84
89
  private val promotedProductListenersIOS = mutableListOf<(NitroProduct) -> Unit>()
85
90
  private val userChoiceBillingListenersAndroid = mutableListOf<(UserChoiceBillingDetails) -> Unit>()
@@ -302,7 +307,10 @@ class HybridRnIap : HybridRnIapSpec() {
302
307
  productTypeBySku.clear()
303
308
  isInitialized = false
304
309
  listenersAttached = false
305
- synchronized(purchaseUpdatedListeners) { purchaseUpdatedListeners.clear() }
310
+ synchronized(purchaseUpdatedListeners) {
311
+ purchaseUpdatedListeners.clear()
312
+ nextPurchaseUpdatedListenerToken = 1.0
313
+ }
306
314
  synchronized(purchaseErrorListeners) { purchaseErrorListeners.clear() }
307
315
  promotedProductListenersIOS.clear()
308
316
  synchronized(userChoiceBillingListenersAndroid) { userChoiceBillingListenersAndroid.clear() }
@@ -783,9 +791,15 @@ class HybridRnIap : HybridRnIapSpec() {
783
791
  get() = 0L
784
792
 
785
793
  // Event listener methods
786
- override fun addPurchaseUpdatedListener(listener: (purchase: NitroPurchase) -> Unit) {
787
- synchronized(purchaseUpdatedListeners) {
788
- purchaseUpdatedListeners.add(listener)
794
+ override fun addPurchaseUpdatedListener(
795
+ listener: (purchase: NitroPurchase) -> Unit,
796
+ options: NitroPurchaseUpdatedListenerOptions?
797
+ ): Double {
798
+ return synchronized(purchaseUpdatedListeners) {
799
+ val token = nextPurchaseUpdatedListenerToken
800
+ nextPurchaseUpdatedListenerToken += 1.0
801
+ purchaseUpdatedListeners.add(PurchaseUpdatedListenerRegistration(token, listener))
802
+ token
789
803
  }
790
804
  }
791
805
 
@@ -795,9 +809,9 @@ class HybridRnIap : HybridRnIapSpec() {
795
809
  }
796
810
  }
797
811
 
798
- override fun removePurchaseUpdatedListener(listener: (purchase: NitroPurchase) -> Unit) {
812
+ override fun removePurchaseUpdatedListener(token: Double) {
799
813
  synchronized(purchaseUpdatedListeners) {
800
- purchaseUpdatedListeners.remove(listener)
814
+ purchaseUpdatedListeners.removeAll { it.token == token }
801
815
  }
802
816
  }
803
817
 
@@ -832,7 +846,9 @@ class HybridRnIap : HybridRnIapSpec() {
832
846
  "sendPurchaseUpdate",
833
847
  mapOf("productId" to purchase.productId, "platform" to purchase.platform)
834
848
  )
835
- val snapshot = synchronized(purchaseUpdatedListeners) { ArrayList(purchaseUpdatedListeners) }
849
+ val snapshot = synchronized(purchaseUpdatedListeners) {
850
+ purchaseUpdatedListeners.map { it.listener }
851
+ }
836
852
  snapshot.forEach { it(purchase) }
837
853
  }
838
854
 
@@ -4,6 +4,16 @@ import OpenIAP
4
4
 
5
5
  @available(iOS 15.0, macOS 14.0, tvOS 15.0, watchOS 8.0, *)
6
6
  class HybridRnIap: HybridRnIapSpec {
7
+ private enum PurchaseUpdatedListenerBucket {
8
+ case deduping
9
+ case nonDeduping
10
+ }
11
+
12
+ private struct PurchaseUpdatedListenerRegistration {
13
+ let token: Double
14
+ let bucket: PurchaseUpdatedListenerBucket
15
+ }
16
+
7
17
  // MARK: - Properties
8
18
  private var updateListenerTask: Task<Void, Never>?
9
19
  private var isInitialized: Bool = false
@@ -11,20 +21,20 @@ class HybridRnIap: HybridRnIapSpec {
11
21
  private var productTypeBySku: [String: String] = [:]
12
22
  // OpenIAP event subscriptions
13
23
  private var purchaseUpdatedSub: Subscription?
24
+ private var purchaseUpdatedDuplicateSub: Subscription?
14
25
  private var purchaseErrorSub: Subscription?
15
26
  private var promotedProductSub: Subscription?
16
27
  // Event listeners
17
- private var purchaseUpdatedListeners: [(NitroPurchase) -> Void] = []
28
+ private var nextPurchaseUpdatedListenerToken: Double = 1
29
+ private var purchaseUpdatedListeners: [(token: Double, listener: (NitroPurchase) -> Void)] = []
30
+ private var purchaseUpdatedDuplicateListeners: [(token: Double, listener: (NitroPurchase) -> Void)] = []
31
+ private var purchaseUpdatedListenerRegistrations: [PurchaseUpdatedListenerRegistration] = []
18
32
  private var purchaseErrorListeners: [(NitroPurchaseResult) -> Void] = []
19
33
  private var promotedProductListeners: [(NitroProduct) -> Void] = []
20
34
  private var subscriptionBillingIssueListeners: [(NitroPurchase) -> Void] = []
21
35
  private var subscriptionBillingIssueSub: Subscription?
22
36
  private var lastPurchaseErrorKey: String? = nil
23
37
  private var lastPurchaseErrorTimestamp: TimeInterval = 0
24
- private var deliveredPurchaseEventKeys: Set<String> = []
25
- private var deliveredPurchaseEventOrder: [String] = []
26
- private let purchaseEventDedupLimit = 128
27
- private static let duplicatePurchaseCode = "duplicate-purchase"
28
38
  private var purchasePayloadById: [String: [String: Any]] = [:]
29
39
  // Thread safety lock for listener arrays and error dedup state
30
40
  private let listenerLock = NSLock()
@@ -942,16 +952,92 @@ class HybridRnIap: HybridRnIapSpec {
942
952
 
943
953
  // MARK: - Event Listener Methods
944
954
 
945
- func addPurchaseUpdatedListener(listener: @escaping (NitroPurchase) -> Void) throws {
946
- listenerLock.withLock { purchaseUpdatedListeners.append(listener) }
955
+ func addPurchaseUpdatedListener(
956
+ listener: @escaping (NitroPurchase) -> Void,
957
+ options: NitroPurchaseUpdatedListenerOptions?
958
+ ) throws -> Double {
959
+ let dedupeTransactionIOS = purchaseUpdatedDedupeTransactionIOS(from: options)
960
+ let receiveDuplicateTransactionUpdatesIOS = !dedupeTransactionIOS
961
+ let token = listenerLock.withLock {
962
+ let token = nextPurchaseUpdatedListenerToken
963
+ nextPurchaseUpdatedListenerToken += 1
964
+
965
+ let registration = PurchaseUpdatedListenerRegistration(
966
+ token: token,
967
+ bucket: receiveDuplicateTransactionUpdatesIOS ? .nonDeduping : .deduping
968
+ )
969
+ if receiveDuplicateTransactionUpdatesIOS {
970
+ purchaseUpdatedDuplicateListeners.append((token: token, listener: listener))
971
+ } else {
972
+ purchaseUpdatedListeners.append((token: token, listener: listener))
973
+ }
974
+ purchaseUpdatedListenerRegistrations.append(registration)
975
+ return token
976
+ }
977
+
978
+ if receiveDuplicateTransactionUpdatesIOS {
979
+ attachDuplicatePurchaseUpdatedSubIfNeeded()
980
+ } else {
981
+ attachPurchaseUpdatedSubIfNeeded()
982
+ }
983
+ return token
984
+ }
985
+
986
+ func removePurchaseUpdatedListener(token: Double) throws {
987
+ let removedSubscription = listenerLock.withLock {
988
+ removePurchaseUpdatedListenerRegistration(token: token)
989
+ }
990
+ if let removedSubscription {
991
+ RnIapLog.payload("removeListener", removedSubscription.label)
992
+ OpenIapModule.shared.removeListener(removedSubscription.subscription)
993
+ }
947
994
  }
948
995
 
949
996
  func addPurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
950
997
  listenerLock.withLock { purchaseErrorListeners.append(listener) }
951
998
  }
952
999
 
953
- func removePurchaseUpdatedListener(listener: @escaping (NitroPurchase) -> Void) throws {
954
- listenerLock.withLock { purchaseUpdatedListeners.removeAll() }
1000
+ private func purchaseUpdatedDedupeTransactionIOS(
1001
+ from options: NitroPurchaseUpdatedListenerOptions?
1002
+ ) -> Bool {
1003
+ guard let dedupeTransactionIOS = options?.dedupeTransactionIOS else {
1004
+ return true
1005
+ }
1006
+ switch dedupeTransactionIOS {
1007
+ case .second(let enabled):
1008
+ return enabled
1009
+ case .first:
1010
+ return true
1011
+ }
1012
+ }
1013
+
1014
+ private func removePurchaseUpdatedListenerRegistration(token: Double) -> (label: String, subscription: Subscription)? {
1015
+ guard let registrationIndex = purchaseUpdatedListenerRegistrations.lastIndex(where: {
1016
+ $0.token == token
1017
+ }) else {
1018
+ return nil
1019
+ }
1020
+ let registration = purchaseUpdatedListenerRegistrations.remove(at: registrationIndex)
1021
+ switch registration.bucket {
1022
+ case .deduping:
1023
+ if let index = purchaseUpdatedListeners.lastIndex(where: { $0.token == token }) {
1024
+ purchaseUpdatedListeners.remove(at: index)
1025
+ }
1026
+ guard purchaseUpdatedListeners.isEmpty, let sub = purchaseUpdatedSub else {
1027
+ return nil
1028
+ }
1029
+ purchaseUpdatedSub = nil
1030
+ return ("purchaseUpdated", sub)
1031
+ case .nonDeduping:
1032
+ if let index = purchaseUpdatedDuplicateListeners.lastIndex(where: { $0.token == token }) {
1033
+ purchaseUpdatedDuplicateListeners.remove(at: index)
1034
+ }
1035
+ guard purchaseUpdatedDuplicateListeners.isEmpty, let sub = purchaseUpdatedDuplicateSub else {
1036
+ return nil
1037
+ }
1038
+ purchaseUpdatedDuplicateSub = nil
1039
+ return ("purchaseUpdatedDuplicate", sub)
1040
+ }
955
1041
  }
956
1042
 
957
1043
  func removePurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
@@ -970,26 +1056,7 @@ class HybridRnIap: HybridRnIapSpec {
970
1056
  // MARK: - Private Helper Methods
971
1057
 
972
1058
  private func attachListenersIfNeeded() {
973
- if purchaseUpdatedSub == nil {
974
- RnIapLog.payload("purchaseUpdatedListener.register", nil)
975
- purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
976
- guard let self else {
977
- RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, purchase event dropped")
978
- return
979
- }
980
- Task { @MainActor in
981
- let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
982
- let payload = RnIapHelper.sanitizeDictionary(rawPayload)
983
- RnIapLog.result("purchaseUpdatedListener", payload)
984
- if let identifier = rawPayload["id"] as? String {
985
- self.purchasePayloadById[identifier] = rawPayload
986
- }
987
- let nitro = RnIapHelper.convertPurchaseDictionary(payload)
988
- self.sendPurchaseUpdate(nitro)
989
- }
990
- }
991
- RnIapLog.result("purchaseUpdatedListener.register", "attached")
992
- }
1059
+ attachPurchaseUpdatedSubIfNeeded()
993
1060
 
994
1061
  if purchaseErrorSub == nil {
995
1062
  RnIapLog.payload("purchaseErrorListener.register", nil)
@@ -1048,6 +1115,61 @@ class HybridRnIap: HybridRnIapSpec {
1048
1115
  }
1049
1116
  }
1050
1117
 
1118
+ private func attachPurchaseUpdatedSubIfNeeded() {
1119
+ listenerLock.withLock {
1120
+ guard purchaseUpdatedSub == nil else {
1121
+ return
1122
+ }
1123
+ RnIapLog.payload("purchaseUpdatedListener.register", nil)
1124
+ purchaseUpdatedSub = OpenIapModule.shared.purchaseUpdatedListener { [weak self] openIapPurchase in
1125
+ guard let self else {
1126
+ RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, purchase event dropped")
1127
+ return
1128
+ }
1129
+ Task { @MainActor in
1130
+ let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
1131
+ let payload = RnIapHelper.sanitizeDictionary(rawPayload)
1132
+ RnIapLog.result("purchaseUpdatedListener", payload)
1133
+ if let identifier = rawPayload["id"] as? String {
1134
+ self.purchasePayloadById[identifier] = rawPayload
1135
+ }
1136
+ let nitro = RnIapHelper.convertPurchaseDictionary(payload)
1137
+ self.sendPurchaseUpdate(nitro, includeDuplicateListeners: false)
1138
+ }
1139
+ }
1140
+ RnIapLog.result("purchaseUpdatedListener.register", "attached")
1141
+ }
1142
+ }
1143
+
1144
+ private func attachDuplicatePurchaseUpdatedSubIfNeeded() {
1145
+ listenerLock.withLock {
1146
+ guard purchaseUpdatedDuplicateSub == nil else {
1147
+ return
1148
+ }
1149
+ RnIapLog.payload("purchaseUpdatedListener.register.duplicates", nil)
1150
+ let options = PurchaseUpdatedListenerOptions(
1151
+ dedupeTransactionIOS: false
1152
+ )
1153
+ purchaseUpdatedDuplicateSub = OpenIapModule.shared.purchaseUpdatedListener({ [weak self] openIapPurchase in
1154
+ guard let self else {
1155
+ RnIapLog.warn("purchaseUpdatedListener: HybridRnIap deallocated, non-deduping purchase event dropped")
1156
+ return
1157
+ }
1158
+ Task { @MainActor in
1159
+ let rawPayload = OpenIapSerialization.purchase(openIapPurchase)
1160
+ let payload = RnIapHelper.sanitizeDictionary(rawPayload)
1161
+ RnIapLog.result("purchaseUpdatedListener.duplicates", payload)
1162
+ if let identifier = rawPayload["id"] as? String {
1163
+ self.purchasePayloadById[identifier] = rawPayload
1164
+ }
1165
+ let nitro = RnIapHelper.convertPurchaseDictionary(payload)
1166
+ self.sendPurchaseUpdate(nitro, includeDuplicateListeners: true)
1167
+ }
1168
+ }, options: options)
1169
+ RnIapLog.result("purchaseUpdatedListener.register.duplicates", "attached")
1170
+ }
1171
+ }
1172
+
1051
1173
  private func attachSubscriptionBillingIssueSubIfNeeded() {
1052
1174
  guard subscriptionBillingIssueSub == nil else { return }
1053
1175
  RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
@@ -1075,48 +1197,13 @@ class HybridRnIap: HybridRnIapSpec {
1075
1197
  }
1076
1198
  }
1077
1199
 
1078
- private func sendPurchaseUpdate(_ purchase: NitroPurchase) {
1079
- let originalTxId: String
1080
- if case .second(let val) = purchase.originalTransactionIdentifierIOS { originalTxId = val } else { originalTxId = "" }
1081
- let purchaseTokenStr: String
1082
- if case .second(let val) = purchase.purchaseToken { purchaseTokenStr = val } else { purchaseTokenStr = "" }
1083
- let keyComponents: [String] = [
1084
- purchase.id,
1085
- purchase.productId,
1086
- String(purchase.transactionDate),
1087
- originalTxId,
1088
- purchaseTokenStr
1089
- ]
1090
- let eventKey = keyComponents.joined(separator: "#")
1091
-
1092
- var isDuplicate = false
1200
+ private func sendPurchaseUpdate(_ purchase: NitroPurchase, includeDuplicateListeners: Bool) {
1093
1201
  let snapshot: [(NitroPurchase) -> Void] = listenerLock.withLock {
1094
- if deliveredPurchaseEventKeys.contains(eventKey) {
1095
- isDuplicate = true
1096
- return []
1097
- }
1098
-
1099
- deliveredPurchaseEventKeys.insert(eventKey)
1100
- deliveredPurchaseEventOrder.append(eventKey)
1101
- if deliveredPurchaseEventOrder.count > purchaseEventDedupLimit, let removed = deliveredPurchaseEventOrder.first {
1102
- deliveredPurchaseEventOrder.removeFirst()
1103
- deliveredPurchaseEventKeys.remove(removed)
1202
+ if includeDuplicateListeners {
1203
+ return purchaseUpdatedDuplicateListeners.map(\.listener)
1104
1204
  }
1105
1205
 
1106
- return Array(purchaseUpdatedListeners)
1107
- }
1108
-
1109
- if isDuplicate {
1110
- RnIapLog.warn("Duplicate purchase update skipped for \(purchase.productId)")
1111
- let error = NitroPurchaseResult(
1112
- responseCode: -1,
1113
- debugMessage: nil,
1114
- code: HybridRnIap.duplicatePurchaseCode,
1115
- message: "Duplicate purchase update skipped for \(purchase.productId). Use restorePurchases or getAvailablePurchases to recover.",
1116
- purchaseToken: nil
1117
- )
1118
- sendPurchaseError(error, productId: purchase.productId)
1119
- return
1206
+ return purchaseUpdatedListeners.map(\.listener)
1120
1207
  }
1121
1208
 
1122
1209
  for listener in snapshot {
@@ -1178,6 +1265,10 @@ class HybridRnIap: HybridRnIapSpec {
1178
1265
  RnIapLog.payload("removeListener", "purchaseUpdated")
1179
1266
  OpenIapModule.shared.removeListener(sub)
1180
1267
  }
1268
+ if let sub = purchaseUpdatedDuplicateSub {
1269
+ RnIapLog.payload("removeListener", "purchaseUpdatedDuplicate")
1270
+ OpenIapModule.shared.removeListener(sub)
1271
+ }
1181
1272
  if let sub = purchaseErrorSub {
1182
1273
  RnIapLog.payload("removeListener", "purchaseError")
1183
1274
  OpenIapModule.shared.removeListener(sub)
@@ -1191,6 +1282,7 @@ class HybridRnIap: HybridRnIapSpec {
1191
1282
  OpenIapModule.shared.removeListener(sub)
1192
1283
  }
1193
1284
  purchaseUpdatedSub = nil
1285
+ purchaseUpdatedDuplicateSub = nil
1194
1286
  purchaseErrorSub = nil
1195
1287
  promotedProductSub = nil
1196
1288
  subscriptionBillingIssueSub = nil
@@ -1203,13 +1295,14 @@ class HybridRnIap: HybridRnIapSpec {
1203
1295
  // Clear event listeners, error dedup state, and delivery state (thread-safe)
1204
1296
  listenerLock.withLock {
1205
1297
  purchaseUpdatedListeners.removeAll()
1298
+ purchaseUpdatedDuplicateListeners.removeAll()
1299
+ purchaseUpdatedListenerRegistrations.removeAll()
1300
+ nextPurchaseUpdatedListenerToken = 1
1206
1301
  purchaseErrorListeners.removeAll()
1207
1302
  promotedProductListeners.removeAll()
1208
1303
  subscriptionBillingIssueListeners.removeAll()
1209
1304
  lastPurchaseErrorKey = nil
1210
1305
  lastPurchaseErrorTimestamp = 0
1211
- deliveredPurchaseEventKeys.removeAll()
1212
- deliveredPurchaseEventOrder.removeAll()
1213
1306
  }
1214
1307
  // Clear purchasePayloadById on MainActor to match its access pattern
1215
1308
  Task { @MainActor in
@@ -192,7 +192,7 @@ export function useIAP(options) {
192
192
  if (optionsRef.current?.onPurchaseSuccess) {
193
193
  optionsRef.current.onPurchaseSuccess(purchase);
194
194
  }
195
- });
195
+ }, optionsRef.current?.purchaseUpdatedListenerOptions);
196
196
  }
197
197
  if (!subscriptionsRef.current.purchaseError) {
198
198
  subscriptionsRef.current.purchaseError = purchaseErrorListener(error => {
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","verifyPurchase","verifyPurchaseTopLevel","verifyPurchaseWithProvider","verifyPurchaseWithProviderTopLevel","getActiveSubscriptions","hasActiveSubscriptions","syncIOS","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","subscriptionBillingIssueListener","isStandardIOS","ErrorCode","useIAP","options","connected","setConnected","products","setProducts","subscriptions","setSubscriptions","availablePurchases","setAvailablePurchases","promotedProductIOS","setPromotedProductIOS","activeSubscriptions","setActiveSubscriptions","optionsRef","connectedRef","mergeWithDuplicateCheck","existingItems","newItems","getKey","merged","forEach","newItem","isDuplicate","some","existingItem","push","current","subscriptionsRef","isMountedRef","subscriptionsRefState","invokeOnError","error","onError","Error","String","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","getAvailablePurchasesInternal","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","includeSuspendedAndroid","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","restorePurchases","OS","buildAndroidConfig","config","enableBillingProgramAndroid","alternativeBillingModeAndroid","registerListeners","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","code","InitConnection","onPurchaseError","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","subscriptionBillingIssue","onSubscriptionBillingIssue","cleanupListeners","remove","undefined","initIapWithSubscriptions","reconnect"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":";;AAAA;AACA,SAAQA,WAAW,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,QAAO,OAAO;AAC9D,SAAQC,QAAQ,QAAO,cAAc;AACrC,SAAQC,YAAY,QAAO,mBAAgB;;AAE3C;AACA,SACEC,cAAc,EACdC,qBAAqB,EACrBC,uBAAuB,EACvBC,0BAA0B,EAC1BC,qBAAqB,EACrBC,iBAAiB,IAAIC,yBAAyB,EAC9CC,eAAe,IAAIC,uBAAuB,EAC1CC,aAAa,EACbC,eAAe,IAAIC,uBAAuB,EAC1CC,cAAc,IAAIC,sBAAsB,EACxCC,0BAA0B,IAAIC,kCAAkC,EAChEC,sBAAsB,EACtBC,sBAAsB,EACtBC,OAAO,EACPC,qBAAqB,EACrBC,mCAAmC,EACnCC,0CAA0C,EAC1CC,mCAAmC,EACnCC,oCAAoC,EACpCC,gCAAgC,EAChCC,gCAAgC,EAChCC,aAAa,QACR,aAAK;;AAEZ;AACA,SAAQC,SAAS,QAAO,aAAU;;AAsBlC;;AAsPA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACC,OAAuB,EAAU;EACtD,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAGnC,QAAQ,CAAU,KAAK,CAAC;EAC1D,MAAM,CAACoC,QAAQ,EAAEC,WAAW,CAAC,GAAGrC,QAAQ,CAAY,EAAE,CAAC;EACvD,MAAM,CAACsC,aAAa,EAAEC,gBAAgB,CAAC,GAAGvC,QAAQ,CAAwB,EAAE,CAAC;EAC7E,MAAM,CAACwC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGzC,QAAQ,CAAa,EAAE,CAAC;EAC5E,MAAM,CAAC0C,kBAAkB,EAAEC,qBAAqB,CAAC,GAAG3C,QAAQ,CAAU,CAAC;EACvE,MAAM,CAAC4C,mBAAmB,EAAEC,sBAAsB,CAAC,GAAG7C,QAAQ,CAE5D,EAAE,CAAC;EAEL,MAAM8C,UAAU,GAAG7C,MAAM,CAA4BgC,OAAO,CAAC;EAC7D,MAAMc,YAAY,GAAG9C,MAAM,CAAU,KAAK,CAAC;;EAE3C;EACA,MAAM+C,uBAAuB,GAAGlD,WAAW,CACzC,CACEmD,aAAkB,EAClBC,QAAa,EACbC,MAA2B,KACnB;IACR,MAAMC,MAAM,GAAG,CAAC,GAAGH,aAAa,CAAC;IACjCC,QAAQ,CAACG,OAAO,CAAEC,OAAO,IAAK;MAC5B,MAAMC,WAAW,GAAGH,MAAM,CAACI,IAAI,CAC5BC,YAAY,IAAKN,MAAM,CAACM,YAAY,CAAC,KAAKN,MAAM,CAACG,OAAO,CAC3D,CAAC;MACD,IAAI,CAACC,WAAW,EAAE;QAChBH,MAAM,CAACM,IAAI,CAACJ,OAAO,CAAC;MACtB;IACF,CAAC,CAAC;IACF,OAAOF,MAAM;EACf,CAAC,EACD,EACF,CAAC;EAEDrD,SAAS,CAAC,MAAM;IACd+C,UAAU,CAACa,OAAO,GAAG1B,OAAO;EAC9B,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAEblC,SAAS,CAAC,MAAM;IACdgD,YAAY,CAACY,OAAO,GAAGzB,SAAS;EAClC,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAEf,MAAM0B,gBAAgB,GAAG3D,MAAM,CAM5B,CAAC,CAAC,CAAC;;EAEN;EACA,MAAM4D,YAAY,GAAG5D,MAAM,CAAU,IAAI,CAAC;EAE1C,MAAM6D,qBAAqB,GAAG7D,MAAM,CAAwB,EAAE,CAAC;EAE/DF,SAAS,CAAC,MAAM;IACd+D,qBAAqB,CAACH,OAAO,GAAGrB,aAAa;EAC/C,CAAC,EAAE,CAACA,aAAa,CAAC,CAAC;;EAEnB;EACA,MAAMyB,aAAa,GAAGjE,WAAW,CAAEkE,KAAc,IAAK;IACpD,IAAIlB,UAAU,CAACa,OAAO,EAAEM,OAAO,EAAE;MAC/BnB,UAAU,CAACa,OAAO,CAACM,OAAO,CACxBD,KAAK,YAAYE,KAAK,GAAGF,KAAK,GAAG,IAAIE,KAAK,CAACC,MAAM,CAACH,KAAK,CAAC,CAC1D,CAAC;IACH;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMI,qBAAqB,GAAGtE,WAAW,CACvC,MAAOuE,MAGN,IAAoB;IACnB,IAAI,CAACtB,YAAY,CAACY,OAAO,EAAE;MACzBxD,YAAY,CAACmE,IAAI,CACf,2DACF,CAAC;MACD;IACF;IACA,IAAI;MACF,MAAMC,WAAW,GAAGF,MAAM,CAACG,IAAI,IAAI,QAAQ;MAC3CrE,YAAY,CAACsE,KAAK,CAAC,sCAAsC,EAAE;QACzDC,IAAI,EAAEL,MAAM,CAACK,IAAI;QACjBF,IAAI,EAAED;MACR,CAAC,CAAC;MACF,MAAMI,MAAM,GAAG,MAAM9D,aAAa,CAAC;QACjC6D,IAAI,EAAEL,MAAM,CAACK,IAAI;QACjBF,IAAI,EAAED;MACR,CAAC,CAAC;MACFpE,YAAY,CAACsE,KAAK,CAAC,gCAAgC,EAAEE,MAAM,CAAC;MAC5D,MAAMC,KAAK,GAAID,MAAM,IAAI,EAAwC;;MAEjE;MACA,IAAIJ,WAAW,KAAK,MAAM,EAAE;QAC1B;QACAhC,gBAAgB,CAAEsC,iBAAwC,IACxD7B,uBAAuB,CACrB6B,iBAAiB,EACjBD,KAAK,EACJE,YAAiC,IAAKA,YAAY,CAACC,EACtD,CACF,CAAC;QACD;MACF;MAEA,IAAIR,WAAW,KAAK,KAAK,EAAE;QACzB;QACA,MAAMS,WAAW,GAAGJ,KAAK,CAACK,MAAM,CAC7BC,IAAI,IAAsBA,IAAI,CAACV,IAAI,KAAK,QAC3C,CAAC;QACD,MAAMW,gBAAgB,GAAGP,KAAK,CAACK,MAAM,CAClCC,IAAI,IAAkCA,IAAI,CAACV,IAAI,KAAK,MACvD,CAAC;QAEDnC,WAAW,CAAE+C,YAAuB,IAClCpC,uBAAuB,CACrBoC,YAAY,EACZJ,WAAW,EACVK,OAAgB,IAAKA,OAAO,CAACN,EAChC,CACF,CAAC;QACDxC,gBAAgB,CAAEsC,iBAAwC,IACxD7B,uBAAuB,CACrB6B,iBAAiB,EACjBM,gBAAgB,EACfL,YAAiC,IAAKA,YAAY,CAACC,EACtD,CACF,CAAC;QACD;MACF;;MAEA;MACA1C,WAAW,CAAE+C,YAAuB,IAClCpC,uBAAuB,CACrBoC,YAAY,EACZR,KAAK,EACJS,OAAgB,IAAKA,OAAO,CAACN,EAChC,CACF,CAAC;IACH,CAAC,CAAC,OAAOf,KAAK,EAAE;MACd7D,YAAY,CAAC6D,KAAK,CAAC,0BAA0B,EAAEA,KAAK,CAAC;MACrDD,aAAa,CAACC,KAAK,CAAC;IACtB;EACF,CAAC,EACD,CAAChB,uBAAuB,EAAEe,aAAa,CACzC,CAAC;EAED,MAAMuB,6BAA6B,GAAGxF,WAAW,CAC/C,MAAOmC,OAAyB,IAAoB;IAClD,IAAI;MACF,MAAM0C,MAAM,GAAG,MAAMnE,qBAAqB,CAAC;QACzC+E,6BAA6B,EAC3BtD,OAAO,EAAEsD,6BAA6B,IAAI,KAAK;QACjDC,yBAAyB,EAAEvD,OAAO,EAAEuD,yBAAyB,IAAI,IAAI;QACrEC,uBAAuB,EAAExD,OAAO,EAAEwD,uBAAuB,IAAI;MAC/D,CAAC,CAAC;MACFhD,qBAAqB,CAACkC,MAAM,CAAC;IAC/B,CAAC,CAAC,OAAOX,KAAK,EAAE;MACd7D,YAAY,CAAC6D,KAAK,CAAC,qCAAqC,EAAEA,KAAK,CAAC;MAChED,aAAa,CAACC,KAAK,CAAC;IACtB;EACF,CAAC,EACD,CAACD,aAAa,CAChB,CAAC;EAED,MAAM2B,8BAA8B,GAAG5F,WAAW,CAChD,MAAO6F,eAA0B,IAAoC;IACnE,IAAI;MACF,MAAMhB,MAAM,GAAG,MAAMvD,sBAAsB,CAACuE,eAAe,CAAC;MAC5D9C,sBAAsB,CAAC8B,MAAM,CAAC;MAC9B,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOX,KAAK,EAAE;MACd7D,YAAY,CAAC6D,KAAK,CAAC,qCAAqC,EAAEA,KAAK,CAAC;MAChED,aAAa,CAACC,KAAK,CAAC;MACpB,OAAO,EAAE;IACX;EACF,CAAC,EACD,CAACD,aAAa,CAChB,CAAC;EAED,MAAM6B,8BAA8B,GAAG9F,WAAW,CAChD,MAAO6F,eAA0B,IAAuB;IACtD,IAAI;MACF,OAAO,MAAMtE,sBAAsB,CAACsE,eAAe,CAAC;IACtD,CAAC,CAAC,OAAO3B,KAAK,EAAE;MACd7D,YAAY,CAAC6D,KAAK,CAAC,sCAAsC,EAAEA,KAAK,CAAC;MACjED,aAAa,CAACC,KAAK,CAAC;MACpB,OAAO,KAAK;IACd;EACF,CAAC,EACD,CAACD,aAAa,CAChB,CAAC;EAED,MAAMtD,iBAAiB,GAAGX,WAAW,CACnC,MAAO+F,IAAmC,IAAoB;IAC5D;IACA;IACA;IACA;IACA;IACA,MAAMnF,yBAAyB,CAACmF,IAAI,CAAC;EACvC,CAAC,EACD,EACF,CAAC;EAED,MAAMlF,eAAe,GAAGb,WAAW,CACjC,MAAOgG,UAAgC,IAAoB;IACzD,MAAMlF,uBAAuB,CAACkF,UAAU,CAAC;EAC3C,CAAC,EACD,EACF,CAAC;EAED,MAAMC,gBAAgB,GAAGjG,WAAW,CAClC,MAAOmC,OAAyB,IAAoB;IAClD,IAAI;MACF,IAAI/B,QAAQ,CAAC8F,EAAE,KAAK,KAAK,EAAE;QACzB,MAAM1E,OAAO,CAAC,CAAC;MACjB;MAEA,MAAMgE,6BAA6B,CAACrD,OAAO,CAAC;IAC9C,CAAC,CAAC,OAAO+B,KAAK,EAAE;MACd7D,YAAY,CAACmE,IAAI,CAAC,8BAA8B,EAAEN,KAAK,CAAC;MACxDD,aAAa,CAACC,KAAK,CAAC;IACtB;EACF,CAAC,EACD,CAACsB,6BAA6B,EAAEvB,aAAa,CAC/C,CAAC;EAED,MAAMjD,eAAe,GAAGhB,WAAW,CACjC,MAAOmC,OAA4B,IACjClB,uBAAuB,CAACkB,OAAO,CAAC,EAClC,EACF,CAAC;EAED,MAAMjB,cAAc,GAAGlB,WAAW,CAChC,MAAOmC,OAA4B,IAAoC;IACrE,OAAOhB,sBAAsB,CAACgB,OAAO,CAAC;EACxC,CAAC,EACD,EACF,CAAC;EAED,MAAMf,0BAA0B,GAAGpB,WAAW,CAC5C,MACEmC,OAAwC,IACM;IAC9C,OAAOd,kCAAkC,CAACc,OAAO,CAAC;EACpD,CAAC,EACD,EACF,CAAC;;EAED;EACA,MAAMgE,kBAAkB,GAAGnG,WAAW,CAAC,MAAM;IAC3C,IAAIoG,MAKS;IAEb,IAAIhG,QAAQ,CAAC8F,EAAE,KAAK,SAAS,EAAE;MAC7B,IAAIlD,UAAU,CAACa,OAAO,EAAEwC,2BAA2B,EAAE;QACnDD,MAAM,GAAG;UACPC,2BAA2B,EACzBrD,UAAU,CAACa,OAAO,CAACwC;QACvB,CAAC;MACH,CAAC,MAAM,IAAIrD,UAAU,CAACa,OAAO,EAAEyC,6BAA6B,EAAE;QAC5DF,MAAM,GAAG;UACPE,6BAA6B,EAC3BtD,UAAU,CAACa,OAAO,CAACyC;QACvB,CAAC;MACH;IACF;IAEA,OAAOF,MAAM;EACf,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,MAAMG,iBAAiB,GAAGvG,WAAW,CAAC,MAAM;IAC1C,IAAI,CAAC8D,gBAAgB,CAACD,OAAO,CAAC2C,cAAc,EAAE;MAC5C1C,gBAAgB,CAACD,OAAO,CAAC2C,cAAc,GAAGhG,uBAAuB,CAC/D,MAAOiG,QAAkB,IAAK;QAC5B,IAAI;UACF,MAAMb,8BAA8B,CAAC,CAAC;UACtC,MAAMJ,6BAA6B,CAAC,CAAC;QACvC,CAAC,CAAC,OAAOkB,CAAC,EAAE;UACVrG,YAAY,CAACmE,IAAI,CAAC,wCAAwC,EAAEkC,CAAC,CAAC;QAChE;QACA,IAAI1D,UAAU,CAACa,OAAO,EAAE8C,iBAAiB,EAAE;UACzC3D,UAAU,CAACa,OAAO,CAAC8C,iBAAiB,CAACF,QAAQ,CAAC;QAChD;MACF,CACF,CAAC;IACH;IAEA,IAAI,CAAC3C,gBAAgB,CAACD,OAAO,CAAC+C,aAAa,EAAE;MAC3C9C,gBAAgB,CAACD,OAAO,CAAC+C,aAAa,GAAGrG,qBAAqB,CAC3D2D,KAAK,IAAK;QACT,IACEA,KAAK,CAAC2C,IAAI,KAAK5E,SAAS,CAAC6E,cAAc,IACvC,CAAC7D,YAAY,CAACY,OAAO,EACrB;UACA;QACF;QACA,IAAIb,UAAU,CAACa,OAAO,EAAEkD,eAAe,EAAE;UACvC/D,UAAU,CAACa,OAAO,CAACkD,eAAe,CAAC7C,KAAK,CAAC;QAC3C;MACF,CACF,CAAC;IACH;IAEA,IAAIlC,aAAa,CAAC,CAAC,IAAI,CAAC8B,gBAAgB,CAACD,OAAO,CAACjB,kBAAkB,EAAE;MACnEkB,gBAAgB,CAACD,OAAO,CAACjB,kBAAkB,GAAGnC,0BAA0B,CACrE8E,OAAgB,IAAK;QACpB1C,qBAAqB,CAAC0C,OAAO,CAAC;QAC9B,IAAIvC,UAAU,CAACa,OAAO,EAAEmD,oBAAoB,EAAE;UAC5ChE,UAAU,CAACa,OAAO,CAACmD,oBAAoB,CAACzB,OAAO,CAAC;QAClD;MACF,CACF,CAAC;IACH;IAEA,IACEnF,QAAQ,CAAC8F,EAAE,KAAK,SAAS,IACzBlD,UAAU,CAACa,OAAO,EAAEoD,0BAA0B,IAC9C,CAACnD,gBAAgB,CAACD,OAAO,CAACqD,wBAAwB,EAClD;MACApD,gBAAgB,CAACD,OAAO,CAACqD,wBAAwB,GAC/CpF,gCAAgC,CAAEqF,OAAO,IAAK;QAC5C,IAAInE,UAAU,CAACa,OAAO,EAAEoD,0BAA0B,EAAE;UAClDjE,UAAU,CAACa,OAAO,CAACoD,0BAA0B,CAACE,OAAO,CAAC;QACxD;MACF,CAAC,CAAC;IACN;;IAEA;IACA;IACA,IAAI,CAACrD,gBAAgB,CAACD,OAAO,CAACuD,wBAAwB,EAAE;MACtDtD,gBAAgB,CAACD,OAAO,CAACuD,wBAAwB,GAC/CrF,gCAAgC,CAAE0E,QAAkB,IAAK;QACvDzD,UAAU,CAACa,OAAO,EAAEwD,0BAA0B,GAAGZ,QAAQ,CAAC;MAC5D,CAAC,CAAC;IACN;EACF,CAAC,EAAE,CAACb,8BAA8B,EAAEJ,6BAA6B,CAAC,CAAC;;EAEnE;EACA,MAAM8B,gBAAgB,GAAGtH,WAAW,CAAC,MAAM;IACzC8D,gBAAgB,CAACD,OAAO,CAAC2C,cAAc,EAAEe,MAAM,CAAC,CAAC;IACjDzD,gBAAgB,CAACD,OAAO,CAAC+C,aAAa,EAAEW,MAAM,CAAC,CAAC;IAChDzD,gBAAgB,CAACD,OAAO,CAACjB,kBAAkB,EAAE2E,MAAM,CAAC,CAAC;IACrDzD,gBAAgB,CAACD,OAAO,CAACqD,wBAAwB,EAAEK,MAAM,CAAC,CAAC;IAC3DzD,gBAAgB,CAACD,OAAO,CAACuD,wBAAwB,EAAEG,MAAM,CAAC,CAAC;IAC3DzD,gBAAgB,CAACD,OAAO,CAAC2C,cAAc,GAAGgB,SAAS;IACnD1D,gBAAgB,CAACD,OAAO,CAAC+C,aAAa,GAAGY,SAAS;IAClD1D,gBAAgB,CAACD,OAAO,CAACjB,kBAAkB,GAAG4E,SAAS;IACvD1D,gBAAgB,CAACD,OAAO,CAACqD,wBAAwB,GAAGM,SAAS;IAC7D1D,gBAAgB,CAACD,OAAO,CAACuD,wBAAwB,GAAGI,SAAS;EAC/D,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,wBAAwB,GAAGzH,WAAW,CAAC,YAA2B;IACtE,MAAMoG,MAAM,GAAGD,kBAAkB,CAAC,CAAC;IAEnC,IAAI;MACF,MAAMtB,MAAM,GAAG,MAAMvE,cAAc,CAAC8F,MAAM,CAAC;MAE3C,IAAI,CAACrC,YAAY,CAACF,OAAO,EAAE;QACzB;MACF;MAEA,IAAI,CAACgB,MAAM,EAAE;QACXxC,YAAY,CAAC,KAAK,CAAC;QACnBhC,YAAY,CAACmE,IAAI,CAAC,wCAAwC,CAAC;QAC3D;MACF;MAEA+B,iBAAiB,CAAC,CAAC;MACnBlE,YAAY,CAAC,IAAI,CAAC;IACpB,CAAC,CAAC,OAAO6B,KAAK,EAAE;MACd7D,YAAY,CAAC6D,KAAK,CAAC,wBAAwB,EAAEA,KAAK,CAAC;MACnDoD,gBAAgB,CAAC,CAAC;MAClB,IAAIvD,YAAY,CAACF,OAAO,EAAE;QACxBxB,YAAY,CAAC,KAAK,CAAC;MACrB;MACA4B,aAAa,CAACC,KAAK,CAAC;IACtB;EACF,CAAC,EAAE,CAACiC,kBAAkB,EAAEI,iBAAiB,EAAEe,gBAAgB,EAAErD,aAAa,CAAC,CAAC;EAE5E,MAAMyD,SAAS,GAAG1H,WAAW,CAAC,YAA8B;IAC1D,MAAMoG,MAAM,GAAGD,kBAAkB,CAAC,CAAC;IAEnC,IAAI;MACF,MAAMtB,MAAM,GAAG,MAAMvE,cAAc,CAAC8F,MAAM,CAAC;MAE3C,IAAI,CAACrC,YAAY,CAACF,OAAO,EAAE;QACzB,OAAO,KAAK;MACd;MAEA,IAAIgB,MAAM,EAAE;QACV0B,iBAAiB,CAAC,CAAC;QACnBlE,YAAY,CAAC,IAAI,CAAC;QAClB,OAAO,IAAI;MACb;MAEAA,YAAY,CAAC,KAAK,CAAC;MACnB,OAAO,KAAK;IACd,CAAC,CAAC,OAAO6B,KAAK,EAAE;MACd7D,YAAY,CAAC6D,KAAK,CAAC,4BAA4B,EAAEA,KAAK,CAAC;MACvDoD,gBAAgB,CAAC,CAAC;MAClB,IAAIvD,YAAY,CAACF,OAAO,EAAE;QACxBxB,YAAY,CAAC,KAAK,CAAC;MACrB;MACA4B,aAAa,CAACC,KAAK,CAAC;MACpB,OAAO,KAAK;IACd;EACF,CAAC,EAAE,CAACiC,kBAAkB,EAAEI,iBAAiB,EAAEe,gBAAgB,EAAErD,aAAa,CAAC,CAAC;EAE5EhE,SAAS,CAAC,MAAM;IACd8D,YAAY,CAACF,OAAO,GAAG,IAAI;IAC3B4D,wBAAwB,CAAC,CAAC;IAE1B,OAAO,MAAM;MACX1D,YAAY,CAACF,OAAO,GAAG,KAAK;MAC5ByD,gBAAgB,CAAC,CAAC;MAClB;MACAjF,YAAY,CAAC,KAAK,CAAC;IACrB,CAAC;EACH,CAAC,EAAE,CAACoF,wBAAwB,EAAEH,gBAAgB,CAAC,CAAC;EAEhD,OAAO;IACLlF,SAAS;IACTE,QAAQ;IACRE,aAAa;IACb7B,iBAAiB;IACjB+B,kBAAkB;IAClBE,kBAAkB;IAClBE,mBAAmB;IACnBpC,qBAAqB,EAAE8E,6BAA6B;IACpDzE,aAAa,EAAEuD,qBAAqB;IACpCzD,eAAe;IACfG,eAAe;IACfE,cAAc;IACdE,0BAA0B;IAC1B6E,gBAAgB;IAChBxE,qBAAqB;IACrBC,mCAAmC;IACnCJ,sBAAsB,EAAEsE,8BAA8B;IACtDrE,sBAAsB,EAAEuE,8BAA8B;IACtD4B,SAAS;IACT;IACA,IAAItH,QAAQ,CAAC8F,EAAE,KAAK,SAAS,GACzB;MACEvE,0CAA0C;MAC1CC,mCAAmC;MACnCC;IACF,CAAC,GACD,CAAC,CAAC;EACR,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","verifyPurchase","verifyPurchaseTopLevel","verifyPurchaseWithProvider","verifyPurchaseWithProviderTopLevel","getActiveSubscriptions","hasActiveSubscriptions","syncIOS","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","subscriptionBillingIssueListener","isStandardIOS","ErrorCode","useIAP","options","connected","setConnected","products","setProducts","subscriptions","setSubscriptions","availablePurchases","setAvailablePurchases","promotedProductIOS","setPromotedProductIOS","activeSubscriptions","setActiveSubscriptions","optionsRef","connectedRef","mergeWithDuplicateCheck","existingItems","newItems","getKey","merged","forEach","newItem","isDuplicate","some","existingItem","push","current","subscriptionsRef","isMountedRef","subscriptionsRefState","invokeOnError","error","onError","Error","String","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","getAvailablePurchasesInternal","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","includeSuspendedAndroid","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","restorePurchases","OS","buildAndroidConfig","config","enableBillingProgramAndroid","alternativeBillingModeAndroid","registerListeners","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseUpdatedListenerOptions","purchaseError","code","InitConnection","onPurchaseError","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","subscriptionBillingIssue","onSubscriptionBillingIssue","cleanupListeners","remove","undefined","initIapWithSubscriptions","reconnect"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
@@ -114,11 +114,15 @@ const IAP = {
114
114
  // ============================================================================
115
115
 
116
116
  const purchaseUpdateJsListeners = new Set();
117
+ const purchaseUpdateDuplicateJsListeners = new Set();
117
118
  let purchaseUpdateNativeAttached = false;
118
- const purchaseUpdateNativeHandler = nitroPurchase => {
119
+ let purchaseUpdateDuplicateNativeAttached = false;
120
+ let purchaseUpdateNativeToken = null;
121
+ let purchaseUpdateDuplicateNativeToken = null;
122
+ const emitPurchaseUpdateToListeners = (nitroPurchase, listeners) => {
119
123
  if (validateNitroPurchase(nitroPurchase)) {
120
124
  const convertedPurchase = convertNitroPurchaseToPurchase(nitroPurchase);
121
- for (const listener of purchaseUpdateJsListeners) {
125
+ for (const listener of listeners) {
122
126
  try {
123
127
  listener(convertedPurchase);
124
128
  } catch (e) {
@@ -129,6 +133,12 @@ const purchaseUpdateNativeHandler = nitroPurchase => {
129
133
  RnIapConsole.error('Invalid purchase data received from native — productId:', nitroPurchase?.productId ?? 'unknown');
130
134
  }
131
135
  };
136
+ const purchaseUpdateNativeHandler = nitroPurchase => {
137
+ emitPurchaseUpdateToListeners(nitroPurchase, purchaseUpdateJsListeners);
138
+ };
139
+ const purchaseUpdateDuplicateNativeHandler = nitroPurchase => {
140
+ emitPurchaseUpdateToListeners(nitroPurchase, purchaseUpdateDuplicateJsListeners);
141
+ };
132
142
  const purchaseErrorJsListeners = new Set();
133
143
  let purchaseErrorNativeAttached = false;
134
144
  const purchaseErrorNativeHandler = error => {
@@ -168,6 +178,9 @@ const promotedProductNativeHandler = nitroProduct => {
168
178
  */
169
179
  export const resetListenerState = () => {
170
180
  purchaseUpdateNativeAttached = false;
181
+ purchaseUpdateDuplicateNativeAttached = false;
182
+ purchaseUpdateNativeToken = null;
183
+ purchaseUpdateDuplicateNativeToken = null;
171
184
  purchaseErrorNativeAttached = false;
172
185
  promotedProductNativeAttached = false;
173
186
  userChoiceBillingNativeAttached = false;
@@ -175,17 +188,21 @@ export const resetListenerState = () => {
175
188
  subscriptionBillingIssueNativeAttached = false;
176
189
  // Clear all JS listeners since native side clears them in endConnection
177
190
  purchaseUpdateJsListeners.clear();
191
+ purchaseUpdateDuplicateJsListeners.clear();
178
192
  purchaseErrorJsListeners.clear();
179
193
  promotedProductJsListeners.clear();
180
194
  userChoiceBillingJsListeners.clear();
181
195
  developerProvidedBillingJsListeners.clear();
182
196
  subscriptionBillingIssueJsListeners.clear();
183
197
  };
184
- export const purchaseUpdatedListener = listener => {
185
- purchaseUpdateJsListeners.add(listener);
186
- if (!purchaseUpdateNativeAttached) {
198
+ export const purchaseUpdatedListener = (listener, options) => {
199
+ const receiveDuplicateTransactionUpdatesIOS = Platform.OS === 'ios' && options?.dedupeTransactionIOS === false;
200
+ const listeners = receiveDuplicateTransactionUpdatesIOS ? purchaseUpdateDuplicateJsListeners : purchaseUpdateJsListeners;
201
+ listeners.add(listener);
202
+ if (!purchaseUpdateNativeAttached && !receiveDuplicateTransactionUpdatesIOS) {
187
203
  try {
188
- IAP.instance.addPurchaseUpdatedListener(purchaseUpdateNativeHandler);
204
+ const token = IAP.instance.addPurchaseUpdatedListener(purchaseUpdateNativeHandler);
205
+ purchaseUpdateNativeToken = typeof token === 'number' ? token : null;
189
206
  purchaseUpdateNativeAttached = true;
190
207
  } catch (e) {
191
208
  const msg = toErrorMessage(e);
@@ -196,9 +213,50 @@ export const purchaseUpdatedListener = listener => {
196
213
  }
197
214
  }
198
215
  }
216
+ if (!purchaseUpdateDuplicateNativeAttached && receiveDuplicateTransactionUpdatesIOS) {
217
+ try {
218
+ const nativeOptions = {
219
+ dedupeTransactionIOS: false
220
+ };
221
+ const token = IAP.instance.addPurchaseUpdatedListener(purchaseUpdateDuplicateNativeHandler, nativeOptions);
222
+ purchaseUpdateDuplicateNativeToken = typeof token === 'number' ? token : null;
223
+ purchaseUpdateDuplicateNativeAttached = true;
224
+ } catch (e) {
225
+ const msg = toErrorMessage(e);
226
+ if (msg.includes('Nitro runtime not installed')) {
227
+ RnIapConsole.warn('[purchaseUpdatedListener] Nitro not ready yet; listener inert until initConnection()');
228
+ } else {
229
+ throw e;
230
+ }
231
+ }
232
+ }
233
+ let removed = false;
199
234
  return {
200
235
  remove: () => {
201
- purchaseUpdateJsListeners.delete(listener);
236
+ if (removed) {
237
+ return;
238
+ }
239
+ removed = true;
240
+ listeners.delete(listener);
241
+ if (listeners.size > 0) {
242
+ return;
243
+ }
244
+ const token = receiveDuplicateTransactionUpdatesIOS ? purchaseUpdateDuplicateNativeToken : purchaseUpdateNativeToken;
245
+ if (token == null) {
246
+ return;
247
+ }
248
+ try {
249
+ IAP.instance.removePurchaseUpdatedListener(token);
250
+ if (receiveDuplicateTransactionUpdatesIOS) {
251
+ purchaseUpdateDuplicateNativeToken = null;
252
+ purchaseUpdateDuplicateNativeAttached = false;
253
+ } else {
254
+ purchaseUpdateNativeToken = null;
255
+ purchaseUpdateNativeAttached = false;
256
+ }
257
+ } catch (e) {
258
+ RnIapConsole.warn('[purchaseUpdatedListener] native remove failed:', e);
259
+ }
202
260
  }
203
261
  };
204
262
  };