react-native-iap 15.1.0 → 15.2.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.
- package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +171 -114
- package/android/src/main/java/com/margelo/nitro/iap/ProductQueryHelpers.kt +42 -0
- package/android/src/test/java/com/margelo/nitro/iap/ProductQueryHelpersTest.kt +140 -0
- package/ios/HybridRnIap.swift +72 -1
- package/lib/module/hooks/useIAP.js +11 -1
- package/lib/module/hooks/useIAP.js.map +1 -1
- package/lib/module/hooks/useWebhookEvents.js +113 -0
- package/lib/module/hooks/useWebhookEvents.js.map +1 -0
- package/lib/module/index.js +405 -131
- package/lib/module/index.js.map +1 -1
- package/lib/module/kit-api.js +161 -0
- package/lib/module/kit-api.js.map +1 -0
- package/lib/module/types.js +16 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/error.js.map +1 -1
- package/lib/module/utils/errorMapping.js +6 -0
- package/lib/module/utils/errorMapping.js.map +1 -1
- package/lib/module/webhook-client.js +164 -0
- package/lib/module/webhook-client.js.map +1 -0
- package/lib/typescript/plugin/src/withIAP.d.ts +1 -1
- package/lib/typescript/src/hooks/useIAP.d.ts +172 -2
- package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useWebhookEvents.d.ts +55 -0
- package/lib/typescript/src/hooks/useWebhookEvents.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +283 -129
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/kit-api.d.ts +54 -0
- package/lib/typescript/src/kit-api.d.ts.map +1 -0
- package/lib/typescript/src/specs/RnIap.nitro.d.ts +24 -0
- package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +320 -75
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/error.d.ts +3 -0
- package/lib/typescript/src/utils/error.d.ts.map +1 -1
- package/lib/typescript/src/utils/errorMapping.d.ts +6 -0
- package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
- package/lib/typescript/src/webhook-client.d.ts +82 -0
- package/lib/typescript/src/webhook-client.d.ts.map +1 -0
- package/nitrogen/generated/android/NitroIap+autolinking.cmake +3 -0
- package/nitrogen/generated/android/c++/JAdvancedCommerceInfoIOS.hpp +118 -0
- package/nitrogen/generated/android/c++/JAdvancedCommerceItemDetailsIOS.hpp +62 -0
- package/nitrogen/generated/android/c++/JAdvancedCommerceItemIOS.hpp +78 -0
- package/nitrogen/generated/android/c++/JAdvancedCommerceRefundIOS.hpp +62 -0
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +52 -0
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +3 -0
- package/nitrogen/generated/android/c++/JPurchase.hpp +11 -0
- package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +16 -1
- package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +11 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceInfoIOS.hpp +84 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_AdvancedCommerceItemDetailsIOS.hpp +74 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.cpp +35 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Array_AdvancedCommerceRefundIOS_.hpp +84 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceInfoIOS.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemDetailsIOS.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceItemIOS.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AdvancedCommerceRefundIOS.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceInfoIOS.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_AdvancedCommerceItemDetailsIOS.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_AdvancedCommerceRefundIOS_.kt +53 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +166 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +12 -0
- package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +32 -0
- package/nitrogen/generated/ios/swift/AdvancedCommerceInfoIOS.swift +294 -0
- package/nitrogen/generated/ios/swift/AdvancedCommerceItemDetailsIOS.swift +61 -0
- package/nitrogen/generated/ios/swift/AdvancedCommerceItemIOS.swift +141 -0
- package/nitrogen/generated/ios/swift/AdvancedCommerceRefundIOS.swift +61 -0
- package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +3 -0
- package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +57 -0
- package/nitrogen/generated/ios/swift/PurchaseIOS.swift +39 -2
- package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceInfoIOS.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_AdvancedCommerceItemDetailsIOS.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType__AdvancedCommerceRefundIOS_.swift +18 -0
- package/nitrogen/generated/shared/c++/AdvancedCommerceInfoIOS.hpp +117 -0
- package/nitrogen/generated/shared/c++/AdvancedCommerceItemDetailsIOS.hpp +86 -0
- package/nitrogen/generated/shared/c++/AdvancedCommerceItemIOS.hpp +99 -0
- package/nitrogen/generated/shared/c++/AdvancedCommerceRefundIOS.hpp +86 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +3 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +3 -0
- package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +9 -2
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/plugin/build/withIAP.d.ts +1 -1
- package/plugin/src/withIAP.ts +1 -1
- package/src/hooks/useIAP.ts +185 -2
- package/src/hooks/useWebhookEvents.ts +180 -0
- package/src/index.ts +440 -130
- package/src/kit-api.ts +225 -0
- package/src/specs/RnIap.nitro.ts +31 -0
- package/src/types.ts +330 -75
- package/src/utils/error.ts +3 -0
- package/src/utils/errorMapping.ts +12 -0
- package/src/webhook-client.ts +312 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package com.margelo.nitro.iap
|
|
2
|
+
|
|
3
|
+
import dev.hyo.openiap.ProductCommon
|
|
4
|
+
import dev.hyo.openiap.ProductQueryType
|
|
5
|
+
import kotlin.coroutines.cancellation.CancellationException
|
|
6
|
+
import kotlinx.coroutines.async
|
|
7
|
+
import kotlinx.coroutines.coroutineScope
|
|
8
|
+
|
|
9
|
+
internal suspend fun collectAllQueryProducts(
|
|
10
|
+
skusList: List<String>,
|
|
11
|
+
fetchKind: suspend (ProductQueryType) -> List<ProductCommon>,
|
|
12
|
+
onFailure: (ProductQueryType, Throwable) -> Unit = { _, _ -> },
|
|
13
|
+
): List<ProductCommon> = coroutineScope {
|
|
14
|
+
val byId = linkedMapOf<String, ProductCommon>()
|
|
15
|
+
var firstFailure: Throwable? = null
|
|
16
|
+
|
|
17
|
+
val queries = listOf(ProductQueryType.InApp, ProductQueryType.Subs).map { kind ->
|
|
18
|
+
kind to async {
|
|
19
|
+
runCatching {
|
|
20
|
+
fetchKind(kind)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
queries.forEach { (kind, query) ->
|
|
26
|
+
query.await().onSuccess { fetched ->
|
|
27
|
+
fetched.forEach { product ->
|
|
28
|
+
byId.putIfAbsent(product.id, product)
|
|
29
|
+
}
|
|
30
|
+
}.onFailure { error ->
|
|
31
|
+
if (error is CancellationException) throw error
|
|
32
|
+
onFailure(kind, error)
|
|
33
|
+
if (firstFailure == null) firstFailure = error
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (byId.isEmpty()) {
|
|
38
|
+
firstFailure?.let { throw it }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
skusList.mapNotNull { byId[it] }
|
|
42
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
package com.margelo.nitro.iap
|
|
2
|
+
|
|
3
|
+
import dev.hyo.openiap.IapPlatform
|
|
4
|
+
import dev.hyo.openiap.OpenIapError
|
|
5
|
+
import dev.hyo.openiap.ProductCommon
|
|
6
|
+
import dev.hyo.openiap.ProductQueryType
|
|
7
|
+
import dev.hyo.openiap.ProductType
|
|
8
|
+
import java.util.Collections
|
|
9
|
+
import kotlinx.coroutines.CompletableDeferred
|
|
10
|
+
import kotlinx.coroutines.runBlocking
|
|
11
|
+
import kotlinx.coroutines.withTimeout
|
|
12
|
+
import org.junit.Assert.assertEquals
|
|
13
|
+
import org.junit.Assert.assertSame
|
|
14
|
+
import org.junit.Test
|
|
15
|
+
|
|
16
|
+
class ProductQueryHelpersTest {
|
|
17
|
+
@Test
|
|
18
|
+
fun `all query starts in-app and subs fetches concurrently`() = runBlocking {
|
|
19
|
+
val startedKinds = Collections.synchronizedSet(mutableSetOf<ProductQueryType>())
|
|
20
|
+
val bothStarted = CompletableDeferred<Unit>()
|
|
21
|
+
|
|
22
|
+
val products = withTimeout(1000) {
|
|
23
|
+
collectAllQueryProducts(
|
|
24
|
+
skusList = listOf("monthly", "lifetime"),
|
|
25
|
+
fetchKind = { kind ->
|
|
26
|
+
when (kind) {
|
|
27
|
+
ProductQueryType.InApp,
|
|
28
|
+
ProductQueryType.Subs -> {
|
|
29
|
+
startedKinds.add(kind)
|
|
30
|
+
if (startedKinds.size == 2) {
|
|
31
|
+
bothStarted.complete(Unit)
|
|
32
|
+
}
|
|
33
|
+
bothStarted.await()
|
|
34
|
+
|
|
35
|
+
when (kind) {
|
|
36
|
+
ProductQueryType.InApp -> listOf(
|
|
37
|
+
fakeProduct("lifetime", ProductType.InApp),
|
|
38
|
+
)
|
|
39
|
+
ProductQueryType.Subs -> listOf(
|
|
40
|
+
fakeProduct("monthly", ProductType.Subs),
|
|
41
|
+
)
|
|
42
|
+
ProductQueryType.All -> error("All should be expanded by the helper")
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ProductQueryType.All -> error("All should be expanded by the helper")
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
assertEquals(setOf(ProductQueryType.InApp, ProductQueryType.Subs), startedKinds.toSet())
|
|
52
|
+
assertEquals(listOf("monthly", "lifetime"), products.map { it.id })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@Test
|
|
56
|
+
fun `all query returns partial success when one product kind fails`() = runBlocking {
|
|
57
|
+
val queryError = OpenIapError.BillingError("Invalid subscriptions")
|
|
58
|
+
val failures = mutableListOf<Pair<ProductQueryType, Throwable>>()
|
|
59
|
+
|
|
60
|
+
val products = collectAllQueryProducts(
|
|
61
|
+
skusList = listOf("monthly", "lifetime"),
|
|
62
|
+
fetchKind = { kind ->
|
|
63
|
+
when (kind) {
|
|
64
|
+
ProductQueryType.InApp -> listOf(fakeProduct("lifetime", ProductType.InApp))
|
|
65
|
+
ProductQueryType.Subs -> throw queryError
|
|
66
|
+
ProductQueryType.All -> error("All should be expanded by the helper")
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
onFailure = { kind, error -> failures += kind to error },
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
assertEquals(listOf("lifetime"), products.map { it.id })
|
|
73
|
+
assertEquals(listOf(ProductQueryType.Subs), failures.map { it.first })
|
|
74
|
+
assertSame(queryError, failures.single().second)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@Test
|
|
78
|
+
fun `all query rethrows first failure when both product kinds fail`() = runBlocking {
|
|
79
|
+
val firstError = OpenIapError.BillingError("Invalid in-app products")
|
|
80
|
+
val secondError = OpenIapError.BillingError("Service unavailable")
|
|
81
|
+
val failures = mutableListOf<ProductQueryType>()
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
collectAllQueryProducts(
|
|
85
|
+
skusList = listOf("monthly", "lifetime"),
|
|
86
|
+
fetchKind = { kind ->
|
|
87
|
+
when (kind) {
|
|
88
|
+
ProductQueryType.InApp -> throw firstError
|
|
89
|
+
ProductQueryType.Subs -> throw secondError
|
|
90
|
+
ProductQueryType.All -> error("All should be expanded by the helper")
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
onFailure = { kind, _ -> failures += kind },
|
|
94
|
+
)
|
|
95
|
+
} catch (error: Throwable) {
|
|
96
|
+
assertSame(firstError, error)
|
|
97
|
+
assertEquals(listOf(ProductQueryType.InApp, ProductQueryType.Subs), failures)
|
|
98
|
+
return@runBlocking
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
error("Expected the first product query failure to be rethrown")
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@Test
|
|
105
|
+
fun `all query preserves input sku order and keeps first matching product`() = runBlocking {
|
|
106
|
+
val products = collectAllQueryProducts(
|
|
107
|
+
skusList = listOf("monthly", "lifetime", "annual"),
|
|
108
|
+
fetchKind = { kind ->
|
|
109
|
+
when (kind) {
|
|
110
|
+
ProductQueryType.InApp -> listOf(
|
|
111
|
+
fakeProduct("lifetime", ProductType.InApp),
|
|
112
|
+
fakeProduct("monthly", ProductType.InApp),
|
|
113
|
+
)
|
|
114
|
+
ProductQueryType.Subs -> listOf(
|
|
115
|
+
fakeProduct("monthly", ProductType.Subs),
|
|
116
|
+
fakeProduct("annual", ProductType.Subs),
|
|
117
|
+
)
|
|
118
|
+
ProductQueryType.All -> error("All should be expanded by the helper")
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
assertEquals(listOf("monthly", "lifetime", "annual"), products.map { it.id })
|
|
124
|
+
assertEquals(ProductType.InApp, products[0].type)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private fun fakeProduct(productId: String, type: ProductType): ProductCommon =
|
|
128
|
+
object : ProductCommon {
|
|
129
|
+
override val currency: String = "USD"
|
|
130
|
+
override val debugDescription: String? = null
|
|
131
|
+
override val description: String = productId
|
|
132
|
+
override val displayName: String? = productId
|
|
133
|
+
override val displayPrice: String = "$1.00"
|
|
134
|
+
override val id: String = productId
|
|
135
|
+
override val platform: IapPlatform = IapPlatform.Android
|
|
136
|
+
override val price: Double? = 1.0
|
|
137
|
+
override val title: String = productId
|
|
138
|
+
override val type: ProductType = type
|
|
139
|
+
}
|
|
140
|
+
}
|
package/ios/HybridRnIap.swift
CHANGED
|
@@ -17,6 +17,8 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
17
17
|
private var purchaseUpdatedListeners: [(NitroPurchase) -> Void] = []
|
|
18
18
|
private var purchaseErrorListeners: [(NitroPurchaseResult) -> Void] = []
|
|
19
19
|
private var promotedProductListeners: [(NitroProduct) -> Void] = []
|
|
20
|
+
private var subscriptionBillingIssueListeners: [(NitroPurchase) -> Void] = []
|
|
21
|
+
private var subscriptionBillingIssueSub: Subscription?
|
|
20
22
|
private var lastPurchaseErrorKey: String? = nil
|
|
21
23
|
private var lastPurchaseErrorTimestamp: TimeInterval = 0
|
|
22
24
|
private var deliveredPurchaseEventKeys: Set<String> = []
|
|
@@ -715,6 +717,39 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
715
717
|
}
|
|
716
718
|
}
|
|
717
719
|
|
|
720
|
+
func getAllTransactionsIOS() throws -> Promise<[NitroPurchase]> {
|
|
721
|
+
return Promise.async {
|
|
722
|
+
do {
|
|
723
|
+
RnIapLog.payload("getAllTransactionsIOS", nil)
|
|
724
|
+
let all = try await OpenIapModule.shared.getAllTransactionsIOS()
|
|
725
|
+
var unionPurchases: [OpenIAP.Purchase] = []
|
|
726
|
+
var payloadUpdates: [String: [String: Any]] = [:]
|
|
727
|
+
for purchase in all {
|
|
728
|
+
let union = OpenIAP.Purchase.purchaseIos(purchase)
|
|
729
|
+
unionPurchases.append(union)
|
|
730
|
+
let raw = OpenIapSerialization.purchase(union)
|
|
731
|
+
if let identifier = raw["id"] as? String {
|
|
732
|
+
payloadUpdates[identifier] = raw
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
await MainActor.run {
|
|
736
|
+
for (key, value) in payloadUpdates {
|
|
737
|
+
self.purchasePayloadById[key] = value
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
let payloads = RnIapHelper.sanitizeArray(OpenIapSerialization.purchases(unionPurchases))
|
|
741
|
+
RnIapLog.result("getAllTransactionsIOS", payloads)
|
|
742
|
+
return payloads.map { RnIapHelper.convertPurchaseDictionary($0) }
|
|
743
|
+
} catch let purchaseError as PurchaseError {
|
|
744
|
+
RnIapLog.failure("getAllTransactionsIOS", error: purchaseError)
|
|
745
|
+
throw OpenIapException.from(purchaseError)
|
|
746
|
+
} catch {
|
|
747
|
+
RnIapLog.failure("getAllTransactionsIOS", error: error)
|
|
748
|
+
throw OpenIapException.make(code: .serviceError, message: error.localizedDescription)
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
718
753
|
func syncIOS() throws -> Promise<Bool> {
|
|
719
754
|
return Promise.async {
|
|
720
755
|
do {
|
|
@@ -922,7 +957,16 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
922
957
|
func removePurchaseErrorListener(listener: @escaping (NitroPurchaseResult) -> Void) throws {
|
|
923
958
|
listenerLock.withLock { purchaseErrorListeners.removeAll() }
|
|
924
959
|
}
|
|
925
|
-
|
|
960
|
+
|
|
961
|
+
func addSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
|
|
962
|
+
listenerLock.withLock { subscriptionBillingIssueListeners.append(listener) }
|
|
963
|
+
attachSubscriptionBillingIssueSubIfNeeded()
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
func removeSubscriptionBillingIssueListener(listener: @escaping (NitroPurchase) -> Void) throws {
|
|
967
|
+
listenerLock.withLock { subscriptionBillingIssueListeners.removeAll() }
|
|
968
|
+
}
|
|
969
|
+
|
|
926
970
|
// MARK: - Private Helper Methods
|
|
927
971
|
|
|
928
972
|
private func attachListenersIfNeeded() {
|
|
@@ -1004,6 +1048,27 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1004
1048
|
}
|
|
1005
1049
|
}
|
|
1006
1050
|
|
|
1051
|
+
private func attachSubscriptionBillingIssueSubIfNeeded() {
|
|
1052
|
+
guard subscriptionBillingIssueSub == nil else { return }
|
|
1053
|
+
RnIapLog.payload("subscriptionBillingIssueListener.register", nil)
|
|
1054
|
+
subscriptionBillingIssueSub = OpenIapModule.shared.subscriptionBillingIssueListener { [weak self] openIapPurchase in
|
|
1055
|
+
guard let self else {
|
|
1056
|
+
RnIapLog.warn("subscriptionBillingIssueListener: HybridRnIap deallocated, event dropped")
|
|
1057
|
+
return
|
|
1058
|
+
}
|
|
1059
|
+
Task { @MainActor in
|
|
1060
|
+
let payload = RnIapHelper.sanitizeDictionary(OpenIapSerialization.purchase(openIapPurchase))
|
|
1061
|
+
RnIapLog.result("subscriptionBillingIssueListener", payload)
|
|
1062
|
+
let nitro = RnIapHelper.convertPurchaseDictionary(payload)
|
|
1063
|
+
let snapshot: [(NitroPurchase) -> Void] = self.listenerLock.withLock {
|
|
1064
|
+
Array(self.subscriptionBillingIssueListeners)
|
|
1065
|
+
}
|
|
1066
|
+
for l in snapshot { l(nitro) }
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
RnIapLog.result("subscriptionBillingIssueListener.register", "attached")
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1007
1072
|
private func ensureConnection() throws {
|
|
1008
1073
|
guard isInitialized else {
|
|
1009
1074
|
throw OpenIapException.make(code: .initConnection, message: "Connection not initialized. Call initConnection() first.")
|
|
@@ -1121,9 +1186,14 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1121
1186
|
RnIapLog.payload("removeListener", "promotedProduct")
|
|
1122
1187
|
OpenIapModule.shared.removeListener(sub)
|
|
1123
1188
|
}
|
|
1189
|
+
if let sub = subscriptionBillingIssueSub {
|
|
1190
|
+
RnIapLog.payload("removeListener", "subscriptionBillingIssue")
|
|
1191
|
+
OpenIapModule.shared.removeListener(sub)
|
|
1192
|
+
}
|
|
1124
1193
|
purchaseUpdatedSub = nil
|
|
1125
1194
|
purchaseErrorSub = nil
|
|
1126
1195
|
promotedProductSub = nil
|
|
1196
|
+
subscriptionBillingIssueSub = nil
|
|
1127
1197
|
Task {
|
|
1128
1198
|
RnIapLog.payload("endConnection", nil)
|
|
1129
1199
|
let result = try? await OpenIapModule.shared.endConnection()
|
|
@@ -1135,6 +1205,7 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
1135
1205
|
purchaseUpdatedListeners.removeAll()
|
|
1136
1206
|
purchaseErrorListeners.removeAll()
|
|
1137
1207
|
promotedProductListeners.removeAll()
|
|
1208
|
+
subscriptionBillingIssueListeners.removeAll()
|
|
1138
1209
|
lastPurchaseErrorKey = nil
|
|
1139
1210
|
lastPurchaseErrorTimestamp = 0
|
|
1140
1211
|
deliveredPurchaseEventKeys.removeAll()
|
|
@@ -6,7 +6,7 @@ import { Platform } from 'react-native';
|
|
|
6
6
|
import { RnIapConsole } from "../utils/debug.js";
|
|
7
7
|
|
|
8
8
|
// Internal modules
|
|
9
|
-
import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, verifyPurchase as verifyPurchaseTopLevel, verifyPurchaseWithProvider as verifyPurchaseWithProviderTopLevel, getActiveSubscriptions, hasActiveSubscriptions, syncIOS, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid, isStandardIOS } from "../index.js";
|
|
9
|
+
import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, verifyPurchase as verifyPurchaseTopLevel, verifyPurchaseWithProvider as verifyPurchaseWithProviderTopLevel, getActiveSubscriptions, hasActiveSubscriptions, syncIOS, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid, subscriptionBillingIssueListener, isStandardIOS } from "../index.js";
|
|
10
10
|
|
|
11
11
|
// Types
|
|
12
12
|
import { ErrorCode } from "../types.js";
|
|
@@ -219,6 +219,14 @@ export function useIAP(options) {
|
|
|
219
219
|
}
|
|
220
220
|
});
|
|
221
221
|
}
|
|
222
|
+
|
|
223
|
+
// Always attach so callers that supply `onSubscriptionBillingIssue` later
|
|
224
|
+
// (after the hook has already set up listeners) still receive events.
|
|
225
|
+
if (!subscriptionsRef.current.subscriptionBillingIssue) {
|
|
226
|
+
subscriptionsRef.current.subscriptionBillingIssue = subscriptionBillingIssueListener(purchase => {
|
|
227
|
+
optionsRef.current?.onSubscriptionBillingIssue?.(purchase);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
222
230
|
}, [getActiveSubscriptionsInternal, getAvailablePurchasesInternal]);
|
|
223
231
|
|
|
224
232
|
// Shared helper: clean up all listeners
|
|
@@ -227,10 +235,12 @@ export function useIAP(options) {
|
|
|
227
235
|
subscriptionsRef.current.purchaseError?.remove();
|
|
228
236
|
subscriptionsRef.current.promotedProductIOS?.remove();
|
|
229
237
|
subscriptionsRef.current.userChoiceBillingAndroid?.remove();
|
|
238
|
+
subscriptionsRef.current.subscriptionBillingIssue?.remove();
|
|
230
239
|
subscriptionsRef.current.purchaseUpdate = undefined;
|
|
231
240
|
subscriptionsRef.current.purchaseError = undefined;
|
|
232
241
|
subscriptionsRef.current.promotedProductIOS = undefined;
|
|
233
242
|
subscriptionsRef.current.userChoiceBillingAndroid = undefined;
|
|
243
|
+
subscriptionsRef.current.subscriptionBillingIssue = undefined;
|
|
234
244
|
}, []);
|
|
235
245
|
const initIapWithSubscriptions = useCallback(async () => {
|
|
236
246
|
const config = buildAndroidConfig();
|
|
@@ -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","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","cleanupListeners","remove","undefined","initIapWithSubscriptions","reconnect"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","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","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":[]}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { connectWebhookStream } from "../webhook-client.js";
|
|
5
|
+
// React hook wrapping the SSE webhook stream. Lifecycle:
|
|
6
|
+
// - opens on mount (once `apiKey` is non-empty),
|
|
7
|
+
// - closes on unmount,
|
|
8
|
+
// - reconnects automatically when EventSource raises a transport
|
|
9
|
+
// error (the underlying client auto-reconnects via the EventSource
|
|
10
|
+
// spec; this hook just surfaces the error and re-renders).
|
|
11
|
+
//
|
|
12
|
+
// Why a hook: openiap's UX guidance is that consumers consume webhook
|
|
13
|
+
// events from React state (granting entitlement, refreshing the
|
|
14
|
+
// subscription view) rather than via an imperative listener. The
|
|
15
|
+
// hook's `events` buffer + `onEvent` callback cover both styles.
|
|
16
|
+
export function useWebhookEvents({
|
|
17
|
+
apiKey,
|
|
18
|
+
baseUrl,
|
|
19
|
+
eventSourceFactory,
|
|
20
|
+
bufferSize = 50,
|
|
21
|
+
onEvent,
|
|
22
|
+
onError
|
|
23
|
+
}) {
|
|
24
|
+
const [events, setEvents] = useState([]);
|
|
25
|
+
const [lastError, setLastError] = useState(null);
|
|
26
|
+
const [isConnected, setIsConnected] = useState(false);
|
|
27
|
+
|
|
28
|
+
// Stash callbacks in refs so reconnects don't fire on every render.
|
|
29
|
+
// The underlying SSE connection should only restart when `apiKey` /
|
|
30
|
+
// `baseUrl` change. `eventSourceFactory` is held in a ref too so
|
|
31
|
+
// anonymous-function callers don't tear down the connection every
|
|
32
|
+
// render (a common React pitfall — was previously documented as a
|
|
33
|
+
// caller-side constraint, now enforced by the hook). `bufferSize`
|
|
34
|
+
// is also a ref so adjusting the buffer cap from the host component
|
|
35
|
+
// doesn't tear down the stream and lose in-flight events.
|
|
36
|
+
const onEventRef = useRef(onEvent);
|
|
37
|
+
const onErrorRef = useRef(onError);
|
|
38
|
+
const eventSourceFactoryRef = useRef(eventSourceFactory);
|
|
39
|
+
const bufferSizeRef = useRef(bufferSize);
|
|
40
|
+
onEventRef.current = onEvent;
|
|
41
|
+
onErrorRef.current = onError;
|
|
42
|
+
eventSourceFactoryRef.current = eventSourceFactory;
|
|
43
|
+
bufferSizeRef.current = bufferSize;
|
|
44
|
+
|
|
45
|
+
// Trim the visible buffer immediately when bufferSize is lowered
|
|
46
|
+
// mid-stream. The ref-based update would otherwise only take
|
|
47
|
+
// effect on the next event.
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
setEvents(prev => bufferSize > 0 ? prev.slice(0, bufferSize) : []);
|
|
50
|
+
}, [bufferSize]);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
// Fresh stream → fresh state. Resetting events + lastError on
|
|
53
|
+
// (re)connect prevents a stale payload from the previous
|
|
54
|
+
// apiKey/baseUrl from briefly leaking into the new context.
|
|
55
|
+
setEvents([]);
|
|
56
|
+
setLastError(null);
|
|
57
|
+
if (!apiKey) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let listener = null;
|
|
61
|
+
let mounted = true;
|
|
62
|
+
try {
|
|
63
|
+
listener = connectWebhookStream({
|
|
64
|
+
apiKey,
|
|
65
|
+
baseUrl,
|
|
66
|
+
eventSourceFactory: eventSourceFactoryRef.current,
|
|
67
|
+
onEvent: event => {
|
|
68
|
+
if (!mounted) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
setIsConnected(true);
|
|
72
|
+
const cap = bufferSizeRef.current;
|
|
73
|
+
if (cap > 0) {
|
|
74
|
+
setEvents(prev => [event, ...prev].slice(0, cap));
|
|
75
|
+
}
|
|
76
|
+
onEventRef.current?.(event);
|
|
77
|
+
},
|
|
78
|
+
onError: error => {
|
|
79
|
+
if (!mounted) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
setLastError(error);
|
|
83
|
+
onErrorRef.current?.(error);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
const wrapped = {
|
|
88
|
+
code: 'TRANSPORT_ERROR',
|
|
89
|
+
message: error instanceof Error ? error.message : 'Failed to open webhook stream',
|
|
90
|
+
cause: error
|
|
91
|
+
};
|
|
92
|
+
setLastError(wrapped);
|
|
93
|
+
onErrorRef.current?.(wrapped);
|
|
94
|
+
}
|
|
95
|
+
return () => {
|
|
96
|
+
mounted = false;
|
|
97
|
+
listener?.close();
|
|
98
|
+
setIsConnected(false);
|
|
99
|
+
};
|
|
100
|
+
// `eventSourceFactory` deliberately omitted from deps — held in a
|
|
101
|
+
// ref above so anonymous-function callers don't trigger reconnects
|
|
102
|
+
// on every render. The connection is only re-opened when apiKey or
|
|
103
|
+
// baseUrl changes; a runtime factory swap is picked up on that
|
|
104
|
+
// next reconnect via the ref.
|
|
105
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
106
|
+
}, [apiKey, baseUrl]);
|
|
107
|
+
return {
|
|
108
|
+
events,
|
|
109
|
+
lastError,
|
|
110
|
+
isConnected
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=useWebhookEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","useState","connectWebhookStream","useWebhookEvents","apiKey","baseUrl","eventSourceFactory","bufferSize","onEvent","onError","events","setEvents","lastError","setLastError","isConnected","setIsConnected","onEventRef","onErrorRef","eventSourceFactoryRef","bufferSizeRef","current","prev","slice","listener","mounted","event","cap","error","wrapped","code","message","Error","cause","close"],"sourceRoot":"../../../src","sources":["hooks/useWebhookEvents.ts"],"mappings":"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","ignoreList":[]}
|