react-native-iap 12.4.2 → 12.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -70,6 +70,9 @@ android {
70
70
  }
71
71
 
72
72
  testOptions {
73
+ unitTests.all {
74
+ jvmArgs '-noverify'
75
+ }
73
76
  unitTests.returnDefaultValues = true
74
77
  }
75
78
  }
@@ -0,0 +1,20 @@
1
+ package com.dooboolab.RNIap
2
+
3
+ import android.content.Context
4
+ import com.amazon.device.iap.PurchasingListener
5
+ import com.amazon.device.iap.model.FulfillmentResult
6
+ import com.amazon.device.iap.model.RequestId
7
+
8
+ interface PurchasingServiceProxy {
9
+ fun registerListener(var0: Context?, var1: PurchasingListener?)
10
+
11
+ fun getUserData(): RequestId
12
+
13
+ fun purchase(var0: String?): RequestId
14
+
15
+ fun getProductData(var0: Set<String?>?): RequestId
16
+
17
+ fun getPurchaseUpdates(var0: Boolean): RequestId
18
+
19
+ fun notifyFulfillment(var0: String?, var1: FulfillmentResult?)
20
+ }
@@ -0,0 +1,33 @@
1
+ package com.dooboolab.RNIap
2
+
3
+ import android.content.Context
4
+ import com.amazon.device.iap.PurchasingListener
5
+ import com.amazon.device.iap.PurchasingService
6
+ import com.amazon.device.iap.model.FulfillmentResult
7
+ import com.amazon.device.iap.model.RequestId
8
+
9
+ class PurchasingServiceProxyAmazonImpl : PurchasingServiceProxy {
10
+ override fun registerListener(var0: Context?, var1: PurchasingListener?) {
11
+ return PurchasingService.registerListener(var0, var1)
12
+ }
13
+
14
+ override fun getUserData(): RequestId {
15
+ return PurchasingService.getUserData()
16
+ }
17
+
18
+ override fun purchase(var0: String?): RequestId {
19
+ return PurchasingService.purchase(var0)
20
+ }
21
+
22
+ override fun getProductData(var0: Set<String?>?): RequestId {
23
+ return PurchasingService.getProductData(var0)
24
+ }
25
+
26
+ override fun getPurchaseUpdates(var0: Boolean): RequestId {
27
+ return PurchasingService.getPurchaseUpdates(var0)
28
+ }
29
+
30
+ override fun notifyFulfillment(var0: String?, var1: FulfillmentResult?) {
31
+ return PurchasingService.notifyFulfillment(var0, var1)
32
+ }
33
+ }
@@ -2,8 +2,6 @@ package com.dooboolab.RNIap
2
2
 
3
3
  import android.util.Log
4
4
  import com.amazon.device.iap.PurchasingListener
5
- import com.amazon.device.iap.PurchasingService
6
- import com.amazon.device.iap.model.Product
7
5
  import com.amazon.device.iap.model.ProductDataResponse
8
6
  import com.amazon.device.iap.model.ProductType
9
7
  import com.amazon.device.iap.model.PurchaseResponse
@@ -18,26 +16,21 @@ import com.facebook.react.bridge.WritableNativeArray
18
16
  import com.facebook.react.bridge.WritableNativeMap
19
17
  import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
20
18
  import java.lang.NumberFormatException
21
- import java.util.ArrayList
22
19
 
23
20
  val ProductType.typeString: String
24
21
  get() = if (this == ProductType.ENTITLED || this == ProductType.CONSUMABLE) "inapp" else "subs"
25
22
 
26
- class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingListener {
27
- private val skus: MutableList<Product>
23
+ class RNIapAmazonListener(
24
+ private val reactContext: ReactContext,
25
+ private val purchasingService: PurchasingServiceProxy
26
+ ) : PurchasingListener {
28
27
 
29
28
  override fun onProductDataResponse(response: ProductDataResponse) {
30
- val requestId = response.requestId.toString()
31
29
  when (response.requestStatus) {
32
30
  ProductDataResponse.RequestStatus.SUCCESSFUL -> {
33
31
  val productData = response.productData
34
- val unavailableSkus = response.unavailableSkus
35
32
  val items = WritableNativeArray()
36
33
  for ((_, product) in productData) {
37
- if (!skus.contains(product)) {
38
- skus.add(product)
39
- }
40
-
41
34
  var priceNumber: Number = 0.00
42
35
  val priceString = product.price
43
36
  try {
@@ -107,7 +100,7 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
107
100
  availableItems.pushMap(promiseItem)
108
101
  }
109
102
  if (response.hasMore()) {
110
- PurchasingService.getPurchaseUpdates(false)
103
+ purchasingService.getPurchaseUpdates(false)
111
104
  } else {
112
105
  if (purchases.size > 0 && promiseItem != null) {
113
106
  PromiseUtils
@@ -197,13 +190,8 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
197
190
  override fun onPurchaseResponse(response: PurchaseResponse) {
198
191
  val requestId = response.requestId.toString()
199
192
  val userId = response.userData.userId
200
- val status = response.requestStatus
201
193
 
202
- // Info for potential error reporting
203
- val debugMessage: String?
204
- var errorCode = PromiseUtils.E_UNKNOWN
205
- val error = Arguments.createMap()
206
- when (status) {
194
+ when (response.requestStatus) {
207
195
  PurchaseResponse.RequestStatus.SUCCESSFUL -> {
208
196
  val receipt = response.receipt
209
197
  val userData = response.userData
@@ -218,8 +206,9 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
218
206
  )
219
207
  }
220
208
  PurchaseResponse.RequestStatus.ALREADY_PURCHASED -> {
221
- debugMessage = "You already own this item."
222
- errorCode = PromiseUtils.E_ALREADY_OWNED
209
+ val error = Arguments.createMap()
210
+ val debugMessage = "You already own this item."
211
+ val errorCode = PromiseUtils.E_ALREADY_OWNED
223
212
  error.putInt("responseCode", 0)
224
213
  error.putString("debugMessage", debugMessage)
225
214
  error.putString("code", errorCode)
@@ -234,9 +223,10 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
234
223
  )
235
224
  }
236
225
  PurchaseResponse.RequestStatus.FAILED -> {
237
- debugMessage =
226
+ val error = Arguments.createMap()
227
+ val debugMessage =
238
228
  "An unknown or unexpected error has occurred. Please try again later."
239
- errorCode = PromiseUtils.E_UNKNOWN
229
+ val errorCode = PromiseUtils.E_UNKNOWN
240
230
  error.putInt("responseCode", 0)
241
231
  error.putString("debugMessage", debugMessage)
242
232
  error.putString("code", errorCode)
@@ -251,8 +241,9 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
251
241
  )
252
242
  }
253
243
  PurchaseResponse.RequestStatus.INVALID_SKU -> {
254
- debugMessage = "That item is unavailable."
255
- errorCode = PromiseUtils.E_ITEM_UNAVAILABLE
244
+ val error = Arguments.createMap()
245
+ val debugMessage = "That item is unavailable."
246
+ val errorCode = PromiseUtils.E_ITEM_UNAVAILABLE
256
247
  error.putInt("responseCode", 0)
257
248
  error.putString("debugMessage", debugMessage)
258
249
  error.putString("code", errorCode)
@@ -267,8 +258,9 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
267
258
  )
268
259
  }
269
260
  PurchaseResponse.RequestStatus.NOT_SUPPORTED -> {
270
- debugMessage = "This feature is not available on your device."
271
- errorCode = PromiseUtils.E_SERVICE_ERROR
261
+ val error = Arguments.createMap()
262
+ val debugMessage = "This feature is not available on your device."
263
+ val errorCode = PromiseUtils.E_SERVICE_ERROR
272
264
  error.putInt("responseCode", 0)
273
265
  error.putString("debugMessage", debugMessage)
274
266
  error.putString("code", errorCode)
@@ -314,11 +306,8 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
314
306
  )
315
307
  }
316
308
  }
317
- fun clear() {
318
- skus.clear()
319
- }
320
309
 
321
- private fun sendEvent(
310
+ fun sendEvent(
322
311
  reactContext: ReactContext,
323
312
  eventName: String,
324
313
  params: WritableMap?
@@ -344,8 +333,4 @@ class RNIapAmazonListener(private val reactContext: ReactContext) : PurchasingLi
344
333
  private const val E_USER_DATA_RESPONSE_NOT_SUPPORTED = "E_USER_DATA_RESPONSE_NOT_SUPPORTED"
345
334
  const val TAG = "RNIapAmazonListener"
346
335
  }
347
-
348
- init {
349
- skus = ArrayList()
350
- }
351
336
  }
@@ -1,9 +1,11 @@
1
1
  package com.dooboolab.RNIap
2
2
 
3
+ import android.os.Handler
4
+ import android.os.Looper
3
5
  import android.util.Log
4
6
  import com.amazon.device.drm.LicensingService
5
7
  import com.amazon.device.drm.model.LicenseResponse
6
- import com.amazon.device.iap.PurchasingService
8
+ import com.amazon.device.iap.PurchasingListener
7
9
  import com.amazon.device.iap.model.FulfillmentResult
8
10
  import com.facebook.react.bridge.LifecycleEventListener
9
11
  import com.facebook.react.bridge.Promise
@@ -11,14 +13,17 @@ import com.facebook.react.bridge.ReactApplicationContext
11
13
  import com.facebook.react.bridge.ReactContextBaseJavaModule
12
14
  import com.facebook.react.bridge.ReactMethod
13
15
  import com.facebook.react.bridge.ReadableArray
14
- import com.facebook.react.bridge.UiThreadUtil
15
16
  import com.facebook.react.module.annotations.ReactModule
16
17
 
17
18
  @ReactModule(name = RNIapAmazonModule.TAG)
18
- class RNIapAmazonModule(reactContext: ReactApplicationContext) :
19
+ class RNIapAmazonModule(
20
+ reactContext: ReactApplicationContext,
21
+ private val purchasingService: PurchasingServiceProxy = PurchasingServiceProxyAmazonImpl(),
22
+ private val handler: Handler = Handler(Looper.getMainLooper()),
23
+ private val amazonListener: PurchasingListener = RNIapAmazonListener(reactContext, purchasingService)
24
+ ) :
19
25
  ReactContextBaseJavaModule(reactContext) {
20
26
  var hasListener = false
21
- private var amazonListener: RNIapAmazonListener? = null
22
27
  override fun getName(): String {
23
28
  return TAG
24
29
  }
@@ -26,20 +31,19 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
26
31
  @ReactMethod
27
32
  fun initConnection(promise: Promise) {
28
33
  val context = reactApplicationContext
29
- val amazonListener = RNIapAmazonListener(context)
30
- this.amazonListener = amazonListener
31
- UiThreadUtil.runOnUiThread {
34
+
35
+ handler.postDelayed({
32
36
  try {
33
- PurchasingService.registerListener(context.applicationContext, amazonListener)
37
+ purchasingService.registerListener(context.applicationContext, amazonListener)
34
38
  hasListener = true
35
39
  // Prefetch user and purchases as per Amazon SDK documentation:
36
- PurchasingService.getUserData()
37
- PurchasingService.getPurchaseUpdates(false)
40
+ purchasingService.getUserData()
41
+ purchasingService.getPurchaseUpdates(false)
38
42
  promise.safeResolve(true)
39
43
  } catch (e: Exception) {
40
44
  promise.safeReject("Error initializing Amazon appstore sdk", e)
41
45
  }
42
- }
46
+ }, 0L)
43
47
  }
44
48
 
45
49
  @ReactMethod
@@ -84,14 +88,13 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
84
88
  @ReactMethod
85
89
  fun endConnection(promise: Promise) {
86
90
  PromiseUtils.rejectAllPendingPromises()
87
- amazonListener?.clear()
88
91
  hasListener = false
89
92
  promise.resolve(true)
90
93
  }
91
94
 
92
95
  @ReactMethod
93
96
  fun getUser(promise: Promise) {
94
- val requestId = PurchasingService.getUserData()
97
+ val requestId = purchasingService.getUserData()
95
98
  PromiseUtils.addPromiseForKey(PROMISE_GET_USER_DATA, promise)
96
99
  }
97
100
 
@@ -114,13 +117,13 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
114
117
  ii++
115
118
  }
116
119
  PromiseUtils.addPromiseForKey(PROMISE_GET_PRODUCT_DATA, promise)
117
- val requestId = PurchasingService.getProductData(productSkus)
120
+ val requestId = purchasingService.getProductData(productSkus)
118
121
  }
119
122
 
120
123
  @ReactMethod
121
124
  fun getAvailableItems(promise: Promise) {
122
125
  PromiseUtils.addPromiseForKey(PROMISE_QUERY_AVAILABLE_ITEMS, promise)
123
- PurchasingService.getPurchaseUpdates(true)
126
+ purchasingService.getPurchaseUpdates(true)
124
127
  }
125
128
 
126
129
  @ReactMethod
@@ -129,7 +132,7 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
129
132
  promise: Promise
130
133
  ) {
131
134
  PromiseUtils.addPromiseForKey(PROMISE_BUY_ITEM, promise)
132
- val requestId = PurchasingService.purchase(sku)
135
+ val requestId = purchasingService.purchase(sku)
133
136
  }
134
137
 
135
138
  @ReactMethod
@@ -138,7 +141,7 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
138
141
  developerPayLoad: String?,
139
142
  promise: Promise
140
143
  ) {
141
- PurchasingService.notifyFulfillment(token, FulfillmentResult.FULFILLED)
144
+ purchasingService.notifyFulfillment(token, FulfillmentResult.FULFILLED)
142
145
  promise.resolve(true)
143
146
  }
144
147
 
@@ -148,13 +151,13 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
148
151
  developerPayLoad: String?,
149
152
  promise: Promise
150
153
  ) {
151
- PurchasingService.notifyFulfillment(token, FulfillmentResult.FULFILLED)
154
+ purchasingService.notifyFulfillment(token, FulfillmentResult.FULFILLED)
152
155
  promise.resolve(true)
153
156
  }
154
157
 
155
158
  private fun sendUnconsumedPurchases(promise: Promise) {
156
159
  PromiseUtils.addPromiseForKey(PROMISE_QUERY_PURCHASES, promise)
157
- PurchasingService.getPurchaseUpdates(false)
160
+ purchasingService.getPurchaseUpdates(false)
158
161
  }
159
162
 
160
163
  @ReactMethod
@@ -189,8 +192,8 @@ class RNIapAmazonModule(reactContext: ReactApplicationContext) :
189
192
  */
190
193
  override fun onHostResume() {
191
194
  if (hasListener) {
192
- PurchasingService.getUserData()
193
- PurchasingService.getPurchaseUpdates(false)
195
+ purchasingService.getUserData()
196
+ purchasingService.getPurchaseUpdates(false)
194
197
  }
195
198
  }
196
199
  override fun onHostPause() {}
@@ -0,0 +1,151 @@
1
+ package com.dooboolab.RNIap
2
+
3
+ import android.os.Handler
4
+ import com.amazon.device.iap.model.PurchaseResponse
5
+ import com.amazon.device.iap.model.Receipt
6
+ import com.amazon.device.iap.model.RequestId
7
+ import com.amazon.device.iap.model.UserData
8
+ import com.facebook.react.bridge.Arguments
9
+ import com.facebook.react.bridge.Promise
10
+ import com.facebook.react.bridge.ReactApplicationContext
11
+ import com.facebook.react.bridge.WritableMap
12
+ import io.mockk.MockKAnnotations
13
+ import io.mockk.Runs
14
+ import io.mockk.every
15
+ import io.mockk.impl.annotations.MockK
16
+ import io.mockk.impl.annotations.RelaxedMockK
17
+ import io.mockk.just
18
+ import io.mockk.mockk
19
+ import io.mockk.mockkStatic
20
+ import io.mockk.slot
21
+ import io.mockk.spyk
22
+ import io.mockk.verify
23
+ import org.junit.Assert.assertEquals
24
+ import org.junit.Before
25
+ import org.junit.Test
26
+ import java.util.*
27
+
28
+ class RNIapAmazonModuleTest {
29
+
30
+ @MockK
31
+ lateinit var context: ReactApplicationContext
32
+
33
+ @RelaxedMockK
34
+ lateinit var purchasingServiceProxy: PurchasingServiceProxy
35
+
36
+ @MockK
37
+ lateinit var mainThreadHandler: Handler
38
+
39
+ private lateinit var listener: RNIapAmazonListener
40
+
41
+ private lateinit var module: RNIapAmazonModule
42
+
43
+ @Before
44
+ fun setUp() {
45
+ MockKAnnotations.init(this, relaxUnitFun = true)
46
+ listener = spyk(RNIapAmazonListener(context, purchasingServiceProxy))
47
+ module = RNIapAmazonModule(context, purchasingServiceProxy, mainThreadHandler, listener)
48
+ }
49
+
50
+ @Test
51
+ fun `initConnection should resolve to true`() {
52
+ every { context.applicationContext } returns mockk()
53
+
54
+ val promise = mockk<Promise>(relaxed = true)
55
+ val slot = slot<Runnable>()
56
+ every { mainThreadHandler.postDelayed(capture(slot), any()) } answers { slot.captured.run(); true }
57
+ module.initConnection(promise)
58
+ verify(exactly = 0) { promise.reject(any(), any<String>()) }
59
+ verify { promise.resolve(true) }
60
+ verify { purchasingServiceProxy.registerListener(any(), any()) }
61
+ }
62
+
63
+ @Test
64
+ fun `Purchase Item`() {
65
+ val purchaseResponse = mockk<PurchaseResponse>() {
66
+ every { requestId } returns RequestId.fromString("0")
67
+
68
+ every { requestStatus } returns PurchaseResponse.RequestStatus.SUCCESSFUL
69
+ val mReceipt = mockk<Receipt>(relaxed = true) {
70
+ every { sku } returns "mySku"
71
+ every { purchaseDate } returns Date()
72
+ every { receiptId } returns "rId"
73
+ }
74
+ every { receipt } returns mReceipt
75
+ val mUserData = mockk<UserData>(relaxed = true) {
76
+ every { userId } returns "uid1"
77
+ }
78
+ every { userData } returns mUserData
79
+ }
80
+
81
+ every { listener.sendEvent(any(), any(), any()) } just Runs
82
+
83
+ every { purchasingServiceProxy.purchase(any()) } answers {
84
+ listener.onPurchaseResponse(
85
+ purchaseResponse
86
+ ); RequestId.fromString("0")
87
+ }
88
+
89
+ val itemsMap = mockk<WritableMap>(relaxed = true) {
90
+ every { getString("productId") } returns "mySku"
91
+ }
92
+ mockkStatic(Arguments::class)
93
+
94
+ every { Arguments.createMap() } returns itemsMap
95
+
96
+ val promise = mockk<Promise>(relaxed = true)
97
+
98
+ module.buyItemByType("mySku", promise)
99
+ verify(exactly = 0) { promise.reject(any(), any<String>()) }
100
+ val response = slot<WritableMap>()
101
+ verify { promise.resolve(capture(response)) }
102
+ assertEquals("mySku", response.captured.getString("productId"))
103
+ verify { listener.sendEvent(any(), "purchase-updated", any()) }
104
+ verify(exactly = 0) { purchasingServiceProxy.getPurchaseUpdates(false) }
105
+ }
106
+
107
+ // @Test
108
+ // fun `initConnection Play Services not available on device should reject`() {
109
+ // }
110
+ //
111
+ // @Test
112
+ // fun `initConnection start new connection fails`() {
113
+ // }
114
+ //
115
+ // @Test
116
+ // fun `endConnection resolves`() {
117
+ // }
118
+ //
119
+ // @Test
120
+ // fun `flushFailedPurchasesCachedAsPending resolves to false if no pending purchases`() {
121
+ // }
122
+ //
123
+ // @Test
124
+ // fun `flushFailedPurchasesCachedAsPending resolves to true if pending purchases`() {
125
+ // }
126
+ //
127
+ // @Test
128
+ // fun getItemsByType() {
129
+ // }
130
+ //
131
+ // @Test
132
+ // fun getAvailableItemsByType() {
133
+ // }
134
+ //
135
+ // @Test
136
+ // fun getPurchaseHistoryByType() {
137
+ // }
138
+ //
139
+ //
140
+ // @Test
141
+ // fun acknowledgePurchase() {
142
+ // }
143
+ //
144
+ // @Test
145
+ // fun consumeProduct() {
146
+ // }
147
+ //
148
+ // @Test
149
+ // fun onPurchasesUpdated() {
150
+ // }
151
+ }
@@ -191,6 +191,11 @@ const getProducts = _ref => {
191
191
  let {
192
192
  skus
193
193
  } = _ref;
194
+
195
+ if (!(skus !== null && skus !== void 0 && skus.length)) {
196
+ return Promise.reject('"skus" is required');
197
+ }
198
+
194
199
  return (_reactNative.Platform.select({
195
200
  ios: async () => {
196
201
  let items;
@@ -238,6 +243,11 @@ const getSubscriptions = _ref2 => {
238
243
  let {
239
244
  skus
240
245
  } = _ref2;
246
+
247
+ if (!(skus !== null && skus !== void 0 && skus.length)) {
248
+ return Promise.reject('"skus" is required');
249
+ }
250
+
241
251
  return (_reactNative.Platform.select({
242
252
  ios: async () => {
243
253
  let items;
@@ -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","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
+ {"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","length","Promise","reject","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","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","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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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,QAII;EAAA,IAJH;IAC1BC;EAD0B,CAIG;;EAC7B,I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"}
package/lib/module/iap.js CHANGED
@@ -145,6 +145,11 @@ export const getProducts = _ref => {
145
145
  let {
146
146
  skus
147
147
  } = _ref;
148
+
149
+ if (!(skus !== null && skus !== void 0 && skus.length)) {
150
+ return Promise.reject('"skus" is required');
151
+ }
152
+
148
153
  return (Platform.select({
149
154
  ios: async () => {
150
155
  let items;
@@ -189,6 +194,11 @@ export const getSubscriptions = _ref2 => {
189
194
  let {
190
195
  skus
191
196
  } = _ref2;
197
+
198
+ if (!(skus !== null && skus !== void 0 && skus.length)) {
199
+ return Promise.reject('"skus" is required');
200
+ }
201
+
192
202
  return (Platform.select({
193
203
  ios: async () => {
194
204
  let items;
@@ -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","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
+ {"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","length","Promise","reject","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","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","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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-iap",
3
- "version": "12.4.2",
3
+ "version": "12.4.4",
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)",
package/src/iap.ts CHANGED
@@ -180,8 +180,11 @@ export const getProducts = ({
180
180
  skus,
181
181
  }: {
182
182
  skus: string[];
183
- }): Promise<Array<Product>> =>
184
- (
183
+ }): Promise<Array<Product>> => {
184
+ if (!skus?.length) {
185
+ return Promise.reject('"skus" is required');
186
+ }
187
+ return (
185
188
  Platform.select({
186
189
  ios: async () => {
187
190
  let items: Product[];
@@ -207,6 +210,7 @@ export const getProducts = ({
207
210
  },
208
211
  }) || (() => Promise.reject(new Error('Unsupported Platform')))
209
212
  )();
213
+ };
210
214
 
211
215
  /**
212
216
  * Get a list of subscriptions
@@ -233,8 +237,11 @@ export const getSubscriptions = ({
233
237
  skus,
234
238
  }: {
235
239
  skus: string[];
236
- }): Promise<Subscription[]> =>
237
- (
240
+ }): Promise<Subscription[]> => {
241
+ if (!skus?.length) {
242
+ return Promise.reject('"skus" is required');
243
+ }
244
+ return (
238
245
  Platform.select({
239
246
  ios: async (): Promise<SubscriptionIOS[]> => {
240
247
  let items: SubscriptionIOS[];
@@ -287,6 +294,7 @@ export const getSubscriptions = ({
287
294
  },
288
295
  }) || (() => Promise.reject(new Error('Unsupported Platform')))
289
296
  )();
297
+ };
290
298
 
291
299
  /**
292
300
  * Adds an extra property to subscriptions so we can distinguish the platform