react-native-iap 11.0.0-alpha.7 → 11.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +0 -1
  2. package/ios/IapSerializationUtils.swift +30 -0
  3. package/ios/RNIapIos.m +1 -10
  4. package/ios/RNIapIos.swift +18 -84
  5. package/ios/RNIapIosSk2.m +5 -0
  6. package/ios/RNIapIosSk2.swift +66 -52
  7. package/lib/commonjs/eventEmitter.js +4 -4
  8. package/lib/commonjs/eventEmitter.js.map +1 -1
  9. package/lib/commonjs/hooks/withIAPContext.js +1 -1
  10. package/lib/commonjs/hooks/withIAPContext.js.map +1 -1
  11. package/lib/commonjs/iap.js +398 -335
  12. package/lib/commonjs/iap.js.map +1 -1
  13. package/lib/commonjs/index.js +13 -0
  14. package/lib/commonjs/index.js.map +1 -1
  15. package/lib/commonjs/internal/platform.js +75 -2
  16. package/lib/commonjs/internal/platform.js.map +1 -1
  17. package/lib/commonjs/modules/amazon.js +28 -1
  18. package/lib/commonjs/modules/amazon.js.map +1 -1
  19. package/lib/commonjs/modules/android.js +73 -1
  20. package/lib/commonjs/modules/android.js.map +1 -1
  21. package/lib/commonjs/modules/ios.js +126 -0
  22. package/lib/commonjs/modules/ios.js.map +1 -1
  23. package/lib/commonjs/modules/iosSk2.js +47 -0
  24. package/lib/commonjs/modules/iosSk2.js.map +1 -1
  25. package/lib/commonjs/types/appleSk2.js +21 -1
  26. package/lib/commonjs/types/appleSk2.js.map +1 -1
  27. package/lib/module/eventEmitter.js +2 -2
  28. package/lib/module/eventEmitter.js.map +1 -1
  29. package/lib/module/hooks/withIAPContext.js +2 -2
  30. package/lib/module/hooks/withIAPContext.js.map +1 -1
  31. package/lib/module/iap.js +359 -267
  32. package/lib/module/iap.js.map +1 -1
  33. package/lib/module/index.js +1 -0
  34. package/lib/module/index.js.map +1 -1
  35. package/lib/module/internal/platform.js +48 -1
  36. package/lib/module/internal/platform.js.map +1 -1
  37. package/lib/module/modules/amazon.js +23 -0
  38. package/lib/module/modules/amazon.js.map +1 -1
  39. package/lib/module/modules/android.js +59 -1
  40. package/lib/module/modules/android.js.map +1 -1
  41. package/lib/module/modules/ios.js +102 -1
  42. package/lib/module/modules/ios.js.map +1 -1
  43. package/lib/module/modules/iosSk2.js +30 -1
  44. package/lib/module/modules/iosSk2.js.map +1 -1
  45. package/lib/module/types/appleSk2.js +17 -0
  46. package/lib/module/types/appleSk2.js.map +1 -1
  47. package/lib/typescript/iap.d.ts +347 -168
  48. package/lib/typescript/index.d.ts +1 -0
  49. package/lib/typescript/internal/platform.d.ts +9 -0
  50. package/lib/typescript/modules/amazon.d.ts +17 -0
  51. package/lib/typescript/modules/android.d.ts +38 -1
  52. package/lib/typescript/modules/ios.d.ts +57 -5
  53. package/lib/typescript/modules/iosSk2.d.ts +28 -7
  54. package/lib/typescript/types/appleSk2.d.ts +31 -0
  55. package/package.json +5 -2
  56. package/src/eventEmitter.ts +4 -3
  57. package/src/hooks/withIAPContext.tsx +2 -2
  58. package/src/iap.ts +402 -356
  59. package/src/index.ts +1 -0
  60. package/src/internal/platform.ts +77 -1
  61. package/src/modules/amazon.ts +29 -1
  62. package/src/modules/android.ts +83 -2
  63. package/src/modules/ios.ts +124 -13
  64. package/src/modules/iosSk2.ts +46 -15
  65. package/src/types/appleSk2.ts +58 -1
package/README.md CHANGED
@@ -19,7 +19,6 @@ Read the [documentation](https://react-native-iap.dooboolab.com). See the [troub
19
19
  Please [fund the project](https://opencollective.com/react-native-iap) if you are willing the maintainers to make the repository sustainable.
20
20
 
21
21
  - [andresesfm](https://github.com/andresesfm)
22
- - [jeremybarbet](https://github.com/jeremybarbet)
23
22
 
24
23
  > The fund goes to maintainers.
25
24
 
@@ -53,6 +53,36 @@ func serialize(_ si: Product.SubscriptionInfo?) -> [String: Any?]? {
53
53
  "subscriptionPeriod": si.subscriptionPeriod
54
54
  ]
55
55
  }
56
+ @available(iOS 15.0, *)
57
+ func serialize(_ s: Product.SubscriptionInfo.Status?) -> [String: Any?]? {
58
+ guard let s = s else {return nil}
59
+ return ["state": serialize( s.state)
60
+ // "renewalInfo": serialize(s.renewalInfo),
61
+ // "transaction": serialize(s.transaction),
62
+ ]
63
+ }
64
+
65
+ @available(iOS 15.0, *)
66
+ func serialize(_ rs: Product.SubscriptionInfo.RenewalState?) -> String? {
67
+ guard let rs = rs else {return nil}
68
+ switch rs {
69
+ case .expired: return "expired"
70
+ case .inBillingRetryPeriod: return "inBillingRetryPeriod"
71
+ case .inGracePeriod: return "inGracePeriod"
72
+ case .revoked: return "revoked"
73
+ case .subscribed: return "subscribed"
74
+ default:
75
+ return nil
76
+ }
77
+ }
78
+
79
+ @available(iOS 15.0, *)
80
+ func serialize(_ ri: Product.SubscriptionInfo.RenewalInfo?) -> [String: Any?]? {
81
+ guard let ri = ri else {return nil}
82
+ return ["signedDate": ri.signedDate
83
+ ]
84
+ }
85
+
56
86
  @available(iOS 15.0, *)
57
87
  func serialize(_ so: Product.SubscriptionOffer?) -> [String: Any?]? {
58
88
  guard let so = so else {return nil}
package/ios/RNIapIos.m CHANGED
@@ -25,17 +25,8 @@ RCT_EXTERN_METHOD(buyProduct:
25
25
  (NSString*)sku
26
26
  andDangerouslyFinishTransactionAutomatically:(BOOL)andDangerouslyFinishTransactionAutomatically
27
27
  applicationUsername:(NSString*)applicationUsername
28
- resolve:(RCTPromiseResolveBlock)resolve
29
- reject:(RCTPromiseRejectBlock)reject)
30
- RCT_EXTERN_METHOD(buyProductWithOffer:
31
- (NSString*)sku
32
- forUser:(NSString*)usernameHash
33
- withOffer:(NSDictionary*)discountOffer
34
- resolve:(RCTPromiseResolveBlock)resolve
35
- reject:(RCTPromiseRejectBlock)reject)
36
- RCT_EXTERN_METHOD(buyProductWithQuantityIOS:
37
- (NSString*)sku
38
28
  quantity:(NSInteger)quantity
29
+ withOffer:(NSDictionary*)discountOffer
39
30
  resolve:(RCTPromiseResolveBlock)resolve
40
31
  reject:(RCTPromiseRejectBlock)reject)
41
32
 
@@ -196,6 +196,8 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
196
196
  _ sku: String,
197
197
  andDangerouslyFinishTransactionAutomatically: Bool,
198
198
  applicationUsername: String?,
199
+ quantity: Int,
200
+ withOffer discountOffer: [String: String]?,
199
201
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
200
202
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
201
203
  ) {
@@ -215,106 +217,38 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
215
217
 
216
218
  let payment = SKMutablePayment(product: prod)
217
219
 
218
- if let applicationUsername = applicationUsername {
219
- payment.applicationUsername = applicationUsername
220
- }
221
- SKPaymentQueue.default().add(payment)
222
- } else {
223
- if hasListeners {
224
- let err = [
225
- "debugMessage": "Invalid product ID.",
226
- "code": "E_DEVELOPER_ERROR",
227
- "message": "Invalid product ID.",
228
- "productId": sku
229
- ]
230
-
231
- sendEvent(withName: "purchase-error", body: err)
232
- }
233
-
234
- reject("E_DEVELOPER_ERROR", "Invalid product ID.", nil)
235
- }
236
- }
237
-
238
- @objc public func buyProductWithOffer(
239
- _ sku: String,
240
- forUser usernameHash: String,
241
- withOffer discountOffer: [String: String],
242
- resolve: @escaping RCTPromiseResolveBlock = { _ in },
243
- reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
244
- ) {
245
- var product: SKProduct?
246
- let lockQueue = DispatchQueue(label: "validProducts")
247
- lockQueue.sync {
248
- for p in validProducts {
249
- if sku == p.productIdentifier {
250
- product = p
251
- break
220
+ if #available(iOS 12.2, tvOS 12.2, *) {
221
+ if let discountOffer = discountOffer, let identifier = discountOffer["identifier"], let keyIdentifier = discountOffer["keyIdentifier"], let nonce = discountOffer["nonce"], let signature = discountOffer["signature"], let timestamp = discountOffer["timestamp"] {
222
+ let discount = SKPaymentDiscount(
223
+ identifier: identifier,
224
+ keyIdentifier: keyIdentifier,
225
+ nonce: UUID(uuidString: nonce)!,
226
+ signature: signature,
227
+ timestamp: NSNumber(value: Int(timestamp)!))
228
+ payment.paymentDiscount = discount
252
229
  }
253
230
  }
254
- }
255
-
256
- if let prod = product {
257
- addPromise(forKey: prod.productIdentifier, resolve: resolve, reject: reject)
258
-
259
- let payment = SKMutablePayment(product: prod)
260
231
 
261
- if #available(iOS 12.2, tvOS 12.2, *) {
262
- let discount = SKPaymentDiscount(
263
- identifier: discountOffer["identifier"]!,
264
- keyIdentifier: discountOffer["keyIdentifier"]!,
265
- nonce: UUID(uuidString: discountOffer["nonce"]!)!,
266
- signature: discountOffer["signature"]!,
267
- timestamp: NSNumber(value: Int(discountOffer["timestamp"]!)!))
268
- payment.paymentDiscount = discount
232
+ if let applicationUsername = applicationUsername {
233
+ payment.applicationUsername = applicationUsername
269
234
  }
270
- payment.applicationUsername = usernameHash
271
- SKPaymentQueue.default().add(payment)
272
- } else {
273
- if hasListeners {
274
- let err = [
275
- "debugMessage": "Invalid product ID.",
276
- "message": "Invalid product ID.",
277
- "code": "E_DEVELOPER_ERROR",
278
- "productId": sku
279
- ]
280
- sendEvent(withName: "purchase-error", body: err)
235
+ if quantity > 0 {
236
+ payment.quantity = quantity
281
237
  }
282
- reject("E_DEVELOPER_ERROR", "Invalid product ID.", nil)
283
- }
284
- }
285
238
 
286
- @objc public func buyProductWithQuantityIOS(
287
- _ sku: String,
288
- quantity: Int,
289
- resolve: @escaping RCTPromiseResolveBlock = { _ in },
290
- reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
291
- ) {
292
- debugMessage("buyProductWithQuantityIOS")
293
- var product: SKProduct?
294
- let lockQueue = DispatchQueue(label: "validProducts")
295
- lockQueue.sync {
296
- for p in validProducts {
297
- if sku == p.productIdentifier {
298
- product = p
299
- break
300
- }
301
- }
302
- }
303
- if let prod = product {
304
- addPromise(forKey: prod.productIdentifier, resolve: resolve, reject: reject)
305
- let payment = SKMutablePayment(product: prod)
306
- payment.quantity = quantity
307
239
  SKPaymentQueue.default().add(payment)
308
240
  } else {
309
241
  if hasListeners {
310
242
  let err = [
311
243
  "debugMessage": "Invalid product ID.",
312
- "message": "Invalid product ID.",
313
244
  "code": "E_DEVELOPER_ERROR",
245
+ "message": "Invalid product ID.",
314
246
  "productId": sku
315
247
  ]
248
+
316
249
  sendEvent(withName: "purchase-error", body: err)
317
250
  }
251
+
318
252
  reject("E_DEVELOPER_ERROR", "Invalid product ID.", nil)
319
253
  }
320
254
  }
package/ios/RNIapIosSk2.m CHANGED
@@ -35,6 +35,11 @@ RCT_EXTERN_METHOD(isEligibleForIntroOffer:
35
35
  resolve:(RCTPromiseResolveBlock)resolve
36
36
  reject:(RCTPromiseRejectBlock)reject)
37
37
 
38
+ RCT_EXTERN_METHOD(subscriptionStatus:
39
+ (NSString*)sku
40
+ resolve:(RCTPromiseResolveBlock)resolve
41
+ reject:(RCTPromiseRejectBlock)reject)
42
+
38
43
  RCT_EXTERN_METHOD(currentEntitlement:
39
44
  (NSString*)sku
40
45
  resolve:(RCTPromiseResolveBlock)resolve
@@ -51,7 +51,7 @@ class RNIapIosSk2: RCTEventEmitter {
51
51
  // await self.updateCustomerProductStatus()
52
52
 
53
53
  if self.hasListeners {
54
- self.sendEvent(withName: "transaction-updated", body: ["transaction": serialize(transaction)])
54
+ self.sendEvent(withName: "purchase-updated", body: serialize(transaction))
55
55
  }
56
56
  // Always finish a transaction.
57
57
  // await transaction.finish() //TODO: Document
@@ -66,7 +66,7 @@ class RNIapIosSk2: RCTEventEmitter {
66
66
  "message": error.localizedDescription
67
67
  ]
68
68
 
69
- self.sendEvent(withName: "transaction-updated", body: ["error": err])
69
+ self.sendEvent(withName: "purchase-error", body: err)
70
70
  }
71
71
  }
72
72
  }
@@ -224,7 +224,7 @@ class RNIapIosSk2: RCTEventEmitter {
224
224
  options.insert(.quantity(quantity))
225
225
  }
226
226
 
227
- let offerID = withOffer["offerID"] // TODO: Adjust JS to match these new names
227
+ let offerID = withOffer["offerID"]
228
228
  let keyID = withOffer["keyID"]
229
229
  let nonce = withOffer["nonce"]
230
230
  let signature = withOffer["signature"]
@@ -306,75 +306,87 @@ class RNIapIosSk2: RCTEventEmitter {
306
306
  }
307
307
  }
308
308
 
309
- @objc public func isEligibleForIntroOffer( // TODO: new method
309
+ @objc public func isEligibleForIntroOffer(
310
310
  _ groupID: String,
311
311
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
312
312
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
313
- ) async {
314
- let isEligibleForIntroOffer = await Product.SubscriptionInfo.isEligibleForIntroOffer(for: groupID)
315
- resolve(isEligibleForIntroOffer)
313
+ ) {
314
+ Task {
315
+ let isEligibleForIntroOffer = await Product.SubscriptionInfo.isEligibleForIntroOffer(for: groupID)
316
+ resolve(isEligibleForIntroOffer)
317
+ }
316
318
  }
317
319
 
318
- @objc public func subscriptionStatus( // TODO: new method
320
+ @objc public func subscriptionStatus(
319
321
  _ sku: String,
320
322
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
321
323
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
322
- ) async {
323
- do {
324
- let status = try await products[sku]?.subscription?.status
325
- resolve(status)
326
- } catch {
327
- reject("", "", error)
324
+ ) {
325
+ Task {
326
+ do {
327
+ let status: [Product.SubscriptionInfo.Status]? = try await products[sku]?.subscription?.status
328
+ guard let status = status else {
329
+ resolve(nil)
330
+ return
331
+ }
332
+ resolve(status.map({s in serialize(s)}))
333
+ } catch {
334
+ reject(IapErrors.E_UNKNOWN.rawValue, "Error getting subscription status", error)
335
+ }
328
336
  }
329
337
  }
330
338
 
331
- @objc public func currentEntitlement( // TODO: new method
339
+ @objc public func currentEntitlement(
332
340
  _ sku: String,
333
341
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
334
342
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
335
- ) async {
336
- if let product = products[sku] {
337
- if let result = await product.currentEntitlement {
338
- do {
339
- // Check whether the transaction is verified. If it isn’t, catch `failedVerification` error.
340
- let transaction = try checkVerified(result)
341
- resolve(serialize(transaction))
342
- } catch StoreError.failedVerification {
343
- reject(IapErrors.E_UNKNOWN.rawValue, "Failed to verify transaction for sku \(sku)", StoreError.failedVerification)
344
- } catch {
345
- debugMessage(error)
346
- reject(IapErrors.E_UNKNOWN.rawValue, "Error fetching entitlement for sku \(sku)", error)
343
+ ) {
344
+ Task {
345
+ if let product = products[sku] {
346
+ if let result = await product.currentEntitlement {
347
+ do {
348
+ // Check whether the transaction is verified. If it isn’t, catch `failedVerification` error.
349
+ let transaction = try checkVerified(result)
350
+ resolve(serialize(transaction))
351
+ } catch StoreError.failedVerification {
352
+ reject(IapErrors.E_UNKNOWN.rawValue, "Failed to verify transaction for sku \(sku)", StoreError.failedVerification)
353
+ } catch {
354
+ debugMessage(error)
355
+ reject(IapErrors.E_UNKNOWN.rawValue, "Error fetching entitlement for sku \(sku)", error)
356
+ }
357
+ } else {
358
+ reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find entitlement for sku \(sku)", nil)
347
359
  }
348
360
  } else {
349
- reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find entitlement for sku \(sku)", nil)
361
+ reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find product for sku \(sku)", nil)
350
362
  }
351
- } else {
352
- reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find product for sku \(sku)", nil)
353
363
  }
354
364
  }
355
365
 
356
- @objc public func latestTransaction( // TODO: new method
366
+ @objc public func latestTransaction(
357
367
  _ sku: String,
358
368
  resolve: @escaping RCTPromiseResolveBlock = { _ in },
359
369
  reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
360
- ) async {
361
- if let product = products[sku] {
362
- if let result = await product.latestTransaction {
363
- do {
364
- // Check whether the transaction is verified. If it isn’t, catch `failedVerification` error.
365
- let transaction = try checkVerified(result)
366
- resolve(serialize(transaction))
367
- } catch StoreError.failedVerification {
368
- reject(IapErrors.E_UNKNOWN.rawValue, "Failed to verify transaction for sku \(sku)", StoreError.failedVerification)
369
- } catch {
370
- debugMessage(error)
371
- reject(IapErrors.E_UNKNOWN.rawValue, "Error fetching latest transaction for sku \(sku)", error)
370
+ ) {
371
+ Task {
372
+ if let product = products[sku] {
373
+ if let result = await product.latestTransaction {
374
+ do {
375
+ // Check whether the transaction is verified. If it isn’t, catch `failedVerification` error.
376
+ let transaction = try checkVerified(result)
377
+ resolve(serialize(transaction))
378
+ } catch StoreError.failedVerification {
379
+ reject(IapErrors.E_UNKNOWN.rawValue, "Failed to verify transaction for sku \(sku)", StoreError.failedVerification)
380
+ } catch {
381
+ debugMessage(error)
382
+ reject(IapErrors.E_UNKNOWN.rawValue, "Error fetching latest transaction for sku \(sku)", error)
383
+ }
384
+ } else {
385
+ reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find latest transaction for sku \(sku)", nil)
372
386
  }
373
387
  } else {
374
- reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find latest transaction for sku \(sku)", nil)
388
+ reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find product for sku \(sku)", nil)
375
389
  }
376
- } else {
377
- reject(IapErrors.E_DEVELOPER_ERROR.rawValue, "Can't find product for sku \(sku)", nil)
378
390
  }
379
391
  }
380
392
 
@@ -403,15 +415,17 @@ class RNIapIosSk2: RCTEventEmitter {
403
415
  resolve(transactions.values.map({(t: Transaction) in serialize(t)}))
404
416
  }
405
417
 
406
- // TODO: New method
407
418
  @objc public func sync(
408
419
  _ resolve: @escaping RCTPromiseResolveBlock = { _ in},
409
420
  reject: @escaping RCTPromiseRejectBlock = {_, _, _ in}
410
- ) async {
411
- do {
412
- try await AppStore.sync()
413
- } catch {
414
- reject(IapErrors.E_SYNC_ERROR.rawValue, "Error synchronizing with the AppStore", error)
421
+ ) {
422
+ Task {
423
+ do {
424
+ try await AppStore.sync()
425
+ resolve(nil)
426
+ } catch {
427
+ reject(IapErrors.E_SYNC_ERROR.rawValue, "Error synchronizing with the AppStore", error)
428
+ }
415
429
  }
416
430
  }
417
431
 
@@ -17,14 +17,14 @@ var _internal = require("./internal");
17
17
  * Add IAP purchase event
18
18
  */
19
19
  const purchaseUpdatedListener = listener => {
20
- const eventEmitter = new _reactNative.NativeEventEmitter((0, _iap.getNativeModule)());
20
+ const eventEmitter = new _reactNative.NativeEventEmitter((0, _internal.getNativeModule)());
21
21
  const proxyListener = (0, _iap.isIosStorekit2)() ? event => {
22
22
  listener((0, _appleSk.transactionSk2Map)(event));
23
23
  } : listener;
24
24
  const emitterSubscription = eventEmitter.addListener('purchase-updated', proxyListener);
25
25
 
26
26
  if (_internal.isAndroid) {
27
- (0, _iap.getAndroidModule)().startListening();
27
+ (0, _internal.getAndroidModule)().startListening();
28
28
  }
29
29
 
30
30
  return emitterSubscription;
@@ -37,7 +37,7 @@ const purchaseUpdatedListener = listener => {
37
37
  exports.purchaseUpdatedListener = purchaseUpdatedListener;
38
38
 
39
39
  const purchaseErrorListener = listener => {
40
- const eventEmitter = new _reactNative.NativeEventEmitter((0, _iap.getNativeModule)());
40
+ const eventEmitter = new _reactNative.NativeEventEmitter((0, _internal.getNativeModule)());
41
41
  return eventEmitter.addListener('purchase-error', listener);
42
42
  };
43
43
  /**
@@ -51,7 +51,7 @@ exports.purchaseErrorListener = purchaseErrorListener;
51
51
 
52
52
  const promotedProductListener = listener => {
53
53
  if (_internal.isIos) {
54
- const eventEmitter = new _reactNative.NativeEventEmitter((0, _iap.getIosModule)());
54
+ const eventEmitter = new _reactNative.NativeEventEmitter((0, _internal.getIosModule)());
55
55
  return eventEmitter.addListener('iap-promoted-product', listener);
56
56
  }
57
57
 
@@ -1 +1 @@
1
- {"version":3,"names":["purchaseUpdatedListener","listener","eventEmitter","NativeEventEmitter","getNativeModule","proxyListener","isIosStorekit2","event","transactionSk2Map","emitterSubscription","addListener","isAndroid","getAndroidModule","startListening","purchaseErrorListener","promotedProductListener","isIos","getIosModule"],"sources":["eventEmitter.ts"],"sourcesContent":["import {EmitterSubscription, NativeEventEmitter} from 'react-native';\n\nimport {transactionSk2Map} from './types/appleSk2';\nimport {\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isIosStorekit2,\n} from './iap';\nimport {isAndroid, isIos} from './internal';\nimport type {PurchaseError} from './purchaseError';\nimport type {Purchase} from './types';\n\n/**\n * Add IAP purchase event\n */\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n) => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n const proxyListener = isIosStorekit2()\n ? (event: Purchase) => {\n listener(transactionSk2Map(event as any));\n }\n : listener;\n const emitterSubscription = eventEmitter.addListener(\n 'purchase-updated',\n proxyListener,\n );\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n */\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EmitterSubscription => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n return eventEmitter.addListener('purchase-error', listener);\n};\n\n/**\n * Add IAP promoted subscription event\n *\n * @platform iOS\n */\nexport const promotedProductListener = (listener: () => void) => {\n if (isIos) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-promoted-product', listener);\n }\n\n return null;\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AAMA;;AAIA;AACA;AACA;AACO,MAAMA,uBAAuB,GAClCC,QADqC,IAElC;EACH,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,oBAAA,GAAvB,CAArB;EACA,MAAMC,aAAa,GAAG,IAAAC,mBAAA,MACjBC,KAAD,IAAqB;IACnBN,QAAQ,CAAC,IAAAO,0BAAA,EAAkBD,KAAlB,CAAD,CAAR;EACD,CAHiB,GAIlBN,QAJJ;EAKA,MAAMQ,mBAAmB,GAAGP,YAAY,CAACQ,WAAb,CAC1B,kBAD0B,EAE1BL,aAF0B,CAA5B;;EAKA,IAAIM,mBAAJ,EAAe;IACb,IAAAC,qBAAA,IAAmBC,cAAnB;EACD;;EAED,OAAOJ,mBAAP;AACD,CAnBM;AAqBP;AACA;AACA;;;;;AACO,MAAMK,qBAAqB,GAChCb,QADmC,IAEX;EACxB,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,oBAAA,GAAvB,CAArB;EACA,OAAOF,YAAY,CAACQ,WAAb,CAAyB,gBAAzB,EAA2CT,QAA3C,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;;;;;AACO,MAAMc,uBAAuB,GAAId,QAAD,IAA0B;EAC/D,IAAIe,eAAJ,EAAW;IACT,MAAMd,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAc,iBAAA,GAAvB,CAArB;IACA,OAAOf,YAAY,CAACQ,WAAb,CAAyB,sBAAzB,EAAiDT,QAAjD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CAPM"}
1
+ {"version":3,"names":["purchaseUpdatedListener","listener","eventEmitter","NativeEventEmitter","getNativeModule","proxyListener","isIosStorekit2","event","transactionSk2Map","emitterSubscription","addListener","isAndroid","getAndroidModule","startListening","purchaseErrorListener","promotedProductListener","isIos","getIosModule"],"sources":["eventEmitter.ts"],"sourcesContent":["import {EmitterSubscription, NativeEventEmitter} from 'react-native';\n\nimport {transactionSk2Map} from './types/appleSk2';\nimport {isIosStorekit2} from './iap';\nimport {\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAndroid,\n isIos,\n} from './internal';\nimport type {PurchaseError} from './purchaseError';\nimport type {Purchase} from './types';\n\n/**\n * Add IAP purchase event\n */\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n) => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n const proxyListener = isIosStorekit2()\n ? (event: Purchase) => {\n listener(transactionSk2Map(event as any));\n }\n : listener;\n const emitterSubscription = eventEmitter.addListener(\n 'purchase-updated',\n proxyListener,\n );\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n */\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EmitterSubscription => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n return eventEmitter.addListener('purchase-error', listener);\n};\n\n/**\n * Add IAP promoted subscription event\n *\n * @platform iOS\n */\nexport const promotedProductListener = (listener: () => void) => {\n if (isIos) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-promoted-product', listener);\n }\n\n return null;\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AAUA;AACA;AACA;AACO,MAAMA,uBAAuB,GAClCC,QADqC,IAElC;EACH,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,yBAAA,GAAvB,CAArB;EACA,MAAMC,aAAa,GAAG,IAAAC,mBAAA,MACjBC,KAAD,IAAqB;IACnBN,QAAQ,CAAC,IAAAO,0BAAA,EAAkBD,KAAlB,CAAD,CAAR;EACD,CAHiB,GAIlBN,QAJJ;EAKA,MAAMQ,mBAAmB,GAAGP,YAAY,CAACQ,WAAb,CAC1B,kBAD0B,EAE1BL,aAF0B,CAA5B;;EAKA,IAAIM,mBAAJ,EAAe;IACb,IAAAC,0BAAA,IAAmBC,cAAnB;EACD;;EAED,OAAOJ,mBAAP;AACD,CAnBM;AAqBP;AACA;AACA;;;;;AACO,MAAMK,qBAAqB,GAChCb,QADmC,IAEX;EACxB,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,yBAAA,GAAvB,CAArB;EACA,OAAOF,YAAY,CAACQ,WAAb,CAAyB,gBAAzB,EAA2CT,QAA3C,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;;;;;AACO,MAAMc,uBAAuB,GAAId,QAAD,IAA0B;EAC/D,IAAIe,eAAJ,EAAW;IACT,MAAMd,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAc,sBAAA,GAAvB,CAArB;IACA,OAAOf,YAAY,CAACQ,WAAb,CAAyB,sBAAzB,EAAiDT,QAAjD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CAPM"}
@@ -77,7 +77,7 @@ function withIAPContext(Component) {
77
77
  setCurrentPurchaseError(error);
78
78
  });
79
79
  const promotedProductSubscription = (0, _eventEmitter.promotedProductListener)(async () => {
80
- const product = await (0, _iap.getPromotedProductIOS)();
80
+ const product = await _iap.IapIos.getPromotedProductIOS();
81
81
  setPromotedProductsIOS(prevProducts => [...prevProducts, ...(product ? [product] : [])]);
82
82
  });
83
83
  return () => {
@@ -1 +1 @@
1
- {"version":3,"names":["IAPContext","React","createContext","useIAPContext","ctx","useContext","Error","withIAPContext","Component","WrapperComponent","props","connected","setConnected","useState","products","setProducts","promotedProductsIOS","setPromotedProductsIOS","subscriptions","setSubscriptions","purchaseHistory","setPurchaseHistory","availablePurchases","setAvailablePurchases","currentPurchase","setCurrentPurchase","currentPurchaseError","setCurrentPurchaseError","initConnectionError","setInitConnectionError","context","useMemo","useEffect","initConnection","then","value","undefined","catch","purchaseUpdateSubscription","purchaseUpdatedListener","purchase","purchaseErrorSubscription","purchaseErrorListener","error","promotedProductSubscription","promotedProductListener","product","getPromotedProductIOS","prevProducts","remove"],"sources":["withIAPContext.tsx"],"sourcesContent":["import React, {useContext, useEffect, useMemo, useState} from 'react';\n\nimport {\n promotedProductListener,\n purchaseErrorListener,\n purchaseUpdatedListener,\n} from '../eventEmitter';\nimport {getPromotedProductIOS, initConnection} from '../iap';\nimport type {PurchaseError} from '../purchaseError';\nimport type {\n Product,\n ProductPurchase,\n Purchase,\n Subscription,\n SubscriptionPurchase,\n} from '../types';\n\ntype IAPContextType = {\n connected: boolean;\n products: Product[];\n promotedProductsIOS: Product[];\n subscriptions: Subscription[];\n purchaseHistory: Purchase[];\n availablePurchases: Purchase[];\n currentPurchase?: Purchase;\n currentPurchaseError?: PurchaseError;\n initConnectionError?: Error;\n setProducts: (products: Product[]) => void;\n setSubscriptions: (subscriptions: Subscription[]) => void;\n setPurchaseHistory: (purchaseHistory: Purchase[]) => void;\n setAvailablePurchases: (availablePurchases: Purchase[]) => void;\n setCurrentPurchase: (currentPurchase: Purchase | undefined) => void;\n setCurrentPurchaseError: (\n currentPurchaseError: PurchaseError | undefined,\n ) => void;\n};\n\n// @ts-ignore\nconst IAPContext = React.createContext<IAPContextType>(null);\n\nexport function useIAPContext(): IAPContextType {\n const ctx = useContext(IAPContext);\n\n if (!ctx) {\n throw new Error('You need wrap your app with withIAPContext HOC');\n }\n\n return ctx;\n}\n\nexport function withIAPContext<T>(Component: React.ComponentType<T>) {\n return function WrapperComponent(props: T) {\n const [connected, setConnected] = useState(false);\n const [products, setProducts] = useState<Product[]>([]);\n\n const [promotedProductsIOS, setPromotedProductsIOS] = useState<Product[]>(\n [],\n );\n const [subscriptions, setSubscriptions] = useState<Subscription[]>([]);\n const [purchaseHistory, setPurchaseHistory] = useState<Purchase[]>([]);\n\n const [availablePurchases, setAvailablePurchases] = useState<Purchase[]>(\n [],\n );\n const [currentPurchase, setCurrentPurchase] = useState<Purchase>();\n\n const [currentPurchaseError, setCurrentPurchaseError] =\n useState<PurchaseError>();\n\n const [initConnectionError, setInitConnectionError] = useState<Error>();\n\n const context = useMemo(\n () => ({\n connected,\n products,\n subscriptions,\n promotedProductsIOS,\n purchaseHistory,\n availablePurchases,\n currentPurchase,\n currentPurchaseError,\n initConnectionError,\n setProducts,\n setSubscriptions,\n setPurchaseHistory,\n setAvailablePurchases,\n setCurrentPurchase,\n setCurrentPurchaseError,\n }),\n [\n connected,\n products,\n subscriptions,\n promotedProductsIOS,\n purchaseHistory,\n availablePurchases,\n currentPurchase,\n currentPurchaseError,\n initConnectionError,\n setProducts,\n setSubscriptions,\n setPurchaseHistory,\n setAvailablePurchases,\n setCurrentPurchase,\n setCurrentPurchaseError,\n ],\n );\n\n useEffect(() => {\n initConnection()\n .then((value) => {\n setInitConnectionError(undefined);\n setConnected(value);\n })\n .catch(setInitConnectionError);\n }, []);\n\n useEffect(() => {\n if (!connected) {\n return;\n }\n\n const purchaseUpdateSubscription = purchaseUpdatedListener(\n async (purchase: ProductPurchase | SubscriptionPurchase) => {\n setCurrentPurchaseError(undefined);\n setCurrentPurchase(purchase);\n },\n );\n\n const purchaseErrorSubscription = purchaseErrorListener(\n (error: PurchaseError) => {\n setCurrentPurchase(undefined);\n setCurrentPurchaseError(error);\n },\n );\n\n const promotedProductSubscription = promotedProductListener(async () => {\n const product = await getPromotedProductIOS();\n\n setPromotedProductsIOS((prevProducts) => [\n ...prevProducts,\n ...(product ? [product] : []),\n ]);\n });\n\n return () => {\n purchaseUpdateSubscription.remove();\n purchaseErrorSubscription.remove();\n promotedProductSubscription?.remove();\n };\n }, [connected]);\n\n return (\n <IAPContext.Provider value={context}>\n <Component {...props} />\n </IAPContext.Provider>\n );\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["IAPContext","React","createContext","useIAPContext","ctx","useContext","Error","withIAPContext","Component","WrapperComponent","props","connected","setConnected","useState","products","setProducts","promotedProductsIOS","setPromotedProductsIOS","subscriptions","setSubscriptions","purchaseHistory","setPurchaseHistory","availablePurchases","setAvailablePurchases","currentPurchase","setCurrentPurchase","currentPurchaseError","setCurrentPurchaseError","initConnectionError","setInitConnectionError","context","useMemo","useEffect","initConnection","then","value","undefined","catch","purchaseUpdateSubscription","purchaseUpdatedListener","purchase","purchaseErrorSubscription","purchaseErrorListener","error","promotedProductSubscription","promotedProductListener","product","IapIos","getPromotedProductIOS","prevProducts","remove"],"sources":["withIAPContext.tsx"],"sourcesContent":["import React, {useContext, useEffect, useMemo, useState} from 'react';\n\nimport {\n promotedProductListener,\n purchaseErrorListener,\n purchaseUpdatedListener,\n} from '../eventEmitter';\nimport {IapIos, initConnection} from '../iap';\nimport type {PurchaseError} from '../purchaseError';\nimport type {\n Product,\n ProductPurchase,\n Purchase,\n Subscription,\n SubscriptionPurchase,\n} from '../types';\n\ntype IAPContextType = {\n connected: boolean;\n products: Product[];\n promotedProductsIOS: Product[];\n subscriptions: Subscription[];\n purchaseHistory: Purchase[];\n availablePurchases: Purchase[];\n currentPurchase?: Purchase;\n currentPurchaseError?: PurchaseError;\n initConnectionError?: Error;\n setProducts: (products: Product[]) => void;\n setSubscriptions: (subscriptions: Subscription[]) => void;\n setPurchaseHistory: (purchaseHistory: Purchase[]) => void;\n setAvailablePurchases: (availablePurchases: Purchase[]) => void;\n setCurrentPurchase: (currentPurchase: Purchase | undefined) => void;\n setCurrentPurchaseError: (\n currentPurchaseError: PurchaseError | undefined,\n ) => void;\n};\n\n// @ts-ignore\nconst IAPContext = React.createContext<IAPContextType>(null);\n\nexport function useIAPContext(): IAPContextType {\n const ctx = useContext(IAPContext);\n\n if (!ctx) {\n throw new Error('You need wrap your app with withIAPContext HOC');\n }\n\n return ctx;\n}\n\nexport function withIAPContext<T>(Component: React.ComponentType<T>) {\n return function WrapperComponent(props: T) {\n const [connected, setConnected] = useState(false);\n const [products, setProducts] = useState<Product[]>([]);\n\n const [promotedProductsIOS, setPromotedProductsIOS] = useState<Product[]>(\n [],\n );\n const [subscriptions, setSubscriptions] = useState<Subscription[]>([]);\n const [purchaseHistory, setPurchaseHistory] = useState<Purchase[]>([]);\n\n const [availablePurchases, setAvailablePurchases] = useState<Purchase[]>(\n [],\n );\n const [currentPurchase, setCurrentPurchase] = useState<Purchase>();\n\n const [currentPurchaseError, setCurrentPurchaseError] =\n useState<PurchaseError>();\n\n const [initConnectionError, setInitConnectionError] = useState<Error>();\n\n const context = useMemo(\n () => ({\n connected,\n products,\n subscriptions,\n promotedProductsIOS,\n purchaseHistory,\n availablePurchases,\n currentPurchase,\n currentPurchaseError,\n initConnectionError,\n setProducts,\n setSubscriptions,\n setPurchaseHistory,\n setAvailablePurchases,\n setCurrentPurchase,\n setCurrentPurchaseError,\n }),\n [\n connected,\n products,\n subscriptions,\n promotedProductsIOS,\n purchaseHistory,\n availablePurchases,\n currentPurchase,\n currentPurchaseError,\n initConnectionError,\n setProducts,\n setSubscriptions,\n setPurchaseHistory,\n setAvailablePurchases,\n setCurrentPurchase,\n setCurrentPurchaseError,\n ],\n );\n\n useEffect(() => {\n initConnection()\n .then((value) => {\n setInitConnectionError(undefined);\n setConnected(value);\n })\n .catch(setInitConnectionError);\n }, []);\n\n useEffect(() => {\n if (!connected) {\n return;\n }\n\n const purchaseUpdateSubscription = purchaseUpdatedListener(\n async (purchase: ProductPurchase | SubscriptionPurchase) => {\n setCurrentPurchaseError(undefined);\n setCurrentPurchase(purchase);\n },\n );\n\n const purchaseErrorSubscription = purchaseErrorListener(\n (error: PurchaseError) => {\n setCurrentPurchase(undefined);\n setCurrentPurchaseError(error);\n },\n );\n\n const promotedProductSubscription = promotedProductListener(async () => {\n const product = await IapIos.getPromotedProductIOS();\n\n setPromotedProductsIOS((prevProducts) => [\n ...prevProducts,\n ...(product ? [product] : []),\n ]);\n });\n\n return () => {\n purchaseUpdateSubscription.remove();\n purchaseErrorSubscription.remove();\n promotedProductSubscription?.remove();\n };\n }, [connected]);\n\n return (\n <IAPContext.Provider value={context}>\n <Component {...props} />\n </IAPContext.Provider>\n );\n };\n}\n"],"mappings":"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"}