react-native-iap 12.4.8 → 12.4.9

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.
@@ -790,12 +790,12 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
790
790
  return nil
791
791
  }
792
792
 
793
- func getPurchaseData(_ transaction: SKPaymentTransaction, withBlock block: @escaping (_ transactionDict: [String: Any]?) -> Void) {
793
+ func getPurchaseData(_ transaction: SKPaymentTransaction, withBlock block: @escaping (_ transactionDict: [String: Any?]?) -> Void) {
794
794
  requestReceiptData(withBlock: false) { receiptData, _ in
795
795
  if receiptData == nil {
796
796
  block(nil)
797
797
  } else {
798
- var purchase = [
798
+ var purchase: [String: Any?] = [
799
799
  "transactionDate": transaction.transactionDate?.millisecondsSince1970,
800
800
  "transactionId": transaction.transactionIdentifier,
801
801
  "productId": transaction.payment.productIdentifier,
@@ -808,7 +808,7 @@ class RNIapIos: RCTEventEmitter, SKRequestDelegate, SKPaymentTransactionObserver
808
808
  purchase["originalTransactionIdentifierIOS"] = originalTransaction.transactionIdentifier
809
809
  }
810
810
 
811
- block(purchase as [String: Any])
811
+ block(purchase)
812
812
  }
813
813
  }
814
814
  }
@@ -226,7 +226,7 @@ import {getSubscriptions} from 'react-native-iap';
226
226
  const App = () => {
227
227
  const subscriptions = useCallback(
228
228
  async () =>
229
- await getSubscriptions(['com.example.product1', 'com.example.product2']),
229
+ await getSubscriptions({skus:['com.example.product1', 'com.example.product2']}),
230
230
  [],
231
231
  );
232
232
 
@@ -509,7 +509,7 @@ import {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';
509
509
 
510
510
  const App = () => {
511
511
  const products = useCallback(
512
- async () => getProducts(['com.example.product']),
512
+ async () => getProducts({skus:['com.example.product']}),
513
513
  [],
514
514
  );
515
515
 
@@ -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","length","Promise","reject","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","Error","getSubscriptions","subscriptionSk2Map","addSubscriptionPlatform","SubscriptionPlatform","androidPlatform","getAndroidModuleType","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","onlyIncludeActiveItems","resolve","getAvailableItems","transactionSk2ToPurchaseMap","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","offerSk2Map","purchase","buyProduct","offerToRecord","isAmazon","buyItemByType","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","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 transactionSk2ToPurchaseMap,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\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 Purchase,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} 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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, 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. (IOS Sk2 only) 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@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n onlyIncludeActiveItems = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n onlyIncludeActiveItems = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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 request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\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 request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\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 @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: Purchase;\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 await getIosModule().finishTransaction(transactionId);\n return Promise.resolve(true);\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;;AAYA;;;;;;AAmBA,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,QAII;EAAA,IAJH;IAC1BC;EAD0B,CAIG;;EAC7B,I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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","length","Promise","reject","Platform","select","ios","items","isIosStorekit2","getItems","map","productSk2Map","filter","item","includes","productId","type","android","products","getItemsByType","fillProductsWithAdditionalData","Error","getSubscriptions","subscriptionSk2Map","addSubscriptionPlatform","SubscriptionPlatform","androidPlatform","getAndroidModuleType","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","onlyIncludeActiveItems","resolve","getAvailableItems","transactionSk2ToPurchaseMap","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","offerSk2Map","purchase","buyProduct","offerToRecord","isAmazon","buyItemByType","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","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 transactionSk2ToPurchaseMap,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\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 Purchase,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} 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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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({skus:['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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, 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. (IOS Sk2 only) 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@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n onlyIncludeActiveItems = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n onlyIncludeActiveItems = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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({skus:['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 request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\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 request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\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 @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: Purchase;\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 await getIosModule().finishTransaction(transactionId);\n return Promise.resolve(true);\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;;AAYA;;;;;;AAmBA,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,QAII;EAAA,IAJH;IAC1BC;EAD0B,CAIG;;EAC7B,I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"}
package/lib/module/iap.js CHANGED
@@ -180,7 +180,7 @@ import {getSubscriptions} from 'react-native-iap';
180
180
  const App = () => {
181
181
  const subscriptions = useCallback(
182
182
  async () =>
183
- await getSubscriptions(['com.example.product1', 'com.example.product2']),
183
+ await getSubscriptions({skus:['com.example.product1', 'com.example.product2']}),
184
184
  [],
185
185
  );
186
186
 
@@ -454,7 +454,7 @@ import {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';
454
454
 
455
455
  const App = () => {
456
456
  const products = useCallback(
457
- async () => getProducts(['com.example.product']),
457
+ async () => getProducts({skus:['com.example.product']}),
458
458
  [],
459
459
  );
460
460
 
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","transactionSk2ToPurchaseMap","fillProductsWithAdditionalData","getAndroidModule","getAndroidModuleType","getIosModule","getNativeModule","isAmazon","isIosStorekit2","storekit1Mode","storekit2Mode","storekitHybridMode","ProductType","PurchaseStateAndroid","SubscriptionPlatform","RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","ANDROID_ITEM_TYPE_SUBSCRIPTION","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","getProducts","skus","length","Promise","reject","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","Error","getSubscriptions","addSubscriptionPlatform","androidPlatform","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","onlyIncludeActiveItems","resolve","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","purchase","buyProduct","buyItemByType","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","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 transactionSk2ToPurchaseMap,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\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 Purchase,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} 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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, 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. (IOS Sk2 only) 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@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n onlyIncludeActiveItems = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n onlyIncludeActiveItems = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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 request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\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 request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\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 @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: Purchase;\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 await getIosModule().finishTransaction(transactionId);\n return Promise.resolve(true);\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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"}
1
+ {"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","transactionSk2ToPurchaseMap","fillProductsWithAdditionalData","getAndroidModule","getAndroidModuleType","getIosModule","getNativeModule","isAmazon","isIosStorekit2","storekit1Mode","storekit2Mode","storekitHybridMode","ProductType","PurchaseStateAndroid","SubscriptionPlatform","RNIapIos","RNIapIosSk2","RNIapModule","RNIapAmazonModule","ANDROID_ITEM_TYPE_SUBSCRIPTION","subs","ANDROID_ITEM_TYPE_IAP","inapp","setup","storekitMode","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","getProducts","skus","length","Promise","reject","select","ios","items","getItems","map","filter","item","includes","productId","type","android","products","getItemsByType","Error","getSubscriptions","addSubscriptionPlatform","androidPlatform","subscriptions","castSubscriptions","amazon","platform","subscription","getPurchaseHistory","alsoPublishToEventListener","automaticallyFinishRestoredTransactions","onlyIncludeActiveItems","resolve","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","purchase","buyProduct","buyItemByType","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","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 transactionSk2ToPurchaseMap,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n getAndroidModuleType,\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 Purchase,\n PurchaseResult,\n PurchaseStateAndroid,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionAmazon,\n SubscriptionAndroid,\n SubscriptionIOS,\n SubscriptionPlatform,\n SubscriptionPurchase,\n} 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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\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/**\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({skus:['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 if (!skus?.length) {\n return Promise.reject('\"skus\" is required');\n }\n return (\n Platform.select({\n ios: async (): Promise<SubscriptionIOS[]> => {\n let items: SubscriptionIOS[];\n if (isIosStorekit2()) {\n items = ((await RNIapIosSk2.getItems(skus)) as ProductSk2[]).map(\n subscriptionSk2Map,\n );\n } else {\n items = (await RNIapIos.getItems(skus)) as SubscriptionIOS[];\n }\n\n items = items.filter(\n (item: SubscriptionIOS) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n\n return addSubscriptionPlatform(items, SubscriptionPlatform.ios);\n },\n android: async (): Promise<Subscription[]> => {\n const androidPlatform = getAndroidModuleType();\n\n let subscriptions = (await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n )) as SubscriptionAndroid[] | SubscriptionAmazon[];\n\n switch (androidPlatform) {\n case 'android': {\n const castSubscriptions = subscriptions as SubscriptionAndroid[];\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.android,\n );\n }\n case 'amazon':\n let castSubscriptions = subscriptions as SubscriptionAmazon[];\n castSubscriptions = await fillProductsWithAdditionalData(\n castSubscriptions,\n );\n return addSubscriptionPlatform(\n castSubscriptions,\n SubscriptionPlatform.amazon,\n );\n case null:\n default:\n throw new Error(\n `getSubscriptions received unknown platform ${androidPlatform}. Verify the logic in getAndroidModuleType`,\n );\n }\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n\n/**\n * Adds an extra property to subscriptions so we can distinguish the platform\n * we retrieved them on.\n */\nconst addSubscriptionPlatform = <T>(\n subscriptions: T[],\n platform: SubscriptionPlatform,\n): T[] => {\n return subscriptions.map((subscription) => ({...subscription, 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. (IOS Sk2 only) 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@param {automaticallyFinishRestoredTransactions}:boolean. (IOS Sk1 only) When `true`, all the transactions that are returned are automatically\nfinished. This means that if you call this method again you won't get the same result on the same device. On the other hand, if `false` you'd\nhave to manually finish the returned transaction once you have delivered the content to your user.\n@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to false, meaning that it will return one transaction per item purchased. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n */\nexport const getPurchaseHistory = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = true,\n onlyIncludeActiveItems = false,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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@param {onlyIncludeActiveItems}:boolean. (IOS Sk2 only). Defaults to true, meaning that it will return the transaction if suscription has not expired. \n@See https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements for details\n *\n */\nexport const getAvailablePurchases = ({\n alsoPublishToEventListener = false,\n automaticallyFinishRestoredTransactions = false,\n onlyIncludeActiveItems = true,\n}: {\n alsoPublishToEventListener?: boolean;\n automaticallyFinishRestoredTransactions?: boolean;\n onlyIncludeActiveItems?: boolean;\n} = {}): Promise<Purchase[]> =>\n (\n Platform.select({\n ios: async () => {\n if (isIosStorekit2()) {\n return Promise.resolve(\n (\n await RNIapIosSk2.getAvailableItems(\n alsoPublishToEventListener,\n onlyIncludeActiveItems,\n )\n ).map(transactionSk2ToPurchaseMap),\n );\n } else {\n return RNIapIos.getAvailableItems(\n automaticallyFinishRestoredTransactions,\n );\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({skus:['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 request: RequestPurchase,\n): Promise<ProductPurchase | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS purchase');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon purchase');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (!('skus' in request) || !request.skus.length) {\n throw new Error('skus is required for Android purchase');\n }\n\n const {\n skus,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n skus,\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 request: RequestSubscription,\n): Promise<SubscriptionPurchase | null | void> =>\n (\n Platform.select({\n ios: async () => {\n if (!('sku' in request)) {\n throw new Error('sku is required for iOS subscriptions');\n }\n\n const {\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n appAccountToken,\n quantity,\n withOffer,\n } = request;\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 const purchase = transactionSk2ToPurchaseMap(\n await RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n ),\n );\n return Promise.resolve(purchase);\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' in request)) {\n throw new Error('sku is required for Amazon subscriptions');\n }\n const {sku} = request;\n return RNIapAmazonModule.buyItemByType(sku);\n } else {\n if (\n !('subscriptionOffers' in request) ||\n request.subscriptionOffers.length === 0\n ) {\n throw new Error(\n 'subscriptionOffers are required for Google Play subscriptions',\n );\n }\n\n const {\n subscriptionOffers,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n isOfferPersonalized,\n } = request;\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 @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true\n */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: Purchase;\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 await getIosModule().finishTransaction(transactionId);\n return Promise.resolve(true);\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,2BALF,QAMO,kBANP;AAOA,SACEC,8BADF,EAEEC,gBAFF,EAGEC,oBAHF,EAIEC,YAJF,EAKEC,eALF,EAMEC,QANF,EAOEC,cAPF,EAQEC,aARF,EASEC,aATF,EAUEC,kBAVF,QAWO,YAXP;AAYA,SAGEC,WAHF,EAMEC,oBANF,EAaEC,oBAbF,QAeO,SAfP;AAiBA,SAAQpB,UAAR,EAAoBD,SAApB,EAA+BE,MAA/B,EAAuCC,SAAvC,EAAkDY,cAAlD;AAEA,MAAM;EAACO,QAAD;EAAWC,WAAX;EAAwBC,WAAxB;EAAqCC;AAArC,IAA0D3B,aAAhE;AACA,MAAM4B,8BAA8B,GAAGP,WAAW,CAACQ,IAAnD;AACA,MAAMC,qBAAqB,GAAGT,WAAW,CAACU,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;MACEf,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,MAAMc,cAAc,GAAG,MAC5BnB,eAAe,GAAGmB,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,MAC3BpB,eAAe,GAAGoB,aAAlB,EADK;AAGP;AACA;AACA;AACA;;AACA,OAAO,MAAMC,0CAA0C,GACrD,MACExB,gBAAgB,GAAGyB,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,QAII;EAAA,IAJH;IAC1BC;EAD0B,CAIG;;EAC7B,IAAI,EAACA,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEC,MAAP,CAAJ,EAAmB;IACjB,OAAOC,OAAO,CAACC,MAAR,CAAe,oBAAf,CAAP;EACD;;EACD,OAAO,CACLzC,QAAQ,CAAC0C,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAIC,KAAJ;;MACA,IAAI5B,cAAc,EAAlB,EAAsB;QACpB4B,KAAK,GAAG,CAAE,MAAMpB,WAAW,CAACqB,QAAZ,CAAqBP,IAArB,CAAR,EAAqDQ,GAArD,CACNvC,aADM,CAAR;MAGD,CAJD,MAIO;QACLqC,KAAK,GAAI,MAAMrB,QAAQ,CAACsB,QAAT,CAAkBP,IAAlB,CAAf;MACD;;MACD,OAAOM,KAAK,CAACG,MAAN,CACJC,IAAD,IACEV,IAAI,CAACW,QAAL,CAAcD,IAAI,CAACE,SAAnB,KAAiCF,IAAI,CAACG,IAAL,KAAc,KAF5C,CAAP;IAID,CAda;IAedC,OAAO,EAAE,YAAY;MACnB,MAAMC,QAAQ,GAAG,MAAM1C,gBAAgB,GAAG2C,cAAnB,CACrBzB,qBADqB,EAErBS,IAFqB,CAAvB;MAKA,OAAO5B,8BAA8B,CAAC2C,QAAD,CAArC;IACD;EAtBa,CAAhB,MAuBO,MAAMb,OAAO,CAACC,MAAR,CAAe,IAAIc,KAAJ,CAAU,sBAAV,CAAf,CAvBb,CADK,GAAP;AA0BD,CAlCM;AAoCP;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,SAID;EAAA,IAJE;IAC/BlB;EAD+B,CAIF;;EAC7B,IAAI,EAACA,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEC,MAAP,CAAJ,EAAmB;IACjB,OAAOC,OAAO,CAACC,MAAR,CAAe,oBAAf,CAAP;EACD;;EACD,OAAO,CACLzC,QAAQ,CAAC0C,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAwC;MAC3C,IAAIC,KAAJ;;MACA,IAAI5B,cAAc,EAAlB,EAAsB;QACpB4B,KAAK,GAAG,CAAE,MAAMpB,WAAW,CAACqB,QAAZ,CAAqBP,IAArB,CAAR,EAAqDQ,GAArD,CACNtC,kBADM,CAAR;MAGD,CAJD,MAIO;QACLoC,KAAK,GAAI,MAAMrB,QAAQ,CAACsB,QAAT,CAAkBP,IAAlB,CAAf;MACD;;MAEDM,KAAK,GAAGA,KAAK,CAACG,MAAN,CACLC,IAAD,IACEV,IAAI,CAACW,QAAL,CAAcD,IAAI,CAACE,SAAnB,KAAiCF,IAAI,CAACG,IAAL,KAAc,MAF3C,CAAR;MAKA,OAAOM,uBAAuB,CAACb,KAAD,EAAQtB,oBAAoB,CAACqB,GAA7B,CAA9B;IACD,CAjBa;IAkBdS,OAAO,EAAE,YAAqC;MAC5C,MAAMM,eAAe,GAAG9C,oBAAoB,EAA5C;MAEA,IAAI+C,aAAa,GAAI,MAAMhD,gBAAgB,GAAG2C,cAAnB,CACzB3B,8BADyB,EAEzBW,IAFyB,CAA3B;;MAKA,QAAQoB,eAAR;QACE,KAAK,SAAL;UAAgB;YACd,MAAME,iBAAiB,GAAGD,aAA1B;YACA,OAAOF,uBAAuB,CAC5BG,iBAD4B,EAE5BtC,oBAAoB,CAAC8B,OAFO,CAA9B;UAID;;QACD,KAAK,QAAL;UACE,IAAIQ,iBAAiB,GAAGD,aAAxB;UACAC,iBAAiB,GAAG,MAAMlD,8BAA8B,CACtDkD,iBADsD,CAAxD;UAGA,OAAOH,uBAAuB,CAC5BG,iBAD4B,EAE5BtC,oBAAoB,CAACuC,MAFO,CAA9B;;QAIF,KAAK,IAAL;QACA;UACE,MAAM,IAAIN,KAAJ,CACH,8CAA6CG,eAAgB,4CAD1D,CAAN;MAnBJ;IAuBD;EAjDa,CAAhB,MAkDO,MAAMlB,OAAO,CAACC,MAAR,CAAe,IAAIc,KAAJ,CAAU,sBAAV,CAAf,CAlDb,CADK,GAAP;AAqDD,CA7DM;AA+DP;AACA;AACA;AACA;;AACA,MAAME,uBAAuB,GAAG,CAC9BE,aAD8B,EAE9BG,QAF8B,KAGtB;EACR,OAAOH,aAAa,CAACb,GAAd,CAAmBiB,YAAD,KAAmB,EAAC,GAAGA,YAAJ;IAAkBD;EAAlB,CAAnB,CAAlB,CAAP;AACD,CALD;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAME,kBAAkB,GAAG;EAAA,IAAC;IACjCC,0BAA0B,GAAG,KADI;IAEjCC,uCAAuC,GAAG,IAFT;IAGjCC,sBAAsB,GAAG;EAHQ,CAAD,uEAQ9B,EAR8B;EAAA,OAShC,CACEnE,QAAQ,CAAC0C,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAI3B,cAAc,EAAlB,EAAsB;QACpB,OAAOwB,OAAO,CAAC4B,OAAR,CACL,CACE,MAAM5C,WAAW,CAAC6C,iBAAZ,CACJJ,0BADI,EAEJE,sBAFI,CADR,EAKErB,GALF,CAKMrC,2BALN,CADK,CAAP;MAQD,CATD,MASO;QACL,OAAOc,QAAQ,CAAC8C,iBAAT,CACLH,uCADK,CAAP;MAGD;IACF,CAhBa;IAiBdd,OAAO,EAAE,YAAY;MACnB,IAAI1B,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAAC2C,iBAAlB,EAAb;MACD;;MAED,MAAMhB,QAAQ,GAAG,MAAM5B,WAAW,CAAC6C,wBAAZ,CACrBzC,qBADqB,CAAvB;MAIA,MAAM8B,aAAa,GAAG,MAAMlC,WAAW,CAAC6C,wBAAZ,CAC1B3C,8BAD0B,CAA5B;MAIA,OAAO0B,QAAQ,CAACkB,MAAT,CAAgBZ,aAAhB,CAAP;IACD;EA/Ba,CAAhB,MAgCO,MAAMnB,OAAO,CAAC4B,OAAR,CAAgB,EAAhB,CAhCb,CADF,GATgC;AAAA,CAA3B;AA6CP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;IACpCP,0BAA0B,GAAG,KADO;IAEpCC,uCAAuC,GAAG,KAFN;IAGpCC,sBAAsB,GAAG;EAHW,CAAD,uEAQjC,EARiC;EAAA,OASnC,CACEnE,QAAQ,CAAC0C,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,IAAI3B,cAAc,EAAlB,EAAsB;QACpB,OAAOwB,OAAO,CAAC4B,OAAR,CACL,CACE,MAAM5C,WAAW,CAAC6C,iBAAZ,CACJJ,0BADI,EAEJE,sBAFI,CADR,EAKErB,GALF,CAKMrC,2BALN,CADK,CAAP;MAQD,CATD,MASO;QACL,OAAOc,QAAQ,CAAC8C,iBAAT,CACLH,uCADK,CAAP;MAGD;IACF,CAhBa;IAiBdd,OAAO,EAAE,YAAY;MACnB,IAAI1B,iBAAJ,EAAuB;QACrB,OAAO,MAAMA,iBAAiB,CAAC2C,iBAAlB,EAAb;MACD;;MAED,MAAMhB,QAAQ,GAAG,MAAM5B,WAAW,CAACgD,uBAAZ,CACrB5C,qBADqB,CAAvB;MAIA,MAAM8B,aAAa,GAAG,MAAMlC,WAAW,CAACgD,uBAAZ,CAC1B9C,8BAD0B,CAA5B;MAIA,OAAO0B,QAAQ,CAACkB,MAAT,CAAgBZ,aAAhB,CAAP;IACD;EA/Ba,CAAhB,MAgCO,MAAMnB,OAAO,CAAC4B,OAAR,CAAgB,EAAhB,CAhCb,CADF,GATmC;AAAA,CAA9B;AA6CP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,GAC1BC,OAD6B,IAG7B,CACE3E,QAAQ,CAAC0C,MAAT,CAAgB;EACdC,GAAG,EAAE,YAAY;IACf,IAAI,EAAE,SAASgC,OAAX,CAAJ,EAAyB;MACvB,MAAM,IAAIpB,KAAJ,CAAU,kCAAV,CAAN;IACD;;IAED,MAAM;MACJqB,GADI;MAEJC,+CAA+C,GAAG,KAF9C;MAGJC,eAHI;MAIJC,QAJI;MAKJC;IALI,IAMFL,OANJ;;IAQA,IAAIE,+CAAJ,EAAqD;MACnDI,OAAO,CAACC,IAAR,CACE,wXADF;IAGD;;IACD,IAAIlE,cAAc,EAAlB,EAAsB;MACpB,MAAMmE,KAAK,GAAG7E,WAAW,CAAC0E,SAAD,CAAzB;MAEA,MAAMI,QAAQ,GAAG3E,2BAA2B,CAC1C,MAAMe,WAAW,CAAC6D,UAAZ,CACJT,GADI,EAEJC,+CAFI,EAGJC,eAHI,EAIJC,QAAQ,IAAI,CAAC,CAJT,EAKJI,KALI,CADoC,CAA5C;MASA,OAAO3C,OAAO,CAAC4B,OAAR,CAAgBgB,QAAhB,CAAP;IACD,CAbD,MAaO;MACL,OAAO7D,QAAQ,CAAC8D,UAAT,CACLT,GADK,EAELC,+CAFK,EAGLC,eAHK,EAILC,QAAQ,IAAI,CAAC,CAJR,EAKL1E,aAAa,CAAC2E,SAAD,CALR,CAAP;IAOD;EACF,CAzCa;EA0Cd5B,OAAO,EAAE,YAAY;IACnB,IAAIrC,QAAJ,EAAc;MACZ,IAAI,EAAE,SAAS4D,OAAX,CAAJ,EAAyB;QACvB,MAAM,IAAIpB,KAAJ,CAAU,qCAAV,CAAN;MACD;;MACD,MAAM;QAACqB;MAAD,IAAQD,OAAd;MACA,OAAOjD,iBAAiB,CAAC4D,aAAlB,CAAgCV,GAAhC,CAAP;IACD,CAND,MAMO;MACL,IAAI,EAAE,UAAUD,OAAZ,KAAwB,CAACA,OAAO,CAACrC,IAAR,CAAaC,MAA1C,EAAkD;QAChD,MAAM,IAAIgB,KAAJ,CAAU,uCAAV,CAAN;MACD;;MAED,MAAM;QACJjB,IADI;QAEJiD,0BAFI;QAGJC,0BAHI;QAIJC;MAJI,IAKFd,OALJ;MAMA,OAAOhE,gBAAgB,GAAG2E,aAAnB,CACLzD,qBADK,EAELS,IAFK,EAGLoD,SAHK,EAIL,CAAC,CAJI,EAKLH,0BALK,EAMLC,0BANK,EAOL,EAPK,EAQLC,mBAAmB,IAAI,KARlB,CAAP;IAUD;EACF;AAvEa,CAAhB,KAwEMjD,OAAO,CAAC4B,OAzEhB,GAHK;AA+EP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMuB,mBAAmB,GAC9BhB,OADiC,IAGjC,CACE3E,QAAQ,CAAC0C,MAAT,CAAgB;EACdC,GAAG,EAAE,YAAY;IACf,IAAI,EAAE,SAASgC,OAAX,CAAJ,EAAyB;MACvB,MAAM,IAAIpB,KAAJ,CAAU,uCAAV,CAAN;IACD;;IAED,MAAM;MACJqB,GADI;MAEJC,+CAA+C,GAAG,KAF9C;MAGJC,eAHI;MAIJC,QAJI;MAKJC;IALI,IAMFL,OANJ;;IAQA,IAAIE,+CAAJ,EAAqD;MACnDI,OAAO,CAACC,IAAR,CACE,wXADF;IAGD;;IAED,IAAIlE,cAAc,EAAlB,EAAsB;MACpB,MAAMmE,KAAK,GAAG7E,WAAW,CAAC0E,SAAD,CAAzB;MAEA,MAAMI,QAAQ,GAAG3E,2BAA2B,CAC1C,MAAMe,WAAW,CAAC6D,UAAZ,CACJT,GADI,EAEJC,+CAFI,EAGJC,eAHI,EAIJC,QAAQ,IAAI,CAAC,CAJT,EAKJI,KALI,CADoC,CAA5C;MASA,OAAO3C,OAAO,CAAC4B,OAAR,CAAgBgB,QAAhB,CAAP;IACD,CAbD,MAaO;MACL,OAAO7D,QAAQ,CAAC8D,UAAT,CACLT,GADK,EAELC,+CAFK,EAGLC,eAHK,EAILC,QAAQ,IAAI,CAAC,CAJR,EAKL1E,aAAa,CAAC2E,SAAD,CALR,CAAP;IAOD;EACF,CA1Ca;EA2Cd5B,OAAO,EAAE,YAAY;IACnB,IAAIrC,QAAJ,EAAc;MACZ,IAAI,EAAE,SAAS4D,OAAX,CAAJ,EAAyB;QACvB,MAAM,IAAIpB,KAAJ,CAAU,0CAAV,CAAN;MACD;;MACD,MAAM;QAACqB;MAAD,IAAQD,OAAd;MACA,OAAOjD,iBAAiB,CAAC4D,aAAlB,CAAgCV,GAAhC,CAAP;IACD,CAND,MAMO;MACL,IACE,EAAE,wBAAwBD,OAA1B,KACAA,OAAO,CAACiB,kBAAR,CAA2BrD,MAA3B,KAAsC,CAFxC,EAGE;QACA,MAAM,IAAIgB,KAAJ,CACJ,+DADI,CAAN;MAGD;;MAED,MAAM;QACJqC,kBADI;QAEJC,oBAFI;QAGJC,oBAAoB,GAAG,CAAC,CAHpB;QAIJP,0BAJI;QAKJC,0BALI;QAMJC;MANI,IAOFd,OAPJ;MASA,OAAOlD,WAAW,CAAC6D,aAAZ,CACL3D,8BADK,EAELiE,kBAFK,aAELA,kBAFK,uBAELA,kBAAkB,CAAE9C,GAApB,CAAyBiD,EAAD,IAAQA,EAAE,CAACnB,GAAnC,CAFK,EAGLiB,oBAHK,EAILC,oBAJK,EAKLP,0BALK,EAMLC,0BANK,EAOLI,kBAPK,aAOLA,kBAPK,uBAOLA,kBAAkB,CAAE9C,GAApB,CAAyBiD,EAAD,IAAQA,EAAE,CAACC,UAAnC,CAPK,EAQLP,mBAAmB,IAAI,KARlB,CAAP;IAUD;EACF;AAhFa,CAAhB,MAiFO,MAAMjD,OAAO,CAAC4B,OAAR,CAAgB,IAAhB,CAjFb,CADF,GAHK;AAwFP;AACA;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,MAAM6B,iBAAiB,GAAG,SAQQ;EAAA,IARP;IAChCb,QADgC;IAEhCc,YAFgC;IAGhCC;EAHgC,CAQO;EACvC,OAAO,CACLnG,QAAQ,CAAC0C,MAAT,CAAgB;IACdC,GAAG,EAAE,YAAY;MACf,MAAMyD,aAAa,GAAGhB,QAAQ,CAACgB,aAA/B;;MAEA,IAAI,CAACA,aAAL,EAAoB;QAClB,OAAO5D,OAAO,CAACC,MAAR,CACL,IAAIc,KAAJ,CAAU,kDAAV,CADK,CAAP;MAGD;;MACD,MAAM1C,YAAY,GAAGoF,iBAAf,CAAiCG,aAAjC,CAAN;MACA,OAAO5D,OAAO,CAAC4B,OAAR,CAAgB,IAAhB,CAAP;IACD,CAXa;IAYdhB,OAAO,EAAE,YAAY;MACnB,IAAIgC,QAAJ,aAAIA,QAAJ,eAAIA,QAAQ,CAAEiB,aAAd,EAA6B;QAC3B,IAAIH,YAAJ,EAAkB;UAChB,OAAOvF,gBAAgB,GAAG2F,cAAnB,CACLlB,QAAQ,CAACiB,aADJ,EAELF,uBAFK,CAAP;QAID,CALD,MAKO,IACLf,QAAQ,CAACmB,YAAT,IACC,CAACnB,QAAQ,CAACoB,qBAAV,IACCpB,QAAQ,CAACqB,oBAAT,KAAkCpF,oBAAoB,CAACqF,SAHpD,EAIL;UACA,OAAO/F,gBAAgB,GAAGgG,mBAAnB,CACLvB,QAAQ,CAACiB,aADJ,EAELF,uBAFK,CAAP;QAID,CATM,MASA;UACL,OAAO3D,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;EArCa,CAAhB,MAsCO,MAAMf,OAAO,CAACC,MAAR,CAAe,IAAIc,KAAJ,CAAU,sBAAV,CAAf,CAtCb,CADK,GAAP;AAyCD,CAlDM"}
@@ -122,7 +122,7 @@ import {getSubscriptions} from 'react-native-iap';
122
122
  const App = () => {
123
123
  const subscriptions = useCallback(
124
124
  async () =>
125
- await getSubscriptions(['com.example.product1', 'com.example.product2']),
125
+ await getSubscriptions({skus:['com.example.product1', 'com.example.product2']}),
126
126
  [],
127
127
  );
128
128
 
@@ -300,7 +300,7 @@ import {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';
300
300
 
301
301
  const App = () => {
302
302
  const products = useCallback(
303
- async () => getProducts(['com.example.product']),
303
+ async () => getProducts({skus:['com.example.product']}),
304
304
  [],
305
305
  );
306
306
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-iap",
3
- "version": "12.4.8",
3
+ "version": "12.4.9",
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
@@ -225,7 +225,7 @@ import {getSubscriptions} from 'react-native-iap';
225
225
  const App = () => {
226
226
  const subscriptions = useCallback(
227
227
  async () =>
228
- await getSubscriptions(['com.example.product1', 'com.example.product2']),
228
+ await getSubscriptions({skus:['com.example.product1', 'com.example.product2']}),
229
229
  [],
230
230
  );
231
231
 
@@ -554,7 +554,7 @@ import {requestPurchase, Product, Sku, getProducts} from 'react-native-iap';
554
554
 
555
555
  const App = () => {
556
556
  const products = useCallback(
557
- async () => getProducts(['com.example.product']),
557
+ async () => getProducts({skus:['com.example.product']}),
558
558
  [],
559
559
  );
560
560