react-native-iap 11.0.0-beta.1 → 11.0.0-rc.2

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 (55) hide show
  1. package/README.md +0 -1
  2. package/ios/IapSerializationUtils.swift +30 -0
  3. package/ios/RNIapIosSk2.m +5 -0
  4. package/ios/RNIapIosSk2.swift +63 -49
  5. package/lib/commonjs/eventEmitter.js +4 -4
  6. package/lib/commonjs/eventEmitter.js.map +1 -1
  7. package/lib/commonjs/hooks/withIAPContext.js +1 -1
  8. package/lib/commonjs/hooks/withIAPContext.js.map +1 -1
  9. package/lib/commonjs/iap.js +50 -297
  10. package/lib/commonjs/iap.js.map +1 -1
  11. package/lib/commonjs/internal/platform.js +75 -2
  12. package/lib/commonjs/internal/platform.js.map +1 -1
  13. package/lib/commonjs/modules/amazon.js +28 -1
  14. package/lib/commonjs/modules/amazon.js.map +1 -1
  15. package/lib/commonjs/modules/android.js +73 -1
  16. package/lib/commonjs/modules/android.js.map +1 -1
  17. package/lib/commonjs/modules/ios.js +126 -0
  18. package/lib/commonjs/modules/ios.js.map +1 -1
  19. package/lib/commonjs/modules/iosSk2.js +47 -0
  20. package/lib/commonjs/modules/iosSk2.js.map +1 -1
  21. package/lib/commonjs/types/appleSk2.js.map +1 -1
  22. package/lib/module/eventEmitter.js +2 -2
  23. package/lib/module/eventEmitter.js.map +1 -1
  24. package/lib/module/hooks/withIAPContext.js +2 -2
  25. package/lib/module/hooks/withIAPContext.js.map +1 -1
  26. package/lib/module/iap.js +8 -223
  27. package/lib/module/iap.js.map +1 -1
  28. package/lib/module/internal/platform.js +48 -1
  29. package/lib/module/internal/platform.js.map +1 -1
  30. package/lib/module/modules/amazon.js +23 -0
  31. package/lib/module/modules/amazon.js.map +1 -1
  32. package/lib/module/modules/android.js +59 -1
  33. package/lib/module/modules/android.js.map +1 -1
  34. package/lib/module/modules/ios.js +102 -1
  35. package/lib/module/modules/ios.js.map +1 -1
  36. package/lib/module/modules/iosSk2.js +30 -1
  37. package/lib/module/modules/iosSk2.js.map +1 -1
  38. package/lib/module/types/appleSk2.js.map +1 -1
  39. package/lib/typescript/iap.d.ts +7 -120
  40. package/lib/typescript/internal/platform.d.ts +9 -0
  41. package/lib/typescript/modules/amazon.d.ts +17 -0
  42. package/lib/typescript/modules/android.d.ts +38 -1
  43. package/lib/typescript/modules/ios.d.ts +56 -0
  44. package/lib/typescript/modules/iosSk2.d.ts +27 -1
  45. package/lib/typescript/types/appleSk2.d.ts +4 -0
  46. package/package.json +1 -1
  47. package/src/eventEmitter.ts +4 -3
  48. package/src/hooks/withIAPContext.tsx +2 -2
  49. package/src/iap.ts +20 -297
  50. package/src/internal/platform.ts +78 -1
  51. package/src/modules/amazon.ts +29 -1
  52. package/src/modules/android.ts +83 -2
  53. package/src/modules/ios.ts +121 -0
  54. package/src/modules/iosSk2.ts +45 -1
  55. package/src/types/appleSk2.ts +12 -0
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/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
@@ -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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"}