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.
- package/README.md +0 -1
- package/ios/IapSerializationUtils.swift +30 -0
- package/ios/RNIapIosSk2.m +5 -0
- package/ios/RNIapIosSk2.swift +63 -49
- package/lib/commonjs/eventEmitter.js +4 -4
- package/lib/commonjs/eventEmitter.js.map +1 -1
- package/lib/commonjs/hooks/withIAPContext.js +1 -1
- package/lib/commonjs/hooks/withIAPContext.js.map +1 -1
- package/lib/commonjs/iap.js +50 -297
- package/lib/commonjs/iap.js.map +1 -1
- package/lib/commonjs/internal/platform.js +75 -2
- package/lib/commonjs/internal/platform.js.map +1 -1
- package/lib/commonjs/modules/amazon.js +28 -1
- package/lib/commonjs/modules/amazon.js.map +1 -1
- package/lib/commonjs/modules/android.js +73 -1
- package/lib/commonjs/modules/android.js.map +1 -1
- package/lib/commonjs/modules/ios.js +126 -0
- package/lib/commonjs/modules/ios.js.map +1 -1
- package/lib/commonjs/modules/iosSk2.js +47 -0
- package/lib/commonjs/modules/iosSk2.js.map +1 -1
- package/lib/commonjs/types/appleSk2.js.map +1 -1
- package/lib/module/eventEmitter.js +2 -2
- package/lib/module/eventEmitter.js.map +1 -1
- package/lib/module/hooks/withIAPContext.js +2 -2
- package/lib/module/hooks/withIAPContext.js.map +1 -1
- package/lib/module/iap.js +8 -223
- package/lib/module/iap.js.map +1 -1
- package/lib/module/internal/platform.js +48 -1
- package/lib/module/internal/platform.js.map +1 -1
- package/lib/module/modules/amazon.js +23 -0
- package/lib/module/modules/amazon.js.map +1 -1
- package/lib/module/modules/android.js +59 -1
- package/lib/module/modules/android.js.map +1 -1
- package/lib/module/modules/ios.js +102 -1
- package/lib/module/modules/ios.js.map +1 -1
- package/lib/module/modules/iosSk2.js +30 -1
- package/lib/module/modules/iosSk2.js.map +1 -1
- package/lib/module/types/appleSk2.js.map +1 -1
- package/lib/typescript/iap.d.ts +7 -120
- package/lib/typescript/internal/platform.d.ts +9 -0
- package/lib/typescript/modules/amazon.d.ts +17 -0
- package/lib/typescript/modules/android.d.ts +38 -1
- package/lib/typescript/modules/ios.d.ts +56 -0
- package/lib/typescript/modules/iosSk2.d.ts +27 -1
- package/lib/typescript/types/appleSk2.d.ts +4 -0
- package/package.json +1 -1
- package/src/eventEmitter.ts +4 -3
- package/src/hooks/withIAPContext.tsx +2 -2
- package/src/iap.ts +20 -297
- package/src/internal/platform.ts +78 -1
- package/src/modules/amazon.ts +29 -1
- package/src/modules/android.ts +83 -2
- package/src/modules/ios.ts +121 -0
- package/src/modules/iosSk2.ts +45 -1
- 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
|
package/ios/RNIapIosSk2.swift
CHANGED
|
@@ -306,75 +306,87 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
-
@objc public func isEligibleForIntroOffer(
|
|
309
|
+
@objc public func isEligibleForIntroOffer(
|
|
310
310
|
_ groupID: String,
|
|
311
311
|
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
312
312
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
313
|
-
)
|
|
314
|
-
|
|
315
|
-
|
|
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(
|
|
320
|
+
@objc public func subscriptionStatus(
|
|
319
321
|
_ sku: String,
|
|
320
322
|
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
321
323
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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(
|
|
339
|
+
@objc public func currentEntitlement(
|
|
332
340
|
_ sku: String,
|
|
333
341
|
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
334
342
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
335
|
-
)
|
|
336
|
-
|
|
337
|
-
if let
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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
|
|
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(
|
|
366
|
+
@objc public func latestTransaction(
|
|
357
367
|
_ sku: String,
|
|
358
368
|
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
359
369
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
360
|
-
)
|
|
361
|
-
|
|
362
|
-
if let
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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
|
|
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
|
-
)
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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 {
|
|
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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"}
|