react-native-iap 8.6.2 → 9.0.0-beta11

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.
@@ -1 +1 @@
1
- {"version":3,"names":["Linking","NativeEventEmitter","NativeModules","Platform","ReceiptValidationStatus","IAPErrorCode","InstallSourceAndroid","PurchaseStateAndroid","RNIapIos","RNIapModule","RNIapAmazonModule","isAndroid","OS","ANDROID_ITEM_TYPE_SUBSCRIPTION","ANDROID_ITEM_TYPE_IAP","getInstallSourceAndroid","GOOGLE_PLAY","AMAZON","checkNativeAndroidAvailable","Error","E_IAP_NOT_AVAILABLE","getAndroidModule","checkNativeIOSAvailable","getIosModule","getNativeModule","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","fillProductsAdditionalData","products","user","getUser","currencies","CA","ES","AU","DE","IN","US","JP","GB","IT","BR","FR","currency","userMarketplaceAmazon","forEach","product","getProducts","skus","select","ios","items","getItems","filter","item","includes","productId","type","android","getItemsByType","Promise","resolve","getSubscriptions","subscriptions","getPurchaseHistory","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","sku","andDangerouslyFinishTransactionAutomaticallyIOS","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","applicationUsername","console","warn","buyProduct","buyItemByType","requestSubscription","purchaseTokenAndroid","prorationModeAndroid","requestPurchaseWithQuantityIOS","quantity","buyProductWithQuantityIOS","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","consumeProduct","purchaseToken","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase","clearTransactionIOS","clearTransaction","clearProductsIOS","clearProducts","acknowledgePurchaseAndroid","token","developerPayload","deepLinkToSubscriptionsAndroid","openURL","getPackageName","getPromotedProductIOS","promotedProduct","buyPromotedProductIOS","buyPromotedProduct","fetchJsonOrThrow","url","receiptBody","response","fetch","method","headers","Accept","body","JSON","stringify","ok","Object","assign","statusText","statusCode","status","json","requestAgnosticReceiptValidationIos","TEST_RECEIPT","testResponse","requestPurchaseWithOfferIOS","forUser","withOffer","buyProductWithOffer","validateReceiptIos","isTest","validateReceiptAndroid","packageName","productToken","accessToken","isSub","validateReceiptAmazon","developerSecret","userId","receiptId","useSandbox","sandBoxUrl","purchaseUpdatedListener","listener","emitterSubscription","addListener","startListening","purchaseErrorListener","promotedProductListener","getPendingPurchasesIOS","getPendingTransactions","presentCodeRedemptionSheetIOS","presentCodeRedemptionSheet"],"sources":["iap.ts"],"sourcesContent":["import {\n EmitterSubscription,\n Linking,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nimport type * as Amazon from './types/amazon';\nimport type * as Android from './types/android';\nimport type * as Apple from './types/apple';\nimport {ReceiptValidationStatus} from './types/apple';\nimport type {\n InAppPurchase,\n Product,\n ProductCommon,\n ProductPurchase,\n PurchaseError,\n PurchaseResult,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionPurchase,\n} from './types';\nimport {\n IAPErrorCode,\n InstallSourceAndroid,\n PurchaseStateAndroid,\n} from './types';\n\nconst {RNIapIos, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst isAndroid = Platform.OS === 'android';\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = 'subs';\nconst ANDROID_ITEM_TYPE_IAP = 'inapp';\n\nexport const getInstallSourceAndroid = (): InstallSourceAndroid => {\n return RNIapModule\n ? InstallSourceAndroid.GOOGLE_PLAY\n : InstallSourceAndroid.AMAZON;\n};\n\nconst checkNativeAndroidAvailable = (): void => {\n if (!RNIapModule && !RNIapAmazonModule) {\n throw new Error(IAPErrorCode.E_IAP_NOT_AVAILABLE);\n }\n};\n\nconst getAndroidModule = (): typeof RNIapModule | typeof RNIapAmazonModule => {\n checkNativeAndroidAvailable();\n\n return RNIapModule ? RNIapModule : RNIapAmazonModule;\n};\n\nconst checkNativeIOSAvailable = (): void => {\n if (!RNIapIos) {\n throw new Error(IAPErrorCode.E_IAP_NOT_AVAILABLE);\n }\n};\n\nconst getIosModule = (): typeof RNIapIos => {\n checkNativeIOSAvailable();\n\n return RNIapIos;\n};\n\nconst getNativeModule = ():\n | typeof RNIapModule\n | typeof RNIapAmazonModule\n | typeof RNIapIos => {\n if (isAndroid) {\n return getAndroidModule();\n }\n\n return getIosModule();\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * @returns {Promise<boolean>}\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * End module for purchase flow.\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<void> =>\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 = (): Promise<\n string[]\n> => getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Fill products with additional data\n * @param {Array<ProductCommon>} products Products\n */\nconst fillProductsAdditionalData = async (\n products: Array<ProductCommon>,\n): Promise<Array<ProductCommon>> => {\n // Amazon\n if (RNIapAmazonModule) {\n // On amazon we must get the user marketplace to detect the currency\n const user = await RNIapAmazonModule.getUser();\n\n const currencies = {\n CA: 'CAD',\n ES: 'EUR',\n AU: 'AUD',\n DE: 'EUR',\n IN: 'INR',\n US: 'USD',\n JP: 'JPY',\n GB: 'GBP',\n IT: 'EUR',\n BR: 'BRL',\n FR: 'EUR',\n };\n\n const currency =\n currencies[user.userMarketplaceAmazon as keyof typeof currencies];\n\n // Add currency to products\n products.forEach((product) => {\n if (currency) {\n product.currency = currency;\n }\n });\n }\n\n return products;\n};\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n * @param {string[]} skus The item skus\n * @returns {Promise<Product[]>}\n */\nexport const getProducts = (skus: string[]): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n const items = await getIosModule().getItems(skus);\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 fillProductsAdditionalData(products);\n },\n }) || Promise.resolve\n )();\n\n/**\n * Get a list of subscriptions\n * @param {string[]} skus The item skus\n * @returns {Promise<Subscription[]>}\n */\nexport const getSubscriptions = (skus: string[]): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async () => {\n const items = await getIosModule().getItems(skus);\n\n return items.filter(\n (item: Subscription) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n },\n android: async () => {\n const subscriptions = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n );\n\n return fillProductsAdditionalData(subscriptions);\n },\n }) || Promise.resolve\n )();\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * @returns {Promise<(InAppPurchase | SubscriptionPurchase)[]>}\n */\nexport const getPurchaseHistory = (): Promise<\n (InAppPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems();\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await getAndroidModule().getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await getAndroidModule().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 * @returns {Promise<(InAppPurchase | SubscriptionPurchase)[]>}\n */\nexport const getAvailablePurchases = (): Promise<\n (InAppPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems();\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await getAndroidModule().getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await getAndroidModule().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 * @param {string} sku The product's sku/ID\n * @param {string} [applicationUsername] The purchaser's user ID\n * @param {boolean} [andDangerouslyFinishTransactionAutomaticallyIOS] You should set this to false 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 * @param {string} [obfuscatedAccountIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n * @param {string} [obfuscatedProfileIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n * @returns {Promise<InAppPurchase>}\n */\n\nexport const requestPurchase = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n applicationUsername,\n}: RequestPurchase): Promise<InAppPurchase> =>\n (\n Platform.select({\n ios: async () => {\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 return getIosModule().buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n applicationUsername,\n );\n },\n android: async () => {\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n sku,\n null,\n 0,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n );\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * @param {string} [sku] The product's sku/ID\n * @param {string} [applicationUsername] The purchaser's user ID\n * @param {boolean} [andDangerouslyFinishTransactionAutomaticallyIOS] You should set this to false 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 * @param {string} [purchaseTokenAndroid] purchaseToken that the user is upgrading or downgrading from (Android).\n * @param {ProrationModesAndroid} [prorationModeAndroid] UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED\n * @param {string} [obfuscatedAccountIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n * @param {string} [obfuscatedProfileIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n * @returns {Promise<SubscriptionPurchase | null>} Promise resolves to null when using proratioModesAndroid=DEFERRED, and to a SubscriptionPurchase otherwise\n */\nexport const requestSubscription = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n applicationUsername,\n}: RequestSubscription): Promise<SubscriptionPurchase | null> =>\n (\n Platform.select({\n ios: async () => {\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 return getIosModule().buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n applicationUsername,\n );\n },\n android: async () => {\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n sku,\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n );\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * @param {string} sku The product's sku/ID\n * @returns {Promise<void>}\n */\nexport const requestPurchaseWithQuantityIOS = (\n sku: string,\n quantity: number,\n): Promise<InAppPurchase> =>\n getIosModule().buyProductWithQuantityIOS(sku, quantity);\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 * @param {object} purchase The purchase that you would like to finish.\n * @param {boolean} isConsumable Checks if purchase is consumable. Has effect on `android`.\n * @param {string} developerPayloadAndroid Android developerPayload.\n * @returns {Promise<string | void> }\n */\nexport const finishTransaction = (\n purchase: InAppPurchase | ProductPurchase,\n isConsumable?: boolean,\n developerPayloadAndroid?: string,\n): Promise<string | void> => {\n return (\n Platform.select({\n ios: async () => {\n return getIosModule().finishTransaction(purchase.transactionId);\n },\n android: async () => {\n if (purchase) {\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 throw new Error('purchase is not suitable to be purchased');\n }\n } else {\n throw new Error('purchase is not assigned');\n }\n },\n }) || Promise.resolve\n )();\n};\n\n/**\n * Clear Transaction (iOS only)\n * Finish remaining transactions. Related to issue #257 and #801\n * link : https://github.com/dooboolab/react-native-iap/issues/257\n * https://github.com/dooboolab/react-native-iap/issues/801\n * @returns {Promise<void>}\n */\nexport const clearTransactionIOS = (): Promise<void> =>\n getIosModule().clearTransaction();\n\n/**\n * Clear valid Products (iOS only)\n * Remove all products which are validated by Apple server.\n * @returns {void}\n */\nexport const clearProductsIOS = (): Promise<void> =>\n getIosModule().clearProducts();\n\n/**\n * Acknowledge a product (on Android.) No-op on iOS.\n * @param {string} token The product's token (on Android)\n * @returns {Promise<PurchaseResult | void>}\n */\nexport const acknowledgePurchaseAndroid = (\n token: string,\n developerPayload?: string,\n): Promise<PurchaseResult | void> => {\n return getAndroidModule().acknowledgePurchase(token, developerPayload);\n};\n\n/**\n * Deep link to subscriptions screen on Android. No-op on iOS.\n * @param {string} sku The product's SKU (on Android)\n * @returns {Promise<void>}\n */\nexport const deepLinkToSubscriptionsAndroid = async (\n sku: string,\n): Promise<void> => {\n checkNativeAndroidAvailable();\n\n return Linking.openURL(\n `https://play.google.com/store/account/subscriptions?package=${await RNIapModule.getPackageName()}&sku=${sku}`,\n );\n};\n\n/**\n * Should Add Store Payment (iOS only)\n * Indicates the the App Store purchase should continue from the app instead of the App Store.\n * @returns {Promise<Product | null>} promoted product\n */\nexport const getPromotedProductIOS = (): Promise<Product | null> =>\n getIosModule().promotedProduct();\n\n/**\n * Buy the currently selected promoted product (iOS only)\n * Initiates the payment process for a promoted product. Should only be called in response to the `iap-promoted-product` event.\n * @returns {Promise<void>}\n */\nexport const buyPromotedProductIOS = (): Promise<void> =>\n getIosModule().buyPromotedProduct();\n\nconst fetchJsonOrThrow = async (\n url: string,\n receiptBody: Record<string, unknown>,\n): Promise<Apple.ReceiptValidationResponse | false> => {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(receiptBody),\n });\n\n if (!response.ok) {\n throw Object.assign(new Error(response.statusText), {\n statusCode: response.status,\n });\n }\n\n return response.json();\n};\n\nconst requestAgnosticReceiptValidationIos = async (\n receiptBody: Record<string, unknown>,\n): Promise<Apple.ReceiptValidationResponse | false> => {\n const response = await fetchJsonOrThrow(\n 'https://buy.itunes.apple.com/verifyReceipt',\n receiptBody,\n );\n\n // Best practice is to check for test receipt and check sandbox instead\n // https://developer.apple.com/documentation/appstorereceipts/verifyreceipt\n if (response && response.status === ReceiptValidationStatus.TEST_RECEIPT) {\n const testResponse = await fetchJsonOrThrow(\n 'https://sandbox.itunes.apple.com/verifyReceipt',\n receiptBody,\n );\n\n return testResponse;\n }\n\n return response;\n};\n\n/**\n * Buy products or subscriptions with offers (iOS only)\n *\n * Runs the payment process with some info you must fetch\n * from your server.\n * @param {string} sku The product identifier\n * @param {string} forUser An user identifier on you system\n * @param {Apple.PaymentDiscount} withOffer The offer information\n * @param {string} withOffer.identifier The offer identifier\n * @param {string} withOffer.keyIdentifier Key identifier that it uses to generate the signature\n * @param {string} withOffer.nonce An UUID returned from the server\n * @param {string} withOffer.signature The actual signature returned from the server\n * @param {number} withOffer.timestamp The timestamp of the signature\n * @returns {Promise<void>}\n */\nexport const requestPurchaseWithOfferIOS = (\n sku: string,\n forUser: string,\n withOffer: Apple.PaymentDiscount,\n): Promise<void> => getIosModule().buyProductWithOffer(sku, forUser, withOffer);\n\n/**\n * Validate receipt for iOS.\n * @param {object} receiptBody the receipt body to send to apple server.\n * @param {boolean} isTest whether this is in test environment which is sandbox.\n * @returns {Promise<Apple.ReceiptValidationResponse | false>}\n */\nexport const validateReceiptIos = async (\n receiptBody: Record<string, unknown>,\n isTest?: boolean,\n): Promise<Apple.ReceiptValidationResponse | false> => {\n if (isTest == null) {\n return await requestAgnosticReceiptValidationIos(receiptBody);\n }\n\n const url = isTest\n ? 'https://sandbox.itunes.apple.com/verifyReceipt'\n : 'https://buy.itunes.apple.com/verifyReceipt';\n\n const response = await fetchJsonOrThrow(url, receiptBody);\n\n return response;\n};\n\n/**\n * Validate receipt for Android. NOTE: This method is here for debugging purposes only. Including\n * your access token in the binary you ship to users is potentially dangerous.\n * Use server side validation instead for your production builds\n * @param {string} packageName package name of your app.\n * @param {string} productId product id for your in app product.\n * @param {string} productToken token for your purchase.\n * @param {string} accessToken accessToken from googleApis.\n * @param {boolean} isSub whether this is subscription or inapp. `true` for subscription.\n * @returns {Promise<object>}\n */\nexport const validateReceiptAndroid = async (\n packageName: string,\n productId: string,\n productToken: string,\n accessToken: string,\n isSub?: boolean,\n): Promise<Android.ReceiptType> => {\n const type = isSub ? 'subscriptions' : 'products';\n\n const url =\n 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications' +\n `/${packageName}/purchases/${type}/${productId}` +\n `/tokens/${productToken}?access_token=${accessToken}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw Object.assign(new Error(response.statusText), {\n statusCode: response.status,\n });\n }\n\n return response.json();\n};\n\n/**\n * Validate receipt for Amazon. NOTE: This method is here for debugging purposes only. Including\n * your developer secret in the binary you ship to users is potentially dangerous.\n * Use server side validation instead for your production builds\n * @param {string} developerSecret: from the Amazon developer console.\n * @param {string} userId who purchased the item.\n * @param {string} receiptId long obfuscated string returned when purchasing the item\n * @param {boolean} useSandbox Defaults to true, use sandbox environment or production.\n * @returns {Promise<object>}\n */\nexport const validateReceiptAmazon = async (\n developerSecret: string,\n userId: string,\n receiptId: string,\n useSandbox: boolean = true,\n): Promise<Amazon.ReceiptType> => {\n const sandBoxUrl = useSandbox ? 'sandbox/' : '';\n const url = `https://appstore-sdk.amazon.com/${sandBoxUrl}version/1.0/verifyReceiptId/developer/${developerSecret}/user/${userId}/receiptId/${receiptId}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw Object.assign(new Error(response.statusText), {\n statusCode: response.status,\n });\n }\n\n return response.json();\n};\n\n/**\n * Add IAP purchase event\n * @returns {callback(e: InAppPurchase | ProductPurchase)}\n */\nexport const purchaseUpdatedListener = (\n listener: (event: InAppPurchase | SubscriptionPurchase) => void,\n): EmitterSubscription => {\n const emitterSubscription = new NativeEventEmitter(\n getNativeModule(),\n ).addListener('purchase-updated', listener);\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n * @returns {callback(e: PurchaseError)}\n */\nexport const purchaseErrorListener = (\n listener: (errorEvent: PurchaseError) => void,\n): EmitterSubscription =>\n new NativeEventEmitter(getNativeModule()).addListener(\n 'purchase-error',\n listener,\n );\n\n/**\n * Add IAP promoted subscription event\n * Only available on iOS\n */\nexport const promotedProductListener = (\n listener: () => void,\n): EmitterSubscription =>\n new NativeEventEmitter(getIosModule()).addListener(\n 'iap-promoted-product',\n listener,\n );\n\n/**\n * Get the current receipt base64 encoded in IOS.\n * @param {forceRefresh?:boolean}\n * @returns {Promise<ProductPurchase[]>}\n */\nexport const getPendingPurchasesIOS = async (): Promise<ProductPurchase[]> =>\n getIosModule().getPendingTransactions();\n\n/**\n * Launches a modal to register the redeem offer code in IOS.\n * @returns {Promise<null>}\n */\nexport const presentCodeRedemptionSheetIOS = async (): Promise<null> =>\n getIosModule().presentCodeRedemptionSheet();\n"],"mappings":"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"}
1
+ {"version":3,"names":["Linking","NativeEventEmitter","NativeModules","Platform","ReceiptValidationStatus","IAPErrorCode","InstallSourceAndroid","PurchaseStateAndroid","RNIapIos","RNIapModule","RNIapAmazonModule","isAndroid","OS","ANDROID_ITEM_TYPE_SUBSCRIPTION","ANDROID_ITEM_TYPE_IAP","getInstallSourceAndroid","GOOGLE_PLAY","AMAZON","androidNativeModule","setAndroidNativeModule","nativeModule","checkNativeAndroidAvailable","Error","E_IAP_NOT_AVAILABLE","getAndroidModule","checkNativeIOSAvailable","getIosModule","getNativeModule","initConnection","endConnection","flushFailedPurchasesCachedAsPendingAndroid","flushFailedPurchasesCachedAsPending","fillProductsAdditionalData","products","user","getUser","currencies","CA","ES","AU","DE","IN","US","JP","GB","IT","BR","FR","currency","userMarketplaceAmazon","forEach","product","getProducts","skus","select","ios","items","getItems","filter","item","includes","productId","type","android","getItemsByType","Promise","resolve","getSubscriptions","subscriptions","getPurchaseHistory","getAvailableItems","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","sku","andDangerouslyFinishTransactionAutomaticallyIOS","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","applicationUsername","console","warn","buyProduct","buyItemByType","undefined","requestSubscription","purchaseTokenAndroid","prorationModeAndroid","selectedOfferIndexArr","requestPurchaseWithQuantityIOS","quantity","buyProductWithQuantityIOS","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","consumeProduct","purchaseToken","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase","clearTransactionIOS","clearTransaction","clearProductsIOS","clearProducts","acknowledgePurchaseAndroid","token","developerPayload","deepLinkToSubscriptionsAndroid","openURL","getPackageName","getPromotedProductIOS","promotedProduct","buyPromotedProductIOS","buyPromotedProduct","fetchJsonOrThrow","url","receiptBody","response","fetch","method","headers","Accept","body","JSON","stringify","ok","Object","assign","statusText","statusCode","status","json","requestAgnosticReceiptValidationIos","TEST_RECEIPT","testResponse","requestPurchaseWithOfferIOS","forUser","withOffer","buyProductWithOffer","validateReceiptIos","isTest","validateReceiptAndroid","packageName","productToken","accessToken","isSub","validateReceiptAmazon","developerSecret","userId","receiptId","useSandbox","sandBoxUrl","purchaseUpdatedListener","listener","emitterSubscription","addListener","startListening","purchaseErrorListener","promotedProductListener","getPendingPurchasesIOS","getPendingTransactions","presentCodeRedemptionSheetIOS","presentCodeRedemptionSheet"],"sources":["iap.ts"],"sourcesContent":["import {\n EmitterSubscription,\n Linking,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nimport type * as Amazon from './types/amazon';\nimport type * as Android from './types/android';\nimport type * as Apple from './types/apple';\nimport {ReceiptValidationStatus} from './types/apple';\nimport type {\n InAppPurchase,\n Product,\n ProductCommon,\n ProductPurchase,\n PurchaseError,\n PurchaseResult,\n RequestPurchase,\n RequestSubscription,\n Subscription,\n SubscriptionPurchase,\n} from './types';\nimport {\n IAPErrorCode,\n InstallSourceAndroid,\n PurchaseStateAndroid,\n} from './types';\n\nconst {RNIapIos, RNIapModule, RNIapAmazonModule} = NativeModules;\nconst isAndroid = Platform.OS === 'android';\nconst ANDROID_ITEM_TYPE_SUBSCRIPTION = 'subs';\nconst ANDROID_ITEM_TYPE_IAP = 'inapp';\n\nexport const getInstallSourceAndroid = (): InstallSourceAndroid => {\n return RNIapModule\n ? InstallSourceAndroid.GOOGLE_PLAY\n : InstallSourceAndroid.AMAZON;\n};\n\nlet androidNativeModule = RNIapModule;\n\nexport const setAndroidNativeModule = (\n nativeModule: typeof RNIapModule,\n): void => {\n androidNativeModule = nativeModule;\n};\n\nconst checkNativeAndroidAvailable = (): void => {\n if (!RNIapModule && !RNIapAmazonModule) {\n throw new Error(IAPErrorCode.E_IAP_NOT_AVAILABLE);\n }\n};\n\nconst getAndroidModule = (): typeof RNIapModule | typeof RNIapAmazonModule => {\n checkNativeAndroidAvailable();\n\n return androidNativeModule\n ? androidNativeModule\n : RNIapModule\n ? RNIapModule\n : RNIapAmazonModule;\n};\n\nconst checkNativeIOSAvailable = (): void => {\n if (!RNIapIos) {\n throw new Error(IAPErrorCode.E_IAP_NOT_AVAILABLE);\n }\n};\n\nconst getIosModule = (): typeof RNIapIos => {\n checkNativeIOSAvailable();\n\n return RNIapIos;\n};\n\nconst getNativeModule = ():\n | typeof RNIapModule\n | typeof RNIapAmazonModule\n | typeof RNIapIos => {\n return isAndroid ? getAndroidModule() : getIosModule();\n};\n\n/**\n * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.\n * @returns {Promise<boolean>}\n */\nexport const initConnection = (): Promise<boolean> =>\n getNativeModule().initConnection();\n\n/**\n * End module for purchase flow.\n * @returns {Promise<void>}\n */\nexport const endConnection = (): Promise<void> =>\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 = (): Promise<\n string[]\n> => getAndroidModule().flushFailedPurchasesCachedAsPending();\n\n/**\n * Fill products with additional data\n * @param {Array<ProductCommon>} products Products\n */\nconst fillProductsAdditionalData = async (\n products: Array<ProductCommon>,\n): Promise<Array<ProductCommon>> => {\n // Amazon\n if (RNIapAmazonModule) {\n // On amazon we must get the user marketplace to detect the currency\n const user = await RNIapAmazonModule.getUser();\n\n const currencies = {\n CA: 'CAD',\n ES: 'EUR',\n AU: 'AUD',\n DE: 'EUR',\n IN: 'INR',\n US: 'USD',\n JP: 'JPY',\n GB: 'GBP',\n IT: 'EUR',\n BR: 'BRL',\n FR: 'EUR',\n };\n\n const currency =\n currencies[user.userMarketplaceAmazon as keyof typeof currencies];\n\n // Add currency to products\n products.forEach((product) => {\n if (currency) {\n product.currency = currency;\n }\n });\n }\n\n return products;\n};\n\n/**\n * Get a list of products (consumable and non-consumable items, but not subscriptions)\n * @param {string[]} skus The item skus\n * @returns {Promise<Product[]>}\n */\nexport const getProducts = (skus: string[]): Promise<Array<Product>> =>\n (\n Platform.select({\n ios: async () => {\n const items = await getIosModule().getItems(skus);\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 fillProductsAdditionalData(products);\n },\n }) || Promise.resolve\n )();\n\n/**\n * Get a list of subscriptions\n * @param {string[]} skus The item skus\n * @returns {Promise<Subscription[]>}\n */\nexport const getSubscriptions = (skus: string[]): Promise<Subscription[]> =>\n (\n Platform.select({\n ios: async () => {\n const items = await getIosModule().getItems(skus);\n\n return items.filter(\n (item: Subscription) =>\n skus.includes(item.productId) && item.type === 'subs',\n );\n },\n android: async () => {\n const subscriptions = await getAndroidModule().getItemsByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n skus,\n );\n\n return fillProductsAdditionalData(subscriptions);\n },\n }) || Promise.resolve\n )();\n\n/**\n * Gets an inventory of purchases made by the user regardless of consumption status\n * @returns {Promise<(InAppPurchase | SubscriptionPurchase)[]>}\n */\nexport const getPurchaseHistory = (): Promise<\n (InAppPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems();\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await getAndroidModule().getPurchaseHistoryByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await getAndroidModule().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 * @returns {Promise<(InAppPurchase | SubscriptionPurchase)[]>}\n */\nexport const getAvailablePurchases = (): Promise<\n (InAppPurchase | SubscriptionPurchase)[]\n> =>\n (\n Platform.select({\n ios: async () => {\n return getIosModule().getAvailableItems();\n },\n android: async () => {\n if (RNIapAmazonModule) {\n return await RNIapAmazonModule.getAvailableItems();\n }\n\n const products = await getAndroidModule().getAvailableItemsByType(\n ANDROID_ITEM_TYPE_IAP,\n );\n\n const subscriptions = await getAndroidModule().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 * @param {string} sku The product's sku/ID\n * @param {string} [applicationUsername] The purchaser's user ID\n * @param {boolean} [andDangerouslyFinishTransactionAutomaticallyIOS] You should set this to false 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 * @param {string} [obfuscatedAccountIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n * @param {string} [obfuscatedProfileIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n * @returns {Promise<InAppPurchase>}\n */\n\nexport const requestPurchase = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n applicationUsername,\n}: RequestPurchase): Promise<InAppPurchase> =>\n (\n Platform.select({\n ios: async () => {\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 return getIosModule().buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n applicationUsername,\n );\n },\n android: async () => {\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_IAP,\n [sku],\n null,\n -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n undefined,\n );\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * @param {string} [sku] The product's sku/ID\n * @param {string} [applicationUsername] The purchaser's user ID\n * @param {boolean} [andDangerouslyFinishTransactionAutomaticallyIOS] You should set this to false 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 * @param {string} [purchaseTokenAndroid] purchaseToken that the user is upgrading or downgrading from (Android).\n * @param {ProrationModesAndroid} [prorationModeAndroid] UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED\n * @param {string} [obfuscatedAccountIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.\n * @param {string} [obfuscatedProfileIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.\n * @param {string} [selectedOfferIndex] Selected Offer index from the list returned by get products\n * @returns {Promise<SubscriptionPurchase | null>} Promise resolves to null when using proratioModesAndroid=DEFERRED, and to a SubscriptionPurchase otherwise\n */\nexport const requestSubscription = ({\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS = false,\n purchaseTokenAndroid,\n prorationModeAndroid = -1,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n selectedOfferIndexArr = undefined, // Android Billing V5\n skus = undefined, // Android Billing V5\n applicationUsername,\n}: RequestSubscription): Promise<SubscriptionPurchase | null> =>\n (\n Platform.select({\n ios: async () => {\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 return getIosModule().buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n applicationUsername,\n );\n },\n android: async () => {\n return getAndroidModule().buyItemByType(\n ANDROID_ITEM_TYPE_SUBSCRIPTION,\n sku ? [sku] : skus,\n purchaseTokenAndroid,\n prorationModeAndroid,\n obfuscatedAccountIdAndroid,\n obfuscatedProfileIdAndroid,\n selectedOfferIndexArr,\n );\n },\n }) || Promise.resolve\n )();\n\n/**\n * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.\n * @param {string} sku The product's sku/ID\n * @returns {Promise<void>}\n */\nexport const requestPurchaseWithQuantityIOS = (\n sku: string,\n quantity: number,\n): Promise<InAppPurchase> =>\n getIosModule().buyProductWithQuantityIOS(sku, quantity);\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 * @param {object} purchase The purchase that you would like to finish.\n * @param {boolean} isConsumable Checks if purchase is consumable. Has effect on `android`.\n * @param {string} developerPayloadAndroid Android developerPayload.\n * @returns {Promise<string | void> }\n */\nexport const finishTransaction = (\n purchase: InAppPurchase | ProductPurchase,\n isConsumable?: boolean,\n developerPayloadAndroid?: string,\n): Promise<string | void> => {\n return (\n Platform.select({\n ios: async () => {\n return getIosModule().finishTransaction(purchase.transactionId);\n },\n android: async () => {\n if (purchase) {\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 throw new Error('purchase is not suitable to be purchased');\n }\n } else {\n throw new Error('purchase is not assigned');\n }\n },\n }) || Promise.resolve\n )();\n};\n\n/**\n * Clear Transaction (iOS only)\n * Finish remaining transactions. Related to issue #257 and #801\n * link : https://github.com/dooboolab/react-native-iap/issues/257\n * https://github.com/dooboolab/react-native-iap/issues/801\n * @returns {Promise<void>}\n */\nexport const clearTransactionIOS = (): Promise<void> =>\n getIosModule().clearTransaction();\n\n/**\n * Clear valid Products (iOS only)\n * Remove all products which are validated by Apple server.\n * @returns {void}\n */\nexport const clearProductsIOS = (): Promise<void> =>\n getIosModule().clearProducts();\n\n/**\n * Acknowledge a product (on Android.) No-op on iOS.\n * @param {string} token The product's token (on Android)\n * @returns {Promise<PurchaseResult | void>}\n */\nexport const acknowledgePurchaseAndroid = (\n token: string,\n developerPayload?: string,\n): Promise<PurchaseResult | void> => {\n return getAndroidModule().acknowledgePurchase(token, developerPayload);\n};\n\n/**\n * Deep link to subscriptions screen on Android. No-op on iOS.\n * @param {string} sku The product's SKU (on Android)\n * @returns {Promise<void>}\n */\nexport const deepLinkToSubscriptionsAndroid = async (\n sku: string,\n): Promise<void> => {\n checkNativeAndroidAvailable();\n\n return Linking.openURL(\n `https://play.google.com/store/account/subscriptions?package=${await RNIapModule.getPackageName()}&sku=${sku}`,\n );\n};\n\n/**\n * Should Add Store Payment (iOS only)\n * Indicates the the App Store purchase should continue from the app instead of the App Store.\n * @returns {Promise<Product | null>} promoted product\n */\nexport const getPromotedProductIOS = (): Promise<Product | null> =>\n getIosModule().promotedProduct();\n\n/**\n * Buy the currently selected promoted product (iOS only)\n * Initiates the payment process for a promoted product. Should only be called in response to the `iap-promoted-product` event.\n * @returns {Promise<void>}\n */\nexport const buyPromotedProductIOS = (): Promise<void> =>\n getIosModule().buyPromotedProduct();\n\nconst fetchJsonOrThrow = async (\n url: string,\n receiptBody: Record<string, unknown>,\n): Promise<Apple.ReceiptValidationResponse | false> => {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(receiptBody),\n });\n\n if (!response.ok) {\n throw Object.assign(new Error(response.statusText), {\n statusCode: response.status,\n });\n }\n\n return response.json();\n};\n\nconst requestAgnosticReceiptValidationIos = async (\n receiptBody: Record<string, unknown>,\n): Promise<Apple.ReceiptValidationResponse | false> => {\n const response = await fetchJsonOrThrow(\n 'https://buy.itunes.apple.com/verifyReceipt',\n receiptBody,\n );\n\n // Best practice is to check for test receipt and check sandbox instead\n // https://developer.apple.com/documentation/appstorereceipts/verifyreceipt\n if (response && response.status === ReceiptValidationStatus.TEST_RECEIPT) {\n const testResponse = await fetchJsonOrThrow(\n 'https://sandbox.itunes.apple.com/verifyReceipt',\n receiptBody,\n );\n\n return testResponse;\n }\n\n return response;\n};\n\n/**\n * Buy products or subscriptions with offers (iOS only)\n *\n * Runs the payment process with some info you must fetch\n * from your server.\n * @param {string} sku The product identifier\n * @param {string} forUser An user identifier on you system\n * @param {Apple.PaymentDiscount} withOffer The offer information\n * @param {string} withOffer.identifier The offer identifier\n * @param {string} withOffer.keyIdentifier Key identifier that it uses to generate the signature\n * @param {string} withOffer.nonce An UUID returned from the server\n * @param {string} withOffer.signature The actual signature returned from the server\n * @param {number} withOffer.timestamp The timestamp of the signature\n * @returns {Promise<void>}\n */\nexport const requestPurchaseWithOfferIOS = (\n sku: string,\n forUser: string,\n withOffer: Apple.PaymentDiscount,\n): Promise<void> => getIosModule().buyProductWithOffer(sku, forUser, withOffer);\n\n/**\n * Validate receipt for iOS.\n * @param {object} receiptBody the receipt body to send to apple server.\n * @param {boolean} isTest whether this is in test environment which is sandbox.\n * @returns {Promise<Apple.ReceiptValidationResponse | false>}\n */\nexport const validateReceiptIos = async (\n receiptBody: Record<string, unknown>,\n isTest?: boolean,\n): Promise<Apple.ReceiptValidationResponse | false> => {\n if (isTest == null) {\n return await requestAgnosticReceiptValidationIos(receiptBody);\n }\n\n const url = isTest\n ? 'https://sandbox.itunes.apple.com/verifyReceipt'\n : 'https://buy.itunes.apple.com/verifyReceipt';\n\n const response = await fetchJsonOrThrow(url, receiptBody);\n\n return response;\n};\n\n/**\n * Validate receipt for Android. NOTE: This method is here for debugging purposes only. Including\n * your access token in the binary you ship to users is potentially dangerous.\n * Use server side validation instead for your production builds\n * @param {string} packageName package name of your app.\n * @param {string} productId product id for your in app product.\n * @param {string} productToken token for your purchase.\n * @param {string} accessToken accessToken from googleApis.\n * @param {boolean} isSub whether this is subscription or inapp. `true` for subscription.\n * @returns {Promise<object>}\n */\nexport const validateReceiptAndroid = async (\n packageName: string,\n productId: string,\n productToken: string,\n accessToken: string,\n isSub?: boolean,\n): Promise<Android.ReceiptType> => {\n const type = isSub ? 'subscriptions' : 'products';\n\n const url =\n 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications' +\n `/${packageName}/purchases/${type}/${productId}` +\n `/tokens/${productToken}?access_token=${accessToken}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw Object.assign(new Error(response.statusText), {\n statusCode: response.status,\n });\n }\n\n return response.json();\n};\n\n/**\n * Validate receipt for Amazon. NOTE: This method is here for debugging purposes only. Including\n * your developer secret in the binary you ship to users is potentially dangerous.\n * Use server side validation instead for your production builds\n * @param {string} developerSecret: from the Amazon developer console.\n * @param {string} userId who purchased the item.\n * @param {string} receiptId long obfuscated string returned when purchasing the item\n * @param {boolean} useSandbox Defaults to true, use sandbox environment or production.\n * @returns {Promise<object>}\n */\nexport const validateReceiptAmazon = async (\n developerSecret: string,\n userId: string,\n receiptId: string,\n useSandbox: boolean = true,\n): Promise<Amazon.ReceiptType> => {\n const sandBoxUrl = useSandbox ? 'sandbox/' : '';\n const url = `https://appstore-sdk.amazon.com/${sandBoxUrl}version/1.0/verifyReceiptId/developer/${developerSecret}/user/${userId}/receiptId/${receiptId}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw Object.assign(new Error(response.statusText), {\n statusCode: response.status,\n });\n }\n\n return response.json();\n};\n\n/**\n * Add IAP purchase event\n * @returns {callback(e: InAppPurchase | ProductPurchase)}\n */\nexport const purchaseUpdatedListener = (\n listener: (event: InAppPurchase | SubscriptionPurchase) => void,\n): EmitterSubscription => {\n const emitterSubscription = new NativeEventEmitter(\n getNativeModule(),\n ).addListener('purchase-updated', listener);\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n * @returns {callback(e: PurchaseError)}\n */\nexport const purchaseErrorListener = (\n listener: (errorEvent: PurchaseError) => void,\n): EmitterSubscription =>\n new NativeEventEmitter(getNativeModule()).addListener(\n 'purchase-error',\n listener,\n );\n\n/**\n * Add IAP promoted subscription event\n * Only available on iOS\n */\nexport const promotedProductListener = (\n listener: () => void,\n): EmitterSubscription =>\n new NativeEventEmitter(getIosModule()).addListener(\n 'iap-promoted-product',\n listener,\n );\n\n/**\n * Get the current receipt base64 encoded in IOS.\n * @param {forceRefresh?:boolean}\n * @returns {Promise<ProductPurchase[]>}\n */\nexport const getPendingPurchasesIOS = async (): Promise<ProductPurchase[]> =>\n getIosModule().getPendingTransactions();\n\n/**\n * Launches a modal to register the redeem offer code in IOS.\n * @returns {Promise<null>}\n */\nexport const presentCodeRedemptionSheetIOS = async (): Promise<null> =>\n getIosModule().presentCodeRedemptionSheet();\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["IAPErrorCode","ProrationModesAndroid","PurchaseStateAndroid","PROMOTED_PRODUCT","InstallSourceAndroid"],"sources":["index.ts"],"sourcesContent":["type Sku = string;\n\nexport enum IAPErrorCode {\n E_IAP_NOT_AVAILABLE = 'E_IAP_NOT_AVAILABLE',\n E_UNKNOWN = 'E_UNKNOWN',\n E_USER_CANCELLED = 'E_USER_CANCELLED',\n E_USER_ERROR = 'E_USER_ERROR',\n E_ITEM_UNAVAILABLE = 'E_ITEM_UNAVAILABLE',\n E_REMOTE_ERROR = 'E_REMOTE_ERROR',\n E_NETWORK_ERROR = 'E_NETWORK_ERROR',\n E_SERVICE_ERROR = 'E_SERVICE_ERROR',\n E_RECEIPT_FAILED = 'E_RECEIPT_FAILED',\n E_RECEIPT_FINISHED_FAILED = 'E_RECEIPT_FINISHED_FAILED',\n E_NOT_PREPARED = 'E_NOT_PREPARED',\n E_NOT_ENDED = 'E_NOT_ENDED',\n E_ALREADY_OWNED = 'E_ALREADY_OWNED',\n E_DEVELOPER_ERROR = 'E_DEVELOPER_ERROR',\n E_BILLING_RESPONSE_JSON_PARSE_ERROR = 'E_BILLING_RESPONSE_JSON_PARSE_ERROR',\n E_DEFERRED_PAYMENT = 'E_DEFERRED_PAYMENT',\n}\n\nexport enum ProrationModesAndroid {\n IMMEDIATE_WITH_TIME_PRORATION = 1,\n IMMEDIATE_AND_CHARGE_PRORATED_PRICE = 2,\n IMMEDIATE_WITHOUT_PRORATION = 3,\n DEFERRED = 4,\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY = 0,\n}\n\nexport enum PurchaseStateAndroid {\n UNSPECIFIED_STATE = 0,\n PURCHASED = 1,\n PENDING = 2,\n}\n\nexport const PROMOTED_PRODUCT = 'iap-promoted-product';\n\nexport enum InstallSourceAndroid {\n NOT_SET = 0,\n GOOGLE_PLAY = 1,\n AMAZON = 2,\n}\n\nexport interface ProductCommon {\n type: 'subs' | 'sub' | 'inapp' | 'iap';\n productId: string;\n title: string;\n description: string;\n price: string;\n currency: string;\n localizedPrice: string;\n countryCode?: string;\n}\n\nexport interface ProductPurchase {\n productId: string;\n transactionId?: string;\n transactionDate: number;\n transactionReceipt: string;\n purchaseToken?: string;\n //iOS\n quantityIOS?: number;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n //Android\n dataAndroid?: string;\n signatureAndroid?: string;\n autoRenewingAndroid?: boolean;\n purchaseStateAndroid?: PurchaseStateAndroid;\n isAcknowledgedAndroid?: boolean;\n packageNameAndroid?: string;\n developerPayloadAndroid?: string;\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n //Amazon\n userIdAmazon?: string;\n userMarketplaceAmazon?: string;\n userJsonAmazon?: string;\n isCanceledAmazon?: boolean;\n}\n\nexport interface PurchaseResult {\n responseCode?: number;\n debugMessage?: string;\n code?: string;\n message?: string;\n}\n\nexport interface PurchaseError {\n responseCode?: number;\n debugMessage?: string;\n code?: string;\n message?: string;\n productId?: string;\n}\n\nexport type InAppPurchase = ProductPurchase;\n\nexport interface SubscriptionPurchase extends ProductPurchase {\n autoRenewingAndroid?: boolean;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n}\n\nexport type Purchase = InAppPurchase | SubscriptionPurchase;\n\nexport interface Discount {\n identifier: string;\n type: string;\n numberOfPeriods: string;\n price: string;\n localizedPrice: string;\n paymentMode: '' | 'FREETRIAL' | 'PAYASYOUGO' | 'PAYUPFRONT';\n subscriptionPeriod: string;\n}\n\nexport interface Product extends ProductCommon {\n type: 'inapp' | 'iap';\n}\n\nexport interface Subscription extends ProductCommon {\n type: 'subs' | 'sub';\n\n discounts?: Discount[];\n\n introductoryPrice?: string;\n introductoryPriceAsAmountIOS?: string;\n introductoryPricePaymentModeIOS?:\n | ''\n | 'FREETRIAL'\n | 'PAYASYOUGO'\n | 'PAYUPFRONT';\n introductoryPriceNumberOfPeriodsIOS?: string;\n introductoryPriceSubscriptionPeriodIOS?:\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'YEAR'\n | '';\n\n subscriptionPeriodNumberIOS?: string;\n subscriptionPeriodUnitIOS?: '' | 'YEAR' | 'MONTH' | 'WEEK' | 'DAY';\n\n introductoryPriceAsAmountAndroid: string;\n introductoryPriceCyclesAndroid?: string;\n introductoryPricePeriodAndroid?: string;\n subscriptionPeriodAndroid?: string;\n freeTrialPeriodAndroid?: string;\n}\n\ninterface RequestPurchaseCommon {\n sku: Sku;\n}\n\ninterface RequestPurchaseIOS extends RequestPurchaseCommon {\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean;\n applicationUsername?: string;\n obfuscatedAccountIdAndroid?: never;\n obfuscatedProfileIdAndroid?: never;\n selectedOfferIndex?: never;\n}\n\ninterface RequestPurchaseAndroid extends RequestPurchaseCommon {\n andDangerouslyFinishTransactionAutomaticallyIOS?: never;\n applicationUsername?: never;\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n selectedOfferIndex: number;\n}\n\nexport type RequestPurchase = RequestPurchaseIOS | RequestPurchaseAndroid;\n\ninterface RequestSubscriptionIOS extends RequestPurchaseIOS {\n purchaseTokenAndroid?: never;\n prorationModeAndroid?: never;\n}\n\ninterface RequestSubscriptionAndroid extends RequestPurchaseAndroid {\n purchaseTokenAndroid?: string;\n prorationModeAndroid: ProrationModesAndroid;\n}\n\nexport type RequestSubscription =\n | RequestSubscriptionIOS\n | RequestSubscriptionAndroid;\n"],"mappings":"AAEA,WAAYA,YAAZ;;WAAYA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;GAAAA,Y,KAAAA,Y;;AAmBZ,WAAYC,qBAAZ;;WAAYA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;GAAAA,qB,KAAAA,qB;;AAQZ,WAAYC,oBAAZ;;WAAYA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,KAAAA,oB;;AAMZ,OAAO,MAAMC,gBAAgB,GAAG,sBAAzB;AAEP,WAAYC,oBAAZ;;WAAYA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,KAAAA,oB"}
1
+ {"version":3,"names":["IAPErrorCode","ProrationModesAndroid","PurchaseStateAndroid","PROMOTED_PRODUCT","InstallSourceAndroid"],"sources":["index.ts"],"sourcesContent":["export enum IAPErrorCode {\n E_IAP_NOT_AVAILABLE = 'E_IAP_NOT_AVAILABLE',\n E_UNKNOWN = 'E_UNKNOWN',\n E_USER_CANCELLED = 'E_USER_CANCELLED',\n E_USER_ERROR = 'E_USER_ERROR',\n E_ITEM_UNAVAILABLE = 'E_ITEM_UNAVAILABLE',\n E_REMOTE_ERROR = 'E_REMOTE_ERROR',\n E_NETWORK_ERROR = 'E_NETWORK_ERROR',\n E_SERVICE_ERROR = 'E_SERVICE_ERROR',\n E_RECEIPT_FAILED = 'E_RECEIPT_FAILED',\n E_RECEIPT_FINISHED_FAILED = 'E_RECEIPT_FINISHED_FAILED',\n E_NOT_PREPARED = 'E_NOT_PREPARED',\n E_NOT_ENDED = 'E_NOT_ENDED',\n E_ALREADY_OWNED = 'E_ALREADY_OWNED',\n E_DEVELOPER_ERROR = 'E_DEVELOPER_ERROR',\n E_BILLING_RESPONSE_JSON_PARSE_ERROR = 'E_BILLING_RESPONSE_JSON_PARSE_ERROR',\n E_DEFERRED_PAYMENT = 'E_DEFERRED_PAYMENT',\n}\n\nexport enum ProrationModesAndroid {\n IMMEDIATE_WITH_TIME_PRORATION = 1,\n IMMEDIATE_AND_CHARGE_PRORATED_PRICE = 2,\n IMMEDIATE_WITHOUT_PRORATION = 3,\n DEFERRED = 4,\n UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY = 0,\n}\n\nexport enum PurchaseStateAndroid {\n UNSPECIFIED_STATE = 0,\n PURCHASED = 1,\n PENDING = 2,\n}\n\nexport const PROMOTED_PRODUCT = 'iap-promoted-product';\n\nexport enum InstallSourceAndroid {\n NOT_SET = 0,\n GOOGLE_PLAY = 1,\n AMAZON = 2,\n}\n\nexport interface ProductCommon {\n type: 'subs' | 'sub' | 'inapp' | 'iap';\n productId: string;\n productIds?: string[];\n title: string;\n description: string;\n price: string;\n currency: string;\n localizedPrice: string;\n countryCode?: string;\n}\n\nexport interface ProductPurchase {\n productId: string;\n productIds?: string[];\n transactionId?: string;\n transactionDate: number;\n transactionReceipt: string;\n purchaseToken?: string;\n //iOS\n quantityIOS?: number;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n //Android\n dataAndroid?: string;\n signatureAndroid?: string;\n autoRenewingAndroid?: boolean;\n purchaseStateAndroid?: PurchaseStateAndroid;\n isAcknowledgedAndroid?: boolean;\n packageNameAndroid?: string;\n developerPayloadAndroid?: string;\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n //Amazon\n userIdAmazon?: string;\n userMarketplaceAmazon?: string;\n userJsonAmazon?: string;\n isCanceledAmazon?: boolean;\n}\n\nexport interface PurchaseResult {\n responseCode?: number;\n debugMessage?: string;\n code?: string;\n message?: string;\n}\n\nexport interface PurchaseError {\n responseCode?: number;\n debugMessage?: string;\n code?: string;\n message?: string;\n productId?: string;\n}\n\nexport type InAppPurchase = ProductPurchase;\n\nexport interface SubscriptionPurchase extends ProductPurchase {\n autoRenewingAndroid?: boolean;\n originalTransactionDateIOS?: string;\n originalTransactionIdentifierIOS?: string;\n}\n\nexport type Purchase = InAppPurchase | SubscriptionPurchase;\n\nexport interface Discount {\n identifier: string;\n type: string;\n numberOfPeriods: string;\n price: string;\n localizedPrice: string;\n paymentMode: '' | 'FREETRIAL' | 'PAYASYOUGO' | 'PAYUPFRONT';\n subscriptionPeriod: string;\n}\n\nexport interface Product extends ProductCommon {\n type: 'inapp' | 'iap';\n}\n\nexport interface Subscription extends ProductCommon {\n type: 'subs' | 'sub';\n\n discounts?: Discount[];\n\n introductoryPrice?: string;\n introductoryPriceAsAmountIOS?: string;\n introductoryPricePaymentModeIOS?:\n | ''\n | 'FREETRIAL'\n | 'PAYASYOUGO'\n | 'PAYUPFRONT';\n introductoryPriceNumberOfPeriodsIOS?: string;\n introductoryPriceSubscriptionPeriodIOS?:\n | 'DAY'\n | 'WEEK'\n | 'MONTH'\n | 'YEAR'\n | '';\n\n subscriptionPeriodNumberIOS?: string;\n subscriptionPeriodUnitIOS?: '' | 'YEAR' | 'MONTH' | 'WEEK' | 'DAY';\n\n introductoryPriceAsAmountAndroid: string;\n introductoryPriceCyclesAndroid?: string;\n introductoryPricePeriodAndroid?: string;\n subscriptionPeriodAndroid?: string;\n freeTrialPeriodAndroid?: string;\n //Android V5\n productType?: string;\n name?: string;\n oneTimePurchaseOfferDetails?: {\n priceCurrencyCode?: string;\n formattedPrice?: string;\n priceAmountMicros?: string;\n }[];\n subscriptionOfferDetails?: {\n offerToken?: string[];\n pricingPhases: {\n pricingPhaseList: {\n formattedPrice?: string;\n priceCurrencyCode?: string;\n billingPeriod?: string;\n billingCycleCount?: number;\n priceAmountMicros?: string;\n recurrenceMode?: number;\n };\n };\n }[];\n}\n\ninterface RequestPurchaseCommon {\n sku: string;\n}\n\ninterface RequestPurchaseIOS extends RequestPurchaseCommon {\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean;\n applicationUsername?: string;\n obfuscatedAccountIdAndroid: string | undefined;\n obfuscatedProfileIdAndroid: string | undefined;\n}\n\ninterface RequestPurchaseAndroid extends RequestPurchaseCommon {\n andDangerouslyFinishTransactionAutomaticallyIOS?: never;\n applicationUsername?: never;\n obfuscatedAccountIdAndroid?: string;\n obfuscatedProfileIdAndroid?: string;\n selectedOfferIndex: number;\n}\n\nexport type RequestPurchase = RequestPurchaseIOS | RequestPurchaseAndroid;\n\ninterface RequestSubscriptionIOS extends RequestPurchaseIOS {\n purchaseTokenAndroid?: never;\n prorationModeAndroid?: never;\n selectedOfferIndexArr?: never;\n skus?: never;\n}\n\ninterface RequestSubscriptionAndroid extends RequestPurchaseAndroid {\n purchaseTokenAndroid?: string;\n prorationModeAndroid: ProrationModesAndroid;\n selectedOfferIndexArr?: number[] | undefined; //For Android Billing V5\n skus?: string[] | undefined; // For AndroidBilling V5\n}\n\nexport type RequestSubscription =\n | RequestSubscriptionIOS\n | RequestSubscriptionAndroid;\n"],"mappings":"AAAA,WAAYA,YAAZ;;WAAYA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;EAAAA,Y;GAAAA,Y,KAAAA,Y;;AAmBZ,WAAYC,qBAAZ;;WAAYA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;EAAAA,qB,CAAAA,qB;GAAAA,qB,KAAAA,qB;;AAQZ,WAAYC,oBAAZ;;WAAYA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,KAAAA,oB;;AAMZ,OAAO,MAAMC,gBAAgB,GAAG,sBAAzB;AAEP,WAAYC,oBAAZ;;WAAYA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;EAAAA,oB,CAAAA,oB;GAAAA,oB,KAAAA,oB"}
@@ -5,6 +5,7 @@ import type * as Apple from './types/apple';
5
5
  import type { InAppPurchase, Product, ProductPurchase, PurchaseError, PurchaseResult, RequestPurchase, RequestSubscription, Subscription, SubscriptionPurchase } from './types';
6
6
  import { InstallSourceAndroid } from './types';
7
7
  export declare const getInstallSourceAndroid: () => InstallSourceAndroid;
8
+ export declare const setAndroidNativeModule: (nativeModule: any) => void;
8
9
  /**
9
10
  * Init module for purchase flow. Required on Android. In ios it will check whether user canMakePayment.
10
11
  * @returns {Promise<boolean>}
@@ -61,9 +62,10 @@ export declare const requestPurchase: ({ sku, andDangerouslyFinishTransactionAut
61
62
  * @param {ProrationModesAndroid} [prorationModeAndroid] UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED
62
63
  * @param {string} [obfuscatedAccountIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.
63
64
  * @param {string} [obfuscatedProfileIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.
65
+ * @param {string} [selectedOfferIndex] Selected Offer index from the list returned by get products
64
66
  * @returns {Promise<SubscriptionPurchase | null>} Promise resolves to null when using proratioModesAndroid=DEFERRED, and to a SubscriptionPurchase otherwise
65
67
  */
66
- export declare const requestSubscription: ({ sku, andDangerouslyFinishTransactionAutomaticallyIOS, purchaseTokenAndroid, prorationModeAndroid, obfuscatedAccountIdAndroid, obfuscatedProfileIdAndroid, applicationUsername, }: RequestSubscription) => Promise<SubscriptionPurchase | null>;
68
+ export declare const requestSubscription: ({ sku, andDangerouslyFinishTransactionAutomaticallyIOS, purchaseTokenAndroid, prorationModeAndroid, obfuscatedAccountIdAndroid, obfuscatedProfileIdAndroid, selectedOfferIndexArr, skus, applicationUsername, }: RequestSubscription) => Promise<SubscriptionPurchase | null>;
67
69
  /**
68
70
  * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.
69
71
  * @param {string} sku The product's sku/ID
@@ -1,4 +1,3 @@
1
- declare type Sku = string;
2
1
  export declare enum IAPErrorCode {
3
2
  E_IAP_NOT_AVAILABLE = "E_IAP_NOT_AVAILABLE",
4
3
  E_UNKNOWN = "E_UNKNOWN",
@@ -38,6 +37,7 @@ export declare enum InstallSourceAndroid {
38
37
  export interface ProductCommon {
39
38
  type: 'subs' | 'sub' | 'inapp' | 'iap';
40
39
  productId: string;
40
+ productIds?: string[];
41
41
  title: string;
42
42
  description: string;
43
43
  price: string;
@@ -47,6 +47,7 @@ export interface ProductCommon {
47
47
  }
48
48
  export interface ProductPurchase {
49
49
  productId: string;
50
+ productIds?: string[];
50
51
  transactionId?: string;
51
52
  transactionDate: number;
52
53
  transactionReceipt: string;
@@ -115,16 +116,35 @@ export interface Subscription extends ProductCommon {
115
116
  introductoryPricePeriodAndroid?: string;
116
117
  subscriptionPeriodAndroid?: string;
117
118
  freeTrialPeriodAndroid?: string;
119
+ productType?: string;
120
+ name?: string;
121
+ oneTimePurchaseOfferDetails?: {
122
+ priceCurrencyCode?: string;
123
+ formattedPrice?: string;
124
+ priceAmountMicros?: string;
125
+ }[];
126
+ subscriptionOfferDetails?: {
127
+ offerToken?: string[];
128
+ pricingPhases: {
129
+ pricingPhaseList: {
130
+ formattedPrice?: string;
131
+ priceCurrencyCode?: string;
132
+ billingPeriod?: string;
133
+ billingCycleCount?: number;
134
+ priceAmountMicros?: string;
135
+ recurrenceMode?: number;
136
+ };
137
+ };
138
+ }[];
118
139
  }
119
140
  interface RequestPurchaseCommon {
120
- sku: Sku;
141
+ sku: string;
121
142
  }
122
143
  interface RequestPurchaseIOS extends RequestPurchaseCommon {
123
144
  andDangerouslyFinishTransactionAutomaticallyIOS: boolean;
124
145
  applicationUsername?: string;
125
- obfuscatedAccountIdAndroid?: never;
126
- obfuscatedProfileIdAndroid?: never;
127
- selectedOfferIndex?: never;
146
+ obfuscatedAccountIdAndroid: string | undefined;
147
+ obfuscatedProfileIdAndroid: string | undefined;
128
148
  }
129
149
  interface RequestPurchaseAndroid extends RequestPurchaseCommon {
130
150
  andDangerouslyFinishTransactionAutomaticallyIOS?: never;
@@ -137,10 +157,14 @@ export declare type RequestPurchase = RequestPurchaseIOS | RequestPurchaseAndroi
137
157
  interface RequestSubscriptionIOS extends RequestPurchaseIOS {
138
158
  purchaseTokenAndroid?: never;
139
159
  prorationModeAndroid?: never;
160
+ selectedOfferIndexArr?: never;
161
+ skus?: never;
140
162
  }
141
163
  interface RequestSubscriptionAndroid extends RequestPurchaseAndroid {
142
164
  purchaseTokenAndroid?: string;
143
165
  prorationModeAndroid: ProrationModesAndroid;
166
+ selectedOfferIndexArr?: number[] | undefined;
167
+ skus?: string[] | undefined;
144
168
  }
145
169
  export declare type RequestSubscription = RequestSubscriptionIOS | RequestSubscriptionAndroid;
146
170
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-iap",
3
- "version": "8.6.2",
3
+ "version": "9.0.0-beta11",
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
@@ -39,6 +39,14 @@ export const getInstallSourceAndroid = (): InstallSourceAndroid => {
39
39
  : InstallSourceAndroid.AMAZON;
40
40
  };
41
41
 
42
+ let androidNativeModule = RNIapModule;
43
+
44
+ export const setAndroidNativeModule = (
45
+ nativeModule: typeof RNIapModule,
46
+ ): void => {
47
+ androidNativeModule = nativeModule;
48
+ };
49
+
42
50
  const checkNativeAndroidAvailable = (): void => {
43
51
  if (!RNIapModule && !RNIapAmazonModule) {
44
52
  throw new Error(IAPErrorCode.E_IAP_NOT_AVAILABLE);
@@ -48,7 +56,11 @@ const checkNativeAndroidAvailable = (): void => {
48
56
  const getAndroidModule = (): typeof RNIapModule | typeof RNIapAmazonModule => {
49
57
  checkNativeAndroidAvailable();
50
58
 
51
- return RNIapModule ? RNIapModule : RNIapAmazonModule;
59
+ return androidNativeModule
60
+ ? androidNativeModule
61
+ : RNIapModule
62
+ ? RNIapModule
63
+ : RNIapAmazonModule;
52
64
  };
53
65
 
54
66
  const checkNativeIOSAvailable = (): void => {
@@ -67,11 +79,7 @@ const getNativeModule = ():
67
79
  | typeof RNIapModule
68
80
  | typeof RNIapAmazonModule
69
81
  | typeof RNIapIos => {
70
- if (isAndroid) {
71
- return getAndroidModule();
72
- }
73
-
74
- return getIosModule();
82
+ return isAndroid ? getAndroidModule() : getIosModule();
75
83
  };
76
84
 
77
85
  /**
@@ -285,11 +293,12 @@ export const requestPurchase = ({
285
293
  android: async () => {
286
294
  return getAndroidModule().buyItemByType(
287
295
  ANDROID_ITEM_TYPE_IAP,
288
- sku,
296
+ [sku],
289
297
  null,
290
- 0,
298
+ -1,
291
299
  obfuscatedAccountIdAndroid,
292
300
  obfuscatedProfileIdAndroid,
301
+ undefined,
293
302
  );
294
303
  },
295
304
  }) || Promise.resolve
@@ -304,6 +313,7 @@ export const requestPurchase = ({
304
313
  * @param {ProrationModesAndroid} [prorationModeAndroid] UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY, IMMEDIATE_WITH_TIME_PRORATION, IMMEDIATE_AND_CHARGE_PRORATED_PRICE, IMMEDIATE_WITHOUT_PRORATION, DEFERRED
305
314
  * @param {string} [obfuscatedAccountIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's account in your app.
306
315
  * @param {string} [obfuscatedProfileIdAndroid] Specifies an optional obfuscated string that is uniquely associated with the user's profile in your app.
316
+ * @param {string} [selectedOfferIndex] Selected Offer index from the list returned by get products
307
317
  * @returns {Promise<SubscriptionPurchase | null>} Promise resolves to null when using proratioModesAndroid=DEFERRED, and to a SubscriptionPurchase otherwise
308
318
  */
309
319
  export const requestSubscription = ({
@@ -313,6 +323,8 @@ export const requestSubscription = ({
313
323
  prorationModeAndroid = -1,
314
324
  obfuscatedAccountIdAndroid,
315
325
  obfuscatedProfileIdAndroid,
326
+ selectedOfferIndexArr = undefined, // Android Billing V5
327
+ skus = undefined, // Android Billing V5
316
328
  applicationUsername,
317
329
  }: RequestSubscription): Promise<SubscriptionPurchase | null> =>
318
330
  (
@@ -333,11 +345,12 @@ export const requestSubscription = ({
333
345
  android: async () => {
334
346
  return getAndroidModule().buyItemByType(
335
347
  ANDROID_ITEM_TYPE_SUBSCRIPTION,
336
- sku,
348
+ sku ? [sku] : skus,
337
349
  purchaseTokenAndroid,
338
350
  prorationModeAndroid,
339
351
  obfuscatedAccountIdAndroid,
340
352
  obfuscatedProfileIdAndroid,
353
+ selectedOfferIndexArr,
341
354
  );
342
355
  },
343
356
  }) || Promise.resolve
@@ -1,5 +1,3 @@
1
- type Sku = string;
2
-
3
1
  export enum IAPErrorCode {
4
2
  E_IAP_NOT_AVAILABLE = 'E_IAP_NOT_AVAILABLE',
5
3
  E_UNKNOWN = 'E_UNKNOWN',
@@ -44,6 +42,7 @@ export enum InstallSourceAndroid {
44
42
  export interface ProductCommon {
45
43
  type: 'subs' | 'sub' | 'inapp' | 'iap';
46
44
  productId: string;
45
+ productIds?: string[];
47
46
  title: string;
48
47
  description: string;
49
48
  price: string;
@@ -54,6 +53,7 @@ export interface ProductCommon {
54
53
 
55
54
  export interface ProductPurchase {
56
55
  productId: string;
56
+ productIds?: string[];
57
57
  transactionId?: string;
58
58
  transactionDate: number;
59
59
  transactionReceipt: string;
@@ -146,18 +146,38 @@ export interface Subscription extends ProductCommon {
146
146
  introductoryPricePeriodAndroid?: string;
147
147
  subscriptionPeriodAndroid?: string;
148
148
  freeTrialPeriodAndroid?: string;
149
+ //Android V5
150
+ productType?: string;
151
+ name?: string;
152
+ oneTimePurchaseOfferDetails?: {
153
+ priceCurrencyCode?: string;
154
+ formattedPrice?: string;
155
+ priceAmountMicros?: string;
156
+ }[];
157
+ subscriptionOfferDetails?: {
158
+ offerToken?: string[];
159
+ pricingPhases: {
160
+ pricingPhaseList: {
161
+ formattedPrice?: string;
162
+ priceCurrencyCode?: string;
163
+ billingPeriod?: string;
164
+ billingCycleCount?: number;
165
+ priceAmountMicros?: string;
166
+ recurrenceMode?: number;
167
+ };
168
+ };
169
+ }[];
149
170
  }
150
171
 
151
172
  interface RequestPurchaseCommon {
152
- sku: Sku;
173
+ sku: string;
153
174
  }
154
175
 
155
176
  interface RequestPurchaseIOS extends RequestPurchaseCommon {
156
177
  andDangerouslyFinishTransactionAutomaticallyIOS: boolean;
157
178
  applicationUsername?: string;
158
- obfuscatedAccountIdAndroid?: never;
159
- obfuscatedProfileIdAndroid?: never;
160
- selectedOfferIndex?: never;
179
+ obfuscatedAccountIdAndroid: string | undefined;
180
+ obfuscatedProfileIdAndroid: string | undefined;
161
181
  }
162
182
 
163
183
  interface RequestPurchaseAndroid extends RequestPurchaseCommon {
@@ -173,11 +193,15 @@ export type RequestPurchase = RequestPurchaseIOS | RequestPurchaseAndroid;
173
193
  interface RequestSubscriptionIOS extends RequestPurchaseIOS {
174
194
  purchaseTokenAndroid?: never;
175
195
  prorationModeAndroid?: never;
196
+ selectedOfferIndexArr?: never;
197
+ skus?: never;
176
198
  }
177
199
 
178
200
  interface RequestSubscriptionAndroid extends RequestPurchaseAndroid {
179
201
  purchaseTokenAndroid?: string;
180
202
  prorationModeAndroid: ProrationModesAndroid;
203
+ selectedOfferIndexArr?: number[] | undefined; //For Android Billing V5
204
+ skus?: string[] | undefined; // For AndroidBilling V5
181
205
  }
182
206
 
183
207
  export type RequestSubscription =