react-native-iap 12.0.0 → 12.0.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 +3 -1
- package/ios/IapTypes.swift +21 -0
- package/ios/RNIapIos.swift +8 -58
- package/ios/RNIapIosSk2.m +4 -0
- package/ios/RNIapIosSk2.swift +33 -0
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/module/types/index.js.map +1 -1
- package/lib/typescript/types/index.d.ts +4 -1
- package/package.json +1 -1
- package/src/types/index.ts +4 -1
package/README.md
CHANGED
|
@@ -28,7 +28,9 @@ Please [fund the project](https://opencollective.com/react-native-iap) if you ar
|
|
|
28
28
|
|
|
29
29
|
## Announcement
|
|
30
30
|
|
|
31
|
-
- Version `
|
|
31
|
+
- Version `12.0.0`: Implements Amazon 3.x SDK including the new DRM verification.
|
|
32
|
+
|
|
33
|
+
- Version `11.0.0`: The module migrates OS sdk to [storekit2](https://developer.apple.com/videos/play/wwdc2021/10114). [andresesfm](https://github.com/andresesfm) is working hard on this.
|
|
32
34
|
|
|
33
35
|
```
|
|
34
36
|
yarn add react-native-iap@next
|
package/ios/IapTypes.swift
CHANGED
|
@@ -33,3 +33,24 @@ enum IapErrors: String, CaseIterable {
|
|
|
33
33
|
return IapErrors.allCases.firstIndex(of: self)!
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
+
|
|
37
|
+
// Based on https://stackoverflow.com/a/40135192/570612
|
|
38
|
+
extension Date {
|
|
39
|
+
var millisecondsSince1970: Int64 {
|
|
40
|
+
return Int64((self.timeIntervalSince1970 * 1000.0).rounded())
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
var millisecondsSince1970String: String {
|
|
44
|
+
return String((self.timeIntervalSince1970 * 1000.0).rounded())
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
init(milliseconds: Int64) {
|
|
48
|
+
self = Date(timeIntervalSince1970: TimeInterval(milliseconds) / 1000)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
extension SKProductsRequest {
|
|
53
|
+
var key: String {
|
|
54
|
+
return String(self.hashValue)
|
|
55
|
+
}
|
|
56
|
+
}
|
package/ios/RNIapIos.swift
CHANGED
|
@@ -1,27 +1,6 @@
|
|
|
1
1
|
import React
|
|
2
2
|
import StoreKit
|
|
3
3
|
|
|
4
|
-
// Based on https://stackoverflow.com/a/40135192/570612
|
|
5
|
-
extension Date {
|
|
6
|
-
var millisecondsSince1970: Int64 {
|
|
7
|
-
return Int64((self.timeIntervalSince1970 * 1000.0).rounded())
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
var millisecondsSince1970String: String {
|
|
11
|
-
return String((self.timeIntervalSince1970 * 1000.0).rounded())
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
init(milliseconds: Int64) {
|
|
15
|
-
self = Date(timeIntervalSince1970: TimeInterval(milliseconds) / 1000)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
extension SKProductsRequest {
|
|
20
|
-
var key: String {
|
|
21
|
-
return String(self.hashValue)
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
4
|
@objc(RNIapIos)
|
|
26
5
|
class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver, SKProductsRequestDelegate {
|
|
27
6
|
private var promisesByKey: [String: [RNIapIosPromise]]
|
|
@@ -29,7 +8,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
29
8
|
private var hasListeners = false
|
|
30
9
|
private var pendingTransactionWithAutoFinish = false
|
|
31
10
|
private var receiptBlock: ((Data?, Error?) -> Void)? // Block to handle request the receipt async from delegate
|
|
32
|
-
private var validProducts: [SKProduct]
|
|
11
|
+
private var validProducts: [String: SKProduct]
|
|
33
12
|
private var promotedPayment: SKPayment?
|
|
34
13
|
private var promotedProduct: SKProduct?
|
|
35
14
|
private var productsRequest: SKProductsRequest?
|
|
@@ -40,7 +19,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
40
19
|
promisesByKey = [String: [RNIapIosPromise]]()
|
|
41
20
|
pendingTransactionWithAutoFinish = false
|
|
42
21
|
myQueue = DispatchQueue(label: "reject")
|
|
43
|
-
validProducts = [SKProduct]()
|
|
22
|
+
validProducts = [String: SKProduct]()
|
|
44
23
|
super.init()
|
|
45
24
|
addTransactionObserver()
|
|
46
25
|
}
|
|
@@ -212,16 +191,8 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
212
191
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
213
192
|
) {
|
|
214
193
|
pendingTransactionWithAutoFinish = andDangerouslyFinishTransactionAutomatically
|
|
215
|
-
var product: SKProduct?
|
|
216
|
-
|
|
217
|
-
lockQueue.sync {
|
|
218
|
-
for p in validProducts {
|
|
219
|
-
if sku == p.productIdentifier {
|
|
220
|
-
product = p
|
|
221
|
-
break
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
194
|
+
var product: SKProduct? = validProducts[sku]
|
|
195
|
+
|
|
225
196
|
if let prod = product {
|
|
226
197
|
addPromise(forKey: prod.productIdentifier, resolve: resolve, reject: reject)
|
|
227
198
|
|
|
@@ -391,12 +362,8 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
391
362
|
}
|
|
392
363
|
|
|
393
364
|
var items: [[String: Any?]] = [[:]]
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
lockQueue.sync {
|
|
397
|
-
for product in validProducts {
|
|
398
|
-
items.append(getProductObject(product))
|
|
399
|
-
}
|
|
365
|
+
for product in validProducts.values {
|
|
366
|
+
items.append(getProductObject(product))
|
|
400
367
|
}
|
|
401
368
|
|
|
402
369
|
resolvePromises(forKey: request.key, value: items)
|
|
@@ -405,25 +372,8 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
405
372
|
// Add to valid products from Apple server response. Allowing getProducts, getSubscriptions call several times.
|
|
406
373
|
// Doesn't allow duplication. Replace new product.
|
|
407
374
|
func add(_ aProd: SKProduct) {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
lockQueue.sync {
|
|
411
|
-
debugMessage("Add new object: \(aProd.productIdentifier)")
|
|
412
|
-
var delTar = -1
|
|
413
|
-
|
|
414
|
-
for k in 0..<validProducts.count {
|
|
415
|
-
let cur = validProducts[k]
|
|
416
|
-
if cur.productIdentifier == aProd.productIdentifier {
|
|
417
|
-
delTar = k
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
if delTar >= 0 {
|
|
422
|
-
validProducts.remove(at: delTar)
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
validProducts.append(aProd)
|
|
426
|
-
}
|
|
375
|
+
debugMessage("Add new object: \(aProd.productIdentifier)")
|
|
376
|
+
validProducts[aProd.productIdentifier] = aProd
|
|
427
377
|
}
|
|
428
378
|
|
|
429
379
|
func request(_ request: SKRequest, didFailWithError error: Error) {
|
package/ios/RNIapIosSk2.m
CHANGED
|
@@ -85,5 +85,9 @@ RCT_EXTERN_METHOD(presentCodeRedemptionSheet:
|
|
|
85
85
|
(RCTPromiseResolveBlock)resolve
|
|
86
86
|
reject:(RCTPromiseRejectBlock)reject)
|
|
87
87
|
|
|
88
|
+
RCT_EXTERN_METHOD(clearTransaction:
|
|
89
|
+
(RCTPromiseResolveBlock)resolve
|
|
90
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
91
|
+
|
|
88
92
|
@end
|
|
89
93
|
#endif
|
package/ios/RNIapIosSk2.swift
CHANGED
|
@@ -85,6 +85,11 @@ protocol Sk2Delegate {
|
|
|
85
85
|
reject: @escaping RCTPromiseRejectBlock
|
|
86
86
|
)
|
|
87
87
|
|
|
88
|
+
func clearTransaction(
|
|
89
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
90
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
91
|
+
)
|
|
92
|
+
|
|
88
93
|
func startObserving()
|
|
89
94
|
func stopObserving()
|
|
90
95
|
}
|
|
@@ -203,6 +208,10 @@ class DummySk2: Sk2Delegate {
|
|
|
203
208
|
reject(errorCode, errorMessage, nil)
|
|
204
209
|
}
|
|
205
210
|
|
|
211
|
+
func clearTransaction(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
212
|
+
reject(errorCode, errorMessage, nil)
|
|
213
|
+
}
|
|
214
|
+
|
|
206
215
|
func startObserving() {
|
|
207
216
|
}
|
|
208
217
|
|
|
@@ -361,6 +370,12 @@ class RNIapIosSk2: RCTEventEmitter, Sk2Delegate {
|
|
|
361
370
|
) {
|
|
362
371
|
delegate.presentCodeRedemptionSheet(resolve, reject: reject)
|
|
363
372
|
}
|
|
373
|
+
|
|
374
|
+
@objc func clearTransaction(
|
|
375
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
376
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }) {
|
|
377
|
+
delegate.clearTransaction(resolve, reject: reject)
|
|
378
|
+
}
|
|
364
379
|
}
|
|
365
380
|
|
|
366
381
|
@available(iOS 15.0, tvOS 15.0, *)
|
|
@@ -810,4 +825,22 @@ class RNIapIosSk2iOS15: Sk2Delegate {
|
|
|
810
825
|
reject(IapErrors.E_USER_CANCELLED.rawValue, "This method is not available on tvOS", nil)
|
|
811
826
|
#endif
|
|
812
827
|
}
|
|
828
|
+
|
|
829
|
+
func clearTransaction(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
830
|
+
Task {
|
|
831
|
+
for await result in Transaction.unfinished {
|
|
832
|
+
do {
|
|
833
|
+
// Check whether the transaction is verified. If it isn’t, catch `failedVerification` error.
|
|
834
|
+
let transaction = try checkVerified(result)
|
|
835
|
+
debugMessage("Finishing transaction")
|
|
836
|
+
await transaction.finish()
|
|
837
|
+
debugMessage("Finished transaction")
|
|
838
|
+
transactions.removeValue(forKey: String(transaction.id))
|
|
839
|
+
} catch {
|
|
840
|
+
debugMessage("Failed to finish transaction")
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
resolve(nil)
|
|
844
|
+
}
|
|
845
|
+
}
|
|
813
846
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ProrationModesAndroid","PurchaseStateAndroid","PROMOTED_PRODUCT","InstallSourceAndroid","ProductType"],"sources":["index.ts"],"sourcesContent":["import type {\n AmazonModuleProps,\n AndroidModuleProps,\n IosModuleProps,\n} from '../modules';\nimport type {IosModulePropsSk2} from '../modules/iosSk2';\n\nimport type * as Apple from './apple';\n\nexport type Sku = string;\n\nexport enum ProrationModesAndroid {\n IMMEDIATE_WITH_TIME_PRORATION = 1,\n IMMEDIATE_AND_CHARGE_PRORATED_PRICE = 2,\n IMMEDIATE_WITHOUT_PRORATION = 3,\n DEFERRED = 4,\n IMMEDIATE_AND_CHARGE_FULL_PRICE = 5,\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY = 0,\n}\n\nexport enum PurchaseStateAndroid {\n UNSPECIFIED_STATE = 0,\n PURCHASED = 1,\n PENDING = 2,\n}\n\nexport const PROMOTED_PRODUCT = 'iap-promoted-product';\n\nexport enum InstallSourceAndroid {\n NOT_SET = 0,\n GOOGLE_PLAY = 1,\n AMAZON = 2,\n}\n\nexport enum ProductType {\n /** Subscription */\n subs = 'subs',\n\n /** Subscription */\n sub = 'sub',\n\n /** Consumable */\n inapp = 'inapp',\n\n /** Consumable */\n iap = 'iap',\n}\n\nexport interface ProductCommon {\n type: 'subs' | 'sub' | 'inapp' | 'iap';\n productId: string; //iOS\n productIds?: string[];\n title: string;\n description: string;\n price: string;\n currency: string;\n localizedPrice
|
|
1
|
+
{"version":3,"names":["ProrationModesAndroid","PurchaseStateAndroid","PROMOTED_PRODUCT","InstallSourceAndroid","ProductType"],"sources":["index.ts"],"sourcesContent":["import type {\n AmazonModuleProps,\n AndroidModuleProps,\n IosModuleProps,\n} from '../modules';\nimport type {IosModulePropsSk2} from '../modules/iosSk2';\n\nimport type * as Apple from './apple';\n\nexport type Sku = string;\n\nexport enum ProrationModesAndroid {\n IMMEDIATE_WITH_TIME_PRORATION = 1,\n IMMEDIATE_AND_CHARGE_PRORATED_PRICE = 2,\n IMMEDIATE_WITHOUT_PRORATION = 3,\n DEFERRED = 4,\n IMMEDIATE_AND_CHARGE_FULL_PRICE = 5,\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY = 0,\n}\n\nexport enum PurchaseStateAndroid {\n UNSPECIFIED_STATE = 0,\n PURCHASED = 1,\n PENDING = 2,\n}\n\nexport const PROMOTED_PRODUCT = 'iap-promoted-product';\n\nexport enum InstallSourceAndroid {\n NOT_SET = 0,\n GOOGLE_PLAY = 1,\n AMAZON = 2,\n}\n\nexport enum ProductType {\n /** Subscription */\n subs = 'subs',\n\n /** Subscription */\n sub = 'sub',\n\n /** Consumable */\n inapp = 'inapp',\n\n /** Consumable */\n iap = 'iap',\n}\n\nexport interface ProductCommon {\n type: 'subs' | 'sub' | 'inapp' | 'iap';\n productId: string; //iOS\n productIds?: string[];\n title: string;\n description: string;\n price: string;\n currency: string;\n /**\n * For Android use subscription.subscriptionOfferDetails[*].pricingPhases.pricingPhaseList[*].formattedPrice\n */\n localizedPrice?: string;\n countryCode?: string;\n}\n\nexport interface ProductPurchase {\n productId: string;\n transactionId?: string;\n transactionDate: number;\n transactionReceipt: string;\n purchaseToken?: string;\n //iOS\n quantityIOS?: number;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n //Android\n productIds?: string[];\n dataAndroid?: string;\n signatureAndroid?: string;\n autoRenewingAndroid?: boolean;\n purchaseStateAndroid?: PurchaseStateAndroid;\n isAcknowledgedAndroid?: boolean;\n packageNameAndroid?: string;\n developerPayloadAndroid?: string;\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n //Amazon\n userIdAmazon?: string;\n userMarketplaceAmazon?: string;\n userJsonAmazon?: string;\n isCanceledAmazon?: boolean;\n}\n\nexport interface PurchaseResult {\n responseCode?: number;\n debugMessage?: string;\n code?: string;\n message?: string;\n purchaseToken?: string;\n}\n\nexport interface SubscriptionPurchase extends ProductPurchase {\n autoRenewingAndroid?: boolean;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n}\n\nexport type Purchase = ProductPurchase | SubscriptionPurchase;\n\nexport interface Discount {\n identifier: string;\n type: string;\n numberOfPeriods: string;\n price: string;\n localizedPrice: string;\n paymentMode: '' | 'FREETRIAL' | 'PAYASYOUGO' | 'PAYUPFRONT';\n subscriptionPeriod: string;\n}\n\nexport interface ProductAndroid extends ProductCommon {\n type: 'inapp' | 'iap';\n oneTimePurchaseOfferDetails?: {\n priceCurrencyCode: string;\n formattedPrice: string;\n priceAmountMicros: string;\n };\n}\nexport interface ProductIOS extends ProductCommon {\n type: 'inapp' | 'iap';\n}\n\nexport type Product = ProductAndroid & ProductIOS;\n\n// Android V5\nexport interface SubscriptionAndroid extends ProductCommon {\n type: 'subs';\n\n productType?: string;\n name?: string;\n subscriptionOfferDetails?: {\n offerToken: string;\n pricingPhases: {\n pricingPhaseList: {\n formattedPrice: string;\n priceCurrencyCode: string;\n /**\n * P1W, P1M, P1Y\n */\n billingPeriod: string;\n billingCycleCount: number;\n priceAmountMicros: string;\n recurrenceMode: number;\n }[];\n };\n offerTags: string[];\n }[];\n}\n\nexport type SubscriptionIosPeriod = 'DAY' | 'WEEK' | 'MONTH' | 'YEAR' | '';\nexport interface SubscriptionIOS extends ProductCommon {\n type: 'subs';\n discounts?: Discount[];\n introductoryPrice?: string;\n introductoryPriceAsAmountIOS?: string;\n introductoryPricePaymentModeIOS?:\n | ''\n | 'FREETRIAL'\n | 'PAYASYOUGO'\n | 'PAYUPFRONT';\n introductoryPriceNumberOfPeriodsIOS?: string;\n introductoryPriceSubscriptionPeriodIOS?: SubscriptionIosPeriod;\n\n subscriptionPeriodNumberIOS?: string;\n subscriptionPeriodUnitIOS?: SubscriptionIosPeriod;\n}\n\nexport type Subscription = SubscriptionAndroid & SubscriptionIOS;\nexport interface RequestPurchaseBaseAndroid {\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n isOfferPersonalized?: boolean; // For AndroidBilling V5 https://developer.android.com/google/play/billing/integrate#personalized-price\n}\n\nexport interface RequestPurchaseAndroid extends RequestPurchaseBaseAndroid {\n skus?: Sku[];\n}\n\nexport interface RequestPurchaseIOS {\n sku?: Sku;\n andDangerouslyFinishTransactionAutomaticallyIOS?: boolean;\n /**\n * UUID representing user account\n */\n appAccountToken?: string;\n quantity?: number;\n withOffer?: Apple.PaymentDiscount;\n}\n\nexport type RequestPurchase = RequestPurchaseAndroid & RequestPurchaseIOS;\n\n/**\n * In order to purchase a new subscription, every sku must have a selected offerToken\n * @see SubscriptionAndroid.subscriptionOfferDetails.offerToken\n */\nexport interface SubscriptionOffer {\n sku: Sku;\n offerToken: string;\n}\n\nexport interface RequestSubscriptionAndroid extends RequestPurchaseBaseAndroid {\n purchaseTokenAndroid?: string;\n prorationModeAndroid?: ProrationModesAndroid;\n subscriptionOffers?: SubscriptionOffer[]; // For AndroidBilling V5\n}\n\nexport type RequestSubscriptionIOS = RequestPurchaseIOS;\n\nexport type RequestSubscription = RequestSubscriptionAndroid &\n RequestSubscriptionIOS;\n\ndeclare module 'react-native' {\n interface NativeModulesStatic {\n RNIapIos: IosModuleProps;\n RNIapIosSk2: IosModulePropsSk2;\n RNIapModule: AndroidModuleProps;\n RNIapAmazonModule: AmazonModuleProps;\n }\n}\n"],"mappings":";;;;;;IAWYA,qB;;;WAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;GAAAA,qB,qCAAAA,qB;;IASAC,oB;;;WAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,oCAAAA,oB;;AAML,MAAMC,gBAAgB,GAAG,sBAAzB;;IAEKC,oB;;;WAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,oCAAAA,oB;;IAMAC,W;;;WAAAA,W;EAAAA,W;EAAAA,W;EAAAA,W;EAAAA,W;GAAAA,W,2BAAAA,W"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ProrationModesAndroid","PurchaseStateAndroid","PROMOTED_PRODUCT","InstallSourceAndroid","ProductType"],"sources":["index.ts"],"sourcesContent":["import type {\n AmazonModuleProps,\n AndroidModuleProps,\n IosModuleProps,\n} from '../modules';\nimport type {IosModulePropsSk2} from '../modules/iosSk2';\n\nimport type * as Apple from './apple';\n\nexport type Sku = string;\n\nexport enum ProrationModesAndroid {\n IMMEDIATE_WITH_TIME_PRORATION = 1,\n IMMEDIATE_AND_CHARGE_PRORATED_PRICE = 2,\n IMMEDIATE_WITHOUT_PRORATION = 3,\n DEFERRED = 4,\n IMMEDIATE_AND_CHARGE_FULL_PRICE = 5,\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY = 0,\n}\n\nexport enum PurchaseStateAndroid {\n UNSPECIFIED_STATE = 0,\n PURCHASED = 1,\n PENDING = 2,\n}\n\nexport const PROMOTED_PRODUCT = 'iap-promoted-product';\n\nexport enum InstallSourceAndroid {\n NOT_SET = 0,\n GOOGLE_PLAY = 1,\n AMAZON = 2,\n}\n\nexport enum ProductType {\n /** Subscription */\n subs = 'subs',\n\n /** Subscription */\n sub = 'sub',\n\n /** Consumable */\n inapp = 'inapp',\n\n /** Consumable */\n iap = 'iap',\n}\n\nexport interface ProductCommon {\n type: 'subs' | 'sub' | 'inapp' | 'iap';\n productId: string; //iOS\n productIds?: string[];\n title: string;\n description: string;\n price: string;\n currency: string;\n localizedPrice
|
|
1
|
+
{"version":3,"names":["ProrationModesAndroid","PurchaseStateAndroid","PROMOTED_PRODUCT","InstallSourceAndroid","ProductType"],"sources":["index.ts"],"sourcesContent":["import type {\n AmazonModuleProps,\n AndroidModuleProps,\n IosModuleProps,\n} from '../modules';\nimport type {IosModulePropsSk2} from '../modules/iosSk2';\n\nimport type * as Apple from './apple';\n\nexport type Sku = string;\n\nexport enum ProrationModesAndroid {\n IMMEDIATE_WITH_TIME_PRORATION = 1,\n IMMEDIATE_AND_CHARGE_PRORATED_PRICE = 2,\n IMMEDIATE_WITHOUT_PRORATION = 3,\n DEFERRED = 4,\n IMMEDIATE_AND_CHARGE_FULL_PRICE = 5,\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY = 0,\n}\n\nexport enum PurchaseStateAndroid {\n UNSPECIFIED_STATE = 0,\n PURCHASED = 1,\n PENDING = 2,\n}\n\nexport const PROMOTED_PRODUCT = 'iap-promoted-product';\n\nexport enum InstallSourceAndroid {\n NOT_SET = 0,\n GOOGLE_PLAY = 1,\n AMAZON = 2,\n}\n\nexport enum ProductType {\n /** Subscription */\n subs = 'subs',\n\n /** Subscription */\n sub = 'sub',\n\n /** Consumable */\n inapp = 'inapp',\n\n /** Consumable */\n iap = 'iap',\n}\n\nexport interface ProductCommon {\n type: 'subs' | 'sub' | 'inapp' | 'iap';\n productId: string; //iOS\n productIds?: string[];\n title: string;\n description: string;\n price: string;\n currency: string;\n /**\n * For Android use subscription.subscriptionOfferDetails[*].pricingPhases.pricingPhaseList[*].formattedPrice\n */\n localizedPrice?: string;\n countryCode?: string;\n}\n\nexport interface ProductPurchase {\n productId: string;\n transactionId?: string;\n transactionDate: number;\n transactionReceipt: string;\n purchaseToken?: string;\n //iOS\n quantityIOS?: number;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n //Android\n productIds?: string[];\n dataAndroid?: string;\n signatureAndroid?: string;\n autoRenewingAndroid?: boolean;\n purchaseStateAndroid?: PurchaseStateAndroid;\n isAcknowledgedAndroid?: boolean;\n packageNameAndroid?: string;\n developerPayloadAndroid?: string;\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n //Amazon\n userIdAmazon?: string;\n userMarketplaceAmazon?: string;\n userJsonAmazon?: string;\n isCanceledAmazon?: boolean;\n}\n\nexport interface PurchaseResult {\n responseCode?: number;\n debugMessage?: string;\n code?: string;\n message?: string;\n purchaseToken?: string;\n}\n\nexport interface SubscriptionPurchase extends ProductPurchase {\n autoRenewingAndroid?: boolean;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n}\n\nexport type Purchase = ProductPurchase | SubscriptionPurchase;\n\nexport interface Discount {\n identifier: string;\n type: string;\n numberOfPeriods: string;\n price: string;\n localizedPrice: string;\n paymentMode: '' | 'FREETRIAL' | 'PAYASYOUGO' | 'PAYUPFRONT';\n subscriptionPeriod: string;\n}\n\nexport interface ProductAndroid extends ProductCommon {\n type: 'inapp' | 'iap';\n oneTimePurchaseOfferDetails?: {\n priceCurrencyCode: string;\n formattedPrice: string;\n priceAmountMicros: string;\n };\n}\nexport interface ProductIOS extends ProductCommon {\n type: 'inapp' | 'iap';\n}\n\nexport type Product = ProductAndroid & ProductIOS;\n\n// Android V5\nexport interface SubscriptionAndroid extends ProductCommon {\n type: 'subs';\n\n productType?: string;\n name?: string;\n subscriptionOfferDetails?: {\n offerToken: string;\n pricingPhases: {\n pricingPhaseList: {\n formattedPrice: string;\n priceCurrencyCode: string;\n /**\n * P1W, P1M, P1Y\n */\n billingPeriod: string;\n billingCycleCount: number;\n priceAmountMicros: string;\n recurrenceMode: number;\n }[];\n };\n offerTags: string[];\n }[];\n}\n\nexport type SubscriptionIosPeriod = 'DAY' | 'WEEK' | 'MONTH' | 'YEAR' | '';\nexport interface SubscriptionIOS extends ProductCommon {\n type: 'subs';\n discounts?: Discount[];\n introductoryPrice?: string;\n introductoryPriceAsAmountIOS?: string;\n introductoryPricePaymentModeIOS?:\n | ''\n | 'FREETRIAL'\n | 'PAYASYOUGO'\n | 'PAYUPFRONT';\n introductoryPriceNumberOfPeriodsIOS?: string;\n introductoryPriceSubscriptionPeriodIOS?: SubscriptionIosPeriod;\n\n subscriptionPeriodNumberIOS?: string;\n subscriptionPeriodUnitIOS?: SubscriptionIosPeriod;\n}\n\nexport type Subscription = SubscriptionAndroid & SubscriptionIOS;\nexport interface RequestPurchaseBaseAndroid {\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n isOfferPersonalized?: boolean; // For AndroidBilling V5 https://developer.android.com/google/play/billing/integrate#personalized-price\n}\n\nexport interface RequestPurchaseAndroid extends RequestPurchaseBaseAndroid {\n skus?: Sku[];\n}\n\nexport interface RequestPurchaseIOS {\n sku?: Sku;\n andDangerouslyFinishTransactionAutomaticallyIOS?: boolean;\n /**\n * UUID representing user account\n */\n appAccountToken?: string;\n quantity?: number;\n withOffer?: Apple.PaymentDiscount;\n}\n\nexport type RequestPurchase = RequestPurchaseAndroid & RequestPurchaseIOS;\n\n/**\n * In order to purchase a new subscription, every sku must have a selected offerToken\n * @see SubscriptionAndroid.subscriptionOfferDetails.offerToken\n */\nexport interface SubscriptionOffer {\n sku: Sku;\n offerToken: string;\n}\n\nexport interface RequestSubscriptionAndroid extends RequestPurchaseBaseAndroid {\n purchaseTokenAndroid?: string;\n prorationModeAndroid?: ProrationModesAndroid;\n subscriptionOffers?: SubscriptionOffer[]; // For AndroidBilling V5\n}\n\nexport type RequestSubscriptionIOS = RequestPurchaseIOS;\n\nexport type RequestSubscription = RequestSubscriptionAndroid &\n RequestSubscriptionIOS;\n\ndeclare module 'react-native' {\n interface NativeModulesStatic {\n RNIapIos: IosModuleProps;\n RNIapIosSk2: IosModulePropsSk2;\n RNIapModule: AndroidModuleProps;\n RNIapAmazonModule: AmazonModuleProps;\n }\n}\n"],"mappings":"AAWA,WAAYA,qBAAZ;;WAAYA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;GAAAA,qB,KAAAA,qB;;AASZ,WAAYC,oBAAZ;;WAAYA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,KAAAA,oB;;AAMZ,OAAO,MAAMC,gBAAgB,GAAG,sBAAzB;AAEP,WAAYC,oBAAZ;;WAAYA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,KAAAA,oB;;AAMZ,WAAYC,WAAZ;;WAAYA,W;EAAAA,W;EAAAA,W;EAAAA,W;EAAAA,W;GAAAA,W,KAAAA,W"}
|
|
@@ -39,7 +39,10 @@ export interface ProductCommon {
|
|
|
39
39
|
description: string;
|
|
40
40
|
price: string;
|
|
41
41
|
currency: string;
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* For Android use subscription.subscriptionOfferDetails[*].pricingPhases.pricingPhaseList[*].formattedPrice
|
|
44
|
+
*/
|
|
45
|
+
localizedPrice?: string;
|
|
43
46
|
countryCode?: string;
|
|
44
47
|
}
|
|
45
48
|
export interface ProductPurchase {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-iap",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.2",
|
|
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/types/index.ts
CHANGED
|
@@ -54,7 +54,10 @@ export interface ProductCommon {
|
|
|
54
54
|
description: string;
|
|
55
55
|
price: string;
|
|
56
56
|
currency: string;
|
|
57
|
-
|
|
57
|
+
/**
|
|
58
|
+
* For Android use subscription.subscriptionOfferDetails[*].pricingPhases.pricingPhaseList[*].formattedPrice
|
|
59
|
+
*/
|
|
60
|
+
localizedPrice?: string;
|
|
58
61
|
countryCode?: string;
|
|
59
62
|
}
|
|
60
63
|
|