react-native-iap 12.3.4 → 12.4.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.
@@ -20,14 +20,11 @@ import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEm
20
20
  import java.lang.NumberFormatException
21
21
  import java.util.ArrayList
22
22
 
23
+ val ProductType.typeString: String
24
+ get() = if (this == ProductType.ENTITLED || this == ProductType.CONSUMABLE) "inapp" else "subs"
25
+
23
26
  class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingListener {
24
27
  private val skus: MutableList<Product>
25
- private var availableItems: WritableNativeArray
26
- private var availableItemsType: String?
27
- fun getPurchaseUpdatesByType(type: String?) {
28
- availableItemsType = type
29
- PurchasingService.getPurchaseUpdates(true)
30
- }
31
28
 
32
29
  override fun onProductDataResponse(response: ProductDataResponse) {
33
30
  val requestId = response.requestId.toString()
@@ -40,9 +37,7 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
40
37
  if (!skus.contains(product)) {
41
38
  skus.add(product)
42
39
  }
43
- val productType = product.productType
44
- val productTypeString =
45
- if (productType == ProductType.ENTITLED || productType == ProductType.CONSUMABLE) "inapp" else "subs"
40
+
46
41
  var priceNumber: Number = 0.00
47
42
  val priceString = product.price
48
43
  try {
@@ -59,7 +54,7 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
59
54
  val coinsReward = product.coinsReward
60
55
  item.putString("productId", product.sku)
61
56
  item.putString("price", priceNumber.toString())
62
- item.putString("type", productTypeString)
57
+ item.putString("type", product.productType.typeString)
63
58
  item.putString("localizedPrice", priceString)
64
59
  item.putString("title", product.title)
65
60
  item.putString("description", product.description)
@@ -98,12 +93,9 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
98
93
  }
99
94
 
100
95
  override fun onPurchaseUpdatesResponse(response: PurchaseUpdatesResponse) {
101
- // Info for potential error reporting
102
- val debugMessage: String?
103
- var errorCode = PromiseUtils.E_UNKNOWN
104
- val error = Arguments.createMap()
105
96
  when (response.requestStatus) {
106
97
  PurchaseUpdatesResponse.RequestStatus.SUCCESSFUL -> {
98
+ val availableItems = Arguments.createArray()
107
99
  val userData = response.userData
108
100
  var promiseItem: WritableMap? = null
109
101
  val purchases = response.receipts
@@ -112,12 +104,7 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
112
104
  promiseItem = WritableNativeMap()
113
105
  promiseItem.merge(item)
114
106
  sendEvent(reactContext, "purchase-updated", item)
115
- val productType = receipt.productType
116
- val productTypeString =
117
- if (productType == ProductType.ENTITLED || productType == ProductType.CONSUMABLE) "inapp" else "subs"
118
- if (productTypeString == availableItemsType) {
119
- availableItems.pushMap(promiseItem)
120
- }
107
+ availableItems.pushMap(promiseItem)
121
108
  }
122
109
  if (response.hasMore()) {
123
110
  PurchasingService.getPurchaseUpdates(false)
@@ -139,13 +126,12 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
139
126
  RNIapAmazonModule.PROMISE_QUERY_AVAILABLE_ITEMS,
140
127
  availableItems
141
128
  )
142
- availableItems = WritableNativeArray()
143
- availableItemsType = null
144
129
  }
145
130
  }
146
131
  PurchaseUpdatesResponse.RequestStatus.FAILED -> {
147
- debugMessage = "An unknown or unexpected error has occured. Please try again later."
148
- errorCode = PromiseUtils.E_UNKNOWN
132
+ val error = Arguments.createMap()
133
+ val debugMessage = "An unknown or unexpected error has occured. Please try again later."
134
+ val errorCode = PromiseUtils.E_UNKNOWN
149
135
  error.putInt("responseCode", 0)
150
136
  error.putString("debugMessage", debugMessage)
151
137
  error.putString("code", errorCode)
@@ -165,12 +151,11 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
165
151
  debugMessage,
166
152
  null
167
153
  )
168
- availableItems = WritableNativeArray()
169
- availableItemsType = null
170
154
  }
171
155
  PurchaseUpdatesResponse.RequestStatus.NOT_SUPPORTED -> {
172
- debugMessage = "This feature is not available on your device."
173
- errorCode = PromiseUtils.E_SERVICE_ERROR
156
+ val error = Arguments.createMap()
157
+ val debugMessage = "This feature is not available on your device."
158
+ val errorCode = PromiseUtils.E_SERVICE_ERROR
174
159
  error.putInt("responseCode", 0)
175
160
  error.putString("debugMessage", debugMessage)
176
161
  error.putString("code", errorCode)
@@ -190,8 +175,6 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
190
175
  debugMessage,
191
176
  null
192
177
  )
193
- availableItems = WritableNativeArray()
194
- availableItemsType = null
195
178
  }
196
179
  }
197
180
  }
@@ -207,6 +190,7 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
207
190
  item.putString("userJsonAmazon", userData.toJSON().toString())
208
191
  item.putBoolean("isCanceledAmazon", receipt.isCanceled)
209
192
  item.putString("termSku", receipt.termSku)
193
+ item.putString("productType", receipt.productType.typeString)
210
194
  return item
211
195
  }
212
196
 
@@ -224,7 +208,7 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
224
208
  val receipt = response.receipt
225
209
  val userData = response.userData
226
210
  val item = receiptToMap(userData, receipt)
227
- val promiseItem: WritableMap = WritableNativeMap()
211
+ val promiseItem: WritableMap = Arguments.createMap()
228
212
  promiseItem.merge(item)
229
213
  sendEvent(reactContext, "purchase-updated", item)
230
214
  PromiseUtils
@@ -363,7 +347,5 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
363
347
 
364
348
  init {
365
349
  skus = ArrayList()
366
- availableItems = WritableNativeArray()
367
- availableItemsType = null
368
350
  }
369
351
  }
package/ios/RNIapIosSk2.m CHANGED
@@ -36,6 +36,7 @@ RCT_EXTERN_METHOD(getItems:
36
36
 
37
37
  RCT_EXTERN_METHOD(getAvailableItems:
38
38
  (BOOL)alsoPublishToEventListener
39
+ (BOOL)onlyIncludeActiveItems
39
40
  resolve:(RCTPromiseResolveBlock)resolve
40
41
  reject:(RCTPromiseRejectBlock)reject)
41
42
 
@@ -26,6 +26,7 @@ protocol Sk2Delegate {
26
26
 
27
27
  func getAvailableItems(
28
28
  _ alsoPublishToEventListener: Bool,
29
+ onlyIncludeActiveItems: Bool,
29
30
  resolve: @escaping RCTPromiseResolveBlock,
30
31
  reject: @escaping RCTPromiseRejectBlock
31
32
  )
@@ -140,6 +141,7 @@ class DummySk2: Sk2Delegate {
140
141
 
141
142
  func getAvailableItems(
142
143
  _ alsoPublishToEventListener: Bool,
144
+ onlyIncludeActiveItems: Bool,
143
145
  resolve: @escaping RCTPromiseResolveBlock,
144
146
  reject: @escaping RCTPromiseRejectBlock
145
147
  ) {
@@ -311,10 +313,11 @@ class RNIapIosSk2: RCTEventEmitter, Sk2Delegate {
311
313
 
312
314
  @objc public func getAvailableItems(
313
315
  _ alsoPublishToEventListener: Bool,
316
+ onlyIncludeActiveItems: Bool,
314
317
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
315
318
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
316
319
  ) {
317
- delegate.getAvailableItems(alsoPublishToEventListener, resolve: resolve, reject: reject)
320
+ delegate.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems: onlyIncludeActiveItems, resolve: resolve, reject: reject)
318
321
  }
319
322
 
320
323
  @objc public func buyProduct(
@@ -506,14 +509,14 @@ class RNIapIosSk2iOS15: Sk2Delegate {
506
509
  hasListeners = false
507
510
  }
508
511
 
509
- @objc public func initConnection(
512
+ public func initConnection(
510
513
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in },
511
514
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
512
515
  ) {
513
516
  addTransactionObserver()
514
517
  resolve(AppStore.canMakePayments)
515
518
  }
516
- @objc public func endConnection(
519
+ public func endConnection(
517
520
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in },
518
521
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
519
522
  ) {
@@ -524,7 +527,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
524
527
  resolve(nil)
525
528
  }
526
529
 
527
- @objc public func getItems(
530
+ public func getItems(
528
531
  _ skus: [String],
529
532
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
530
533
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
@@ -544,15 +547,16 @@ class RNIapIosSk2iOS15: Sk2Delegate {
544
547
  }
545
548
  }
546
549
 
547
- @objc public func getAvailableItems(
550
+ public func getAvailableItems(
548
551
  _ alsoPublishToEventListener: Bool,
552
+ onlyIncludeActiveItems: Bool,
549
553
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
550
554
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
551
555
  ) {
552
556
  Task {
553
557
  var purchasedItems: [Transaction] = []
554
558
 
555
- func addPurchase(transaction: Transaction, product: Product) {
559
+ func addTransaction(transaction: Transaction) {
556
560
  purchasedItems.append( transaction)
557
561
  if alsoPublishToEventListener {
558
562
  self.sendEvent?("purchase-update", serialize(transaction))
@@ -569,14 +573,18 @@ class RNIapIosSk2iOS15: Sk2Delegate {
569
573
  // Check whether the transaction is verified. If it isn’t, catch `failedVerification` error.
570
574
  let transaction = try checkVerified(result)
571
575
  // Check the `productType` of the transaction and get the corresponding product from the store.
576
+ if !onlyIncludeActiveItems {
577
+ addTransaction(transaction: transaction)
578
+ continue
579
+ }
572
580
  switch transaction.productType {
573
581
  case .nonConsumable:
574
- if let product = products[transaction.productID] {
575
- addPurchase(transaction: transaction, product: product)
582
+ if products[transaction.productID] != nil {
583
+ addTransaction(transaction: transaction)
576
584
  }
577
585
 
578
586
  case .nonRenewable:
579
- if let nonRenewable = products[transaction.productID] {
587
+ if products[transaction.productID] != nil {
580
588
  // Non-renewing subscriptions have no inherent expiration date, so they're always
581
589
  // contained in `Transaction.currentEntitlements` after the user purchases them.
582
590
  // This app defines this non-renewing subscription's expiration date to be one year after purchase.
@@ -587,13 +595,18 @@ class RNIapIosSk2iOS15: Sk2Delegate {
587
595
  to: transaction.purchaseDate)!
588
596
 
589
597
  if currentDate < expirationDate {
590
- addPurchase(transaction: transaction, product: nonRenewable)
598
+ addTransaction(transaction: transaction)
591
599
  }
592
600
  }
593
601
 
594
602
  case .autoRenewable:
595
- if let subscription = products[transaction.productID] {
596
- addPurchase(transaction: transaction, product: subscription)
603
+ if products[transaction.productID] != nil {
604
+ addTransaction(transaction: transaction)
605
+ }
606
+
607
+ case .consumable:
608
+ if products[transaction.productID] != nil {
609
+ addTransaction(transaction: transaction)
597
610
  }
598
611
 
599
612
  default:
@@ -627,7 +640,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
627
640
  }
628
641
  }
629
642
 
630
- @objc public func buyProduct(
643
+ public func buyProduct(
631
644
  _ sku: String,
632
645
  andDangerouslyFinishTransactionAutomatically: Bool,
633
646
  appAccountToken: String?,
@@ -728,7 +741,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
728
741
  }
729
742
  }
730
743
 
731
- @objc public func isEligibleForIntroOffer(
744
+ public func isEligibleForIntroOffer(
732
745
  _ groupID: String,
733
746
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
734
747
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
@@ -739,7 +752,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
739
752
  }
740
753
  }
741
754
 
742
- @objc public func subscriptionStatus(
755
+ public func subscriptionStatus(
743
756
  _ sku: String,
744
757
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
745
758
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
@@ -758,7 +771,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
758
771
  }
759
772
  }
760
773
 
761
- @objc public func currentEntitlement(
774
+ public func currentEntitlement(
762
775
  _ sku: String,
763
776
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
764
777
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
@@ -785,7 +798,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
785
798
  }
786
799
  }
787
800
 
788
- @objc public func latestTransaction(
801
+ public func latestTransaction(
789
802
  _ sku: String,
790
803
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
791
804
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
@@ -812,7 +825,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
812
825
  }
813
826
  }
814
827
 
815
- @objc public func finishTransaction(
828
+ public func finishTransaction(
816
829
  _ transactionIdentifier: String,
817
830
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
818
831
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
@@ -830,14 +843,14 @@ class RNIapIosSk2iOS15: Sk2Delegate {
830
843
  }
831
844
  }
832
845
 
833
- @objc public func getPendingTransactions (
846
+ public func getPendingTransactions (
834
847
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in },
835
848
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
836
849
  ) {
837
850
  resolve(transactions.values.map({(t: Transaction) in serialize(t)}))
838
851
  }
839
852
 
840
- @objc public func sync(
853
+ public func sync(
841
854
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in},
842
855
  reject: @escaping RCTPromiseRejectBlock = {_, _, _ in}
843
856
  ) {
@@ -855,7 +868,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
855
868
  Should remain the same according to:
856
869
  https://stackoverflow.com/a/72789651/570612
857
870
  */
858
- @objc public func presentCodeRedemptionSheet(
871
+ public func presentCodeRedemptionSheet(
859
872
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in },
860
873
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
861
874
  ) {
@@ -867,7 +880,7 @@ class RNIapIosSk2iOS15: Sk2Delegate {
867
880
  #endif
868
881
  }
869
882
 
870
- @objc public func showManageSubscriptions(
883
+ public func showManageSubscriptions(
871
884
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in },
872
885
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
873
886
  ) {
@@ -314,18 +314,21 @@ Note that this is only for backaward compatiblity. It won't publish to transacti
314
314
  @param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically
315
315
  finished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd
316
316
  have to manually finish the returned transaction once you have delivered the content to your user.
317
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased.
318
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
317
319
  */
318
320
 
319
321
 
320
322
  const getPurchaseHistory = function () {
321
323
  let {
322
324
  alsoPublishToEventListener = false,
323
- automaticallyFinishRestoredTransactions = true
325
+ automaticallyFinishRestoredTransactions = true,
326
+ onlyIncludeActiveItems = false
324
327
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
325
328
  return (_reactNative.Platform.select({
326
329
  ios: async () => {
327
330
  if ((0, _internal.isIosStorekit2)()) {
328
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(_appleSk.transactionSk2Map));
331
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(_appleSk.transactionSk2Map));
329
332
  } else {
330
333
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
331
334
  }
@@ -419,6 +422,8 @@ const App = () => {
419
422
  ```
420
423
  @param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.
421
424
  Note that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`
425
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired.
426
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
422
427
  *
423
428
  */
424
429
 
@@ -428,12 +433,13 @@ exports.getPurchaseHistory = getPurchaseHistory;
428
433
  const getAvailablePurchases = function () {
429
434
  let {
430
435
  alsoPublishToEventListener = false,
431
- automaticallyFinishRestoredTransactions = false
436
+ automaticallyFinishRestoredTransactions = false,
437
+ onlyIncludeActiveItems = true
432
438
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
433
439
  return (_reactNative.Platform.select({
434
440
  ios: async () => {
435
441
  if ((0, _internal.isIosStorekit2)()) {
436
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(_appleSk.transactionSk2Map));
442
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(_appleSk.transactionSk2Map));
437
443
  } else {
438
444
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
439
445
  }
@@ -1 +1 @@
1
- {"version":3,"names":["RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","NativeModules","ANDROID_ITEM_TYPE_SUBSCRIPTION","ProductType","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","storekit1Mode","storekit2Mode","storekitHybridMode","initConnection","getNativeModule","endConnection","flushFailedPurchasesCachedAsPendingAndroid","getAndroidModule","flushFailedPurchasesCachedAsPending","getProducts","skus","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","Promise","reject","Error","getSubscriptions","subscriptionSk2Map","addSubscriptionPlatform","SubscriptionPlatform","androidPlatform","getAndroidModuleType","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","resolve","getAvailableItems","transactionSk2Map","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","offerSk2Map","buyProduct","offerToRecord","isAmazon","buyItemByType","length","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","getIosModule","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PurchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, platform}));\n};\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean. (IOS Sk2 only) When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = (\n request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android).\n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED\n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = (\n request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n *\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n```\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;AAOA;;AAYA;;;;;;AAkBA,MAAM;EAACA,QAAD;EAAWC,WAAX;EAAwBC,WAAxB;EAAqCC;AAArC,IAA0DC,0BAAhE;AACA,MAAMC,8BAA8B,GAAGC,kBAAA,CAAYC,IAAnD;AACA,MAAMC,qBAAqB,GAAGF,kBAAA,CAAYG,KAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMO,MAAMC,KAAK,GAAG,YAIV;EAAA,IAJW;IACpBC,YAAY,GAAG;EADK,CAIX,uEAAP,EAAO;;EACT,QAAQA,YAAR;IACE,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,sBAAL;MACE,IAAAC,4BAAA;MACA;;IACF;MACE;EAXJ;AAaD,CAlBM;AAoBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,cAAc,GAAG,MAC5B,IAAAC,yBAAA,IAAkBD,cAAlB,EADK;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAME,aAAa,GAAG,MAC3B,IAAAD,yBAAA,IAAkBC,aAAlB,EADK;AAGP;AACA;AACA;AACA;;;;;AACO,MAAMC,0CAA0C,GACrD,MACE,IAAAC,0BAAA,IAAmBC,mCAAnB,EAFG;AAIP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,WAAW,GAAG;EAAA,IAAC;IAC1BC;EAD0B,CAAD;EAAA,OAKzB,CA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"}
1
+ {"version":3,"names":["RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","NativeModules","ANDROID_ITEM_TYPE_SUBSCRIPTION","ProductType","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","storekit1Mode","storekit2Mode","storekitHybridMode","initConnection","getNativeModule","endConnection","flushFailedPurchasesCachedAsPendingAndroid","getAndroidModule","flushFailedPurchasesCachedAsPending","getProducts","skus","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","Promise","reject","Error","getSubscriptions","subscriptionSk2Map","addSubscriptionPlatform","SubscriptionPlatform","androidPlatform","getAndroidModuleType","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","onlyIncludeActiveItems","resolve","getAvailableItems","transactionSk2Map","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","offerSk2Map","buyProduct","offerToRecord","isAmazon","buyItemByType","length","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","getIosModule","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PurchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, platform}));\n};\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean. (IOS Sk2 only) When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n onlyIncludeActiveItems = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n onlyIncludeActiveItems = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = (\n request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android).\n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED\n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = (\n request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n *\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n```\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;AAOA;;AAYA;;;;;;AAkBA,MAAM;EAACA,QAAD;EAAWC,WAAX;EAAwBC,WAAxB;EAAqCC;AAArC,IAA0DC,0BAAhE;AACA,MAAMC,8BAA8B,GAAGC,kBAAA,CAAYC,IAAnD;AACA,MAAMC,qBAAqB,GAAGF,kBAAA,CAAYG,KAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMO,MAAMC,KAAK,GAAG,YAIV;EAAA,IAJW;IACpBC,YAAY,GAAG;EADK,CAIX,uEAAP,EAAO;;EACT,QAAQA,YAAR;IACE,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,sBAAL;MACE,IAAAC,4BAAA;MACA;;IACF;MACE;EAXJ;AAaD,CAlBM;AAoBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,cAAc,GAAG,MAC5B,IAAAC,yBAAA,IAAkBD,cAAlB,EADK;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAME,aAAa,GAAG,MAC3B,IAAAD,yBAAA,IAAkBC,aAAlB,EADK;AAGP;AACA;AACA;AACA;;;;;AACO,MAAMC,0CAA0C,GACrD,MACE,IAAAC,0BAAA,IAAmBC,mCAAnB,EAFG;AAIP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,WAAW,GAAG;EAAA,IAAC;IAC1BC;EAD0B,CAAD;EAAA,OAKzB,CA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"}
@@ -1 +1 @@
1
- {"version":3,"names":["RNIapIosSk2","NativeModules","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":";;;;;;;AAAA;;AAYA,MAAM;EAACA;AAAD,IAAgBC,0BAAtB;;AAiDA;AACA;AACA;AACA;AACO,MAAMC,IAAI,GAAG,MAAqBF,WAAW,CAACE,IAAZ,EAAlC;AAEP;AACA;AACA;;;;;AACO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCJ,WAAW,CAACG,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;;;;AAEO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCN,WAAW,CAACK,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMC,kBAAkB,GAAID,GAAD,IAChCN,WAAW,CAACO,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BN,WAAW,CAACQ,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCN,WAAW,CAACS,kBAAZ,CAA+BH,GAA/B,CADK"}
1
+ {"version":3,"names":["RNIapIosSk2","NativeModules","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n onlyIncludeActiveItems?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":";;;;;;;AAAA;;AAYA,MAAM;EAACA;AAAD,IAAgBC,0BAAtB;;AAkDA;AACA;AACA;AACA;AACO,MAAMC,IAAI,GAAG,MAAqBF,WAAW,CAACE,IAAZ,EAAlC;AAEP;AACA;AACA;;;;;AACO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCJ,WAAW,CAACG,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;;;;AAEO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCN,WAAW,CAACK,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMC,kBAAkB,GAAID,GAAD,IAChCN,WAAW,CAACO,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BN,WAAW,CAACQ,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCN,WAAW,CAACS,kBAAZ,CAA+BH,GAA/B,CADK"}
package/lib/module/iap.js CHANGED
@@ -262,18 +262,21 @@ Note that this is only for backaward compatiblity. It won't publish to transacti
262
262
  @param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically
263
263
  finished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd
264
264
  have to manually finish the returned transaction once you have delivered the content to your user.
265
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased.
266
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
265
267
  */
266
268
 
267
269
 
268
270
  export const getPurchaseHistory = function () {
269
271
  let {
270
272
  alsoPublishToEventListener = false,
271
- automaticallyFinishRestoredTransactions = true
273
+ automaticallyFinishRestoredTransactions = true,
274
+ onlyIncludeActiveItems = false
272
275
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
273
276
  return (Platform.select({
274
277
  ios: async () => {
275
278
  if (isIosStorekit2()) {
276
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(transactionSk2Map));
279
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(transactionSk2Map));
277
280
  } else {
278
281
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
279
282
  }
@@ -367,18 +370,21 @@ const App = () => {
367
370
  ```
368
371
  @param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.
369
372
  Note that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`
373
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired.
374
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
370
375
  *
371
376
  */
372
377
 
373
378
  export const getAvailablePurchases = function () {
374
379
  let {
375
380
  alsoPublishToEventListener = false,
376
- automaticallyFinishRestoredTransactions = false
381
+ automaticallyFinishRestoredTransactions = false,
382
+ onlyIncludeActiveItems = true
377
383
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
378
384
  return (Platform.select({
379
385
  ios: async () => {
380
386
  if (isIosStorekit2()) {
381
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(transactionSk2Map));
387
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(transactionSk2Map));
382
388
  } else {
383
389
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
384
390
  }
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","transactionSk2Map","fillProductsWithAdditionalData","getAndroidModule","getAndroidModuleType","getIosModule","getNativeModule","isAmazon","isIosStorekit2","storekit1Mode","storekit2Mode","storekitHybridMode","ProductType","PurchaseStateAndroid","SubscriptionPlatform","RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","ANDROID_ITEM_TYPE_SUBSCRIPTION","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","getProducts","skus","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","Promise","reject","Error","getSubscriptions","addSubscriptionPlatform","androidPlatform","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","resolve","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","buyProduct","buyItemByType","length","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, platform}));\n};\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean. (IOS Sk2 only) When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = (\n request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android).\n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED\n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = (\n request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n *\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n```\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","transactionSk2Map","fillProductsWithAdditionalData","getAndroidModule","getAndroidModuleType","getIosModule","getNativeModule","isAmazon","isIosStorekit2","storekit1Mode","storekit2Mode","storekitHybridMode","ProductType","PurchaseStateAndroid","SubscriptionPlatform","RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","ANDROID_ITEM_TYPE_SUBSCRIPTION","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","getProducts","skus","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","Promise","reject","Error","getSubscriptions","addSubscriptionPlatform","androidPlatform","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","onlyIncludeActiveItems","resolve","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","buyProduct","buyItemByType","length","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, platform}));\n};\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean. (IOS Sk2 only) When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n onlyIncludeActiveItems = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n onlyIncludeActiveItems = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = (\n request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID\n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android).\n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED\n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID\n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = (\n request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\n\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n *\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n```\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","RNIapIosSk2","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":"AAAA,SAAQA,aAAR,QAA4B,cAA5B;AAYA,MAAM;EAACC;AAAD,IAAgBD,aAAtB;;AAiDA;AACA;AACA;AACA;AACA,OAAO,MAAME,IAAI,GAAG,MAAqBD,WAAW,CAACC,IAAZ,EAAlC;AAEP;AACA;AACA;;AACA,OAAO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCH,WAAW,CAACE,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;AAEA,OAAO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCL,WAAW,CAACI,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMC,kBAAkB,GAAID,GAAD,IAChCL,WAAW,CAACM,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BL,WAAW,CAACO,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCL,WAAW,CAACQ,kBAAZ,CAA+BH,GAA/B,CADK"}
1
+ {"version":3,"names":["NativeModules","RNIapIosSk2","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n onlyIncludeActiveItems?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":"AAAA,SAAQA,aAAR,QAA4B,cAA5B;AAYA,MAAM;EAACC;AAAD,IAAgBD,aAAtB;;AAkDA;AACA;AACA;AACA;AACA,OAAO,MAAME,IAAI,GAAG,MAAqBD,WAAW,CAACC,IAAZ,EAAlC;AAEP;AACA;AACA;;AACA,OAAO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCH,WAAW,CAACE,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;AAEA,OAAO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCL,WAAW,CAACI,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMC,kBAAkB,GAAID,GAAD,IAChCL,WAAW,CAACM,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BL,WAAW,CAACO,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCL,WAAW,CAACQ,kBAAZ,CAA+BH,GAA/B,CADK"}
@@ -161,10 +161,13 @@ Note that this is only for backaward compatiblity. It won't publish to transacti
161
161
  @param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically
162
162
  finished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd
163
163
  have to manually finish the returned transaction once you have delivered the content to your user.
164
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased.
165
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
164
166
  */
165
- export declare const getPurchaseHistory: ({ alsoPublishToEventListener, automaticallyFinishRestoredTransactions, }?: {
167
+ export declare const getPurchaseHistory: ({ alsoPublishToEventListener, automaticallyFinishRestoredTransactions, onlyIncludeActiveItems, }?: {
166
168
  alsoPublishToEventListener?: boolean | undefined;
167
169
  automaticallyFinishRestoredTransactions?: boolean | undefined;
170
+ onlyIncludeActiveItems?: boolean | undefined;
168
171
  }) => Promise<(ProductPurchase | SubscriptionPurchase)[]>;
169
172
  /**
170
173
  * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)
@@ -244,11 +247,14 @@ const App = () => {
244
247
  ```
245
248
  @param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.
246
249
  Note that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`
250
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired.
251
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
247
252
  *
248
253
  */
249
- export declare const getAvailablePurchases: ({ alsoPublishToEventListener, automaticallyFinishRestoredTransactions, }?: {
254
+ export declare const getAvailablePurchases: ({ alsoPublishToEventListener, automaticallyFinishRestoredTransactions, onlyIncludeActiveItems, }?: {
250
255
  alsoPublishToEventListener?: boolean | undefined;
251
256
  automaticallyFinishRestoredTransactions?: boolean | undefined;
257
+ onlyIncludeActiveItems?: boolean | undefined;
252
258
  }) => Promise<(ProductPurchase | SubscriptionPurchase)[]>;
253
259
  /**
254
260
  * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.
@@ -2,7 +2,7 @@ import type { Product, ProductPurchase, Purchase, Sku } from '../types';
2
2
  import type { PaymentDiscountSk2, ProductSk2, ProductStatus, RefundRequestStatus, TransactionSk2 } from '../types/appleSk2';
3
3
  import type { NativeModuleProps } from './common';
4
4
  declare type getItems = (skus: Sku[]) => Promise<ProductSk2[]>;
5
- declare type getAvailableItems = (alsoPublishToEventListener?: boolean) => Promise<TransactionSk2[]>;
5
+ declare type getAvailableItems = (alsoPublishToEventListener?: boolean, onlyIncludeActiveItems?: boolean) => Promise<TransactionSk2[]>;
6
6
  export declare type BuyProduct = (sku: Sku, andDangerouslyFinishTransactionAutomaticallyIOS: boolean, applicationUsername: string | undefined, quantity: number, withOffer: Record<keyof PaymentDiscountSk2, string> | undefined) => Promise<Purchase>;
7
7
  declare type clearTransaction = () => Promise<void>;
8
8
  declare type clearProducts = () => Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-iap",
3
- "version": "12.3.4",
3
+ "version": "12.4.1",
4
4
  "description": "React Native In App Purchase Module.",
5
5
  "repository": "https://github.com/dooboolab/react-native-iap",
6
6
  "author": "dooboolab <support@dooboolab.com> (https://github.com/dooboolab)",
@@ -64,6 +64,7 @@
64
64
  "lint:eslint": "eslint --fix '**/*.{ts,tsx}'",
65
65
  "lint:ci": "yarn lint:tsc && yarn lint:eslint -f ./node_modules/@firmnav/eslint-github-actions-formatter/dist/formatter.js && yarn lint:prettier",
66
66
  "lint:prettier": "prettier --write \"**/*.{md,js,jsx,ts,tsx}\"",
67
+ "lint:swift": "swiftlint lint --fix --format --path ios/*.swift --config .swiftlint.yml",
67
68
  "format": "git ls-files -m | xargs yarn prettier --write --ignore-unknown --no-error-on-unmatched-pattern",
68
69
  "bootstrap": "yarn example && yarn && yarn example pods",
69
70
  "gen:doc": "typedoc"
package/src/iap.ts CHANGED
@@ -326,13 +326,17 @@ Note that this is only for backaward compatiblity. It won't publish to transacti
326
326
  @param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically
327
327
  finished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd
328
328
  have to manually finish the returned transaction once you have delivered the content to your user.
329
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased.
330
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
329
331
  */
330
332
  export const getPurchaseHistory = ({
331
333
  alsoPublishToEventListener = false,
332
334
  automaticallyFinishRestoredTransactions = true,
335
+ onlyIncludeActiveItems = false,
333
336
  }: {
334
337
  alsoPublishToEventListener?: boolean;
335
338
  automaticallyFinishRestoredTransactions?: boolean;
339
+ onlyIncludeActiveItems?: boolean;
336
340
  } = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>
337
341
  (
338
342
  Platform.select({
@@ -340,7 +344,10 @@ export const getPurchaseHistory = ({
340
344
  if (isIosStorekit2()) {
341
345
  return Promise.resolve(
342
346
  (
343
- await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)
347
+ await RNIapIosSk2.getAvailableItems(
348
+ alsoPublishToEventListener,
349
+ onlyIncludeActiveItems,
350
+ )
344
351
  ).map(transactionSk2Map),
345
352
  );
346
353
  } else {
@@ -445,14 +452,18 @@ const App = () => {
445
452
  ```
446
453
  @param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.
447
454
  Note that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`
455
+ @param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired.
456
+ @See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details
448
457
  *
449
458
  */
450
459
  export const getAvailablePurchases = ({
451
460
  alsoPublishToEventListener = false,
452
461
  automaticallyFinishRestoredTransactions = false,
462
+ onlyIncludeActiveItems = true,
453
463
  }: {
454
464
  alsoPublishToEventListener?: boolean;
455
465
  automaticallyFinishRestoredTransactions?: boolean;
466
+ onlyIncludeActiveItems?: boolean;
456
467
  } = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>
457
468
  (
458
469
  Platform.select({
@@ -460,7 +471,10 @@ export const getAvailablePurchases = ({
460
471
  if (isIosStorekit2()) {
461
472
  return Promise.resolve(
462
473
  (
463
- await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)
474
+ await RNIapIosSk2.getAvailableItems(
475
+ alsoPublishToEventListener,
476
+ onlyIncludeActiveItems,
477
+ )
464
478
  ).map(transactionSk2Map),
465
479
  );
466
480
  } else {
@@ -16,6 +16,7 @@ type getItems = (skus: Sku[]) => Promise<ProductSk2[]>;
16
16
 
17
17
  type getAvailableItems = (
18
18
  alsoPublishToEventListener?: boolean,
19
+ onlyIncludeActiveItems?: boolean,
19
20
  ) => Promise<TransactionSk2[]>;
20
21
 
21
22
  export type BuyProduct = (