react-native-iap 14.4.10 → 14.4.12
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 +195 -12
- package/ios/HybridRnIap.swift +115 -2
- package/ios/RnIapHelper.swift +32 -1
- package/lib/module/hooks/useIAP.js +24 -3
- package/lib/module/hooks/useIAP.js.map +1 -1
- package/lib/module/index.js +275 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +18 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/type-bridge.js +39 -1
- package/lib/module/utils/type-bridge.js.map +1 -1
- package/lib/typescript/plugin/src/withIAP.d.ts +27 -0
- package/lib/typescript/plugin/src/withIAP.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useIAP.d.ts +6 -1
- package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +133 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/RnIap.nitro.d.ts +101 -2
- package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +116 -13
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
- package/nitrogen/generated/android/NitroIapOnLoad.cpp +2 -0
- package/nitrogen/generated/android/c++/JAlternativeBillingModeAndroid.hpp +62 -0
- package/nitrogen/generated/android/c++/JExternalPurchaseLinkResultIOS.hpp +58 -0
- package/nitrogen/generated/android/c++/JExternalPurchaseNoticeAction.hpp +59 -0
- package/nitrogen/generated/android/c++/JExternalPurchaseNoticeResultIOS.hpp +60 -0
- package/nitrogen/generated/android/c++/JFunc_void_NitroProduct.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_UserChoiceBillingDetails.hpp +78 -0
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +136 -3
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +9 -1
- package/nitrogen/generated/android/c++/JInitConnectionConfig.hpp +55 -0
- package/nitrogen/generated/android/c++/JNitroOneTimePurchaseOfferDetail.hpp +61 -0
- package/nitrogen/generated/android/c++/JNitroProduct.hpp +16 -2
- package/nitrogen/generated/android/c++/JNitroPurchase.hpp +74 -2
- package/nitrogen/generated/android/c++/JPurchaseAndroid.hpp +4 -0
- package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +4 -0
- package/nitrogen/generated/android/c++/JUserChoiceBillingDetails.hpp +75 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/AlternativeBillingModeAndroid.kt +22 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseLinkResultIOS.kt +32 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseNoticeAction.kt +21 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ExternalPurchaseNoticeResultIOS.kt +32 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Func_void_UserChoiceBillingDetails.kt +81 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +43 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InitConnectionConfig.kt +29 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroProduct.kt +10 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchase.kt +55 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseAndroid.kt +3 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +3 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/UserChoiceBillingDetails.kt +32 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +24 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +174 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +21 -0
- package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +84 -3
- package/nitrogen/generated/ios/swift/AlternativeBillingModeAndroid.swift +44 -0
- package/nitrogen/generated/ios/swift/ExternalPurchaseLinkResultIOS.swift +65 -0
- package/nitrogen/generated/ios/swift/ExternalPurchaseNoticeAction.swift +40 -0
- package/nitrogen/generated/ios/swift/ExternalPurchaseNoticeResultIOS.swift +65 -0
- package/nitrogen/generated/ios/swift/Func_void_ExternalPurchaseLinkResultIOS.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_ExternalPurchaseNoticeResultIOS.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_UserChoiceBillingDetails.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +9 -1
- package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +168 -2
- package/nitrogen/generated/ios/swift/InitConnectionConfig.swift +47 -0
- package/nitrogen/generated/ios/swift/NitroOneTimePurchaseOfferDetail.swift +57 -0
- package/nitrogen/generated/ios/swift/NitroProduct.swift +91 -1
- package/nitrogen/generated/ios/swift/NitroPurchase.swift +520 -1
- package/nitrogen/generated/ios/swift/PurchaseAndroid.swift +31 -1
- package/nitrogen/generated/ios/swift/PurchaseIOS.swift +31 -1
- package/nitrogen/generated/ios/swift/UserChoiceBillingDetails.swift +58 -0
- package/nitrogen/generated/shared/c++/AlternativeBillingModeAndroid.hpp +80 -0
- package/nitrogen/generated/shared/c++/ExternalPurchaseLinkResultIOS.hpp +72 -0
- package/nitrogen/generated/shared/c++/ExternalPurchaseNoticeAction.hpp +76 -0
- package/nitrogen/generated/shared/c++/ExternalPurchaseNoticeResultIOS.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +8 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +22 -2
- package/nitrogen/generated/shared/c++/InitConnectionConfig.hpp +69 -0
- package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +75 -0
- package/nitrogen/generated/shared/c++/NitroProduct.hpp +17 -2
- package/nitrogen/generated/shared/c++/NitroPurchase.hpp +74 -2
- package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +5 -1
- package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +5 -1
- package/nitrogen/generated/shared/c++/UserChoiceBillingDetails.hpp +72 -0
- package/openiap-versions.json +3 -3
- package/package.json +3 -3
- package/plugin/build/withIAP.d.ts +27 -0
- package/plugin/build/withIAP.js +91 -1
- package/plugin/src/withIAP.ts +162 -0
- package/src/hooks/useIAP.ts +47 -1
- package/src/index.ts +313 -2
- package/src/specs/RnIap.nitro.ts +131 -1
- package/src/types.ts +124 -13
- package/src/utils/type-bridge.ts +76 -16
|
@@ -26,8 +26,10 @@ import dev.hyo.openiap.RequestPurchaseResultPurchase
|
|
|
26
26
|
import dev.hyo.openiap.RequestPurchaseResultPurchases
|
|
27
27
|
import dev.hyo.openiap.RequestSubscriptionAndroidProps
|
|
28
28
|
import dev.hyo.openiap.RequestSubscriptionPropsByPlatforms
|
|
29
|
+
import dev.hyo.openiap.InitConnectionConfig as OpenIapInitConnectionConfig
|
|
29
30
|
import dev.hyo.openiap.listener.OpenIapPurchaseErrorListener
|
|
30
31
|
import dev.hyo.openiap.listener.OpenIapPurchaseUpdateListener
|
|
32
|
+
import dev.hyo.openiap.listener.OpenIapUserChoiceBillingListener
|
|
31
33
|
import kotlinx.coroutines.Dispatchers
|
|
32
34
|
import kotlinx.coroutines.withContext
|
|
33
35
|
import kotlinx.coroutines.CompletableDeferred
|
|
@@ -50,15 +52,16 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
50
52
|
private val purchaseUpdatedListeners = mutableListOf<(NitroPurchase) -> Unit>()
|
|
51
53
|
private val purchaseErrorListeners = mutableListOf<(NitroPurchaseResult) -> Unit>()
|
|
52
54
|
private val promotedProductListenersIOS = mutableListOf<(NitroProduct) -> Unit>()
|
|
55
|
+
private val userChoiceBillingListenersAndroid = mutableListOf<(UserChoiceBillingDetails) -> Unit>()
|
|
53
56
|
private var listenersAttached = false
|
|
54
57
|
private var isInitialized = false
|
|
55
58
|
private var initDeferred: CompletableDeferred<Boolean>? = null
|
|
56
59
|
private val initLock = Any()
|
|
57
60
|
|
|
58
61
|
// Connection methods
|
|
59
|
-
override fun initConnection(): Promise<Boolean> {
|
|
62
|
+
override fun initConnection(config: InitConnectionConfig?): Promise<Boolean> {
|
|
60
63
|
return Promise.async {
|
|
61
|
-
RnIapLog.payload("initConnection",
|
|
64
|
+
RnIapLog.payload("initConnection", config)
|
|
62
65
|
// Fast-path: if already initialized, return immediately
|
|
63
66
|
if (isInitialized) {
|
|
64
67
|
RnIapLog.result("initConnection", true)
|
|
@@ -114,16 +117,39 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
114
117
|
)
|
|
115
118
|
}.onFailure { RnIapLog.failure("purchaseErrorListener", it) }
|
|
116
119
|
})
|
|
120
|
+
openIap.addUserChoiceBillingListener(OpenIapUserChoiceBillingListener { details ->
|
|
121
|
+
runCatching {
|
|
122
|
+
RnIapLog.result(
|
|
123
|
+
"userChoiceBillingListener",
|
|
124
|
+
mapOf("products" to details.products, "token" to details.externalTransactionToken)
|
|
125
|
+
)
|
|
126
|
+
val nitroDetails = UserChoiceBillingDetails(
|
|
127
|
+
externalTransactionToken = details.externalTransactionToken,
|
|
128
|
+
products = details.products.toTypedArray()
|
|
129
|
+
)
|
|
130
|
+
sendUserChoiceBilling(nitroDetails)
|
|
131
|
+
}.onFailure { RnIapLog.failure("userChoiceBillingListener", it) }
|
|
132
|
+
})
|
|
117
133
|
RnIapLog.result("listeners.attach", "attached")
|
|
118
134
|
}
|
|
119
135
|
|
|
120
136
|
// We created it above; reuse the shared instance
|
|
121
137
|
val deferred = initDeferred!!
|
|
122
138
|
try {
|
|
139
|
+
// Convert Nitro config to OpenIAP config
|
|
140
|
+
val openIapConfig = config?.let {
|
|
141
|
+
OpenIapInitConnectionConfig(
|
|
142
|
+
alternativeBillingModeAndroid = when (it.alternativeBillingModeAndroid) {
|
|
143
|
+
com.margelo.nitro.iap.AlternativeBillingModeAndroid.USER_CHOICE -> dev.hyo.openiap.AlternativeBillingModeAndroid.UserChoice
|
|
144
|
+
com.margelo.nitro.iap.AlternativeBillingModeAndroid.ALTERNATIVE_ONLY -> dev.hyo.openiap.AlternativeBillingModeAndroid.AlternativeOnly
|
|
145
|
+
else -> null
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
}
|
|
123
149
|
val ok = try {
|
|
124
|
-
RnIapLog.payload("initConnection.native",
|
|
150
|
+
RnIapLog.payload("initConnection.native", openIapConfig)
|
|
125
151
|
withContext(Dispatchers.Main) {
|
|
126
|
-
openIap.initConnection()
|
|
152
|
+
openIap.initConnection(openIapConfig)
|
|
127
153
|
}
|
|
128
154
|
} catch (err: Throwable) {
|
|
129
155
|
val error = OpenIAPError.InitConnection
|
|
@@ -189,7 +215,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
189
215
|
throw Exception(toErrorJson(OpenIAPError.EmptySkuList))
|
|
190
216
|
}
|
|
191
217
|
|
|
192
|
-
initConnection().await()
|
|
218
|
+
initConnection(null).await()
|
|
193
219
|
|
|
194
220
|
val queryType = parseProductQueryType(type)
|
|
195
221
|
val skusList = skus.toList()
|
|
@@ -262,7 +288,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
262
288
|
}
|
|
263
289
|
|
|
264
290
|
try {
|
|
265
|
-
initConnection().await()
|
|
291
|
+
initConnection(null).await()
|
|
266
292
|
withContext(Dispatchers.Main) { runCatching { openIap.setActivity(context.currentActivity) } }
|
|
267
293
|
|
|
268
294
|
val missingSkus = androidRequest.skus.filterNot { productTypeBySku.containsKey(it) }
|
|
@@ -377,7 +403,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
377
403
|
override fun getAvailablePurchases(options: NitroAvailablePurchasesOptions?): Promise<Array<NitroPurchase>> {
|
|
378
404
|
return Promise.async {
|
|
379
405
|
val androidOptions = options?.android
|
|
380
|
-
initConnection().await()
|
|
406
|
+
initConnection(null).await()
|
|
381
407
|
|
|
382
408
|
RnIapLog.payload(
|
|
383
409
|
"getAvailablePurchases",
|
|
@@ -444,7 +470,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
444
470
|
|
|
445
471
|
// Ensure connection; if it fails, return an error result instead of throwing
|
|
446
472
|
try {
|
|
447
|
-
initConnection().await()
|
|
473
|
+
initConnection(null).await()
|
|
448
474
|
} catch (e: Exception) {
|
|
449
475
|
val err = OpenIAPError.InitConnection
|
|
450
476
|
return@async Variant_Boolean_NitroPurchaseResult.Second(
|
|
@@ -494,7 +520,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
494
520
|
override fun getStorefront(): Promise<String> {
|
|
495
521
|
return Promise.async {
|
|
496
522
|
try {
|
|
497
|
-
initConnection().await()
|
|
523
|
+
initConnection(null).await()
|
|
498
524
|
RnIapLog.payload("getStorefront", null)
|
|
499
525
|
val value = openIap.getStorefront()
|
|
500
526
|
RnIapLog.result("getStorefront", value)
|
|
@@ -657,6 +683,13 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
657
683
|
}
|
|
658
684
|
|
|
659
685
|
val subscriptionOffersJson = subscriptionOffers.takeIf { it.isNotEmpty() }?.let { serializeSubscriptionOffers(it) }
|
|
686
|
+
val oneTimeOfferNitro = oneTimeOffer?.let { otp ->
|
|
687
|
+
NitroOneTimePurchaseOfferDetail(
|
|
688
|
+
formattedPrice = otp.formattedPrice,
|
|
689
|
+
priceAmountMicros = otp.priceAmountMicros,
|
|
690
|
+
priceCurrencyCode = otp.priceCurrencyCode
|
|
691
|
+
)
|
|
692
|
+
}
|
|
660
693
|
|
|
661
694
|
var originalPriceAndroid: String? = null
|
|
662
695
|
var originalPriceAmountMicrosAndroid: Double? = null
|
|
@@ -695,6 +728,12 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
695
728
|
}
|
|
696
729
|
}
|
|
697
730
|
|
|
731
|
+
val nameAndroid = when (product) {
|
|
732
|
+
is ProductAndroid -> product.nameAndroid
|
|
733
|
+
is ProductSubscriptionAndroid -> product.nameAndroid
|
|
734
|
+
else -> null
|
|
735
|
+
}
|
|
736
|
+
|
|
698
737
|
return NitroProduct(
|
|
699
738
|
id = product.id,
|
|
700
739
|
title = product.title,
|
|
@@ -708,6 +747,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
708
747
|
typeIOS = null,
|
|
709
748
|
isFamilyShareableIOS = null,
|
|
710
749
|
jsonRepresentationIOS = null,
|
|
750
|
+
discountsIOS = null,
|
|
711
751
|
subscriptionPeriodUnitIOS = null,
|
|
712
752
|
subscriptionPeriodNumberIOS = null,
|
|
713
753
|
introductoryPriceIOS = null,
|
|
@@ -715,6 +755,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
715
755
|
introductoryPricePaymentModeIOS = null,
|
|
716
756
|
introductoryPriceNumberOfPeriodsIOS = null,
|
|
717
757
|
introductoryPriceSubscriptionPeriodIOS = null,
|
|
758
|
+
nameAndroid = nameAndroid,
|
|
718
759
|
originalPriceAndroid = originalPriceAndroid,
|
|
719
760
|
originalPriceAmountMicrosAndroid = originalPriceAmountMicrosAndroid,
|
|
720
761
|
introductoryPriceValueAndroid = introductoryPriceValueAndroid,
|
|
@@ -722,7 +763,8 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
722
763
|
introductoryPricePeriodAndroid = introductoryPricePeriodAndroid,
|
|
723
764
|
subscriptionPeriodAndroid = subscriptionPeriodAndroid,
|
|
724
765
|
freeTrialPeriodAndroid = freeTrialPeriodAndroid,
|
|
725
|
-
subscriptionOfferDetailsAndroid = subscriptionOffersJson
|
|
766
|
+
subscriptionOfferDetailsAndroid = subscriptionOffersJson,
|
|
767
|
+
oneTimePurchaseOfferDetailsAndroid = oneTimeOfferNitro
|
|
726
768
|
)
|
|
727
769
|
}
|
|
728
770
|
|
|
@@ -748,6 +790,23 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
748
790
|
originalTransactionDateIOS = null,
|
|
749
791
|
originalTransactionIdentifierIOS = null,
|
|
750
792
|
appAccountToken = null,
|
|
793
|
+
appBundleIdIOS = null,
|
|
794
|
+
countryCodeIOS = null,
|
|
795
|
+
currencyCodeIOS = null,
|
|
796
|
+
currencySymbolIOS = null,
|
|
797
|
+
environmentIOS = null,
|
|
798
|
+
expirationDateIOS = null,
|
|
799
|
+
isUpgradedIOS = null,
|
|
800
|
+
offerIOS = null,
|
|
801
|
+
ownershipTypeIOS = null,
|
|
802
|
+
reasonIOS = null,
|
|
803
|
+
reasonStringRepresentationIOS = null,
|
|
804
|
+
revocationDateIOS = null,
|
|
805
|
+
revocationReasonIOS = null,
|
|
806
|
+
storefrontCountryCodeIOS = null,
|
|
807
|
+
subscriptionGroupIdIOS = null,
|
|
808
|
+
transactionReasonIOS = null,
|
|
809
|
+
webOrderLineItemIdIOS = null,
|
|
751
810
|
purchaseTokenAndroid = androidPurchase?.purchaseToken,
|
|
752
811
|
dataAndroid = androidPurchase?.dataAndroid,
|
|
753
812
|
signatureAndroid = androidPurchase?.signatureAndroid,
|
|
@@ -756,7 +815,8 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
756
815
|
isAcknowledgedAndroid = androidPurchase?.isAcknowledgedAndroid,
|
|
757
816
|
packageNameAndroid = androidPurchase?.packageNameAndroid,
|
|
758
817
|
obfuscatedAccountIdAndroid = androidPurchase?.obfuscatedAccountIdAndroid,
|
|
759
|
-
obfuscatedProfileIdAndroid = androidPurchase?.obfuscatedProfileIdAndroid
|
|
818
|
+
obfuscatedProfileIdAndroid = androidPurchase?.obfuscatedProfileIdAndroid,
|
|
819
|
+
developerPayloadAndroid = androidPurchase?.developerPayloadAndroid
|
|
760
820
|
)
|
|
761
821
|
}
|
|
762
822
|
|
|
@@ -791,7 +851,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
791
851
|
override fun deepLinkToSubscriptionsAndroid(options: NitroDeepLinkOptionsAndroid): Promise<Unit> {
|
|
792
852
|
return Promise.async {
|
|
793
853
|
try {
|
|
794
|
-
initConnection().await()
|
|
854
|
+
initConnection(null).await()
|
|
795
855
|
OpenIapDeepLinkOptions(
|
|
796
856
|
skuAndroid = options.skuAndroid,
|
|
797
857
|
packageNameAndroid = options.packageNameAndroid
|
|
@@ -989,9 +1049,132 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
989
1049
|
}
|
|
990
1050
|
}
|
|
991
1051
|
|
|
1052
|
+
// -------------------------------------------------------------------------
|
|
1053
|
+
// Alternative Billing (Android)
|
|
1054
|
+
// -------------------------------------------------------------------------
|
|
1055
|
+
|
|
1056
|
+
override fun checkAlternativeBillingAvailabilityAndroid(): Promise<Boolean> {
|
|
1057
|
+
return Promise.async {
|
|
1058
|
+
RnIapLog.payload("checkAlternativeBillingAvailabilityAndroid", null)
|
|
1059
|
+
try {
|
|
1060
|
+
val isAvailable = withContext(Dispatchers.Main) {
|
|
1061
|
+
openIap.checkAlternativeBillingAvailability()
|
|
1062
|
+
}
|
|
1063
|
+
RnIapLog.result("checkAlternativeBillingAvailabilityAndroid", isAvailable)
|
|
1064
|
+
isAvailable
|
|
1065
|
+
} catch (err: Throwable) {
|
|
1066
|
+
RnIapLog.failure("checkAlternativeBillingAvailabilityAndroid", err)
|
|
1067
|
+
val errorType = parseOpenIapError(err)
|
|
1068
|
+
throw Exception(toErrorJson(errorType, debugMessage = err.message))
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
override fun showAlternativeBillingDialogAndroid(): Promise<Boolean> {
|
|
1074
|
+
return Promise.async {
|
|
1075
|
+
RnIapLog.payload("showAlternativeBillingDialogAndroid", null)
|
|
1076
|
+
try {
|
|
1077
|
+
val activity = context.currentActivity
|
|
1078
|
+
?: throw Exception(toErrorJson(OpenIAPError.DeveloperError, debugMessage = "Activity not available"))
|
|
1079
|
+
|
|
1080
|
+
val userAccepted = withContext(Dispatchers.Main) {
|
|
1081
|
+
openIap.setActivity(activity)
|
|
1082
|
+
openIap.showAlternativeBillingInformationDialog(activity)
|
|
1083
|
+
}
|
|
1084
|
+
RnIapLog.result("showAlternativeBillingDialogAndroid", userAccepted)
|
|
1085
|
+
userAccepted
|
|
1086
|
+
} catch (err: Throwable) {
|
|
1087
|
+
RnIapLog.failure("showAlternativeBillingDialogAndroid", err)
|
|
1088
|
+
val errorType = parseOpenIapError(err)
|
|
1089
|
+
throw Exception(toErrorJson(errorType, debugMessage = err.message))
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
override fun createAlternativeBillingTokenAndroid(sku: String?): Promise<String?> {
|
|
1095
|
+
return Promise.async {
|
|
1096
|
+
RnIapLog.payload("createAlternativeBillingTokenAndroid", mapOf("sku" to sku))
|
|
1097
|
+
try {
|
|
1098
|
+
// Note: OpenIapModule.createAlternativeBillingReportingToken() doesn't accept sku parameter
|
|
1099
|
+
// The sku parameter is ignored for now - may be used in future versions
|
|
1100
|
+
val token = withContext(Dispatchers.Main) {
|
|
1101
|
+
openIap.createAlternativeBillingReportingToken()
|
|
1102
|
+
}
|
|
1103
|
+
RnIapLog.result("createAlternativeBillingTokenAndroid", token)
|
|
1104
|
+
token
|
|
1105
|
+
} catch (err: Throwable) {
|
|
1106
|
+
RnIapLog.failure("createAlternativeBillingTokenAndroid", err)
|
|
1107
|
+
val errorType = parseOpenIapError(err)
|
|
1108
|
+
throw Exception(toErrorJson(errorType, debugMessage = err.message))
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
// User Choice Billing listener
|
|
1114
|
+
override fun addUserChoiceBillingListenerAndroid(listener: (UserChoiceBillingDetails) -> Unit) {
|
|
1115
|
+
synchronized(userChoiceBillingListenersAndroid) {
|
|
1116
|
+
userChoiceBillingListenersAndroid.add(listener)
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
override fun removeUserChoiceBillingListenerAndroid(listener: (UserChoiceBillingDetails) -> Unit) {
|
|
1121
|
+
synchronized(userChoiceBillingListenersAndroid) {
|
|
1122
|
+
userChoiceBillingListenersAndroid.remove(listener)
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
private fun sendUserChoiceBilling(details: UserChoiceBillingDetails) {
|
|
1127
|
+
synchronized(userChoiceBillingListenersAndroid) {
|
|
1128
|
+
userChoiceBillingListenersAndroid.forEach { it(details) }
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
// -------------------------------------------------------------------------
|
|
1133
|
+
// External Purchase (iOS) - Not supported on Android
|
|
1134
|
+
// -------------------------------------------------------------------------
|
|
1135
|
+
|
|
1136
|
+
override fun canPresentExternalPurchaseNoticeIOS(): Promise<Boolean> {
|
|
1137
|
+
return Promise.async {
|
|
1138
|
+
throw Exception(toErrorJson(OpenIAPError.NotSupported))
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
override fun presentExternalPurchaseNoticeSheetIOS(): Promise<ExternalPurchaseNoticeResultIOS> {
|
|
1143
|
+
return Promise.async {
|
|
1144
|
+
throw Exception(toErrorJson(OpenIAPError.NotSupported))
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
override fun presentExternalPurchaseLinkIOS(url: String): Promise<ExternalPurchaseLinkResultIOS> {
|
|
1149
|
+
return Promise.async {
|
|
1150
|
+
throw Exception(toErrorJson(OpenIAPError.NotSupported))
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
|
|
992
1154
|
// ---------------------------------------------------------------------
|
|
993
1155
|
// OpenIAP error helpers: unify error codes/messages from library
|
|
994
1156
|
// ---------------------------------------------------------------------
|
|
1157
|
+
private fun parseOpenIapError(err: Throwable): OpenIAPError {
|
|
1158
|
+
// Try to extract OpenIAPError from the exception chain
|
|
1159
|
+
var cause: Throwable? = err
|
|
1160
|
+
while (cause != null) {
|
|
1161
|
+
val message = cause.message ?: ""
|
|
1162
|
+
// Check if message contains OpenIAP error patterns
|
|
1163
|
+
when {
|
|
1164
|
+
message.contains("not prepared", ignoreCase = true) ||
|
|
1165
|
+
message.contains("not initialized", ignoreCase = true) -> return OpenIAPError.NotPrepared
|
|
1166
|
+
message.contains("developer error", ignoreCase = true) ||
|
|
1167
|
+
message.contains("activity not available", ignoreCase = true) -> return OpenIAPError.DeveloperError
|
|
1168
|
+
message.contains("network", ignoreCase = true) -> return OpenIAPError.NetworkError
|
|
1169
|
+
message.contains("service unavailable", ignoreCase = true) ||
|
|
1170
|
+
message.contains("billing unavailable", ignoreCase = true) -> return OpenIAPError.ServiceUnavailable
|
|
1171
|
+
}
|
|
1172
|
+
cause = cause.cause
|
|
1173
|
+
}
|
|
1174
|
+
// Default to ServiceUnavailable if we can't determine the error type
|
|
1175
|
+
return OpenIAPError.ServiceUnavailable
|
|
1176
|
+
}
|
|
1177
|
+
|
|
995
1178
|
private fun toErrorJson(
|
|
996
1179
|
error: OpenIAPError,
|
|
997
1180
|
productId: String? = null,
|
package/ios/HybridRnIap.swift
CHANGED
|
@@ -38,9 +38,9 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
func initConnection() throws -> Promise<Bool> {
|
|
41
|
+
func initConnection(config: InitConnectionConfig?) throws -> Promise<Bool> {
|
|
42
42
|
return Promise.async {
|
|
43
|
-
RnIapLog.payload("initConnection",
|
|
43
|
+
RnIapLog.payload("initConnection", config?.alternativeBillingModeAndroid)
|
|
44
44
|
self.attachListenersIfNeeded()
|
|
45
45
|
|
|
46
46
|
if self.isInitialized || self.isInitializing {
|
|
@@ -51,6 +51,8 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
51
51
|
self.isInitializing = true
|
|
52
52
|
|
|
53
53
|
do {
|
|
54
|
+
// Note: iOS doesn't support alternative billing config parameter
|
|
55
|
+
// Config is ignored on iOS platform
|
|
54
56
|
let ok = try await OpenIapModule.shared.initConnection()
|
|
55
57
|
RnIapLog.result("initConnection", ok)
|
|
56
58
|
self.isInitialized = ok
|
|
@@ -928,4 +930,115 @@ class HybridRnIap: HybridRnIapSpec {
|
|
|
928
930
|
throw PurchaseError.make(code: .featureNotSupported)
|
|
929
931
|
}
|
|
930
932
|
}
|
|
933
|
+
|
|
934
|
+
// MARK: - Alternative Billing (Android) - Not supported on iOS
|
|
935
|
+
|
|
936
|
+
func checkAlternativeBillingAvailabilityAndroid() throws -> Promise<Bool> {
|
|
937
|
+
return Promise.async {
|
|
938
|
+
throw PurchaseError.make(code: .featureNotSupported)
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
func showAlternativeBillingDialogAndroid() throws -> Promise<Bool> {
|
|
943
|
+
return Promise.async {
|
|
944
|
+
throw PurchaseError.make(code: .featureNotSupported)
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
func createAlternativeBillingTokenAndroid(sku: String?) throws -> Promise<String?> {
|
|
949
|
+
return Promise.async {
|
|
950
|
+
throw PurchaseError.make(code: .featureNotSupported)
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
func addUserChoiceBillingListenerAndroid(listener: @escaping (UserChoiceBillingDetails) -> Void) throws {
|
|
955
|
+
// No-op on iOS
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
func removeUserChoiceBillingListenerAndroid(listener: @escaping (UserChoiceBillingDetails) -> Void) throws {
|
|
959
|
+
// No-op on iOS
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// MARK: - External Purchase (iOS 16.0+)
|
|
963
|
+
|
|
964
|
+
func canPresentExternalPurchaseNoticeIOS() throws -> Promise<Bool> {
|
|
965
|
+
return Promise.async {
|
|
966
|
+
RnIapLog.payload("canPresentExternalPurchaseNoticeIOS", nil)
|
|
967
|
+
|
|
968
|
+
if #available(iOS 16.0, *) {
|
|
969
|
+
try self.ensureConnection()
|
|
970
|
+
do {
|
|
971
|
+
let canPresent = try await OpenIapModule.shared.canPresentExternalPurchaseNoticeIOS()
|
|
972
|
+
RnIapLog.result("canPresentExternalPurchaseNoticeIOS", canPresent)
|
|
973
|
+
return canPresent
|
|
974
|
+
} catch {
|
|
975
|
+
RnIapLog.failure("canPresentExternalPurchaseNoticeIOS", error: error)
|
|
976
|
+
throw PurchaseError.make(code: .serviceError, message: error.localizedDescription)
|
|
977
|
+
}
|
|
978
|
+
} else {
|
|
979
|
+
let err = PurchaseError.make(code: .featureNotSupported, message: "External purchase notice requires iOS 16.0 or later")
|
|
980
|
+
RnIapLog.failure("canPresentExternalPurchaseNoticeIOS", error: err)
|
|
981
|
+
throw err
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
func presentExternalPurchaseNoticeSheetIOS() throws -> Promise<ExternalPurchaseNoticeResultIOS> {
|
|
987
|
+
return Promise.async {
|
|
988
|
+
RnIapLog.payload("presentExternalPurchaseNoticeSheetIOS", nil)
|
|
989
|
+
|
|
990
|
+
if #available(iOS 16.0, *) {
|
|
991
|
+
try self.ensureConnection()
|
|
992
|
+
do {
|
|
993
|
+
let result = try await OpenIapModule.shared.presentExternalPurchaseNoticeSheetIOS()
|
|
994
|
+
|
|
995
|
+
// Convert OpenIAP action to Nitro action via raw value
|
|
996
|
+
let actionString = result.result.rawValue
|
|
997
|
+
guard let nitroAction = ExternalPurchaseNoticeAction(fromString: actionString) else {
|
|
998
|
+
throw PurchaseError.make(code: .serviceError, message: "Invalid action: \(actionString)")
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
let nitroResult = ExternalPurchaseNoticeResultIOS(
|
|
1002
|
+
error: result.error,
|
|
1003
|
+
result: nitroAction
|
|
1004
|
+
)
|
|
1005
|
+
RnIapLog.result("presentExternalPurchaseNoticeSheetIOS", result)
|
|
1006
|
+
return nitroResult
|
|
1007
|
+
} catch {
|
|
1008
|
+
RnIapLog.failure("presentExternalPurchaseNoticeSheetIOS", error: error)
|
|
1009
|
+
throw PurchaseError.make(code: .serviceError, message: error.localizedDescription)
|
|
1010
|
+
}
|
|
1011
|
+
} else {
|
|
1012
|
+
let err = PurchaseError.make(code: .featureNotSupported, message: "External purchase notice requires iOS 16.0 or later")
|
|
1013
|
+
RnIapLog.failure("presentExternalPurchaseNoticeSheetIOS", error: err)
|
|
1014
|
+
throw err
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
func presentExternalPurchaseLinkIOS(url: String) throws -> Promise<ExternalPurchaseLinkResultIOS> {
|
|
1020
|
+
return Promise.async {
|
|
1021
|
+
RnIapLog.payload("presentExternalPurchaseLinkIOS", ["url": url])
|
|
1022
|
+
|
|
1023
|
+
if #available(iOS 16.0, *) {
|
|
1024
|
+
try self.ensureConnection()
|
|
1025
|
+
do {
|
|
1026
|
+
let result = try await OpenIapModule.shared.presentExternalPurchaseLinkIOS(url)
|
|
1027
|
+
let nitroResult = ExternalPurchaseLinkResultIOS(
|
|
1028
|
+
error: result.error,
|
|
1029
|
+
success: result.success
|
|
1030
|
+
)
|
|
1031
|
+
RnIapLog.result("presentExternalPurchaseLinkIOS", result)
|
|
1032
|
+
return nitroResult
|
|
1033
|
+
} catch {
|
|
1034
|
+
RnIapLog.failure("presentExternalPurchaseLinkIOS", error: error)
|
|
1035
|
+
throw PurchaseError.make(code: .serviceError, message: error.localizedDescription)
|
|
1036
|
+
}
|
|
1037
|
+
} else {
|
|
1038
|
+
let err = PurchaseError.make(code: .featureNotSupported, message: "External purchase link requires iOS 16.0 or later")
|
|
1039
|
+
RnIapLog.failure("presentExternalPurchaseLinkIOS", error: err)
|
|
1040
|
+
throw err
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
931
1044
|
}
|
package/ios/RnIapHelper.swift
CHANGED
|
@@ -65,6 +65,12 @@ enum RnIapHelper {
|
|
|
65
65
|
if let typeIOS = dictionary["typeIOS"] as? String { product.typeIOS = typeIOS }
|
|
66
66
|
if let familyShareable = boolValue(dictionary["isFamilyShareableIOS"]) { product.isFamilyShareableIOS = familyShareable }
|
|
67
67
|
if let jsonRepresentation = dictionary["jsonRepresentationIOS"] as? String { product.jsonRepresentationIOS = jsonRepresentation }
|
|
68
|
+
if let discounts = dictionary["discountsIOS"] as? [[String: Any]] {
|
|
69
|
+
if let jsonData = try? JSONSerialization.data(withJSONObject: discounts, options: []),
|
|
70
|
+
let jsonString = String(data: jsonData, encoding: .utf8) {
|
|
71
|
+
product.discountsIOS = jsonString
|
|
72
|
+
}
|
|
73
|
+
}
|
|
68
74
|
if let subscriptionUnit = dictionary["subscriptionPeriodUnitIOS"] as? String { product.subscriptionPeriodUnitIOS = subscriptionUnit }
|
|
69
75
|
if let subscriptionNumber = doubleValue(dictionary["subscriptionPeriodNumberIOS"]) { product.subscriptionPeriodNumberIOS = subscriptionNumber }
|
|
70
76
|
if let introductoryPrice = dictionary["introductoryPriceIOS"] as? String { product.introductoryPriceIOS = introductoryPrice }
|
|
@@ -98,11 +104,36 @@ enum RnIapHelper {
|
|
|
98
104
|
purchase.purchaseState = state
|
|
99
105
|
}
|
|
100
106
|
if let isAutoRenewing = boolValue(dictionary["isAutoRenewing"]) { purchase.isAutoRenewing = isAutoRenewing }
|
|
107
|
+
|
|
108
|
+
// iOS specific fields
|
|
101
109
|
if let quantityIOS = doubleValue(dictionary["quantityIOS"]) { purchase.quantityIOS = quantityIOS }
|
|
102
110
|
if let originalDate = doubleValue(dictionary["originalTransactionDateIOS"]) { purchase.originalTransactionDateIOS = originalDate }
|
|
103
111
|
if let originalIdentifier = dictionary["originalTransactionIdentifierIOS"] as? String { purchase.originalTransactionIdentifierIOS = originalIdentifier }
|
|
104
112
|
if let appAccountToken = dictionary["appAccountToken"] as? String { purchase.appAccountToken = appAccountToken }
|
|
105
|
-
|
|
113
|
+
if let appBundleId = dictionary["appBundleIdIOS"] as? String { purchase.appBundleIdIOS = appBundleId }
|
|
114
|
+
if let countryCode = dictionary["countryCodeIOS"] as? String { purchase.countryCodeIOS = countryCode }
|
|
115
|
+
if let currencyCode = dictionary["currencyCodeIOS"] as? String { purchase.currencyCodeIOS = currencyCode }
|
|
116
|
+
if let currencySymbol = dictionary["currencySymbolIOS"] as? String { purchase.currencySymbolIOS = currencySymbol }
|
|
117
|
+
if let environment = dictionary["environmentIOS"] as? String { purchase.environmentIOS = environment }
|
|
118
|
+
if let expirationDate = doubleValue(dictionary["expirationDateIOS"]) { purchase.expirationDateIOS = expirationDate }
|
|
119
|
+
if let isUpgraded = boolValue(dictionary["isUpgradedIOS"]) { purchase.isUpgradedIOS = isUpgraded }
|
|
120
|
+
if let offer = dictionary["offerIOS"] as? [String: Any] {
|
|
121
|
+
if let jsonData = try? JSONSerialization.data(withJSONObject: offer, options: []),
|
|
122
|
+
let jsonString = String(data: jsonData, encoding: .utf8) {
|
|
123
|
+
purchase.offerIOS = jsonString
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if let ownershipType = dictionary["ownershipTypeIOS"] as? String { purchase.ownershipTypeIOS = ownershipType }
|
|
127
|
+
if let reason = dictionary["reasonIOS"] as? String { purchase.reasonIOS = reason }
|
|
128
|
+
if let reasonString = dictionary["reasonStringRepresentationIOS"] as? String { purchase.reasonStringRepresentationIOS = reasonString }
|
|
129
|
+
if let revocationDate = doubleValue(dictionary["revocationDateIOS"]) { purchase.revocationDateIOS = revocationDate }
|
|
130
|
+
if let revocationReason = dictionary["revocationReasonIOS"] as? String { purchase.revocationReasonIOS = revocationReason }
|
|
131
|
+
if let storefrontCountryCode = dictionary["storefrontCountryCodeIOS"] as? String { purchase.storefrontCountryCodeIOS = storefrontCountryCode }
|
|
132
|
+
if let subscriptionGroupId = dictionary["subscriptionGroupIdIOS"] as? String { purchase.subscriptionGroupIdIOS = subscriptionGroupId }
|
|
133
|
+
if let transactionReason = dictionary["transactionReasonIOS"] as? String { purchase.transactionReasonIOS = transactionReason }
|
|
134
|
+
if let webOrderLineItemId = dictionary["webOrderLineItemIdIOS"] as? String { purchase.webOrderLineItemIdIOS = webOrderLineItemId }
|
|
135
|
+
|
|
136
|
+
// Android specific fields
|
|
106
137
|
if let purchaseTokenAndroid = dictionary["purchaseTokenAndroid"] as? String { purchase.purchaseTokenAndroid = purchaseTokenAndroid }
|
|
107
138
|
if let dataAndroid = dictionary["dataAndroid"] as? String { purchase.dataAndroid = dataAndroid }
|
|
108
139
|
if let signatureAndroid = dictionary["signatureAndroid"] as? String { purchase.signatureAndroid = signatureAndroid }
|
|
@@ -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, getActiveSubscriptions, hasActiveSubscriptions, restorePurchases as restorePurchasesTopLevel, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS } from "../index.js";
|
|
9
|
+
import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, getActiveSubscriptions, hasActiveSubscriptions, restorePurchases as restorePurchasesTopLevel, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid } from "../index.js";
|
|
10
10
|
|
|
11
11
|
// Types
|
|
12
12
|
import { ErrorCode } from "../types.js";
|
|
@@ -174,7 +174,21 @@ export function useIAP(options) {
|
|
|
174
174
|
}
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
|
-
|
|
177
|
+
|
|
178
|
+
// Add user choice billing listener for Android (if provided)
|
|
179
|
+
if (Platform.OS === 'android' && optionsRef.current?.onUserChoiceBillingAndroid) {
|
|
180
|
+
subscriptionsRef.current.userChoiceBillingAndroid = userChoiceBillingListenerAndroid(details => {
|
|
181
|
+
if (optionsRef.current?.onUserChoiceBillingAndroid) {
|
|
182
|
+
optionsRef.current.onUserChoiceBillingAndroid(details);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Initialize connection with config
|
|
188
|
+
const config = Platform.OS === 'android' && optionsRef.current?.alternativeBillingModeAndroid ? {
|
|
189
|
+
alternativeBillingModeAndroid: optionsRef.current.alternativeBillingModeAndroid
|
|
190
|
+
} : undefined;
|
|
191
|
+
const result = await initConnection(config);
|
|
178
192
|
setConnected(result);
|
|
179
193
|
if (!result) {
|
|
180
194
|
// Clean up some listeners but leave purchaseError for potential retries
|
|
@@ -190,6 +204,7 @@ export function useIAP(options) {
|
|
|
190
204
|
currentSubscriptions.purchaseUpdate?.remove();
|
|
191
205
|
currentSubscriptions.purchaseError?.remove();
|
|
192
206
|
currentSubscriptions.promotedProductIOS?.remove();
|
|
207
|
+
currentSubscriptions.userChoiceBillingAndroid?.remove();
|
|
193
208
|
// Keep connection alive across screens to avoid race conditions
|
|
194
209
|
setConnected(false);
|
|
195
210
|
};
|
|
@@ -217,7 +232,13 @@ export function useIAP(options) {
|
|
|
217
232
|
getPromotedProductIOS,
|
|
218
233
|
requestPurchaseOnPromotedProductIOS,
|
|
219
234
|
getActiveSubscriptions: getActiveSubscriptionsInternal,
|
|
220
|
-
hasActiveSubscriptions: hasActiveSubscriptionsInternal
|
|
235
|
+
hasActiveSubscriptions: hasActiveSubscriptionsInternal,
|
|
236
|
+
// Alternative billing (Android only)
|
|
237
|
+
...(Platform.OS === 'android' ? {
|
|
238
|
+
checkAlternativeBillingAvailabilityAndroid,
|
|
239
|
+
showAlternativeBillingDialogAndroid,
|
|
240
|
+
createAlternativeBillingTokenAndroid
|
|
241
|
+
} : {})
|
|
221
242
|
};
|
|
222
243
|
}
|
|
223
244
|
//# sourceMappingURL=useIAP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","getActiveSubscriptions","hasActiveSubscriptions","restorePurchases","restorePurchasesTopLevel","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","ErrorCode","normalizeErrorCodeFromNative","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","subscriptionsRefState","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","error","getAvailablePurchasesInternal","_skus","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","err","requestObj","sku","androidOptions","initIapWithSubscriptions","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","mappedError","code","message","productId","undefined","InitConnection","onPurchaseError","OS","onPromotedProductIOS","remove","currentSubscriptions"],"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,sBAAsB,EACtBC,sBAAsB,EACtBC,gBAAgB,IAAIC,wBAAwB,EAC5CC,qBAAqB,EACrBC,mCAAmC,
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","getActiveSubscriptions","hasActiveSubscriptions","restorePurchases","restorePurchasesTopLevel","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","ErrorCode","normalizeErrorCodeFromNative","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","subscriptionsRefState","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","error","getAvailablePurchasesInternal","_skus","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","err","requestObj","sku","androidOptions","initIapWithSubscriptions","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","mappedError","code","message","productId","undefined","InitConnection","onPurchaseError","OS","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","config","alternativeBillingModeAndroid","remove","currentSubscriptions"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
|