react-native-iap 11.0.0-rc.4 → 11.0.0-rc.6
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/ios/RNIapIos.swift +0 -1
- package/ios/RNIapIosSk2.m +1 -1
- package/ios/RNIapIosSk2.swift +379 -34
- package/lib/commonjs/iap.js +10 -2
- package/lib/commonjs/iap.js.map +1 -1
- package/lib/commonjs/modules/iosSk2.js.map +1 -1
- package/lib/module/iap.js +11 -3
- package/lib/module/iap.js.map +1 -1
- package/lib/module/modules/iosSk2.js.map +1 -1
- package/lib/typescript/modules/iosSk2.d.ts +1 -1
- package/package.json +1 -1
- package/src/iap.ts +19 -2
- package/src/modules/iosSk2.ts +1 -1
package/ios/RNIapIos.swift
CHANGED
|
@@ -193,7 +193,6 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
@objc public func getAvailableItems(
|
|
196
|
-
alsoPublishToEventListener: Bool,
|
|
197
196
|
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
198
197
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
199
198
|
) {
|
package/ios/RNIapIosSk2.m
CHANGED
|
@@ -22,7 +22,7 @@ RCT_EXTERN_METHOD(getItems:
|
|
|
22
22
|
reject:(RCTPromiseRejectBlock)reject)
|
|
23
23
|
|
|
24
24
|
RCT_EXTERN_METHOD(getAvailableItems:
|
|
25
|
-
|
|
25
|
+
(BOOL)alsoPublishToEventListener
|
|
26
26
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
27
27
|
reject:(RCTPromiseRejectBlock)reject)
|
|
28
28
|
|
package/ios/RNIapIosSk2.swift
CHANGED
|
@@ -2,18 +2,378 @@ import Foundation
|
|
|
2
2
|
import React
|
|
3
3
|
import StoreKit
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
protocol Sk2Delegate {
|
|
6
|
+
func disable(
|
|
7
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
8
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
func initConnection(
|
|
12
|
+
_ resolve: @escaping RCTPromiseResolveBlock ,
|
|
13
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
func endConnection(
|
|
17
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
18
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
func getItems(
|
|
22
|
+
_ skus: [String],
|
|
23
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
24
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
func getAvailableItems(
|
|
28
|
+
_ alsoPublishToEventListener: Bool,
|
|
29
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
30
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
func buyProduct(
|
|
34
|
+
_ sku: String,
|
|
35
|
+
andDangerouslyFinishTransactionAutomatically: Bool,
|
|
36
|
+
appAccountToken: String?,
|
|
37
|
+
quantity: Int,
|
|
38
|
+
withOffer: [String: String],
|
|
39
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
40
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
func isEligibleForIntroOffer(
|
|
44
|
+
_ groupID: String,
|
|
45
|
+
resolve: @escaping RCTPromiseResolveBlock ,
|
|
46
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
func subscriptionStatus(
|
|
50
|
+
_ sku: String,
|
|
51
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
52
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
func currentEntitlement(
|
|
56
|
+
_ sku: String,
|
|
57
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
58
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
func latestTransaction(
|
|
62
|
+
_ sku: String,
|
|
63
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
64
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
func finishTransaction(
|
|
68
|
+
_ transactionIdentifier: String,
|
|
69
|
+
resolve: @escaping RCTPromiseResolveBlock ,
|
|
70
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
func pendingTransactions (
|
|
74
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
75
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
func sync(
|
|
79
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
80
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
func presentCodeRedemptionSheet(
|
|
84
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
85
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
func startObserving()
|
|
89
|
+
func stopObserving()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
class DummySk2: Sk2Delegate {
|
|
93
|
+
let errorCode = IapErrors.E_DEVELOPER_ERROR.rawValue
|
|
94
|
+
let errorMessage = "Method only available on iOS 15 and up"
|
|
95
|
+
|
|
96
|
+
func disable(
|
|
97
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
98
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
99
|
+
) {
|
|
100
|
+
reject(errorCode, errorMessage, nil)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
func initConnection(
|
|
104
|
+
_ resolve: @escaping RCTPromiseResolveBlock ,
|
|
105
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
106
|
+
) {
|
|
107
|
+
reject(errorCode, errorMessage, nil)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
func endConnection(
|
|
111
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
112
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
113
|
+
) {
|
|
114
|
+
reject(errorCode, errorMessage, nil)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
func getItems(
|
|
118
|
+
_ skus: [String],
|
|
119
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
120
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
121
|
+
) {
|
|
122
|
+
reject(errorCode, errorMessage, nil)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
func getAvailableItems(
|
|
126
|
+
_ alsoPublishToEventListener: Bool,
|
|
127
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
128
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
129
|
+
) {
|
|
130
|
+
reject(errorCode, errorMessage, nil)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
func buyProduct(
|
|
134
|
+
_ sku: String,
|
|
135
|
+
andDangerouslyFinishTransactionAutomatically: Bool,
|
|
136
|
+
appAccountToken: String?,
|
|
137
|
+
quantity: Int,
|
|
138
|
+
withOffer: [String: String],
|
|
139
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
140
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
141
|
+
) {
|
|
142
|
+
reject(errorCode, errorMessage, nil)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
func isEligibleForIntroOffer(
|
|
146
|
+
_ groupID: String,
|
|
147
|
+
resolve: @escaping RCTPromiseResolveBlock ,
|
|
148
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
149
|
+
) {
|
|
150
|
+
reject(errorCode, errorMessage, nil)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
func subscriptionStatus(
|
|
154
|
+
_ sku: String,
|
|
155
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
156
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
157
|
+
) {
|
|
158
|
+
reject(errorCode, errorMessage, nil)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
func currentEntitlement(
|
|
162
|
+
_ sku: String,
|
|
163
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
164
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
165
|
+
) {
|
|
166
|
+
reject(errorCode, errorMessage, nil)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
func latestTransaction(
|
|
170
|
+
_ sku: String,
|
|
171
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
172
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
173
|
+
) {
|
|
174
|
+
reject(errorCode, errorMessage, nil)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
func finishTransaction(
|
|
178
|
+
_ transactionIdentifier: String,
|
|
179
|
+
resolve: @escaping RCTPromiseResolveBlock ,
|
|
180
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
181
|
+
) {
|
|
182
|
+
reject(errorCode, errorMessage, nil)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
func pendingTransactions (
|
|
186
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
187
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
188
|
+
) {
|
|
189
|
+
reject(errorCode, errorMessage, nil)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
func sync(
|
|
193
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
194
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
195
|
+
) {
|
|
196
|
+
reject(errorCode, errorMessage, nil)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
func presentCodeRedemptionSheet(
|
|
200
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
201
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
202
|
+
) {
|
|
203
|
+
reject(errorCode, errorMessage, nil)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
func startObserving() {
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
func stopObserving() {
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
6
213
|
@objc(RNIapIosSk2)
|
|
7
|
-
class RNIapIosSk2: RCTEventEmitter {
|
|
214
|
+
class RNIapIosSk2: RCTEventEmitter, Sk2Delegate {
|
|
215
|
+
private var delegate: Sk2Delegate = DummySk2()
|
|
216
|
+
|
|
217
|
+
override init() {
|
|
218
|
+
super.init()
|
|
219
|
+
if #available(iOS 15.0, *) {
|
|
220
|
+
delegate = RNIapIosSk2iOS15(sendEvent: self.sendEvent)
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@objc public func disable(
|
|
225
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
226
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
227
|
+
) {
|
|
228
|
+
delegate.disable(resolve, reject: reject)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
override class func requiresMainQueueSetup() -> Bool {
|
|
232
|
+
return true
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
override func startObserving() {
|
|
236
|
+
delegate.startObserving()
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
override func stopObserving() {
|
|
240
|
+
delegate.stopObserving()
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
override func addListener(_ eventName: String?) {
|
|
244
|
+
super.addListener(eventName)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
"iap-transaction-updated" is unique to Sk2.
|
|
249
|
+
"iap-promoted-product" is only avaiable on Sk1
|
|
250
|
+
"purchase-updated", "purchase-error" are for backward compatibility
|
|
251
|
+
*/
|
|
252
|
+
override func supportedEvents() -> [String]? {
|
|
253
|
+
return [ "purchase-updated", "purchase-error", "iap-transaction-updated"]
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
@objc public func initConnection(
|
|
257
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
258
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
259
|
+
) {
|
|
260
|
+
delegate.initConnection(resolve, reject: reject)
|
|
261
|
+
}
|
|
262
|
+
@objc public func endConnection(
|
|
263
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
264
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
265
|
+
) {
|
|
266
|
+
delegate.endConnection(resolve, reject: reject)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
@objc public func getItems(
|
|
270
|
+
_ skus: [String],
|
|
271
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
272
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
273
|
+
) {
|
|
274
|
+
delegate.getItems(skus, resolve: resolve, reject: reject)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@objc public func getAvailableItems(
|
|
278
|
+
_ alsoPublishToEventListener: Bool,
|
|
279
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
280
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
281
|
+
) {
|
|
282
|
+
delegate.getAvailableItems(alsoPublishToEventListener, resolve: resolve, reject: reject)
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
@objc public func buyProduct(
|
|
286
|
+
_ sku: String,
|
|
287
|
+
andDangerouslyFinishTransactionAutomatically: Bool,
|
|
288
|
+
appAccountToken: String?,
|
|
289
|
+
quantity: Int,
|
|
290
|
+
withOffer: [String: String],
|
|
291
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
292
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
293
|
+
) {
|
|
294
|
+
delegate.buyProduct(
|
|
295
|
+
sku,
|
|
296
|
+
andDangerouslyFinishTransactionAutomatically: andDangerouslyFinishTransactionAutomatically,
|
|
297
|
+
appAccountToken: appAccountToken,
|
|
298
|
+
quantity: quantity,
|
|
299
|
+
withOffer: withOffer,
|
|
300
|
+
resolve: resolve,
|
|
301
|
+
reject: reject)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@objc public func isEligibleForIntroOffer(
|
|
305
|
+
_ groupID: String,
|
|
306
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
307
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
308
|
+
) {
|
|
309
|
+
delegate.isEligibleForIntroOffer(groupID, resolve: resolve, reject: reject)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
@objc public func subscriptionStatus(
|
|
313
|
+
_ sku: String,
|
|
314
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
315
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
316
|
+
) {
|
|
317
|
+
delegate.subscriptionStatus(sku, resolve: resolve, reject: reject)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
@objc public func currentEntitlement(
|
|
321
|
+
_ sku: String,
|
|
322
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
323
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
324
|
+
) {
|
|
325
|
+
delegate.currentEntitlement(sku, resolve: resolve, reject: reject)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
@objc public func latestTransaction(
|
|
329
|
+
_ sku: String,
|
|
330
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
331
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
332
|
+
) {
|
|
333
|
+
delegate.latestTransaction(sku, resolve: resolve, reject: reject)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
@objc public func finishTransaction(
|
|
337
|
+
_ transactionIdentifier: String,
|
|
338
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
339
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
340
|
+
) {
|
|
341
|
+
delegate.finishTransaction(transactionIdentifier, resolve: resolve, reject: reject)
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
@objc public func pendingTransactions (
|
|
345
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
346
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
347
|
+
) {
|
|
348
|
+
delegate.pendingTransactions(resolve, reject: reject)
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
@objc public func sync(
|
|
352
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in},
|
|
353
|
+
reject: @escaping RCTPromiseRejectBlock = {_, _, _ in}
|
|
354
|
+
) {
|
|
355
|
+
delegate.sync(resolve, reject: reject)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
@objc public func presentCodeRedemptionSheet(
|
|
359
|
+
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
360
|
+
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
361
|
+
) {
|
|
362
|
+
delegate.presentCodeRedemptionSheet(resolve, reject: reject)
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
@available(iOS 15.0, *)
|
|
367
|
+
class RNIapIosSk2iOS15: Sk2Delegate {
|
|
8
368
|
private var hasListeners = false
|
|
9
369
|
private var products: [String: Product]
|
|
10
370
|
private var transactions: [String: Transaction]
|
|
11
371
|
private var updateListenerTask: Task<Void, Error>?
|
|
12
|
-
|
|
13
|
-
|
|
372
|
+
fileprivate var sendEvent: ((String?, Any?) -> Void)?
|
|
373
|
+
init(sendEvent: ((String?, Any?) -> Void)? ) {
|
|
374
|
+
self.sendEvent = sendEvent
|
|
14
375
|
products = [String: Product]()
|
|
15
376
|
transactions = [String: Transaction]()
|
|
16
|
-
super.init()
|
|
17
377
|
addTransactionObserver()
|
|
18
378
|
}
|
|
19
379
|
|
|
@@ -29,9 +389,6 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
29
389
|
resolve(nil)
|
|
30
390
|
}
|
|
31
391
|
|
|
32
|
-
override class func requiresMainQueueSetup() -> Bool {
|
|
33
|
-
return true
|
|
34
|
-
}
|
|
35
392
|
func addTransactionObserver() {
|
|
36
393
|
if updateListenerTask == nil {
|
|
37
394
|
updateListenerTask = listenForTransactions()
|
|
@@ -59,8 +416,8 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
59
416
|
// await self.updateCustomerProductStatus()
|
|
60
417
|
|
|
61
418
|
if self.hasListeners {
|
|
62
|
-
self.sendEvent(
|
|
63
|
-
self.sendEvent(
|
|
419
|
+
self.sendEvent?("purchase-updated", serialize(transaction))
|
|
420
|
+
self.sendEvent?("iap-transaction-updated", ["transaction": serialize(transaction)])
|
|
64
421
|
}
|
|
65
422
|
// Always finish a transaction.
|
|
66
423
|
// await transaction.finish()
|
|
@@ -77,33 +434,21 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
77
434
|
"message": error.localizedDescription
|
|
78
435
|
]
|
|
79
436
|
|
|
80
|
-
self.sendEvent(
|
|
81
|
-
self.sendEvent(
|
|
437
|
+
self.sendEvent?("purchase-error", err)
|
|
438
|
+
self.sendEvent?("iap-transaction-updated", ["error": err])
|
|
82
439
|
}
|
|
83
440
|
}
|
|
84
441
|
}
|
|
85
442
|
}
|
|
86
443
|
}
|
|
87
444
|
|
|
88
|
-
|
|
445
|
+
func startObserving() {
|
|
89
446
|
hasListeners = true
|
|
90
447
|
}
|
|
91
448
|
|
|
92
|
-
|
|
449
|
+
func stopObserving() {
|
|
93
450
|
hasListeners = false
|
|
94
451
|
}
|
|
95
|
-
override func addListener(_ eventName: String?) {
|
|
96
|
-
super.addListener(eventName)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
"iap-transaction-updated" is unique to Sk2.
|
|
101
|
-
"iap-promoted-product" is only avaiable on Sk1
|
|
102
|
-
"purchase-updated", "purchase-error" are for backward compatibility
|
|
103
|
-
*/
|
|
104
|
-
override func supportedEvents() -> [String]? {
|
|
105
|
-
return [ "purchase-updated", "purchase-error", "iap-transaction-updated"]
|
|
106
|
-
}
|
|
107
452
|
|
|
108
453
|
@objc public func initConnection(
|
|
109
454
|
_ resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
@@ -131,9 +476,9 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
131
476
|
Task {
|
|
132
477
|
do {
|
|
133
478
|
let products = try await Product.products(for: skus)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
479
|
+
products.forEach({(prod) in
|
|
480
|
+
self.products[prod.id] = prod
|
|
481
|
+
})
|
|
137
482
|
resolve(products.map({ (prod: Product) -> [String: Any?]? in
|
|
138
483
|
return serialize(prod)
|
|
139
484
|
}).compactMap({$0}))
|
|
@@ -144,8 +489,8 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
144
489
|
}
|
|
145
490
|
|
|
146
491
|
@objc public func getAvailableItems(
|
|
147
|
-
alsoPublishToEventListener: Bool,
|
|
148
|
-
|
|
492
|
+
_ alsoPublishToEventListener: Bool,
|
|
493
|
+
resolve: @escaping RCTPromiseResolveBlock = { _ in },
|
|
149
494
|
reject: @escaping RCTPromiseRejectBlock = { _, _, _ in }
|
|
150
495
|
) {
|
|
151
496
|
Task {
|
|
@@ -154,12 +499,12 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
154
499
|
func addPurchase(transaction: Transaction, product: Product) {
|
|
155
500
|
purchasedItems.append( transaction)
|
|
156
501
|
if alsoPublishToEventListener {
|
|
157
|
-
sendEvent(
|
|
502
|
+
self.sendEvent?("purchase-update", serialize(transaction))
|
|
158
503
|
}
|
|
159
504
|
}
|
|
160
505
|
func addError( error: Error, errorDict: [String: String]) {
|
|
161
506
|
if alsoPublishToEventListener {
|
|
162
|
-
sendEvent(
|
|
507
|
+
self.sendEvent?("purchase-error", errorDict)
|
|
163
508
|
}
|
|
164
509
|
}
|
|
165
510
|
// Iterate through all of the user's purchased products.
|
|
@@ -277,7 +622,7 @@ class RNIapIosSk2: RCTEventEmitter {
|
|
|
277
622
|
resolve(nil)
|
|
278
623
|
} else {
|
|
279
624
|
self.addTransaction(transaction)
|
|
280
|
-
sendEvent(
|
|
625
|
+
self.sendEvent?("purchase-updated", serialize(transaction))
|
|
281
626
|
resolve(serialize(transaction))
|
|
282
627
|
}
|
|
283
628
|
return
|
package/lib/commonjs/iap.js
CHANGED
|
@@ -291,7 +291,11 @@ const getPurchaseHistory = function () {
|
|
|
291
291
|
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
292
292
|
return (_reactNative.Platform.select({
|
|
293
293
|
ios: async () => {
|
|
294
|
-
|
|
294
|
+
if ((0, _internal.isIosStorekit2)()) {
|
|
295
|
+
return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(_appleSk.transactionSk2Map));
|
|
296
|
+
} else {
|
|
297
|
+
return RNIapIos.getAvailableItems();
|
|
298
|
+
}
|
|
295
299
|
},
|
|
296
300
|
android: async () => {
|
|
297
301
|
if (RNIapAmazonModule) {
|
|
@@ -394,7 +398,11 @@ const getAvailablePurchases = function () {
|
|
|
394
398
|
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
395
399
|
return (_reactNative.Platform.select({
|
|
396
400
|
ios: async () => {
|
|
397
|
-
|
|
401
|
+
if ((0, _internal.isIosStorekit2)()) {
|
|
402
|
+
return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(_appleSk.transactionSk2Map));
|
|
403
|
+
} else {
|
|
404
|
+
return RNIapIos.getAvailableItems();
|
|
405
|
+
}
|
|
398
406
|
},
|
|
399
407
|
android: async () => {
|
|
400
408
|
if (RNIapAmazonModule) {
|
package/lib/commonjs/iap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","NativeModules","ANDROID_ITEM_TYPE_SUBSCRIPTION","ProductType","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","storekit1Mode","storekit2Mode","storekitHybridMode","initConnection","getNativeModule","endConnection","flushFailedPurchasesCachedAsPendingAndroid","getAndroidModule","flushFailedPurchasesCachedAsPending","getProducts","skus","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","Promise","reject","Error","getSubscriptions","subscriptionSk2Map","subscriptions","getPurchaseHistory","alsoPublishToEventListener","getIosModule","getAvailableItems","getPurchaseHistoryByType","concat","resolve","getAvailablePurchases","getAvailableItemsByType","requestPurchase","sku","andDangerouslyFinishTransactionAutomaticallyIOS","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","appAccountToken","isOfferPersonalized","undefined","quantity","withOffer","console","warn","offer","offerSk2Map","buyProduct","offerToRecord","isAmazon","buyItemByType","length","requestSubscription","purchaseTokenAndroid","prorationModeAndroid","subscriptionOffers","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PurchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionPurchase,\n} from './types';\nimport {PurchaseStateAndroid} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async () => {\n let items: Subscription[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Subscription[];\n }\n\n return items.filter(\n (item: Subscription) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n },\n android: async () => {\n const subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as Subscription[];\n\n return fillProductsWithAdditionalData(subscriptions);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n}: {\n alsoPublishToEventListener?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems(alsoPublishToEventListener);\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n * \n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n}: {alsoPublishToEventListener?: boolean} = {}): Promise<\n (ProductPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems(alsoPublishToEventListener);\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID \n sku,\n\n \n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n \n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n appAccountToken,\n skus, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n quantity,\n withOffer,\n}: RequestPurchase): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(new Error('sku is required for iOS purchase'));\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!sku?.length && !sku) {\n return Promise.reject(\n new Error('skus is required for Android purchase'),\n );\n }\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus?.length ? skus : [sku],\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID \n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android). \n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED \n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers = undefined, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n appAccountToken,\n quantity,\n withOffer,\n}: RequestSubscription): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for iOS subscription'),\n );\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!subscriptionOffers?.length) {\n return Promise.reject(\n 'subscriptionOffers are required for Google Play Subscriptions',\n );\n }\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n * \n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n``` \n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;AAMA;;AAWA;;;;;;AAcA,MAAM;EAACA,QAAD;EAAWC,WAAX;EAAwBC,WAAxB;EAAqCC;AAArC,IAA0DC,0BAAhE;AACA,MAAMC,8BAA8B,GAAGC,kBAAA,CAAYC,IAAnD;AACA,MAAMC,qBAAqB,GAAGF,kBAAA,CAAYG,KAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMO,MAAMC,KAAK,GAAG,YAIV;EAAA,IAJW;IACpBC,YAAY,GAAG;EADK,CAIX,uEAAP,EAAO;;EACT,QAAQA,YAAR;IACE,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,sBAAL;MACE,IAAAC,4BAAA;MACA;;IACF;MACE;EAXJ;AAaD,CAlBM;AAoBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,cAAc,GAAG,MAC5B,IAAAC,yBAAA,IAAkBD,cAAlB,EADK;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAME,aAAa,GAAG,MAC3B,IAAAD,yBAAA,IAAkBC,aAAlB,EADK;AAGP;AACA;AACA;AACA;;;;;AACO,MAAMC,0CAA0C,GACrD,MACE,IAAAC,0BAAA,IAAmBC,mCAAnB,EAFG;AAIP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,WAAW,GAAG;EAAA,IAAC;IAC1BC;EAD0B,CAAD;EAAA,OAKzB,CAC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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,qBAAqB,GAAG;EAAA,IAAC;IACpCN,0BAA0B,GAAG;EADO,CAAD,uEAEO,EAFP;EAAA,OAKnC,CACExB,qBAAA,CAASC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,OAAO,IAAAuB,sBAAA,IAAeC,iBAAf,CAAiCF,0BAAjC,CAAP;IACD,CAHa;IAIdX,OAAO,EAAE,YAAY;MACnB,IAAIjC,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAAC8C,iBAAlB,EAAb;MACD;;MAED,MAAMZ,QAAQ,GAAG,MAAMnC,WAAW,CAACoD,uBAAZ,CACrB9C,qBADqB,CAAvB;MAIA,MAAMqC,aAAa,GAAG,MAAM3C,WAAW,CAACoD,uBAAZ,CAC1BjD,8BAD0B,CAA5B;MAIA,OAAOgC,QAAQ,CAACc,MAAT,CAAgBN,aAAhB,CAAP;IACD;EAlBa,CAAhB,MAmBO,MAAML,OAAO,CAACY,OAAR,CAAgB,EAAhB,CAnBb,CADF,GALmC;AAAA,CAA9B;AA4BP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AAEO,MAAMG,eAAe,GAAG;EAAA,IAAC;IAC9BC,GAD8B;IAE9BC,+CAA+C,GAAG,KAFpB;IAG9BC,0BAH8B;IAI9BC,0BAJ8B;IAK9BC,eAL8B;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"}
|
|
1
|
+
{"version":3,"names":["RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","NativeModules","ANDROID_ITEM_TYPE_SUBSCRIPTION","ProductType","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","storekit1Mode","storekit2Mode","storekitHybridMode","initConnection","getNativeModule","endConnection","flushFailedPurchasesCachedAsPendingAndroid","getAndroidModule","flushFailedPurchasesCachedAsPending","getProducts","skus","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","Promise","reject","Error","getSubscriptions","subscriptionSk2Map","subscriptions","getPurchaseHistory","alsoPublishToEventListener","resolve","getAvailableItems","transactionSk2Map","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","sku","andDangerouslyFinishTransactionAutomaticallyIOS","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","appAccountToken","isOfferPersonalized","undefined","quantity","withOffer","console","warn","offer","offerSk2Map","buyProduct","offerToRecord","isAmazon","buyItemByType","length","requestSubscription","purchaseTokenAndroid","prorationModeAndroid","subscriptionOffers","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","getIosModule","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PurchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionPurchase,\n} from './types';\nimport {PurchaseStateAndroid} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async () => {\n let items: Subscription[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Subscription[];\n }\n\n return items.filter(\n (item: Subscription) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n },\n android: async () => {\n const subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as Subscription[];\n\n return fillProductsWithAdditionalData(subscriptions);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n}: {\n alsoPublishToEventListener?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems();\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n * \n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n}: {alsoPublishToEventListener?: boolean} = {}): Promise<\n (ProductPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems();\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID \n sku,\n\n \n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n \n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n appAccountToken,\n skus, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n quantity,\n withOffer,\n}: RequestPurchase): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(new Error('sku is required for iOS purchase'));\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!sku?.length && !sku) {\n return Promise.reject(\n new Error('skus is required for Android purchase'),\n );\n }\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus?.length ? skus : [sku],\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID \n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android). \n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED \n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers = undefined, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n appAccountToken,\n quantity,\n withOffer,\n}: RequestSubscription): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for iOS subscription'),\n );\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!subscriptionOffers?.length) {\n return Promise.reject(\n 'subscriptionOffers are required for Google Play Subscriptions',\n );\n }\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n * \n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n``` \n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;AAOA;;AAWA;;;;;;AAcA,MAAM;EAACA,QAAD;EAAWC,WAAX;EAAwBC,WAAxB;EAAqCC;AAArC,IAA0DC,0BAAhE;AACA,MAAMC,8BAA8B,GAAGC,kBAAA,CAAYC,IAAnD;AACA,MAAMC,qBAAqB,GAAGF,kBAAA,CAAYG,KAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMO,MAAMC,KAAK,GAAG,YAIV;EAAA,IAJW;IACpBC,YAAY,GAAG;EADK,CAIX,uEAAP,EAAO;;EACT,QAAQA,YAAR;IACE,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,gBAAL;MACE,IAAAC,uBAAA;MACA;;IACF,KAAK,sBAAL;MACE,IAAAC,4BAAA;MACA;;IACF;MACE;EAXJ;AAaD,CAlBM;AAoBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,cAAc,GAAG,MAC5B,IAAAC,yBAAA,IAAkBD,cAAlB,EADK;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAME,aAAa,GAAG,MAC3B,IAAAD,yBAAA,IAAkBC,aAAlB,EADK;AAGP;AACA;AACA;AACA;;;;;AACO,MAAMC,0CAA0C,GACrD,MACE,IAAAC,0BAAA,IAAmBC,mCAAnB,EAFG;AAIP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMC,WAAW,GAAG;EAAA,IAAC;IAC1BC;EAD0B,CAAD;EAAA,OAKzB,CAC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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMK,qBAAqB,GAAG;EAAA,IAAC;IACpCN,0BAA0B,GAAG;EADO,CAAD,uEAEO,EAFP;EAAA,OAKnC,CACExB,qBAAA,CAASC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAI,IAAAE,wBAAA,GAAJ,EAAsB;QACpB,OAAOa,OAAO,CAACQ,OAAR,CACL,CACE,MAAM/C,WAAW,CAACgD,iBAAZ,CAA8BF,0BAA9B,CADR,EAEElB,GAFF,CAEMqB,0BAFN,CADK,CAAP;MAKD,CAND,MAMO;QACL,OAAOlD,QAAQ,CAACiD,iBAAT,EAAP;MACD;IACF,CAXa;IAYdb,OAAO,EAAE,YAAY;MACnB,IAAIjC,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAAC8C,iBAAlB,EAAb;MACD;;MAED,MAAMZ,QAAQ,GAAG,MAAMnC,WAAW,CAACoD,uBAAZ,CACrB9C,qBADqB,CAAvB;MAIA,MAAMqC,aAAa,GAAG,MAAM3C,WAAW,CAACoD,uBAAZ,CAC1BjD,8BAD0B,CAA5B;MAIA,OAAOgC,QAAQ,CAACe,MAAT,CAAgBP,aAAhB,CAAP;IACD;EA1Ba,CAAhB,MA2BO,MAAML,OAAO,CAACQ,OAAR,CAAgB,EAAhB,CA3Bb,CADF,GALmC;AAAA,CAA9B;AAoCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RNIapIosSk2","NativeModules","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n) => Promise<
|
|
1
|
+
{"version":3,"names":["RNIapIosSk2","NativeModules","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\ntype requestReceipt = (refresh: boolean) => Promise<string>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n requestReceipt: requestReceipt;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n disable: () => Promise<null>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n"],"mappings":";;;;;;;AAAA;;AAWA,MAAM;EAACA;AAAD,IAAgBC,0BAAtB;;AA+CA;AACA;AACA;AACA;AACO,MAAMC,IAAI,GAAG,MAAqBF,WAAW,CAACE,IAAZ,EAAlC;AAEP;AACA;AACA;;;;;AACO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCJ,WAAW,CAACG,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;;;;AAEO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCN,WAAW,CAACK,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMC,kBAAkB,GAAID,GAAD,IAChCN,WAAW,CAACO,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BN,WAAW,CAACQ,iBAAZ,CAA8BF,GAA9B,CADK"}
|
package/lib/module/iap.js
CHANGED
|
@@ -4,7 +4,7 @@ import * as IapAndroid from './modules/android';
|
|
|
4
4
|
import * as IapIos from './modules/ios';
|
|
5
5
|
import * as IapIosSk2 from './modules/iosSk2';
|
|
6
6
|
import { offerToRecord } from './types/apple';
|
|
7
|
-
import { offerSk2Map, productSk2Map, subscriptionSk2Map } from './types/appleSk2';
|
|
7
|
+
import { offerSk2Map, productSk2Map, subscriptionSk2Map, transactionSk2Map } from './types/appleSk2';
|
|
8
8
|
import { fillProductsWithAdditionalData, getAndroidModule, getIosModule, getNativeModule, isAmazon, isIosStorekit2, storekit1Mode, storekit2Mode, storekitHybridMode } from './internal';
|
|
9
9
|
import { ProductType } from './types';
|
|
10
10
|
import { PurchaseStateAndroid } from './types';
|
|
@@ -240,7 +240,11 @@ export const getPurchaseHistory = function () {
|
|
|
240
240
|
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
241
241
|
return (Platform.select({
|
|
242
242
|
ios: async () => {
|
|
243
|
-
|
|
243
|
+
if (isIosStorekit2()) {
|
|
244
|
+
return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(transactionSk2Map));
|
|
245
|
+
} else {
|
|
246
|
+
return RNIapIos.getAvailableItems();
|
|
247
|
+
}
|
|
244
248
|
},
|
|
245
249
|
android: async () => {
|
|
246
250
|
if (RNIapAmazonModule) {
|
|
@@ -340,7 +344,11 @@ export const getAvailablePurchases = function () {
|
|
|
340
344
|
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
341
345
|
return (Platform.select({
|
|
342
346
|
ios: async () => {
|
|
343
|
-
|
|
347
|
+
if (isIosStorekit2()) {
|
|
348
|
+
return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)).map(transactionSk2Map));
|
|
349
|
+
} else {
|
|
350
|
+
return RNIapIos.getAvailableItems();
|
|
351
|
+
}
|
|
344
352
|
},
|
|
345
353
|
android: async () => {
|
|
346
354
|
if (RNIapAmazonModule) {
|
package/lib/module/iap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","fillProductsWithAdditionalData","getAndroidModule","getIosModule","getNativeModule","isAmazon","isIosStorekit2","storekit1Mode","storekit2Mode","storekitHybridMode","ProductType","PurchaseStateAndroid","RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","ANDROID_ITEM_TYPE_SUBSCRIPTION","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","getProducts","skus","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","Promise","reject","Error","getSubscriptions","subscriptions","getPurchaseHistory","alsoPublishToEventListener","getAvailableItems","getPurchaseHistoryByType","concat","resolve","getAvailablePurchases","getAvailableItemsByType","requestPurchase","sku","andDangerouslyFinishTransactionAutomaticallyIOS","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","appAccountToken","isOfferPersonalized","undefined","quantity","withOffer","console","warn","offer","buyProduct","buyItemByType","length","requestSubscription","purchaseTokenAndroid","prorationModeAndroid","subscriptionOffers","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionPurchase,\n} from './types';\nimport {PurchaseStateAndroid} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async () => {\n let items: Subscription[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Subscription[];\n }\n\n return items.filter(\n (item: Subscription) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n },\n android: async () => {\n const subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as Subscription[];\n\n return fillProductsWithAdditionalData(subscriptions);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n}: {\n alsoPublishToEventListener?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems(alsoPublishToEventListener);\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n * \n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n}: {alsoPublishToEventListener?: boolean} = {}): Promise<\n (ProductPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems(alsoPublishToEventListener);\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID \n sku,\n\n \n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n \n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n appAccountToken,\n skus, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n quantity,\n withOffer,\n}: RequestPurchase): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(new Error('sku is required for iOS purchase'));\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!sku?.length && !sku) {\n return Promise.reject(\n new Error('skus is required for Android purchase'),\n );\n }\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus?.length ? skus : [sku],\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID \n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android). \n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED \n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers = undefined, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n appAccountToken,\n quantity,\n withOffer,\n}: RequestSubscription): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for iOS subscription'),\n );\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!subscriptionOffers?.length) {\n return Promise.reject(\n 'subscriptionOffers are required for Google Play Subscriptions',\n );\n }\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n * \n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n``` \n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":"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CmC,wBAAZ,CAC1BjC,8BAD0B,CAA5B;MAIA,OAAOuB,QAAQ,CAACW,MAAT,CAAgBL,aAAhB,CAAP;IACD;EAlBa,CAAhB,MAmBO,MAAMJ,OAAO,CAACU,OAAR,CAAgB,EAAhB,CAnBb,CADF,GALgC;AAAA,CAA3B;AA4BP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMC,qBAAqB,GAAG;EAAA,IAAC;IACpCL,0BAA0B,GAAG;EADO,CAAD,uEAEO,EAFP;EAAA,OAKnC,CACEvD,QAAQ,CAACoC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,OAAO1B,YAAY,GAAG6C,iBAAf,CAAiCD,0BAAjC,CAAP;IACD,CAHa;IAIdT,OAAO,EAAE,YAAY;MACnB,IAAIvB,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAACiC,iBAAlB,EAAb;MACD;;MAED,MAAMT,QAAQ,GAAG,MAAMzB,WAAW,CAACuC,uBAAZ,CACrBnC,qBADqB,CAAvB;MAIA,MAAM2B,aAAa,GAAG,MAAM/B,WAAW,CAACuC,uBAAZ,CAC1BrC,8BAD0B,CAA5B;MAIA,OAAOuB,QAAQ,CAACW,MAAT,CAAgBL,aAAhB,CAAP;IACD;EAlBa,CAAhB,MAmBO,MAAMJ,OAAO,CAACU,OAAR,CAAgB,EAAhB,CAnBb,CADF,GALmC;AAAA,CAA9B;AA4BP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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"}
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","transactionSk2Map","fillProductsWithAdditionalData","getAndroidModule","getIosModule","getNativeModule","isAmazon","isIosStorekit2","storekit1Mode","storekit2Mode","storekitHybridMode","ProductType","PurchaseStateAndroid","RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","ANDROID_ITEM_TYPE_SUBSCRIPTION","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","getProducts","skus","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","Promise","reject","Error","getSubscriptions","subscriptions","getPurchaseHistory","alsoPublishToEventListener","resolve","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","sku","andDangerouslyFinishTransactionAutomaticallyIOS","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","appAccountToken","isOfferPersonalized","undefined","quantity","withOffer","console","warn","offer","buyProduct","buyItemByType","length","requestSubscription","purchaseTokenAndroid","prorationModeAndroid","subscriptionOffers","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAmazon,\n isIosStorekit2,\n storekit1Mode,\n storekit2Mode,\n storekitHybridMode,\n} from './internal';\nimport {\n Product,\n ProductPurchase,\n ProductType,\n PurchaseResult,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionPurchase,\n} from './types';\nimport {PurchaseStateAndroid} from './types';\n\nexport {IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2};\n\nconst {RNIapIos, RNIapIosSk2, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = ProductType.subs;\nconst ANDROID_ITEM_TYPE_IAP = ProductType.inapp;\n\n/**\n * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,\n * minimum changes required in the migration guide (default)\n * HYBRID_MODE: Will enable Storekit 2 for iOS devices > 15.0 but will fallback to Sk1 on older devices\n * There are some edge cases that you need to handle in this case (described in migration guide). This mode\n * is for developers that are migrating to Storekit 2 but want to keep supporting older versions.\n * STOREKIT2_MODE: Will *only* enable Storekit 2. This disables Storekit 1. This is for apps that\n * have already targeted a min version of 15 for their app.\n */\nexport type STOREKIT_OPTIONS =\n | 'STOREKIT1_MODE'\n | 'STOREKIT_HYBRID_MODE'\n | 'STOREKIT2_MODE';\n\nexport const setup = ({\n storekitMode = 'STOREKIT1_MODE',\n}: {\n storekitMode?: STOREKIT_OPTIONS;\n} = {}) => {\n switch (storekitMode) {\n case 'STOREKIT1_MODE':\n storekit1Mode();\n break;\n case 'STOREKIT2_MODE':\n storekit2Mode();\n break;\n case 'STOREKIT_HYBRID_MODE':\n storekitHybridMode();\n break;\n default:\n break;\n }\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * ## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {initConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n void initConnection();\n }, []);\n\n return <View />;\n};\n```\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * Disconnects from native SDK\n * Usage\n * ```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {endConnection} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n return () => {\n void endConnection();\n };\n }, []);\n\n return <View />;\n};\n```\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<boolean> =>\n getNativeModule().endConnection();\n\n/**\n * Consume all 'ghost' purchases (that is, pending payment that already failed but is still marked as pending in Play Store cache). Android only.\n * @returns {Promise<boolean>}\n */\nexport const flushFailedPurchasesCachedAsPendingAndroid =\n (): Promise<boolean> =>\n getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n ## Usage\n\n```ts\nimport React, {useState} from 'react';\nimport {Platform} from 'react-native';\nimport {getProducts, Product} from 'react-native-iap';\n\nconst skus = Platform.select({\n ios: ['com.example.consumableIos'],\n android: ['com.example.consumableAndroid'],\n});\n\nconst App = () => {\n const [products, setProducts] = useState<Product[]>([]);\n\n const handleProducts = async () => {\n const items = await getProducts({skus});\n\n setProducts(items);\n };\n\n useEffect(() => {\n void handleProducts();\n }, []);\n\n return (\n <>\n {products.map((product) => (\n <Text key={product.productId}>{product.productId}</Text>\n ))}\n </>\n );\n};\n```\n\nJust a few things to keep in mind:\n\n- You can get your products in `componentDidMount`, `useEffect` or another appropriate area of your app.\n- Since a user may start your app with a bad or no internet connection, preparing/getting the items more than once may be a good idea.\n- If the user has no IAPs available when the app starts first, you may want to check again when the user enters your IAP store.\n\n */\nexport const getProducts = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n let items: Product[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n productSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Product[];\n }\n return items.filter(\n (item: Product) =>\n skus.includes(item.productId) && item.type === 'iap',\n );\n },\n android: async () => {\n const products = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\n );\n\n return fillProductsWithAdditionalData(products);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Get a list of subscriptions\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getSubscriptions} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () =>\n await getSubscriptions(['com.example.product1', 'com.example.product2']),\n [],\n );\n\n return <View />;\n};\n```\n\n */\nexport const getSubscriptions = ({\n skus,\n}: {\n skus: string[];\n}): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async () => {\n let items: Subscription[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as Subscription[];\n }\n\n return items.filter(\n (item: Subscription) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n },\n android: async () => {\n const subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as Subscription[];\n\n return fillProductsWithAdditionalData(subscriptions);\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getPurchaseHistory} from 'react-native-iap';\n\nconst App = () => {\n const history = useCallback(\n async () =>\n await getPurchaseHistory([\n 'com.example.product1',\n 'com.example.product2',\n ]),\n [],\n );\n\n return <View />;\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n}: {\n alsoPublishToEventListener?: boolean;\n} = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems();\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)\n * ## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {View} from 'react-native';\nimport {getAvailablePurchases} from 'react-native-iap';\n\nconst App = () => {\n const availablePurchases = useCallback(\n async () => await getAvailablePurchases(),\n [],\n );\n\n return <View />;\n};\n```\n\n## Restoring purchases\n\nYou can use `getAvailablePurchases()` to do what's commonly understood as \"restoring\" purchases.\n\n:::note\nFor debugging you may want to consume all items, you have then to iterate over the purchases returned by `getAvailablePurchases()`.\n:::\n\n:::warning\nBeware that if you consume an item without having recorded the purchase in your database the user may have paid for something without getting it delivered and you will have no way to recover the receipt to validate and restore their purchase.\n:::\n\n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {getAvailablePurchases,finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n handleRestore = async () => {\n try {\n const purchases = await getAvailablePurchases();\n const newState = {premium: false, ads: true};\n let titles = [];\n\n await Promise.all(purchases.map(async purchase => {\n switch (purchase.productId) {\n case 'com.example.premium':\n newState.premium = true;\n titles.push('Premium Version');\n break;\n\n case 'com.example.no_ads':\n newState.ads = false;\n titles.push('No Ads');\n break;\n\n case 'com.example.coins100':\n await finishTransaction(purchase.purchaseToken);\n CoinStore.addCoins(100);\n }\n })\n\n Alert.alert(\n 'Restore Successful',\n `You successfully restored the following purchases: ${titles.join(', ')}`,\n );\n } catch (error) {\n console.warn(error);\n Alert.alert(error.message);\n }\n };\n\n return (\n <Button title=\"Restore purchases\" onPress={handleRestore} />\n )\n};\n```\n@param {alsoPublishToEventListener}:boolean When `true`, every element will also be pushed to the purchaseUpdated listener.\nNote that this is only for backaward compatiblity. It won't publish to transactionUpdated (Storekit2) Defaults to `false`\n * \n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n}: {alsoPublishToEventListener?: boolean} = {}): Promise<\n (ProductPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)\n ).map(transactionSk2Map),\n );\n } else {\n return RNIapIos.getAvailableItems();\n }\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await RNIapModule.getAvailableItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n );\n\n return products.concat(subscriptions);\n },\n }) || (() => Promise.resolve([]))\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a product (consumables or non-consumables).\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestPurchase(\n The product's sku/ID \n sku,\n\n \n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n \n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<ProductPurchase>;\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';\n\nconst App = () => {\n const products = useCallback(\n async () => getProducts(['com.example.product']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestPurchase({sku});\n };\n\n return (\n <>\n {products.map((product) => (\n <Button\n key={product.productId}\n title=\"Buy product\"\n onPress={() => handlePurchase(product.productId)}\n />\n ))}\n </>\n );\n};\n```\n\n */\n\nexport const requestPurchase = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n appAccountToken,\n skus, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n quantity,\n withOffer,\n}: RequestPurchase): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(new Error('sku is required for iOS purchase'));\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!sku?.length && !sku) {\n return Promise.reject(\n new Error('skus is required for Android purchase'),\n );\n }\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus?.length ? skus : [sku],\n undefined,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n [],\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * Request a purchase for a subscription.\n\nThe response will be received through the `PurchaseUpdatedListener`.\n\n:::note\n`andDangerouslyFinishTransactionAutomatically` defaults to false. We recommend\nalways keeping at false, and verifying the transaction receipts on the server-side.\n:::\n\n## Signature\n\n```ts\nrequestSubscription(\n The product's sku/ID \n sku,\n\n\n * You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user.\n * @default false\n\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n\n purchaseToken that the user is upgrading or downgrading from (Android). \n purchaseTokenAndroid,\n\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED \n prorationModeAndroid = -1,\n\n /** Specifies an optional obfuscated string that is uniquely associated with the user's account in your app. \n obfuscatedAccountIdAndroid,\n\n Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app. \n obfuscatedProfileIdAndroid,\n\n The purchaser's user ID \n applicationUsername,\n): Promise<SubscriptionPurchase>\n```\n\n## Usage\n\n```tsx\nimport React, {useCallback} from 'react';\nimport {Button} from 'react-native';\nimport {\n requestSubscription,\n Product,\n Sku,\n getSubscriptions,\n} from 'react-native-iap';\n\nconst App = () => {\n const subscriptions = useCallback(\n async () => getSubscriptions(['com.example.subscription']),\n [],\n );\n\n const handlePurchase = async (sku: Sku) => {\n await requestSubscription({sku});\n };\n\n return (\n <>\n {subscriptions.map((subscription) => (\n <Button\n key={subscription.productId}\n title=\"Buy subscription\"\n onPress={() => handlePurchase(subscription.productId)}\n />\n ))}\n </>\n );\n};\n```\n */\nexport const requestSubscription = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers = undefined, // Android Billing V5\n isOfferPersonalized = undefined, // Android Billing V5\n appAccountToken,\n quantity,\n withOffer,\n}: RequestSubscription): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for iOS subscription'),\n );\n }\n if (andDangerouslyFinishTransactionAutomaticallyIOS) {\n console.warn(\n 'You are dangerously allowing react-native-iap to finish your transaction automatically. You should set andDangerouslyFinishTransactionAutomatically to false when calling requestPurchase and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.',\n );\n }\n\n if (isIosStorekit2()) {\n const offer = offerSk2Map(withOffer);\n\n return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!sku) {\n return Promise.reject(\n new Error('sku is required for Amazon purchase'),\n );\n }\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!subscriptionOffers?.length) {\n return Promise.reject(\n 'subscriptionOffers are required for Google Play Subscriptions',\n );\n }\n return RNIapModule.buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n subscriptionOffers?.map((so) => so.sku),\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n subscriptionOffers?.map((so) => so.offerToken),\n isOfferPersonalized ?? false,\n );\n }\n },\n }) || (() => Promise.resolve(null))\n )();\n\n/**\n * Finish Transaction (both platforms)\n * Abstracts Finish Transaction\n * iOS: Tells StoreKit that you have delivered the purchase to the user and StoreKit can now let go of the transaction.\n * Call this after you have persisted the purchased state to your server or local data in your app.\n * `react-native-iap` will continue to deliver the purchase updated events with the successful purchase until you finish the transaction. **Even after the app has relaunched.**\n * Android: it will consume purchase for consumables and acknowledge purchase for non-consumables.\n * \n```tsx\nimport React from 'react';\nimport {Button} from 'react-native';\nimport {finishTransaction} from 'react-native-iap';\n\nconst App = () => {\n const handlePurchase = async () => {\n // ... handle the purchase request\n\n const result = finishTransaction(purchase);\n };\n\n return <Button title=\"Buy product\" onPress={handlePurchase} />;\n};\n``` \n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":"AAAA,SAAQA,aAAR,EAAuBC,QAAvB,QAAsC,cAAtC;AAEA,OAAO,KAAKC,SAAZ,MAA2B,kBAA3B;AACA,OAAO,KAAKC,UAAZ,MAA4B,mBAA5B;AACA,OAAO,KAAKC,MAAZ,MAAwB,eAAxB;AACA,OAAO,KAAKC,SAAZ,MAA2B,kBAA3B;AACA,SAAQC,aAAR,QAA4B,eAA5B;AACA,SACEC,WADF,EAGEC,aAHF,EAIEC,kBAJF,EAKEC,iBALF,QAMO,kBANP;AAOA,SACEC,8BADF,EAEEC,gBAFF,EAGEC,YAHF,EAIEC,eAJF,EAKEC,QALF,EAMEC,cANF,EAOEC,aAPF,EAQEC,aARF,EASEC,kBATF,QAUO,YAVP;AAWA,SAGEC,WAHF,QASO,SATP;AAUA,SAAQC,oBAAR,QAAmC,SAAnC;AAEA,SAAQlB,UAAR,EAAoBD,SAApB,EAA+BE,MAA/B,EAAuCC,SAAvC,EAAkDW,cAAlD;AAEA,MAAM;EAACM,QAAD;EAAWC,WAAX;EAAwBC,WAAxB;EAAqCC;AAArC,IAA0DzB,aAAhE;AACA,MAAM0B,8BAA8B,GAAGN,WAAW,CAACO,IAAnD;AACA,MAAMC,qBAAqB,GAAGR,WAAW,CAACS,KAA1C;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,OAAO,MAAMC,KAAK,GAAG,YAIV;EAAA,IAJW;IACpBC,YAAY,GAAG;EADK,CAIX,uEAAP,EAAO;;EACT,QAAQA,YAAR;IACE,KAAK,gBAAL;MACEd,aAAa;MACb;;IACF,KAAK,gBAAL;MACEC,aAAa;MACb;;IACF,KAAK,sBAAL;MACEC,kBAAkB;MAClB;;IACF;MACE;EAXJ;AAaD,CAlBM;AAoBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMa,cAAc,GAAG,MAC5BlB,eAAe,GAAGkB,cAAlB,EADK;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMC,aAAa,GAAG,MAC3BnB,eAAe,GAAGmB,aAAlB,EADK;AAGP;AACA;AACA;AACA;;AACA,OAAO,MAAMC,0CAA0C,GACrD,MACEtB,gBAAgB,GAAGuB,mCAAnB,EAFG;AAIP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMC,WAAW,GAAG;EAAA,IAAC;IAC1BC;EAD0B,CAAD;EAAA,OAKzB,CACEpC,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAIC,KAAJ;;MACA,IAAIxB,cAAc,EAAlB,EAAsB;QACpBwB,KAAK,GAAG,CAAE,MAAMjB,WAAW,CAACkB,QAAZ,CAAqBJ,IAArB,CAAR,EAAqDK,GAArD,CACNlC,aADM,CAAR;MAGD,CAJD,MAIO;QACLgC,KAAK,GAAI,MAAMlB,QAAQ,CAACmB,QAAT,CAAkBJ,IAAlB,CAAf;MACD;;MACD,OAAOG,KAAK,CAACG,MAAN,CACJC,IAAD,IACEP,IAAI,CAACQ,QAAL,CAAcD,IAAI,CAACE,SAAnB,KAAiCF,IAAI,CAACG,IAAL,KAAc,KAF5C,CAAP;IAID,CAda;IAedC,OAAO,EAAE,YAAY;MACnB,MAAMC,QAAQ,GAAG,MAAMrC,gBAAgB,GAAGsC,cAAnB,CACrBtB,qBADqB,EAErBS,IAFqB,CAAvB;MAKA,OAAO1B,8BAA8B,CAACsC,QAAD,CAArC;IACD;EAtBa,CAAhB,MAuBO,MAAME,OAAO,CAACC,MAAR,CAAe,IAAIC,KAAJ,CAAU,sBAAV,CAAf,CAvBb,CADF,GALyB;AAAA,CAApB;AAgCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMC,gBAAgB,GAAG;EAAA,IAAC;IAC/BjB;EAD+B,CAAD;EAAA,OAK9B,CACEpC,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAIC,KAAJ;;MACA,IAAIxB,cAAc,EAAlB,EAAsB;QACpBwB,KAAK,GAAG,CAAE,MAAMjB,WAAW,CAACkB,QAAZ,CAAqBJ,IAArB,CAAR,EAAqDK,GAArD,CACNjC,kBADM,CAAR;MAGD,CAJD,MAIO;QACL+B,KAAK,GAAI,MAAMlB,QAAQ,CAACmB,QAAT,CAAkBJ,IAAlB,CAAf;MACD;;MAED,OAAOG,KAAK,CAACG,MAAN,CACJC,IAAD,IACEP,IAAI,CAACQ,QAAL,CAAcD,IAAI,CAACE,SAAnB,KAAiCF,IAAI,CAACG,IAAL,KAAc,MAF5C,CAAP;IAID,CAfa;IAgBdC,OAAO,EAAE,YAAY;MACnB,MAAMO,aAAa,GAAI,MAAM3C,gBAAgB,GAAGsC,cAAnB,CAC3BxB,8BAD2B,EAE3BW,IAF2B,CAA7B;MAKA,OAAO1B,8BAA8B,CAAC4C,aAAD,CAArC;IACD;EAvBa,CAAhB,MAwBO,MAAMJ,OAAO,CAACC,MAAR,CAAe,IAAIC,KAAJ,CAAU,sBAAV,CAAf,CAxBb,CADF,GAL8B;AAAA,CAAzB;AAiCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMG,kBAAkB,GAAG;EAAA,IAAC;IACjCC,0BAA0B,GAAG;EADI,CAAD,uEAI9B,EAJ8B;EAAA,OAKhC,CACExD,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAIvB,cAAc,EAAlB,EAAsB;QACpB,OAAOmC,OAAO,CAACO,OAAR,CACL,CACE,MAAMnC,WAAW,CAACoC,iBAAZ,CAA8BF,0BAA9B,CADR,EAEEf,GAFF,CAEMhC,iBAFN,CADK,CAAP;MAKD,CAND,MAMO;QACL,OAAOY,QAAQ,CAACqC,iBAAT,EAAP;MACD;IACF,CAXa;IAYdX,OAAO,EAAE,YAAY;MACnB,IAAIvB,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAACkC,iBAAlB,EAAb;MACD;;MAED,MAAMV,QAAQ,GAAG,MAAMzB,WAAW,CAACoC,wBAAZ,CACrBhC,qBADqB,CAAvB;MAIA,MAAM2B,aAAa,GAAG,MAAM/B,WAAW,CAACoC,wBAAZ,CAC1BlC,8BAD0B,CAA5B;MAIA,OAAOuB,QAAQ,CAACY,MAAT,CAAgBN,aAAhB,CAAP;IACD;EA1Ba,CAAhB,MA2BO,MAAMJ,OAAO,CAACO,OAAR,CAAgB,EAAhB,CA3Bb,CADF,GALgC;AAAA,CAA3B;AAoCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMI,qBAAqB,GAAG;EAAA,IAAC;IACpCL,0BAA0B,GAAG;EADO,CAAD,uEAEO,EAFP;EAAA,OAKnC,CACExD,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAIvB,cAAc,EAAlB,EAAsB;QACpB,OAAOmC,OAAO,CAACO,OAAR,CACL,CACE,MAAMnC,WAAW,CAACoC,iBAAZ,CAA8BF,0BAA9B,CADR,EAEEf,GAFF,CAEMhC,iBAFN,CADK,CAAP;MAKD,CAND,MAMO;QACL,OAAOY,QAAQ,CAACqC,iBAAT,EAAP;MACD;IACF,CAXa;IAYdX,OAAO,EAAE,YAAY;MACnB,IAAIvB,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAACkC,iBAAlB,EAAb;MACD;;MAED,MAAMV,QAAQ,GAAG,MAAMzB,WAAW,CAACuC,uBAAZ,CACrBnC,qBADqB,CAAvB;MAIA,MAAM2B,aAAa,GAAG,MAAM/B,WAAW,CAACuC,uBAAZ,CAC1BrC,8BAD0B,CAA5B;MAIA,OAAOuB,QAAQ,CAACY,MAAT,CAAgBN,aAAhB,CAAP;IACD;EA1Ba,CAAhB,MA2BO,MAAMJ,OAAO,CAACO,OAAR,CAAgB,EAAhB,CA3Bb,CADF,GALmC;AAAA,CAA9B;AAoCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMM,eAAe,GAAG;EAAA,IAAC;IAC9BC,GAD8B;IAE9BC,+CAA+C,GAAG,KAFpB;IAG9BC,0BAH8B;IAI9BC,0BAJ8B;IAK9BC,eAL8B;IAM9BhC,IAN8B;IAMxB;IACNiC,mBAAmB,GAAGC,SAPQ;IAOG;IACjCC,QAR8B;IAS9BC;EAT8B,CAAD;EAAA,OAW7B,CACExE,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAI,CAAC0B,GAAL,EAAU;QACR,OAAOd,OAAO,CAACC,MAAR,CAAe,IAAIC,KAAJ,CAAU,kCAAV,CAAf,CAAP;MACD;;MACD,IAAIa,+CAAJ,EAAqD;QACnDQ,OAAO,CAACC,IAAR,CACE,wXADF;MAGD;;MACD,IAAI3D,cAAc,EAAlB,EAAsB;QACpB,MAAM4D,KAAK,GAAGrE,WAAW,CAACkE,SAAD,CAAzB;QAEA,OAAOlD,WAAW,CAACsD,UAAZ,CACLZ,GADK,EAELC,+CAFK,EAGLG,eAHK,EAILG,QAAQ,IAAI,CAAC,CAJR,EAKLI,KALK,CAAP;MAOD,CAVD,MAUO;QACL,OAAOtD,QAAQ,CAACuD,UAAT,CACLZ,GADK,EAELC,+CAFK,EAGLG,eAHK,EAILG,QAAQ,IAAI,CAAC,CAJR,EAKLlE,aAAa,CAACmE,SAAD,CALR,CAAP;MAOD;IACF,CA7Ba;IA8BdzB,OAAO,EAAE,YAAY;MACnB,IAAIjC,QAAJ,EAAc;QACZ,IAAI,CAACkD,GAAL,EAAU;UACR,OAAOd,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,qCAAV,CADK,CAAP;QAGD;;QACD,OAAO5B,iBAAiB,CAACqD,aAAlB,CAAgCb,GAAhC,CAAP;MACD,CAPD,MAOO;QACL,IAAI,EAACA,GAAD,aAACA,GAAD,eAACA,GAAG,CAAEc,MAAN,KAAgB,CAACd,GAArB,EAA0B;UACxB,OAAOd,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,uCAAV,CADK,CAAP;QAGD;;QACD,OAAOzC,gBAAgB,GAAGkE,aAAnB,CACLlD,qBADK,EAELS,IAAI,SAAJ,IAAAA,IAAI,WAAJ,IAAAA,IAAI,CAAE0C,MAAN,GAAe1C,IAAf,GAAsB,CAAC4B,GAAD,CAFjB,EAGLM,SAHK,EAIL,CAAC,CAJI,EAKLJ,0BALK,EAMLC,0BANK,EAOL,EAPK,EAQLE,mBAAmB,IAAI,KARlB,CAAP;MAUD;IACF;EAvDa,CAAhB,KAwDMnB,OAAO,CAACO,OAzDhB,GAX6B;AAAA,CAAxB;AAuEP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMsB,mBAAmB,GAAG;EAAA,IAAC;IAClCf,GADkC;IAElCC,+CAA+C,GAAG,KAFhB;IAGlCe,oBAHkC;IAIlCC,oBAAoB,GAAG,CAAC,CAJU;IAKlCf,0BALkC;IAMlCC,0BANkC;IAOlCe,kBAAkB,GAAGZ,SAPa;IAOF;IAChCD,mBAAmB,GAAGC,SARY;IAQD;IACjCF,eATkC;IAUlCG,QAVkC;IAWlCC;EAXkC,CAAD;EAAA,OAajC,CACExE,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAI,CAAC0B,GAAL,EAAU;QACR,OAAOd,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,sCAAV,CADK,CAAP;MAGD;;MACD,IAAIa,+CAAJ,EAAqD;QACnDQ,OAAO,CAACC,IAAR,CACE,wXADF;MAGD;;MAED,IAAI3D,cAAc,EAAlB,EAAsB;QACpB,MAAM4D,KAAK,GAAGrE,WAAW,CAACkE,SAAD,CAAzB;QAEA,OAAOlD,WAAW,CAACsD,UAAZ,CACLZ,GADK,EAELC,+CAFK,EAGLG,eAHK,EAILG,QAAQ,IAAI,CAAC,CAJR,EAKLI,KALK,CAAP;MAOD,CAVD,MAUO;QACL,OAAOtD,QAAQ,CAACuD,UAAT,CACLZ,GADK,EAELC,+CAFK,EAGLG,eAHK,EAILG,QAAQ,IAAI,CAAC,CAJR,EAKLlE,aAAa,CAACmE,SAAD,CALR,CAAP;MAOD;IACF,CAhCa;IAiCdzB,OAAO,EAAE,YAAY;MACnB,IAAIjC,QAAJ,EAAc;QACZ,IAAI,CAACkD,GAAL,EAAU;UACR,OAAOd,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,qCAAV,CADK,CAAP;QAGD;;QACD,OAAO5B,iBAAiB,CAACqD,aAAlB,CAAgCb,GAAhC,CAAP;MACD,CAPD,MAOO;QACL,IAAI,EAACkB,kBAAD,aAACA,kBAAD,eAACA,kBAAkB,CAAEJ,MAArB,CAAJ,EAAiC;UAC/B,OAAO5B,OAAO,CAACC,MAAR,CACL,+DADK,CAAP;QAGD;;QACD,OAAO5B,WAAW,CAACsD,aAAZ,CACLpD,8BADK,EAELyD,kBAFK,aAELA,kBAFK,uBAELA,kBAAkB,CAAEzC,GAApB,CAAyB0C,EAAD,IAAQA,EAAE,CAACnB,GAAnC,CAFK,EAGLgB,oBAHK,EAILC,oBAJK,EAKLf,0BALK,EAMLC,0BANK,EAOLe,kBAPK,aAOLA,kBAPK,uBAOLA,kBAAkB,CAAEzC,GAApB,CAAyB0C,EAAD,IAAQA,EAAE,CAACC,UAAnC,CAPK,EAQLf,mBAAmB,IAAI,KARlB,CAAP;MAUD;IACF;EA1Da,CAAhB,MA2DO,MAAMnB,OAAO,CAACO,OAAR,CAAgB,IAAhB,CA3Db,CADF,GAbiC;AAAA,CAA5B;AA4EP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAM4B,iBAAiB,GAAG,SAQQ;EAAA,IARP;IAChCC,QADgC;IAEhCC,YAFgC;IAGhCC;EAHgC,CAQO;EACvC,OAAO,CACLxF,QAAQ,CAACqC,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,MAAMmD,aAAa,GAAGH,QAAQ,CAACG,aAA/B;;MAEA,IAAI,CAACA,aAAL,EAAoB;QAClB,OAAOvC,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,kDAAV,CADK,CAAP;MAGD;;MACD,OAAOxC,YAAY,GAAGyE,iBAAf,CAAiCI,aAAjC,CAAP;IACD,CAVa;IAWd1C,OAAO,EAAE,YAAY;MACnB,IAAIuC,QAAJ,aAAIA,QAAJ,eAAIA,QAAQ,CAAEI,aAAd,EAA6B;QAC3B,IAAIH,YAAJ,EAAkB;UAChB,OAAO5E,gBAAgB,GAAGgF,cAAnB,CACLL,QAAQ,CAACI,aADJ,EAELF,uBAFK,CAAP;QAID,CALD,MAKO,IACLF,QAAQ,CAACM,YAAT,IACC,CAACN,QAAQ,CAACO,qBAAV,IACCP,QAAQ,CAACQ,oBAAT,KAAkC1E,oBAAoB,CAAC2E,SAHpD,EAIL;UACA,OAAOpF,gBAAgB,GAAGqF,mBAAnB,CACLV,QAAQ,CAACI,aADJ,EAELF,uBAFK,CAAP;QAID,CATM,MASA;UACL,OAAOtC,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,0CAAV,CADK,CAAP;QAGD;MACF;;MACD,OAAOF,OAAO,CAACC,MAAR,CACL,IAAIC,KAAJ,CAAU,0CAAV,CADK,CAAP;IAGD;EApCa,CAAhB,MAqCO,MAAMF,OAAO,CAACC,MAAR,CAAe,IAAIC,KAAJ,CAAU,sBAAV,CAAf,CArCb,CADK,GAAP;AAwCD,CAjDM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","RNIapIosSk2","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n) => Promise<
|
|
1
|
+
{"version":3,"names":["NativeModules","RNIapIosSk2","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\ntype requestReceipt = (refresh: boolean) => Promise<string>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n requestReceipt: requestReceipt;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n disable: () => Promise<null>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n"],"mappings":"AAAA,SAAQA,aAAR,QAA4B,cAA5B;AAWA,MAAM;EAACC;AAAD,IAAgBD,aAAtB;;AA+CA;AACA;AACA;AACA;AACA,OAAO,MAAME,IAAI,GAAG,MAAqBD,WAAW,CAACC,IAAZ,EAAlC;AAEP;AACA;AACA;;AACA,OAAO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCH,WAAW,CAACE,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;AAEA,OAAO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCL,WAAW,CAACI,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMC,kBAAkB,GAAID,GAAD,IAChCL,WAAW,CAACM,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BL,WAAW,CAACO,iBAAZ,CAA8BF,GAA9B,CADK"}
|
|
@@ -2,7 +2,7 @@ import type { Product, ProductPurchase, Purchase, Sku } from '../types';
|
|
|
2
2
|
import type { PaymentDiscountSk2, ProductSk2, ProductStatus, TransactionSk2 } from '../types/appleSk2';
|
|
3
3
|
import type { NativeModuleProps } from './common';
|
|
4
4
|
declare type getItems = (skus: Sku[]) => Promise<ProductSk2[]>;
|
|
5
|
-
declare type getAvailableItems = (alsoPublishToEventListener?: boolean) => Promise<
|
|
5
|
+
declare type getAvailableItems = (alsoPublishToEventListener?: boolean) => Promise<TransactionSk2[]>;
|
|
6
6
|
export declare type BuyProduct = (sku: Sku, andDangerouslyFinishTransactionAutomaticallyIOS: boolean, applicationUsername: string | undefined, quantity: number, withOffer: Record<keyof PaymentDiscountSk2, string> | undefined) => Promise<Purchase>;
|
|
7
7
|
declare type clearTransaction = () => Promise<void>;
|
|
8
8
|
declare type clearProducts = () => Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-iap",
|
|
3
|
-
"version": "11.0.0-rc.
|
|
3
|
+
"version": "11.0.0-rc.6",
|
|
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/iap.ts
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
ProductSk2,
|
|
11
11
|
productSk2Map,
|
|
12
12
|
subscriptionSk2Map,
|
|
13
|
+
transactionSk2Map,
|
|
13
14
|
} from './types/appleSk2';
|
|
14
15
|
import {
|
|
15
16
|
fillProductsWithAdditionalData,
|
|
@@ -289,7 +290,15 @@ export const getPurchaseHistory = ({
|
|
|
289
290
|
(
|
|
290
291
|
Platform.select({
|
|
291
292
|
ios: async () => {
|
|
292
|
-
|
|
293
|
+
if (isIosStorekit2()) {
|
|
294
|
+
return Promise.resolve(
|
|
295
|
+
(
|
|
296
|
+
await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)
|
|
297
|
+
).map(transactionSk2Map),
|
|
298
|
+
);
|
|
299
|
+
} else {
|
|
300
|
+
return RNIapIos.getAvailableItems();
|
|
301
|
+
}
|
|
293
302
|
},
|
|
294
303
|
android: async () => {
|
|
295
304
|
if (RNIapAmazonModule) {
|
|
@@ -397,7 +406,15 @@ export const getAvailablePurchases = ({
|
|
|
397
406
|
(
|
|
398
407
|
Platform.select({
|
|
399
408
|
ios: async () => {
|
|
400
|
-
|
|
409
|
+
if (isIosStorekit2()) {
|
|
410
|
+
return Promise.resolve(
|
|
411
|
+
(
|
|
412
|
+
await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener)
|
|
413
|
+
).map(transactionSk2Map),
|
|
414
|
+
);
|
|
415
|
+
} else {
|
|
416
|
+
return RNIapIos.getAvailableItems();
|
|
417
|
+
}
|
|
401
418
|
},
|
|
402
419
|
android: async () => {
|
|
403
420
|
if (RNIapAmazonModule) {
|
package/src/modules/iosSk2.ts
CHANGED