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.
- package/README.md +0 -1
- package/ios/IapSerializationUtils.swift +30 -0
- package/ios/RNIapIos.m +1 -10
- package/ios/RNIapIos.swift +18 -84
- package/ios/RNIapIosSk2.m +5 -0
- package/ios/RNIapIosSk2.swift +66 -52
- 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 +398 -335
- package/lib/commonjs/iap.js.map +1 -1
- package/lib/commonjs/index.js +13 -0
- package/lib/commonjs/index.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 +21 -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 +359 -267
- package/lib/module/iap.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.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 +17 -0
- package/lib/module/types/appleSk2.js.map +1 -1
- package/lib/typescript/iap.d.ts +347 -168
- package/lib/typescript/index.d.ts +1 -0
- 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 +57 -5
- package/lib/typescript/modules/iosSk2.d.ts +28 -7
- package/lib/typescript/types/appleSk2.d.ts +31 -0
- package/package.json +5 -2
- package/src/eventEmitter.ts +4 -3
- package/src/hooks/withIAPContext.tsx +2 -2
- package/src/iap.ts +402 -356
- package/src/index.ts +1 -0
- package/src/internal/platform.ts +77 -1
- package/src/modules/amazon.ts +29 -1
- package/src/modules/android.ts +83 -2
- package/src/modules/ios.ts +124 -13
- package/src/modules/iosSk2.ts +46 -15
- 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
|
|
package/ios/RNIapIos.swift
CHANGED
|
@@ -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
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
262
|
-
|
|
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
|
-
|
|
271
|
-
|
|
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
|
package/ios/RNIapIosSk2.swift
CHANGED
|
@@ -51,7 +51,7 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
51
51
|
// await self.updateCustomerProductStatus()
|
|
52
52
|
|
|
53
53
|
if self.hasListeners {
|
|
54
|
-
self.sendEvent(withName: "
|
|
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: "
|
|
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"]
|
|
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(
|
|
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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"}
|