react-native-iap 12.4.6 → 12.4.8

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.
@@ -48,7 +48,7 @@ const App = () => {
48
48
  const purchaseUpdatedListener = listener => {
49
49
  const eventEmitter = new _reactNative.NativeEventEmitter((0, _internal.getNativeModule)());
50
50
  const proxyListener = (0, _iap.isIosStorekit2)() ? event => {
51
- listener((0, _appleSk.transactionSk2Map)(event));
51
+ listener((0, _appleSk.transactionSk2ToPurchaseMap)(event));
52
52
  } : listener;
53
53
  const emitterSubscription = eventEmitter.addListener('purchase-updated', proxyListener);
54
54
 
@@ -1 +1 @@
1
- {"version":3,"names":["purchaseUpdatedListener","listener","eventEmitter","NativeEventEmitter","getNativeModule","proxyListener","isIosStorekit2","event","transactionSk2Map","emitterSubscription","addListener","isAndroid","getAndroidModule","startListening","purchaseErrorListener","promotedProductListener","isIos","getIosModule","transactionListener"],"sources":["eventEmitter.ts"],"sourcesContent":["import {EmitterSubscription, NativeEventEmitter} from 'react-native';\n\nimport {TransactionEvent, transactionSk2Map} from './types/appleSk2';\nimport {isIosStorekit2} from './iap';\nimport {\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAndroid,\n isIos,\n} from './internal';\nimport type {PurchaseError} from './purchaseError';\nimport type {Purchase} from './types';\n\n/**\n * Add IAP purchase event\n * Register a callback that gets called when the store has any updates to purchases that have not yet been finished, consumed or acknowledged. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n## Signature\n\n```ts\npurchaseUpdatedListener((purchase: Purchase) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((purchase: Purchase) => {\n console.log(purchase);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n */\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n) => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n const proxyListener = isIosStorekit2()\n ? (event: Purchase) => {\n listener(transactionSk2Map(event as any));\n }\n : listener;\n const emitterSubscription = eventEmitter.addListener(\n 'purchase-updated',\n proxyListener,\n );\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n * Register a callback that gets called when there has been an error with a purchase. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates.\n\n## Signature\n\n```ts\npurchaseErrorListener((error: PurchaseError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseErrorListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseErrorListener((error: PurchaseError) => {\n console.log(error);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n */\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EmitterSubscription => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n return eventEmitter.addListener('purchase-error', listener);\n};\n\n/**\n * Add IAP promoted subscription event\n * Add IAP promoted subscription event.\n\n## Signature\n\n```ts\npromotedProductListener((productId?: string) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {promotedProductListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = promotedProductListener((productId) => {\n console.log(productId);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n *\n * @platform iOS\n */\nexport const promotedProductListener = (listener: () => void) => {\n if (isIos && !isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-promoted-product', listener);\n }\n\n return null;\n};\n\n/**\n * Updated transactions for iOS Sk2\n * Register a callback that gets called when the store has any updates to transactions related to purchases that have not yet been finished, consumed or acknowledged. \n * Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n**Warning**\nThis is only available for iOS 15 and higher and Storekit 2 is activated\n\n## Signature\n\n```ts\npurchaseUpdatedListener((transactionOrError: TransactionOrError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((transactionOrError: TransactionOrError) => {\n if(transactionOrError.transaction){\n console.log(\"There's an update to a transaction\", transactionOrError.transaction);\n }else{\n console.log(\"There's been an error with a received transaction\")\n }\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n *\n * @platform iOS (Sk2)\n */\nexport const transactionListener = (\n listener: (event: TransactionEvent) => void,\n) => {\n if (isIos && isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-transaction-updated', listener);\n }\n\n return null;\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMA,uBAAuB,GAClCC,QADqC,IAElC;EACH,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,yBAAA,GAAvB,CAArB;EACA,MAAMC,aAAa,GAAG,IAAAC,mBAAA,MACjBC,KAAD,IAAqB;IACnBN,QAAQ,CAAC,IAAAO,0BAAA,EAAkBD,KAAlB,CAAD,CAAR;EACD,CAHiB,GAIlBN,QAJJ;EAKA,MAAMQ,mBAAmB,GAAGP,YAAY,CAACQ,WAAb,CAC1B,kBAD0B,EAE1BL,aAF0B,CAA5B;;EAKA,IAAIM,mBAAJ,EAAe;IACb,IAAAC,0BAAA,IAAmBC,cAAnB;EACD;;EAED,OAAOJ,mBAAP;AACD,CAnBM;AAqBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMK,qBAAqB,GAChCb,QADmC,IAEX;EACxB,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,yBAAA,GAAvB,CAArB;EACA,OAAOF,YAAY,CAACQ,WAAb,CAAyB,gBAAzB,EAA2CT,QAA3C,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,uBAAuB,GAAId,QAAD,IAA0B;EAC/D,IAAIe,eAAA,IAAS,CAAC,IAAAV,mBAAA,GAAd,EAAgC;IAC9B,MAAMJ,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAc,sBAAA,GAAvB,CAArB;IACA,OAAOf,YAAY,CAACQ,WAAb,CAAyB,sBAAzB,EAAiDT,QAAjD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CAPM;AASP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMiB,mBAAmB,GAC9BjB,QADiC,IAE9B;EACH,IAAIe,eAAA,IAAS,IAAAV,mBAAA,GAAb,EAA+B;IAC7B,MAAMJ,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAc,sBAAA,GAAvB,CAArB;IACA,OAAOf,YAAY,CAACQ,WAAb,CAAyB,yBAAzB,EAAoDT,QAApD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CATM"}
1
+ {"version":3,"names":["purchaseUpdatedListener","listener","eventEmitter","NativeEventEmitter","getNativeModule","proxyListener","isIosStorekit2","event","transactionSk2ToPurchaseMap","emitterSubscription","addListener","isAndroid","getAndroidModule","startListening","purchaseErrorListener","promotedProductListener","isIos","getIosModule","transactionListener"],"sources":["eventEmitter.ts"],"sourcesContent":["import {EmitterSubscription, NativeEventEmitter} from 'react-native';\n\nimport {TransactionEvent, transactionSk2ToPurchaseMap} from './types/appleSk2';\nimport {isIosStorekit2} from './iap';\nimport {\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAndroid,\n isIos,\n} from './internal';\nimport type {PurchaseError} from './purchaseError';\nimport type {Purchase} from './types';\n\n/**\n * Add IAP purchase event\n * Register a callback that gets called when the store has any updates to purchases that have not yet been finished, consumed or acknowledged. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n## Signature\n\n```ts\npurchaseUpdatedListener((purchase: Purchase) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((purchase: Purchase) => {\n console.log(purchase);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n */\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n) => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n const proxyListener = isIosStorekit2()\n ? (event: Purchase) => {\n listener(transactionSk2ToPurchaseMap(event as any));\n }\n : listener;\n const emitterSubscription = eventEmitter.addListener(\n 'purchase-updated',\n proxyListener,\n );\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n * Register a callback that gets called when there has been an error with a purchase. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates.\n\n## Signature\n\n```ts\npurchaseErrorListener((error: PurchaseError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseErrorListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseErrorListener((error: PurchaseError) => {\n console.log(error);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n */\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EmitterSubscription => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n return eventEmitter.addListener('purchase-error', listener);\n};\n\n/**\n * Add IAP promoted subscription event\n * Add IAP promoted subscription event.\n\n## Signature\n\n```ts\npromotedProductListener((productId?: string) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {promotedProductListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = promotedProductListener((productId) => {\n console.log(productId);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n *\n * @platform iOS\n */\nexport const promotedProductListener = (listener: () => void) => {\n if (isIos && !isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-promoted-product', listener);\n }\n\n return null;\n};\n\n/**\n * Updated transactions for iOS Sk2\n * Register a callback that gets called when the store has any updates to transactions related to purchases that have not yet been finished, consumed or acknowledged. \n * Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n**Warning**\nThis is only available for iOS 15 and higher and Storekit 2 is activated\n\n## Signature\n\n```ts\npurchaseUpdatedListener((transactionOrError: TransactionOrError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((transactionOrError: TransactionOrError) => {\n if(transactionOrError.transaction){\n console.log(\"There's an update to a transaction\", transactionOrError.transaction);\n }else{\n console.log(\"There's been an error with a received transaction\")\n }\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n *\n * @platform iOS (Sk2)\n */\nexport const transactionListener = (\n listener: (event: TransactionEvent) => void,\n) => {\n if (isIos && isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-transaction-updated', listener);\n }\n\n return null;\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMA,uBAAuB,GAClCC,QADqC,IAElC;EACH,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,yBAAA,GAAvB,CAArB;EACA,MAAMC,aAAa,GAAG,IAAAC,mBAAA,MACjBC,KAAD,IAAqB;IACnBN,QAAQ,CAAC,IAAAO,oCAAA,EAA4BD,KAA5B,CAAD,CAAR;EACD,CAHiB,GAIlBN,QAJJ;EAKA,MAAMQ,mBAAmB,GAAGP,YAAY,CAACQ,WAAb,CAC1B,kBAD0B,EAE1BL,aAF0B,CAA5B;;EAKA,IAAIM,mBAAJ,EAAe;IACb,IAAAC,0BAAA,IAAmBC,cAAnB;EACD;;EAED,OAAOJ,mBAAP;AACD,CAnBM;AAqBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,MAAMK,qBAAqB,GAChCb,QADmC,IAEX;EACxB,MAAMC,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAC,yBAAA,GAAvB,CAArB;EACA,OAAOF,YAAY,CAACQ,WAAb,CAAyB,gBAAzB,EAA2CT,QAA3C,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,uBAAuB,GAAId,QAAD,IAA0B;EAC/D,IAAIe,eAAA,IAAS,CAAC,IAAAV,mBAAA,GAAd,EAAgC;IAC9B,MAAMJ,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAc,sBAAA,GAAvB,CAArB;IACA,OAAOf,YAAY,CAACQ,WAAb,CAAyB,sBAAzB,EAAiDT,QAAjD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CAPM;AASP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMiB,mBAAmB,GAC9BjB,QADiC,IAE9B;EACH,IAAIe,eAAA,IAAS,IAAAV,mBAAA,GAAb,EAA+B;IAC7B,MAAMJ,YAAY,GAAG,IAAIC,+BAAJ,CAAuB,IAAAc,sBAAA,GAAvB,CAArB;IACA,OAAOf,YAAY,CAACQ,WAAb,CAAyB,yBAAzB,EAAoDT,QAApD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CATM"}
@@ -338,7 +338,7 @@ const getPurchaseHistory = function () {
338
338
  return (_reactNative.Platform.select({
339
339
  ios: async () => {
340
340
  if ((0, _internal.isIosStorekit2)()) {
341
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(_appleSk.transactionSk2Map));
341
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(_appleSk.transactionSk2ToPurchaseMap));
342
342
  } else {
343
343
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
344
344
  }
@@ -449,7 +449,7 @@ const getAvailablePurchases = function () {
449
449
  return (_reactNative.Platform.select({
450
450
  ios: async () => {
451
451
  if ((0, _internal.isIosStorekit2)()) {
452
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(_appleSk.transactionSk2Map));
452
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(_appleSk.transactionSk2ToPurchaseMap));
453
453
  } else {
454
454
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
455
455
  }
@@ -556,7 +556,8 @@ const requestPurchase = request => (_reactNative.Platform.select({
556
556
 
557
557
  if ((0, _internal.isIosStorekit2)()) {
558
558
  const offer = (0, _appleSk.offerSk2Map)(withOffer);
559
- return RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer);
559
+ const purchase = (0, _appleSk.transactionSk2ToPurchaseMap)(await RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer));
560
+ return Promise.resolve(purchase);
560
561
  } else {
561
562
  return RNIapIos.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, (0, _apple.offerToRecord)(withOffer));
562
563
  }
@@ -687,7 +688,8 @@ const requestSubscription = request => (_reactNative.Platform.select({
687
688
 
688
689
  if ((0, _internal.isIosStorekit2)()) {
689
690
  const offer = (0, _appleSk.offerSk2Map)(withOffer);
690
- return RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer);
691
+ const purchase = (0, _appleSk.transactionSk2ToPurchaseMap)(await RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer));
692
+ return Promise.resolve(purchase);
691
693
  } else {
692
694
  return RNIapIos.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, (0, _apple.offerToRecord)(withOffer));
693
695
  }
@@ -742,6 +744,7 @@ const App = () => {
742
744
  return <Button title="Buy product" onPress={handlePurchase} />;
743
745
  };
744
746
  ```
747
+ @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true
745
748
  */
746
749
 
747
750
 
@@ -761,7 +764,8 @@ const finishTransaction = _ref3 => {
761
764
  return Promise.reject(new Error('transactionId required to finish iOS transaction'));
762
765
  }
763
766
 
764
- return (0, _internal.getIosModule)().finishTransaction(transactionId);
767
+ await (0, _internal.getIosModule)().finishTransaction(transactionId);
768
+ return Promise.resolve(true);
765
769
  },
766
770
  android: async () => {
767
771
  if (purchase !== null && purchase !== void 0 && purchase.purchaseToken) {
@@ -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","transactionSk2Map","getPurchaseHistoryByType","concat","getAvailablePurchases","getAvailableItemsByType","requestPurchase","request","sku","andDangerouslyFinishTransactionAutomaticallyIOS","appAccountToken","quantity","withOffer","console","warn","offer","offerSk2Map","buyProduct","offerToRecord","isAmazon","buyItemByType","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","getIosModule","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PurchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n 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 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<(ProductPurchase | SubscriptionPurchase)[]> =>\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(transactionSk2Map),\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<(ProductPurchase | SubscriptionPurchase)[]> =>\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(transactionSk2Map),\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 return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' 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 return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' 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 */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;AAOA;;AAYA;;;;;;AAkBA,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(['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 +1 @@
1
- {"version":3,"names":["RNIapIosSk2","NativeModules","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n onlyIncludeActiveItems?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":";;;;;;;AAAA;;AAYA,MAAM;EAACA;AAAD,IAAgBC,0BAAtB;;AAkDA;AACA;AACA;AACA;AACO,MAAMC,IAAI,GAAG,MAAqBF,WAAW,CAACE,IAAZ,EAAlC;AAEP;AACA;AACA;;;;;AACO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCJ,WAAW,CAACG,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;;;;AAEO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCN,WAAW,CAACK,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMC,kBAAkB,GAAID,GAAD,IAChCN,WAAW,CAACO,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BN,WAAW,CAACQ,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCN,WAAW,CAACS,kBAAZ,CAA+BH,GAA/B,CADK"}
1
+ {"version":3,"names":["RNIapIosSk2","NativeModules","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n onlyIncludeActiveItems?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<TransactionSk2>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":";;;;;;;AAAA;;AAYA,MAAM;EAACA;AAAD,IAAgBC,0BAAtB;;AAkDA;AACA;AACA;AACA;AACO,MAAMC,IAAI,GAAG,MAAqBF,WAAW,CAACE,IAAZ,EAAlC;AAEP;AACA;AACA;;;;;AACO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCJ,WAAW,CAACG,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;;;;AAEO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCN,WAAW,CAACK,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMC,kBAAkB,GAAID,GAAD,IAChCN,WAAW,CAACO,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BN,WAAW,CAACQ,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;;;;AACO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCN,WAAW,CAACS,kBAAZ,CAA+BH,GAA/B,CADK"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.transactionSk2Map = exports.subscriptionSk2Map = exports.productSk2Map = exports.offerSk2Map = void 0;
6
+ exports.transactionSk2ToPurchaseMap = exports.subscriptionSk2Map = exports.productSk2Map = exports.offerSk2Map = void 0;
7
7
 
8
8
  var _ = require(".");
9
9
 
@@ -59,7 +59,7 @@ const subscriptionSk2Map = _ref2 => {
59
59
 
60
60
  exports.subscriptionSk2Map = subscriptionSk2Map;
61
61
 
62
- const transactionSk2Map = _ref3 => {
62
+ const transactionSk2ToPurchaseMap = _ref3 => {
63
63
  let {
64
64
  id,
65
65
  originalPurchaseDate,
@@ -88,7 +88,7 @@ const transactionSk2Map = _ref3 => {
88
88
  */
89
89
 
90
90
 
91
- exports.transactionSk2Map = transactionSk2Map;
91
+ exports.transactionSk2ToPurchaseMap = transactionSk2ToPurchaseMap;
92
92
 
93
93
  const offerSk2Map = offer => {
94
94
  if (!offer) {
@@ -1 +1 @@
1
- {"version":3,"names":["productSk2Map","id","description","displayName","price","displayPrice","prod","title","productId","String","type","localizedPrice","currency","subscriptionSk2Map","subscription","platform","SubscriptionPlatform","ios","subscriptionPeriodNumberIOS","subscriptionPeriod","value","subscriptionPeriodUnitIOS","unit","toUpperCase","transactionSk2Map","originalPurchaseDate","productID","purchaseDate","purchasedQuantity","originalID","purchase","transactionId","transactionDate","transactionReceipt","purchaseToken","quantityIOS","originalTransactionDateIOS","originalTransactionIdentifierIOS","offerSk2Map","offer","undefined","offerID","identifier","keyID","keyIdentifier","nonce","signature","timestamp","toString"],"sources":["appleSk2.ts"],"sourcesContent":["import type {PurchaseError} from '../purchaseError';\n\nimport type {\n ProductIOS,\n Purchase,\n SubscriptionIOS,\n SubscriptionIosPeriod,\n} from '.';\nimport type * as Apple from './apple';\nimport {SubscriptionPlatform} from '.';\n\nexport type SubscriptionPeriod = {\n unit: 'day' | 'week' | 'month' | 'year';\n value: number;\n};\n\nexport type PaymentMode = 'freeTrial' | 'payAsYouGo' | 'payUpFront';\n\nexport type SubscriptionOffer = {\n displayPrice: string;\n id: string;\n paymentMode: PaymentMode;\n period: SubscriptionPeriod;\n periodCount: number;\n price: number;\n type: 'introductory' | 'promotional';\n};\n\nexport type SubscriptionInfo = {\n introductoryOffer?: SubscriptionOffer;\n promotionalOffers?: SubscriptionOffer[];\n subscriptionGroupID: string;\n subscriptionPeriod: SubscriptionPeriod;\n};\n\nexport type RefundRequestStatus = 'success' | 'userCancelled';\n\nexport type ProductSk2 = {\n description: string;\n displayName: string;\n displayPrice: string;\n id: number;\n isFamilyShareable: boolean;\n jsonRepresentation: string;\n price: number;\n subscription: SubscriptionInfo;\n type: 'autoRenewable' | 'consumable' | 'nonConsumable' | 'nonRenewable';\n};\nexport const productSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n}: ProductSk2): ProductIOS => {\n const prod: ProductIOS = {\n title: displayName,\n productId: String(id),\n description,\n type: 'iap',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n };\n return prod;\n};\n\nexport const subscriptionSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n subscription,\n}: ProductSk2): SubscriptionIOS => {\n const prod: SubscriptionIOS = {\n platform: SubscriptionPlatform.ios,\n title: displayName,\n productId: String(id),\n description,\n type: 'subs',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n subscriptionPeriodNumberIOS: `${subscription?.subscriptionPeriod?.value}`,\n subscriptionPeriodUnitIOS:\n subscription?.subscriptionPeriod?.unit.toUpperCase() as SubscriptionIosPeriod,\n };\n return prod;\n};\n\nexport type TransactionSk2 = {\n appAccountToken: string;\n appBundleID: string;\n debugDescription: string;\n deviceVerification: string;\n deviceVerificationNonce: string;\n expirationDate: number;\n id: number;\n isUpgraded: boolean;\n jsonRepresentation: string;\n offerID: string;\n offerType: string;\n originalID: string;\n originalPurchaseDate: number;\n ownershipType: string;\n productID: string;\n productType: string;\n purchaseDate: number;\n purchasedQuantity: number;\n revocationDate: number;\n revocationReason: string;\n signedDate: number;\n subscriptionGroupID: number;\n webOrderLineItemID: number;\n};\n\nexport type TransactionError = PurchaseError;\n\n/**\n * Only one of `transaction` and `error` is not undefined at the time\n */\nexport type TransactionEvent = {\n transaction?: TransactionSk2;\n error?: TransactionError;\n};\n\nexport type SubscriptionStatus =\n | 'expired'\n | 'inBillingRetryPeriod'\n | 'inGracePeriod'\n | 'revoked'\n | 'subscribed';\n\nexport type ProductStatus = {\n state: SubscriptionStatus;\n};\n\nexport const transactionSk2Map = ({\n id,\n originalPurchaseDate,\n productID,\n purchaseDate,\n purchasedQuantity,\n originalID,\n}: TransactionSk2): Purchase => {\n const purchase: Purchase = {\n productId: productID,\n transactionId: String(id),\n transactionDate: purchaseDate, //??\n transactionReceipt: '', // Not available\n purchaseToken: '', //Not avaiable\n quantityIOS: purchasedQuantity,\n originalTransactionDateIOS: originalPurchaseDate,\n originalTransactionIdentifierIOS: originalID,\n };\n return purchase;\n};\n\n/**\n * Payment discount interface @see https://developer.apple.com/documentation/storekit/skpaymentdiscount?language=objc\n */\nexport interface PaymentDiscountSk2 {\n /**\n * A string used to uniquely identify a discount offer for a product.\n */\n offerID: string;\n\n /**\n * A string that identifies the key used to generate the signature.\n */\n keyID: string;\n\n /**\n * A universally unique ID (UUID) value that you define.\n */\n nonce: string;\n\n /**\n * A UTF-8 string representing the properties of a specific discount offer, cryptographically signed.\n */\n signature: string;\n\n /**\n * The date and time of the signature's creation in milliseconds, formatted in Unix epoch time.\n */\n timestamp: number;\n}\n\nexport const offerSk2Map = (\n offer: Apple.PaymentDiscount | undefined,\n): Record<keyof PaymentDiscountSk2, string> | undefined => {\n if (!offer) {\n return undefined;\n }\n return {\n offerID: offer.identifier,\n keyID: offer.keyIdentifier,\n nonce: offer.nonce,\n signature: offer.signature,\n timestamp: offer.timestamp.toString(),\n };\n};\n"],"mappings":";;;;;;;AASA;;AAuCO,MAAMA,aAAa,GAAG,QAMC;EAAA,IANA;IAC5BC,EAD4B;IAE5BC,WAF4B;IAG5BC,WAH4B;IAI5BC,KAJ4B;IAK5BC;EAL4B,CAMA;EAC5B,MAAMC,IAAgB,GAAG;IACvBC,KAAK,EAAEJ,WADgB;IAEvBK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAFM;IAGvBC,WAHuB;IAIvBQ,IAAI,EAAE,KAJiB;IAKvBN,KAAK,EAAEK,MAAM,CAACL,KAAD,CALU;IAMvBO,cAAc,EAAEN,YANO;IAOvBO,QAAQ,EAAE,EAPa,CAOT;;EAPS,CAAzB;EASA,OAAON,IAAP;AACD,CAjBM;;;;AAmBA,MAAMO,kBAAkB,GAAG,SAOC;EAAA;;EAAA,IAPA;IACjCZ,EADiC;IAEjCC,WAFiC;IAGjCC,WAHiC;IAIjCC,KAJiC;IAKjCC,YALiC;IAMjCS;EANiC,CAOA;EACjC,MAAMR,IAAqB,GAAG;IAC5BS,QAAQ,EAAEC,sBAAA,CAAqBC,GADH;IAE5BV,KAAK,EAAEJ,WAFqB;IAG5BK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAHW;IAI5BC,WAJ4B;IAK5BQ,IAAI,EAAE,MALsB;IAM5BN,KAAK,EAAEK,MAAM,CAACL,KAAD,CANe;IAO5BO,cAAc,EAAEN,YAPY;IAQ5BO,QAAQ,EAAE,EARkB;IAQd;IACdM,2BAA2B,EAAG,GAAEJ,YAAH,aAAGA,YAAH,gDAAGA,YAAY,CAAEK,kBAAjB,0DAAG,sBAAkCC,KAAM,EAT5C;IAU5BC,yBAAyB,EACvBP,YADuB,aACvBA,YADuB,iDACvBA,YAAY,CAAEK,kBADS,2DACvB,uBAAkCG,IAAlC,CAAuCC,WAAvC;EAX0B,CAA9B;EAaA,OAAOjB,IAAP;AACD,CAtBM;;;;AAuEA,MAAMkB,iBAAiB,GAAG,SAOD;EAAA,IAPE;IAChCvB,EADgC;IAEhCwB,oBAFgC;IAGhCC,SAHgC;IAIhCC,YAJgC;IAKhCC,iBALgC;IAMhCC;EANgC,CAOF;EAC9B,MAAMC,QAAkB,GAAG;IACzBtB,SAAS,EAAEkB,SADc;IAEzBK,aAAa,EAAEtB,MAAM,CAACR,EAAD,CAFI;IAGzB+B,eAAe,EAAEL,YAHQ;IAGM;IAC/BM,kBAAkB,EAAE,EAJK;IAID;IACxBC,aAAa,EAAE,EALU;IAKN;IACnBC,WAAW,EAAEP,iBANY;IAOzBQ,0BAA0B,EAAEX,oBAPH;IAQzBY,gCAAgC,EAAER;EART,CAA3B;EAUA,OAAOC,QAAP;AACD,CAnBM;AAqBP;AACA;AACA;;;;;AA4BO,MAAMQ,WAAW,GACtBC,KADyB,IAEgC;EACzD,IAAI,CAACA,KAAL,EAAY;IACV,OAAOC,SAAP;EACD;;EACD,OAAO;IACLC,OAAO,EAAEF,KAAK,CAACG,UADV;IAELC,KAAK,EAAEJ,KAAK,CAACK,aAFR;IAGLC,KAAK,EAAEN,KAAK,CAACM,KAHR;IAILC,SAAS,EAAEP,KAAK,CAACO,SAJZ;IAKLC,SAAS,EAAER,KAAK,CAACQ,SAAN,CAAgBC,QAAhB;EALN,CAAP;AAOD,CAbM"}
1
+ {"version":3,"names":["productSk2Map","id","description","displayName","price","displayPrice","prod","title","productId","String","type","localizedPrice","currency","subscriptionSk2Map","subscription","platform","SubscriptionPlatform","ios","subscriptionPeriodNumberIOS","subscriptionPeriod","value","subscriptionPeriodUnitIOS","unit","toUpperCase","transactionSk2ToPurchaseMap","originalPurchaseDate","productID","purchaseDate","purchasedQuantity","originalID","purchase","transactionId","transactionDate","transactionReceipt","purchaseToken","quantityIOS","originalTransactionDateIOS","originalTransactionIdentifierIOS","offerSk2Map","offer","undefined","offerID","identifier","keyID","keyIdentifier","nonce","signature","timestamp","toString"],"sources":["appleSk2.ts"],"sourcesContent":["import type {PurchaseError} from '../purchaseError';\n\nimport type {\n ProductIOS,\n Purchase,\n SubscriptionIOS,\n SubscriptionIosPeriod,\n} from '.';\nimport type * as Apple from './apple';\nimport {SubscriptionPlatform} from '.';\n\nexport type SubscriptionPeriod = {\n unit: 'day' | 'week' | 'month' | 'year';\n value: number;\n};\n\nexport type PaymentMode = 'freeTrial' | 'payAsYouGo' | 'payUpFront';\n\nexport type SubscriptionOffer = {\n displayPrice: string;\n id: string;\n paymentMode: PaymentMode;\n period: SubscriptionPeriod;\n periodCount: number;\n price: number;\n type: 'introductory' | 'promotional';\n};\n\nexport type SubscriptionInfo = {\n introductoryOffer?: SubscriptionOffer;\n promotionalOffers?: SubscriptionOffer[];\n subscriptionGroupID: string;\n subscriptionPeriod: SubscriptionPeriod;\n};\n\nexport type RefundRequestStatus = 'success' | 'userCancelled';\n\nexport type ProductSk2 = {\n description: string;\n displayName: string;\n displayPrice: string;\n id: number;\n isFamilyShareable: boolean;\n jsonRepresentation: string;\n price: number;\n subscription: SubscriptionInfo;\n type: 'autoRenewable' | 'consumable' | 'nonConsumable' | 'nonRenewable';\n};\nexport const productSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n}: ProductSk2): ProductIOS => {\n const prod: ProductIOS = {\n title: displayName,\n productId: String(id),\n description,\n type: 'iap',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n };\n return prod;\n};\n\nexport const subscriptionSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n subscription,\n}: ProductSk2): SubscriptionIOS => {\n const prod: SubscriptionIOS = {\n platform: SubscriptionPlatform.ios,\n title: displayName,\n productId: String(id),\n description,\n type: 'subs',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n subscriptionPeriodNumberIOS: `${subscription?.subscriptionPeriod?.value}`,\n subscriptionPeriodUnitIOS:\n subscription?.subscriptionPeriod?.unit.toUpperCase() as SubscriptionIosPeriod,\n };\n return prod;\n};\n\nexport type TransactionSk2 = {\n appAccountToken: string;\n appBundleID: string;\n debugDescription: string;\n deviceVerification: string;\n deviceVerificationNonce: string;\n expirationDate: number;\n id: number;\n isUpgraded: boolean;\n jsonRepresentation: string;\n offerID: string;\n offerType: string;\n originalID: string;\n originalPurchaseDate: number;\n ownershipType: string;\n productID: string;\n productType: string;\n purchaseDate: number;\n purchasedQuantity: number;\n revocationDate: number;\n revocationReason: string;\n signedDate: number;\n subscriptionGroupID: number;\n webOrderLineItemID: number;\n};\n\nexport type TransactionError = PurchaseError;\n\n/**\n * Only one of `transaction` and `error` is not undefined at the time\n */\nexport type TransactionEvent = {\n transaction?: TransactionSk2;\n error?: TransactionError;\n};\n\nexport type SubscriptionStatus =\n | 'expired'\n | 'inBillingRetryPeriod'\n | 'inGracePeriod'\n | 'revoked'\n | 'subscribed';\n\nexport type ProductStatus = {\n state: SubscriptionStatus;\n};\n\nexport const transactionSk2ToPurchaseMap = ({\n id,\n originalPurchaseDate,\n productID,\n purchaseDate,\n purchasedQuantity,\n originalID,\n}: TransactionSk2): Purchase => {\n const purchase: Purchase = {\n productId: productID,\n transactionId: String(id),\n transactionDate: purchaseDate, //??\n transactionReceipt: '', // Not available\n purchaseToken: '', //Not avaiable\n quantityIOS: purchasedQuantity,\n originalTransactionDateIOS: originalPurchaseDate,\n originalTransactionIdentifierIOS: originalID,\n };\n return purchase;\n};\n\n/**\n * Payment discount interface @see https://developer.apple.com/documentation/storekit/skpaymentdiscount?language=objc\n */\nexport interface PaymentDiscountSk2 {\n /**\n * A string used to uniquely identify a discount offer for a product.\n */\n offerID: string;\n\n /**\n * A string that identifies the key used to generate the signature.\n */\n keyID: string;\n\n /**\n * A universally unique ID (UUID) value that you define.\n */\n nonce: string;\n\n /**\n * A UTF-8 string representing the properties of a specific discount offer, cryptographically signed.\n */\n signature: string;\n\n /**\n * The date and time of the signature's creation in milliseconds, formatted in Unix epoch time.\n */\n timestamp: number;\n}\n\nexport const offerSk2Map = (\n offer: Apple.PaymentDiscount | undefined,\n): Record<keyof PaymentDiscountSk2, string> | undefined => {\n if (!offer) {\n return undefined;\n }\n return {\n offerID: offer.identifier,\n keyID: offer.keyIdentifier,\n nonce: offer.nonce,\n signature: offer.signature,\n timestamp: offer.timestamp.toString(),\n };\n};\n"],"mappings":";;;;;;;AASA;;AAuCO,MAAMA,aAAa,GAAG,QAMC;EAAA,IANA;IAC5BC,EAD4B;IAE5BC,WAF4B;IAG5BC,WAH4B;IAI5BC,KAJ4B;IAK5BC;EAL4B,CAMA;EAC5B,MAAMC,IAAgB,GAAG;IACvBC,KAAK,EAAEJ,WADgB;IAEvBK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAFM;IAGvBC,WAHuB;IAIvBQ,IAAI,EAAE,KAJiB;IAKvBN,KAAK,EAAEK,MAAM,CAACL,KAAD,CALU;IAMvBO,cAAc,EAAEN,YANO;IAOvBO,QAAQ,EAAE,EAPa,CAOT;;EAPS,CAAzB;EASA,OAAON,IAAP;AACD,CAjBM;;;;AAmBA,MAAMO,kBAAkB,GAAG,SAOC;EAAA;;EAAA,IAPA;IACjCZ,EADiC;IAEjCC,WAFiC;IAGjCC,WAHiC;IAIjCC,KAJiC;IAKjCC,YALiC;IAMjCS;EANiC,CAOA;EACjC,MAAMR,IAAqB,GAAG;IAC5BS,QAAQ,EAAEC,sBAAA,CAAqBC,GADH;IAE5BV,KAAK,EAAEJ,WAFqB;IAG5BK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAHW;IAI5BC,WAJ4B;IAK5BQ,IAAI,EAAE,MALsB;IAM5BN,KAAK,EAAEK,MAAM,CAACL,KAAD,CANe;IAO5BO,cAAc,EAAEN,YAPY;IAQ5BO,QAAQ,EAAE,EARkB;IAQd;IACdM,2BAA2B,EAAG,GAAEJ,YAAH,aAAGA,YAAH,gDAAGA,YAAY,CAAEK,kBAAjB,0DAAG,sBAAkCC,KAAM,EAT5C;IAU5BC,yBAAyB,EACvBP,YADuB,aACvBA,YADuB,iDACvBA,YAAY,CAAEK,kBADS,2DACvB,uBAAkCG,IAAlC,CAAuCC,WAAvC;EAX0B,CAA9B;EAaA,OAAOjB,IAAP;AACD,CAtBM;;;;AAuEA,MAAMkB,2BAA2B,GAAG,SAOX;EAAA,IAPY;IAC1CvB,EAD0C;IAE1CwB,oBAF0C;IAG1CC,SAH0C;IAI1CC,YAJ0C;IAK1CC,iBAL0C;IAM1CC;EAN0C,CAOZ;EAC9B,MAAMC,QAAkB,GAAG;IACzBtB,SAAS,EAAEkB,SADc;IAEzBK,aAAa,EAAEtB,MAAM,CAACR,EAAD,CAFI;IAGzB+B,eAAe,EAAEL,YAHQ;IAGM;IAC/BM,kBAAkB,EAAE,EAJK;IAID;IACxBC,aAAa,EAAE,EALU;IAKN;IACnBC,WAAW,EAAEP,iBANY;IAOzBQ,0BAA0B,EAAEX,oBAPH;IAQzBY,gCAAgC,EAAER;EART,CAA3B;EAUA,OAAOC,QAAP;AACD,CAnBM;AAqBP;AACA;AACA;;;;;AA4BO,MAAMQ,WAAW,GACtBC,KADyB,IAEgC;EACzD,IAAI,CAACA,KAAL,EAAY;IACV,OAAOC,SAAP;EACD;;EACD,OAAO;IACLC,OAAO,EAAEF,KAAK,CAACG,UADV;IAELC,KAAK,EAAEJ,KAAK,CAACK,aAFR;IAGLC,KAAK,EAAEN,KAAK,CAACM,KAHR;IAILC,SAAS,EAAEP,KAAK,CAACO,SAJZ;IAKLC,SAAS,EAAER,KAAK,CAACQ,SAAN,CAAgBC,QAAhB;EALN,CAAP;AAOD,CAbM"}
@@ -1,5 +1,5 @@
1
1
  import { NativeEventEmitter } from 'react-native';
2
- import { transactionSk2Map } from './types/appleSk2';
2
+ import { transactionSk2ToPurchaseMap } from './types/appleSk2';
3
3
  import { isIosStorekit2 } from './iap';
4
4
  import { getAndroidModule, getIosModule, getNativeModule, isAndroid, isIos } from './internal';
5
5
 
@@ -38,7 +38,7 @@ const App = () => {
38
38
  export const purchaseUpdatedListener = listener => {
39
39
  const eventEmitter = new NativeEventEmitter(getNativeModule());
40
40
  const proxyListener = isIosStorekit2() ? event => {
41
- listener(transactionSk2Map(event));
41
+ listener(transactionSk2ToPurchaseMap(event));
42
42
  } : listener;
43
43
  const emitterSubscription = eventEmitter.addListener('purchase-updated', proxyListener);
44
44
 
@@ -1 +1 @@
1
- {"version":3,"names":["NativeEventEmitter","transactionSk2Map","isIosStorekit2","getAndroidModule","getIosModule","getNativeModule","isAndroid","isIos","purchaseUpdatedListener","listener","eventEmitter","proxyListener","event","emitterSubscription","addListener","startListening","purchaseErrorListener","promotedProductListener","transactionListener"],"sources":["eventEmitter.ts"],"sourcesContent":["import {EmitterSubscription, NativeEventEmitter} from 'react-native';\n\nimport {TransactionEvent, transactionSk2Map} from './types/appleSk2';\nimport {isIosStorekit2} from './iap';\nimport {\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAndroid,\n isIos,\n} from './internal';\nimport type {PurchaseError} from './purchaseError';\nimport type {Purchase} from './types';\n\n/**\n * Add IAP purchase event\n * Register a callback that gets called when the store has any updates to purchases that have not yet been finished, consumed or acknowledged. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n## Signature\n\n```ts\npurchaseUpdatedListener((purchase: Purchase) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((purchase: Purchase) => {\n console.log(purchase);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n */\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n) => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n const proxyListener = isIosStorekit2()\n ? (event: Purchase) => {\n listener(transactionSk2Map(event as any));\n }\n : listener;\n const emitterSubscription = eventEmitter.addListener(\n 'purchase-updated',\n proxyListener,\n );\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n * Register a callback that gets called when there has been an error with a purchase. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates.\n\n## Signature\n\n```ts\npurchaseErrorListener((error: PurchaseError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseErrorListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseErrorListener((error: PurchaseError) => {\n console.log(error);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n */\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EmitterSubscription => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n return eventEmitter.addListener('purchase-error', listener);\n};\n\n/**\n * Add IAP promoted subscription event\n * Add IAP promoted subscription event.\n\n## Signature\n\n```ts\npromotedProductListener((productId?: string) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {promotedProductListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = promotedProductListener((productId) => {\n console.log(productId);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n *\n * @platform iOS\n */\nexport const promotedProductListener = (listener: () => void) => {\n if (isIos && !isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-promoted-product', listener);\n }\n\n return null;\n};\n\n/**\n * Updated transactions for iOS Sk2\n * Register a callback that gets called when the store has any updates to transactions related to purchases that have not yet been finished, consumed or acknowledged. \n * Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n**Warning**\nThis is only available for iOS 15 and higher and Storekit 2 is activated\n\n## Signature\n\n```ts\npurchaseUpdatedListener((transactionOrError: TransactionOrError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((transactionOrError: TransactionOrError) => {\n if(transactionOrError.transaction){\n console.log(\"There's an update to a transaction\", transactionOrError.transaction);\n }else{\n console.log(\"There's been an error with a received transaction\")\n }\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n *\n * @platform iOS (Sk2)\n */\nexport const transactionListener = (\n listener: (event: TransactionEvent) => void,\n) => {\n if (isIos && isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-transaction-updated', listener);\n }\n\n return null;\n};\n"],"mappings":"AAAA,SAA6BA,kBAA7B,QAAsD,cAAtD;AAEA,SAA0BC,iBAA1B,QAAkD,kBAAlD;AACA,SAAQC,cAAR,QAA6B,OAA7B;AACA,SACEC,gBADF,EAEEC,YAFF,EAGEC,eAHF,EAIEC,SAJF,EAKEC,KALF,QAMO,YANP;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,uBAAuB,GAClCC,QADqC,IAElC;EACH,MAAMC,YAAY,GAAG,IAAIV,kBAAJ,CAAuBK,eAAe,EAAtC,CAArB;EACA,MAAMM,aAAa,GAAGT,cAAc,KAC/BU,KAAD,IAAqB;IACnBH,QAAQ,CAACR,iBAAiB,CAACW,KAAD,CAAlB,CAAR;EACD,CAH+B,GAIhCH,QAJJ;EAKA,MAAMI,mBAAmB,GAAGH,YAAY,CAACI,WAAb,CAC1B,kBAD0B,EAE1BH,aAF0B,CAA5B;;EAKA,IAAIL,SAAJ,EAAe;IACbH,gBAAgB,GAAGY,cAAnB;EACD;;EAED,OAAOF,mBAAP;AACD,CAnBM;AAqBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMG,qBAAqB,GAChCP,QADmC,IAEX;EACxB,MAAMC,YAAY,GAAG,IAAIV,kBAAJ,CAAuBK,eAAe,EAAtC,CAArB;EACA,OAAOK,YAAY,CAACI,WAAb,CAAyB,gBAAzB,EAA2CL,QAA3C,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMQ,uBAAuB,GAAIR,QAAD,IAA0B;EAC/D,IAAIF,KAAK,IAAI,CAACL,cAAc,EAA5B,EAAgC;IAC9B,MAAMQ,YAAY,GAAG,IAAIV,kBAAJ,CAAuBI,YAAY,EAAnC,CAArB;IACA,OAAOM,YAAY,CAACI,WAAb,CAAyB,sBAAzB,EAAiDL,QAAjD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CAPM;AASP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMS,mBAAmB,GAC9BT,QADiC,IAE9B;EACH,IAAIF,KAAK,IAAIL,cAAc,EAA3B,EAA+B;IAC7B,MAAMQ,YAAY,GAAG,IAAIV,kBAAJ,CAAuBI,YAAY,EAAnC,CAArB;IACA,OAAOM,YAAY,CAACI,WAAb,CAAyB,yBAAzB,EAAoDL,QAApD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CATM"}
1
+ {"version":3,"names":["NativeEventEmitter","transactionSk2ToPurchaseMap","isIosStorekit2","getAndroidModule","getIosModule","getNativeModule","isAndroid","isIos","purchaseUpdatedListener","listener","eventEmitter","proxyListener","event","emitterSubscription","addListener","startListening","purchaseErrorListener","promotedProductListener","transactionListener"],"sources":["eventEmitter.ts"],"sourcesContent":["import {EmitterSubscription, NativeEventEmitter} from 'react-native';\n\nimport {TransactionEvent, transactionSk2ToPurchaseMap} from './types/appleSk2';\nimport {isIosStorekit2} from './iap';\nimport {\n getAndroidModule,\n getIosModule,\n getNativeModule,\n isAndroid,\n isIos,\n} from './internal';\nimport type {PurchaseError} from './purchaseError';\nimport type {Purchase} from './types';\n\n/**\n * Add IAP purchase event\n * Register a callback that gets called when the store has any updates to purchases that have not yet been finished, consumed or acknowledged. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n## Signature\n\n```ts\npurchaseUpdatedListener((purchase: Purchase) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((purchase: Purchase) => {\n console.log(purchase);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n */\nexport const purchaseUpdatedListener = (\n listener: (event: Purchase) => void,\n) => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n const proxyListener = isIosStorekit2()\n ? (event: Purchase) => {\n listener(transactionSk2ToPurchaseMap(event as any));\n }\n : listener;\n const emitterSubscription = eventEmitter.addListener(\n 'purchase-updated',\n proxyListener,\n );\n\n if (isAndroid) {\n getAndroidModule().startListening();\n }\n\n return emitterSubscription;\n};\n\n/**\n * Add IAP purchase error event\n * Register a callback that gets called when there has been an error with a purchase. Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates.\n\n## Signature\n\n```ts\npurchaseErrorListener((error: PurchaseError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseErrorListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseErrorListener((error: PurchaseError) => {\n console.log(error);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n */\nexport const purchaseErrorListener = (\n listener: (error: PurchaseError) => void,\n): EmitterSubscription => {\n const eventEmitter = new NativeEventEmitter(getNativeModule());\n return eventEmitter.addListener('purchase-error', listener);\n};\n\n/**\n * Add IAP promoted subscription event\n * Add IAP promoted subscription event.\n\n## Signature\n\n```ts\npromotedProductListener((productId?: string) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {promotedProductListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = promotedProductListener((productId) => {\n console.log(productId);\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n\n *\n * @platform iOS\n */\nexport const promotedProductListener = (listener: () => void) => {\n if (isIos && !isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-promoted-product', listener);\n }\n\n return null;\n};\n\n/**\n * Updated transactions for iOS Sk2\n * Register a callback that gets called when the store has any updates to transactions related to purchases that have not yet been finished, consumed or acknowledged. \n * Returns a React Native `EmitterSubscription` on which you can call `.remove()` to stop receiving updates. Register you listener as soon as possible and react to updates at all times.\n\n**Warning**\nThis is only available for iOS 15 and higher and Storekit 2 is activated\n\n## Signature\n\n```ts\npurchaseUpdatedListener((transactionOrError: TransactionOrError) => {});\n```\n\n## Usage\n\n```tsx\nimport React, {useEffect} from 'react';\nimport {View} from 'react-native';\nimport {purchaseUpdatedListener} from 'react-native-iap';\n\nconst App = () => {\n useEffect(() => {\n const subscription = purchaseUpdatedListener((transactionOrError: TransactionOrError) => {\n if(transactionOrError.transaction){\n console.log(\"There's an update to a transaction\", transactionOrError.transaction);\n }else{\n console.log(\"There's been an error with a received transaction\")\n }\n });\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return <View />;\n};\n```\n *\n * @platform iOS (Sk2)\n */\nexport const transactionListener = (\n listener: (event: TransactionEvent) => void,\n) => {\n if (isIos && isIosStorekit2()) {\n const eventEmitter = new NativeEventEmitter(getIosModule());\n return eventEmitter.addListener('iap-transaction-updated', listener);\n }\n\n return null;\n};\n"],"mappings":"AAAA,SAA6BA,kBAA7B,QAAsD,cAAtD;AAEA,SAA0BC,2BAA1B,QAA4D,kBAA5D;AACA,SAAQC,cAAR,QAA6B,OAA7B;AACA,SACEC,gBADF,EAEEC,YAFF,EAGEC,eAHF,EAIEC,SAJF,EAKEC,KALF,QAMO,YANP;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,uBAAuB,GAClCC,QADqC,IAElC;EACH,MAAMC,YAAY,GAAG,IAAIV,kBAAJ,CAAuBK,eAAe,EAAtC,CAArB;EACA,MAAMM,aAAa,GAAGT,cAAc,KAC/BU,KAAD,IAAqB;IACnBH,QAAQ,CAACR,2BAA2B,CAACW,KAAD,CAA5B,CAAR;EACD,CAH+B,GAIhCH,QAJJ;EAKA,MAAMI,mBAAmB,GAAGH,YAAY,CAACI,WAAb,CAC1B,kBAD0B,EAE1BH,aAF0B,CAA5B;;EAKA,IAAIL,SAAJ,EAAe;IACbH,gBAAgB,GAAGY,cAAnB;EACD;;EAED,OAAOF,mBAAP;AACD,CAnBM;AAqBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,MAAMG,qBAAqB,GAChCP,QADmC,IAEX;EACxB,MAAMC,YAAY,GAAG,IAAIV,kBAAJ,CAAuBK,eAAe,EAAtC,CAArB;EACA,OAAOK,YAAY,CAACI,WAAb,CAAyB,gBAAzB,EAA2CL,QAA3C,CAAP;AACD,CALM;AAOP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMQ,uBAAuB,GAAIR,QAAD,IAA0B;EAC/D,IAAIF,KAAK,IAAI,CAACL,cAAc,EAA5B,EAAgC;IAC9B,MAAMQ,YAAY,GAAG,IAAIV,kBAAJ,CAAuBI,YAAY,EAAnC,CAArB;IACA,OAAOM,YAAY,CAACI,WAAb,CAAyB,sBAAzB,EAAiDL,QAAjD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CAPM;AASP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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,MAAMS,mBAAmB,GAC9BT,QADiC,IAE9B;EACH,IAAIF,KAAK,IAAIL,cAAc,EAA3B,EAA+B;IAC7B,MAAMQ,YAAY,GAAG,IAAIV,kBAAJ,CAAuBI,YAAY,EAAnC,CAArB;IACA,OAAOM,YAAY,CAACI,WAAb,CAAyB,yBAAzB,EAAoDL,QAApD,CAAP;EACD;;EAED,OAAO,IAAP;AACD,CATM"}
package/lib/module/iap.js CHANGED
@@ -4,7 +4,7 @@ import * as IapAndroid from './modules/android';
4
4
  import * as IapIos from './modules/ios';
5
5
  import * as IapIosSk2 from './modules/iosSk2';
6
6
  import { offerToRecord } from './types/apple';
7
- import { offerSk2Map, productSk2Map, subscriptionSk2Map, transactionSk2Map } from './types/appleSk2';
7
+ import { offerSk2Map, productSk2Map, subscriptionSk2Map, transactionSk2ToPurchaseMap } from './types/appleSk2';
8
8
  import { fillProductsWithAdditionalData, getAndroidModule, getAndroidModuleType, getIosModule, getNativeModule, isAmazon, isIosStorekit2, storekit1Mode, storekit2Mode, storekitHybridMode } from './internal';
9
9
  import { ProductType, PurchaseStateAndroid, SubscriptionPlatform } from './types';
10
10
  export { IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2 };
@@ -286,7 +286,7 @@ export const getPurchaseHistory = function () {
286
286
  return (Platform.select({
287
287
  ios: async () => {
288
288
  if (isIosStorekit2()) {
289
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(transactionSk2Map));
289
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(transactionSk2ToPurchaseMap));
290
290
  } else {
291
291
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
292
292
  }
@@ -394,7 +394,7 @@ export const getAvailablePurchases = function () {
394
394
  return (Platform.select({
395
395
  ios: async () => {
396
396
  if (isIosStorekit2()) {
397
- return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(transactionSk2Map));
397
+ return Promise.resolve((await RNIapIosSk2.getAvailableItems(alsoPublishToEventListener, onlyIncludeActiveItems)).map(transactionSk2ToPurchaseMap));
398
398
  } else {
399
399
  return RNIapIos.getAvailableItems(automaticallyFinishRestoredTransactions);
400
400
  }
@@ -498,7 +498,8 @@ export const requestPurchase = request => (Platform.select({
498
498
 
499
499
  if (isIosStorekit2()) {
500
500
  const offer = offerSk2Map(withOffer);
501
- return RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer);
501
+ const purchase = transactionSk2ToPurchaseMap(await RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer));
502
+ return Promise.resolve(purchase);
502
503
  } else {
503
504
  return RNIapIos.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offerToRecord(withOffer));
504
505
  }
@@ -626,7 +627,8 @@ export const requestSubscription = request => (Platform.select({
626
627
 
627
628
  if (isIosStorekit2()) {
628
629
  const offer = offerSk2Map(withOffer);
629
- return RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer);
630
+ const purchase = transactionSk2ToPurchaseMap(await RNIapIosSk2.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offer));
631
+ return Promise.resolve(purchase);
630
632
  } else {
631
633
  return RNIapIos.buyProduct(sku, andDangerouslyFinishTransactionAutomaticallyIOS, appAccountToken, quantity ?? -1, offerToRecord(withOffer));
632
634
  }
@@ -681,6 +683,7 @@ const App = () => {
681
683
  return <Button title="Buy product" onPress={handlePurchase} />;
682
684
  };
683
685
  ```
686
+ @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true
684
687
  */
685
688
 
686
689
  export const finishTransaction = _ref3 => {
@@ -697,7 +700,8 @@ export const finishTransaction = _ref3 => {
697
700
  return Promise.reject(new Error('transactionId required to finish iOS transaction'));
698
701
  }
699
702
 
700
- return getIosModule().finishTransaction(transactionId);
703
+ await getIosModule().finishTransaction(transactionId);
704
+ return Promise.resolve(true);
701
705
  },
702
706
  android: async () => {
703
707
  if (purchase !== null && purchase !== void 0 && purchase.purchaseToken) {
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","IapAmazon","IapAndroid","IapIos","IapIosSk2","offerToRecord","offerSk2Map","productSk2Map","subscriptionSk2Map","transactionSk2Map","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","buyProduct","buyItemByType","obfuscatedAccountIdAndroid","obfuscatedProfileIdAndroid","isOfferPersonalized","undefined","requestSubscription","subscriptionOffers","purchaseTokenAndroid","prorationModeAndroid","so","offerToken","finishTransaction","purchase","isConsumable","developerPayloadAndroid","transactionId","purchaseToken","consumeProduct","userIdAmazon","isAcknowledgedAndroid","purchaseStateAndroid","PURCHASED","acknowledgePurchase"],"sources":["iap.ts"],"sourcesContent":["import {NativeModules, Platform} from 'react-native';\n\nimport * as IapAmazon from './modules/amazon';\nimport * as IapAndroid from './modules/android';\nimport * as IapIos from './modules/ios';\nimport * as IapIosSk2 from './modules/iosSk2';\nimport {offerToRecord} from './types/apple';\nimport {\n offerSk2Map,\n ProductSk2,\n productSk2Map,\n subscriptionSk2Map,\n transactionSk2Map,\n} from './types/appleSk2';\nimport {\n fillProductsWithAdditionalData,\n getAndroidModule,\n 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 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<(ProductPurchase | SubscriptionPurchase)[]> =>\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(transactionSk2Map),\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<(ProductPurchase | SubscriptionPurchase)[]> =>\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(transactionSk2Map),\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 return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' 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 return RNIapIosSk2.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offer,\n );\n } else {\n return RNIapIos.buyProduct(\n sku,\n andDangerouslyFinishTransactionAutomaticallyIOS,\n appAccountToken,\n quantity ?? -1,\n offerToRecord(withOffer),\n );\n }\n },\n android: async () => {\n if (isAmazon) {\n if (!('sku' 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 */\nexport const finishTransaction = ({\n purchase,\n isConsumable,\n developerPayloadAndroid,\n}: {\n purchase: ProductPurchase | SubscriptionPurchase;\n isConsumable?: boolean;\n developerPayloadAndroid?: string;\n}): Promise<PurchaseResult | boolean> => {\n return (\n Platform.select({\n ios: async () => {\n const transactionId = purchase.transactionId;\n\n if (!transactionId) {\n return Promise.reject(\n new Error('transactionId required to finish iOS transaction'),\n );\n }\n return getIosModule().finishTransaction(transactionId);\n },\n android: async () => {\n if (purchase?.purchaseToken) {\n if (isConsumable) {\n return getAndroidModule().consumeProduct(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else if (\n purchase.userIdAmazon ||\n (!purchase.isAcknowledgedAndroid &&\n purchase.purchaseStateAndroid === PurchaseStateAndroid.PURCHASED)\n ) {\n return getAndroidModule().acknowledgePurchase(\n purchase.purchaseToken,\n developerPayloadAndroid,\n );\n } else {\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n }\n }\n return Promise.reject(\n new Error('purchase is not suitable to be purchased'),\n );\n },\n }) || (() => Promise.reject(new Error('Unsupported Platform')))\n )();\n};\n"],"mappings":"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"}
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 +1 @@
1
- {"version":3,"names":["NativeModules","RNIapIosSk2","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Purchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n onlyIncludeActiveItems?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<Purchase>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":"AAAA,SAAQA,aAAR,QAA4B,cAA5B;AAYA,MAAM;EAACC;AAAD,IAAgBD,aAAtB;;AAkDA;AACA;AACA;AACA;AACA,OAAO,MAAME,IAAI,GAAG,MAAqBD,WAAW,CAACC,IAAZ,EAAlC;AAEP;AACA;AACA;;AACA,OAAO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCH,WAAW,CAACE,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;AAEA,OAAO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCL,WAAW,CAACI,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMC,kBAAkB,GAAID,GAAD,IAChCL,WAAW,CAACM,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BL,WAAW,CAACO,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCL,WAAW,CAACQ,kBAAZ,CAA+BH,GAA/B,CADK"}
1
+ {"version":3,"names":["NativeModules","RNIapIosSk2","sync","isEligibleForIntroOffer","groupID","subscriptionStatus","sku","currentEntitlement","latestTransaction","beginRefundRequest"],"sources":["iosSk2.ts"],"sourcesContent":["import {NativeModules} from 'react-native';\n\nimport type {Product, ProductPurchase, Sku} from '../types';\nimport type {\n PaymentDiscountSk2,\n ProductSk2,\n ProductStatus,\n RefundRequestStatus,\n TransactionSk2,\n} from '../types/appleSk2';\n\nimport type {NativeModuleProps} from './common';\nconst {RNIapIosSk2} = NativeModules;\n\ntype getItems = (skus: Sku[]) => Promise<ProductSk2[]>;\n\ntype getAvailableItems = (\n alsoPublishToEventListener?: boolean,\n onlyIncludeActiveItems?: boolean,\n) => Promise<TransactionSk2[]>;\n\nexport type BuyProduct = (\n sku: Sku,\n andDangerouslyFinishTransactionAutomaticallyIOS: boolean,\n applicationUsername: string | undefined,\n quantity: number,\n withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,\n) => Promise<TransactionSk2>;\n\ntype clearTransaction = () => Promise<void>;\ntype clearProducts = () => Promise<void>;\ntype promotedProduct = () => Promise<Product | null>;\ntype buyPromotedProduct = () => Promise<void>;\n\ntype finishTransaction = (transactionIdentifier: string) => Promise<boolean>;\n\ntype getPendingTransactions = () => Promise<ProductPurchase[]>;\ntype presentCodeRedemptionSheet = () => Promise<null>;\ntype showManageSubscriptions = () => Promise<null>;\n\nexport interface IosModulePropsSk2 extends NativeModuleProps {\n isAvailable(): number;\n latestTransaction(sku: string): Promise<TransactionSk2>;\n currentEntitlement(sku: string): Promise<TransactionSk2>;\n subscriptionStatus(sku: string): Promise<ProductStatus[]>;\n isEligibleForIntroOffer(groupID: string): Promise<Boolean>;\n sync(): Promise<null>;\n getItems: getItems;\n getAvailableItems: getAvailableItems;\n buyProduct: BuyProduct;\n clearTransaction: clearTransaction;\n clearProducts: clearProducts;\n promotedProduct: promotedProduct;\n buyPromotedProduct: buyPromotedProduct;\n finishTransaction: finishTransaction;\n getPendingTransactions: getPendingTransactions;\n presentCodeRedemptionSheet: presentCodeRedemptionSheet;\n showManageSubscriptions: showManageSubscriptions;\n disable: () => Promise<null>;\n beginRefundRequest: (sku: string) => Promise<RefundRequestStatus>;\n}\n\n/**\n * Sync state with Appstore (iOS only)\n * https://developer.apple.com/documentation/storekit/appstore/3791906-sync\n */\nexport const sync = (): Promise<null> => RNIapIosSk2.sync();\n\n/**\n *\n */\nexport const isEligibleForIntroOffer = (groupID: string): Promise<Boolean> =>\n RNIapIosSk2.isEligibleForIntroOffer(groupID);\n\n/**\n *\n */\n\nexport const subscriptionStatus = (sku: string): Promise<ProductStatus[]> =>\n RNIapIosSk2.subscriptionStatus(sku);\n\n/**\n *\n */\nexport const currentEntitlement = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.currentEntitlement(sku);\n\n/**\n *\n */\nexport const latestTransaction = (sku: string): Promise<TransactionSk2> =>\n RNIapIosSk2.latestTransaction(sku);\n\n/**\n *\n */\nexport const beginRefundRequest = (sku: string): Promise<RefundRequestStatus> =>\n RNIapIosSk2.beginRefundRequest(sku);\n"],"mappings":"AAAA,SAAQA,aAAR,QAA4B,cAA5B;AAYA,MAAM;EAACC;AAAD,IAAgBD,aAAtB;;AAkDA;AACA;AACA;AACA;AACA,OAAO,MAAME,IAAI,GAAG,MAAqBD,WAAW,CAACC,IAAZ,EAAlC;AAEP;AACA;AACA;;AACA,OAAO,MAAMC,uBAAuB,GAAIC,OAAD,IACrCH,WAAW,CAACE,uBAAZ,CAAoCC,OAApC,CADK;AAGP;AACA;AACA;;AAEA,OAAO,MAAMC,kBAAkB,GAAIC,GAAD,IAChCL,WAAW,CAACI,kBAAZ,CAA+BC,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMC,kBAAkB,GAAID,GAAD,IAChCL,WAAW,CAACM,kBAAZ,CAA+BD,GAA/B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAME,iBAAiB,GAAIF,GAAD,IAC/BL,WAAW,CAACO,iBAAZ,CAA8BF,GAA9B,CADK;AAGP;AACA;AACA;;AACA,OAAO,MAAMG,kBAAkB,GAAIH,GAAD,IAChCL,WAAW,CAACQ,kBAAZ,CAA+BH,GAA/B,CADK"}
@@ -45,7 +45,7 @@ export const subscriptionSk2Map = _ref2 => {
45
45
  };
46
46
  return prod;
47
47
  };
48
- export const transactionSk2Map = _ref3 => {
48
+ export const transactionSk2ToPurchaseMap = _ref3 => {
49
49
  let {
50
50
  id,
51
51
  originalPurchaseDate,
@@ -1 +1 @@
1
- {"version":3,"names":["SubscriptionPlatform","productSk2Map","id","description","displayName","price","displayPrice","prod","title","productId","String","type","localizedPrice","currency","subscriptionSk2Map","subscription","platform","ios","subscriptionPeriodNumberIOS","subscriptionPeriod","value","subscriptionPeriodUnitIOS","unit","toUpperCase","transactionSk2Map","originalPurchaseDate","productID","purchaseDate","purchasedQuantity","originalID","purchase","transactionId","transactionDate","transactionReceipt","purchaseToken","quantityIOS","originalTransactionDateIOS","originalTransactionIdentifierIOS","offerSk2Map","offer","undefined","offerID","identifier","keyID","keyIdentifier","nonce","signature","timestamp","toString"],"sources":["appleSk2.ts"],"sourcesContent":["import type {PurchaseError} from '../purchaseError';\n\nimport type {\n ProductIOS,\n Purchase,\n SubscriptionIOS,\n SubscriptionIosPeriod,\n} from '.';\nimport type * as Apple from './apple';\nimport {SubscriptionPlatform} from '.';\n\nexport type SubscriptionPeriod = {\n unit: 'day' | 'week' | 'month' | 'year';\n value: number;\n};\n\nexport type PaymentMode = 'freeTrial' | 'payAsYouGo' | 'payUpFront';\n\nexport type SubscriptionOffer = {\n displayPrice: string;\n id: string;\n paymentMode: PaymentMode;\n period: SubscriptionPeriod;\n periodCount: number;\n price: number;\n type: 'introductory' | 'promotional';\n};\n\nexport type SubscriptionInfo = {\n introductoryOffer?: SubscriptionOffer;\n promotionalOffers?: SubscriptionOffer[];\n subscriptionGroupID: string;\n subscriptionPeriod: SubscriptionPeriod;\n};\n\nexport type RefundRequestStatus = 'success' | 'userCancelled';\n\nexport type ProductSk2 = {\n description: string;\n displayName: string;\n displayPrice: string;\n id: number;\n isFamilyShareable: boolean;\n jsonRepresentation: string;\n price: number;\n subscription: SubscriptionInfo;\n type: 'autoRenewable' | 'consumable' | 'nonConsumable' | 'nonRenewable';\n};\nexport const productSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n}: ProductSk2): ProductIOS => {\n const prod: ProductIOS = {\n title: displayName,\n productId: String(id),\n description,\n type: 'iap',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n };\n return prod;\n};\n\nexport const subscriptionSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n subscription,\n}: ProductSk2): SubscriptionIOS => {\n const prod: SubscriptionIOS = {\n platform: SubscriptionPlatform.ios,\n title: displayName,\n productId: String(id),\n description,\n type: 'subs',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n subscriptionPeriodNumberIOS: `${subscription?.subscriptionPeriod?.value}`,\n subscriptionPeriodUnitIOS:\n subscription?.subscriptionPeriod?.unit.toUpperCase() as SubscriptionIosPeriod,\n };\n return prod;\n};\n\nexport type TransactionSk2 = {\n appAccountToken: string;\n appBundleID: string;\n debugDescription: string;\n deviceVerification: string;\n deviceVerificationNonce: string;\n expirationDate: number;\n id: number;\n isUpgraded: boolean;\n jsonRepresentation: string;\n offerID: string;\n offerType: string;\n originalID: string;\n originalPurchaseDate: number;\n ownershipType: string;\n productID: string;\n productType: string;\n purchaseDate: number;\n purchasedQuantity: number;\n revocationDate: number;\n revocationReason: string;\n signedDate: number;\n subscriptionGroupID: number;\n webOrderLineItemID: number;\n};\n\nexport type TransactionError = PurchaseError;\n\n/**\n * Only one of `transaction` and `error` is not undefined at the time\n */\nexport type TransactionEvent = {\n transaction?: TransactionSk2;\n error?: TransactionError;\n};\n\nexport type SubscriptionStatus =\n | 'expired'\n | 'inBillingRetryPeriod'\n | 'inGracePeriod'\n | 'revoked'\n | 'subscribed';\n\nexport type ProductStatus = {\n state: SubscriptionStatus;\n};\n\nexport const transactionSk2Map = ({\n id,\n originalPurchaseDate,\n productID,\n purchaseDate,\n purchasedQuantity,\n originalID,\n}: TransactionSk2): Purchase => {\n const purchase: Purchase = {\n productId: productID,\n transactionId: String(id),\n transactionDate: purchaseDate, //??\n transactionReceipt: '', // Not available\n purchaseToken: '', //Not avaiable\n quantityIOS: purchasedQuantity,\n originalTransactionDateIOS: originalPurchaseDate,\n originalTransactionIdentifierIOS: originalID,\n };\n return purchase;\n};\n\n/**\n * Payment discount interface @see https://developer.apple.com/documentation/storekit/skpaymentdiscount?language=objc\n */\nexport interface PaymentDiscountSk2 {\n /**\n * A string used to uniquely identify a discount offer for a product.\n */\n offerID: string;\n\n /**\n * A string that identifies the key used to generate the signature.\n */\n keyID: string;\n\n /**\n * A universally unique ID (UUID) value that you define.\n */\n nonce: string;\n\n /**\n * A UTF-8 string representing the properties of a specific discount offer, cryptographically signed.\n */\n signature: string;\n\n /**\n * The date and time of the signature's creation in milliseconds, formatted in Unix epoch time.\n */\n timestamp: number;\n}\n\nexport const offerSk2Map = (\n offer: Apple.PaymentDiscount | undefined,\n): Record<keyof PaymentDiscountSk2, string> | undefined => {\n if (!offer) {\n return undefined;\n }\n return {\n offerID: offer.identifier,\n keyID: offer.keyIdentifier,\n nonce: offer.nonce,\n signature: offer.signature,\n timestamp: offer.timestamp.toString(),\n };\n};\n"],"mappings":"AASA,SAAQA,oBAAR,QAAmC,GAAnC;AAuCA,OAAO,MAAMC,aAAa,GAAG,QAMC;EAAA,IANA;IAC5BC,EAD4B;IAE5BC,WAF4B;IAG5BC,WAH4B;IAI5BC,KAJ4B;IAK5BC;EAL4B,CAMA;EAC5B,MAAMC,IAAgB,GAAG;IACvBC,KAAK,EAAEJ,WADgB;IAEvBK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAFM;IAGvBC,WAHuB;IAIvBQ,IAAI,EAAE,KAJiB;IAKvBN,KAAK,EAAEK,MAAM,CAACL,KAAD,CALU;IAMvBO,cAAc,EAAEN,YANO;IAOvBO,QAAQ,EAAE,EAPa,CAOT;;EAPS,CAAzB;EASA,OAAON,IAAP;AACD,CAjBM;AAmBP,OAAO,MAAMO,kBAAkB,GAAG,SAOC;EAAA;;EAAA,IAPA;IACjCZ,EADiC;IAEjCC,WAFiC;IAGjCC,WAHiC;IAIjCC,KAJiC;IAKjCC,YALiC;IAMjCS;EANiC,CAOA;EACjC,MAAMR,IAAqB,GAAG;IAC5BS,QAAQ,EAAEhB,oBAAoB,CAACiB,GADH;IAE5BT,KAAK,EAAEJ,WAFqB;IAG5BK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAHW;IAI5BC,WAJ4B;IAK5BQ,IAAI,EAAE,MALsB;IAM5BN,KAAK,EAAEK,MAAM,CAACL,KAAD,CANe;IAO5BO,cAAc,EAAEN,YAPY;IAQ5BO,QAAQ,EAAE,EARkB;IAQd;IACdK,2BAA2B,EAAG,GAAEH,YAAH,aAAGA,YAAH,gDAAGA,YAAY,CAAEI,kBAAjB,0DAAG,sBAAkCC,KAAM,EAT5C;IAU5BC,yBAAyB,EACvBN,YADuB,aACvBA,YADuB,iDACvBA,YAAY,CAAEI,kBADS,2DACvB,uBAAkCG,IAAlC,CAAuCC,WAAvC;EAX0B,CAA9B;EAaA,OAAOhB,IAAP;AACD,CAtBM;AAuEP,OAAO,MAAMiB,iBAAiB,GAAG,SAOD;EAAA,IAPE;IAChCtB,EADgC;IAEhCuB,oBAFgC;IAGhCC,SAHgC;IAIhCC,YAJgC;IAKhCC,iBALgC;IAMhCC;EANgC,CAOF;EAC9B,MAAMC,QAAkB,GAAG;IACzBrB,SAAS,EAAEiB,SADc;IAEzBK,aAAa,EAAErB,MAAM,CAACR,EAAD,CAFI;IAGzB8B,eAAe,EAAEL,YAHQ;IAGM;IAC/BM,kBAAkB,EAAE,EAJK;IAID;IACxBC,aAAa,EAAE,EALU;IAKN;IACnBC,WAAW,EAAEP,iBANY;IAOzBQ,0BAA0B,EAAEX,oBAPH;IAQzBY,gCAAgC,EAAER;EART,CAA3B;EAUA,OAAOC,QAAP;AACD,CAnBM;AAqBP;AACA;AACA;;AA4BA,OAAO,MAAMQ,WAAW,GACtBC,KADyB,IAEgC;EACzD,IAAI,CAACA,KAAL,EAAY;IACV,OAAOC,SAAP;EACD;;EACD,OAAO;IACLC,OAAO,EAAEF,KAAK,CAACG,UADV;IAELC,KAAK,EAAEJ,KAAK,CAACK,aAFR;IAGLC,KAAK,EAAEN,KAAK,CAACM,KAHR;IAILC,SAAS,EAAEP,KAAK,CAACO,SAJZ;IAKLC,SAAS,EAAER,KAAK,CAACQ,SAAN,CAAgBC,QAAhB;EALN,CAAP;AAOD,CAbM"}
1
+ {"version":3,"names":["SubscriptionPlatform","productSk2Map","id","description","displayName","price","displayPrice","prod","title","productId","String","type","localizedPrice","currency","subscriptionSk2Map","subscription","platform","ios","subscriptionPeriodNumberIOS","subscriptionPeriod","value","subscriptionPeriodUnitIOS","unit","toUpperCase","transactionSk2ToPurchaseMap","originalPurchaseDate","productID","purchaseDate","purchasedQuantity","originalID","purchase","transactionId","transactionDate","transactionReceipt","purchaseToken","quantityIOS","originalTransactionDateIOS","originalTransactionIdentifierIOS","offerSk2Map","offer","undefined","offerID","identifier","keyID","keyIdentifier","nonce","signature","timestamp","toString"],"sources":["appleSk2.ts"],"sourcesContent":["import type {PurchaseError} from '../purchaseError';\n\nimport type {\n ProductIOS,\n Purchase,\n SubscriptionIOS,\n SubscriptionIosPeriod,\n} from '.';\nimport type * as Apple from './apple';\nimport {SubscriptionPlatform} from '.';\n\nexport type SubscriptionPeriod = {\n unit: 'day' | 'week' | 'month' | 'year';\n value: number;\n};\n\nexport type PaymentMode = 'freeTrial' | 'payAsYouGo' | 'payUpFront';\n\nexport type SubscriptionOffer = {\n displayPrice: string;\n id: string;\n paymentMode: PaymentMode;\n period: SubscriptionPeriod;\n periodCount: number;\n price: number;\n type: 'introductory' | 'promotional';\n};\n\nexport type SubscriptionInfo = {\n introductoryOffer?: SubscriptionOffer;\n promotionalOffers?: SubscriptionOffer[];\n subscriptionGroupID: string;\n subscriptionPeriod: SubscriptionPeriod;\n};\n\nexport type RefundRequestStatus = 'success' | 'userCancelled';\n\nexport type ProductSk2 = {\n description: string;\n displayName: string;\n displayPrice: string;\n id: number;\n isFamilyShareable: boolean;\n jsonRepresentation: string;\n price: number;\n subscription: SubscriptionInfo;\n type: 'autoRenewable' | 'consumable' | 'nonConsumable' | 'nonRenewable';\n};\nexport const productSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n}: ProductSk2): ProductIOS => {\n const prod: ProductIOS = {\n title: displayName,\n productId: String(id),\n description,\n type: 'iap',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n };\n return prod;\n};\n\nexport const subscriptionSk2Map = ({\n id,\n description,\n displayName,\n price,\n displayPrice,\n subscription,\n}: ProductSk2): SubscriptionIOS => {\n const prod: SubscriptionIOS = {\n platform: SubscriptionPlatform.ios,\n title: displayName,\n productId: String(id),\n description,\n type: 'subs',\n price: String(price),\n localizedPrice: displayPrice,\n currency: '', // Not avaiable on new API, use localizedPrice instead\n subscriptionPeriodNumberIOS: `${subscription?.subscriptionPeriod?.value}`,\n subscriptionPeriodUnitIOS:\n subscription?.subscriptionPeriod?.unit.toUpperCase() as SubscriptionIosPeriod,\n };\n return prod;\n};\n\nexport type TransactionSk2 = {\n appAccountToken: string;\n appBundleID: string;\n debugDescription: string;\n deviceVerification: string;\n deviceVerificationNonce: string;\n expirationDate: number;\n id: number;\n isUpgraded: boolean;\n jsonRepresentation: string;\n offerID: string;\n offerType: string;\n originalID: string;\n originalPurchaseDate: number;\n ownershipType: string;\n productID: string;\n productType: string;\n purchaseDate: number;\n purchasedQuantity: number;\n revocationDate: number;\n revocationReason: string;\n signedDate: number;\n subscriptionGroupID: number;\n webOrderLineItemID: number;\n};\n\nexport type TransactionError = PurchaseError;\n\n/**\n * Only one of `transaction` and `error` is not undefined at the time\n */\nexport type TransactionEvent = {\n transaction?: TransactionSk2;\n error?: TransactionError;\n};\n\nexport type SubscriptionStatus =\n | 'expired'\n | 'inBillingRetryPeriod'\n | 'inGracePeriod'\n | 'revoked'\n | 'subscribed';\n\nexport type ProductStatus = {\n state: SubscriptionStatus;\n};\n\nexport const transactionSk2ToPurchaseMap = ({\n id,\n originalPurchaseDate,\n productID,\n purchaseDate,\n purchasedQuantity,\n originalID,\n}: TransactionSk2): Purchase => {\n const purchase: Purchase = {\n productId: productID,\n transactionId: String(id),\n transactionDate: purchaseDate, //??\n transactionReceipt: '', // Not available\n purchaseToken: '', //Not avaiable\n quantityIOS: purchasedQuantity,\n originalTransactionDateIOS: originalPurchaseDate,\n originalTransactionIdentifierIOS: originalID,\n };\n return purchase;\n};\n\n/**\n * Payment discount interface @see https://developer.apple.com/documentation/storekit/skpaymentdiscount?language=objc\n */\nexport interface PaymentDiscountSk2 {\n /**\n * A string used to uniquely identify a discount offer for a product.\n */\n offerID: string;\n\n /**\n * A string that identifies the key used to generate the signature.\n */\n keyID: string;\n\n /**\n * A universally unique ID (UUID) value that you define.\n */\n nonce: string;\n\n /**\n * A UTF-8 string representing the properties of a specific discount offer, cryptographically signed.\n */\n signature: string;\n\n /**\n * The date and time of the signature's creation in milliseconds, formatted in Unix epoch time.\n */\n timestamp: number;\n}\n\nexport const offerSk2Map = (\n offer: Apple.PaymentDiscount | undefined,\n): Record<keyof PaymentDiscountSk2, string> | undefined => {\n if (!offer) {\n return undefined;\n }\n return {\n offerID: offer.identifier,\n keyID: offer.keyIdentifier,\n nonce: offer.nonce,\n signature: offer.signature,\n timestamp: offer.timestamp.toString(),\n };\n};\n"],"mappings":"AASA,SAAQA,oBAAR,QAAmC,GAAnC;AAuCA,OAAO,MAAMC,aAAa,GAAG,QAMC;EAAA,IANA;IAC5BC,EAD4B;IAE5BC,WAF4B;IAG5BC,WAH4B;IAI5BC,KAJ4B;IAK5BC;EAL4B,CAMA;EAC5B,MAAMC,IAAgB,GAAG;IACvBC,KAAK,EAAEJ,WADgB;IAEvBK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAFM;IAGvBC,WAHuB;IAIvBQ,IAAI,EAAE,KAJiB;IAKvBN,KAAK,EAAEK,MAAM,CAACL,KAAD,CALU;IAMvBO,cAAc,EAAEN,YANO;IAOvBO,QAAQ,EAAE,EAPa,CAOT;;EAPS,CAAzB;EASA,OAAON,IAAP;AACD,CAjBM;AAmBP,OAAO,MAAMO,kBAAkB,GAAG,SAOC;EAAA;;EAAA,IAPA;IACjCZ,EADiC;IAEjCC,WAFiC;IAGjCC,WAHiC;IAIjCC,KAJiC;IAKjCC,YALiC;IAMjCS;EANiC,CAOA;EACjC,MAAMR,IAAqB,GAAG;IAC5BS,QAAQ,EAAEhB,oBAAoB,CAACiB,GADH;IAE5BT,KAAK,EAAEJ,WAFqB;IAG5BK,SAAS,EAAEC,MAAM,CAACR,EAAD,CAHW;IAI5BC,WAJ4B;IAK5BQ,IAAI,EAAE,MALsB;IAM5BN,KAAK,EAAEK,MAAM,CAACL,KAAD,CANe;IAO5BO,cAAc,EAAEN,YAPY;IAQ5BO,QAAQ,EAAE,EARkB;IAQd;IACdK,2BAA2B,EAAG,GAAEH,YAAH,aAAGA,YAAH,gDAAGA,YAAY,CAAEI,kBAAjB,0DAAG,sBAAkCC,KAAM,EAT5C;IAU5BC,yBAAyB,EACvBN,YADuB,aACvBA,YADuB,iDACvBA,YAAY,CAAEI,kBADS,2DACvB,uBAAkCG,IAAlC,CAAuCC,WAAvC;EAX0B,CAA9B;EAaA,OAAOhB,IAAP;AACD,CAtBM;AAuEP,OAAO,MAAMiB,2BAA2B,GAAG,SAOX;EAAA,IAPY;IAC1CtB,EAD0C;IAE1CuB,oBAF0C;IAG1CC,SAH0C;IAI1CC,YAJ0C;IAK1CC,iBAL0C;IAM1CC;EAN0C,CAOZ;EAC9B,MAAMC,QAAkB,GAAG;IACzBrB,SAAS,EAAEiB,SADc;IAEzBK,aAAa,EAAErB,MAAM,CAACR,EAAD,CAFI;IAGzB8B,eAAe,EAAEL,YAHQ;IAGM;IAC/BM,kBAAkB,EAAE,EAJK;IAID;IACxBC,aAAa,EAAE,EALU;IAKN;IACnBC,WAAW,EAAEP,iBANY;IAOzBQ,0BAA0B,EAAEX,oBAPH;IAQzBY,gCAAgC,EAAER;EART,CAA3B;EAUA,OAAOC,QAAP;AACD,CAnBM;AAqBP;AACA;AACA;;AA4BA,OAAO,MAAMQ,WAAW,GACtBC,KADyB,IAEgC;EACzD,IAAI,CAACA,KAAL,EAAY;IACV,OAAOC,SAAP;EACD;;EACD,OAAO;IACLC,OAAO,EAAEF,KAAK,CAACG,UADV;IAELC,KAAK,EAAEJ,KAAK,CAACK,aAFR;IAGLC,KAAK,EAAEN,KAAK,CAACM,KAHR;IAILC,SAAS,EAAEP,KAAK,CAACO,SAJZ;IAKLC,SAAS,EAAER,KAAK,CAACQ,SAAN,CAAgBC,QAAhB;EALN,CAAP;AAOD,CAbM"}
@@ -3,7 +3,7 @@ import * as IapAndroid from './modules/android';
3
3
  import * as IapIos from './modules/ios';
4
4
  import * as IapIosSk2 from './modules/iosSk2';
5
5
  import { isIosStorekit2 } from './internal';
6
- import { Product, ProductPurchase, PurchaseResult, RequestPurchase, RequestSubscription, Subscription, SubscriptionPurchase } from './types';
6
+ import { Product, ProductPurchase, Purchase, PurchaseResult, RequestPurchase, RequestSubscription, Subscription, SubscriptionPurchase } from './types';
7
7
  export { IapAndroid, IapAmazon, IapIos, IapIosSk2, isIosStorekit2 };
8
8
  /**
9
9
  * STOREKIT1_MODE: Will not enable Storekit 2 even if the device supports it. Thigs will work as before,
@@ -168,7 +168,7 @@ export declare const getPurchaseHistory: ({ alsoPublishToEventListener, automati
168
168
  alsoPublishToEventListener?: boolean | undefined;
169
169
  automaticallyFinishRestoredTransactions?: boolean | undefined;
170
170
  onlyIncludeActiveItems?: boolean | undefined;
171
- }) => Promise<(ProductPurchase | SubscriptionPurchase)[]>;
171
+ }) => Promise<Purchase[]>;
172
172
  /**
173
173
  * Get all purchases made by the user (either non-consumable, or haven't been consumed yet)
174
174
  * ## Usage
@@ -255,7 +255,7 @@ export declare const getAvailablePurchases: ({ alsoPublishToEventListener, autom
255
255
  alsoPublishToEventListener?: boolean | undefined;
256
256
  automaticallyFinishRestoredTransactions?: boolean | undefined;
257
257
  onlyIncludeActiveItems?: boolean | undefined;
258
- }) => Promise<(ProductPurchase | SubscriptionPurchase)[]>;
258
+ }) => Promise<Purchase[]>;
259
259
  /**
260
260
  * Request a purchase for product. This will be received in `PurchaseUpdatedListener`.
261
261
  * Request a purchase for a product (consumables or non-consumables).
@@ -425,9 +425,10 @@ const App = () => {
425
425
  return <Button title="Buy product" onPress={handlePurchase} />;
426
426
  };
427
427
  ```
428
+ @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true
428
429
  */
429
430
  export declare const finishTransaction: ({ purchase, isConsumable, developerPayloadAndroid, }: {
430
- purchase: ProductPurchase | SubscriptionPurchase;
431
+ purchase: Purchase;
431
432
  isConsumable?: boolean | undefined;
432
433
  developerPayloadAndroid?: string | undefined;
433
434
  }) => Promise<PurchaseResult | boolean>;
@@ -1,9 +1,9 @@
1
- import type { Product, ProductPurchase, Purchase, Sku } from '../types';
1
+ import type { Product, ProductPurchase, Sku } from '../types';
2
2
  import type { PaymentDiscountSk2, ProductSk2, ProductStatus, RefundRequestStatus, TransactionSk2 } from '../types/appleSk2';
3
3
  import type { NativeModuleProps } from './common';
4
4
  declare type getItems = (skus: Sku[]) => Promise<ProductSk2[]>;
5
5
  declare type getAvailableItems = (alsoPublishToEventListener?: boolean, onlyIncludeActiveItems?: boolean) => Promise<TransactionSk2[]>;
6
- export declare type BuyProduct = (sku: Sku, andDangerouslyFinishTransactionAutomaticallyIOS: boolean, applicationUsername: string | undefined, quantity: number, withOffer: Record<keyof PaymentDiscountSk2, string> | undefined) => Promise<Purchase>;
6
+ export declare type BuyProduct = (sku: Sku, andDangerouslyFinishTransactionAutomaticallyIOS: boolean, applicationUsername: string | undefined, quantity: number, withOffer: Record<keyof PaymentDiscountSk2, string> | undefined) => Promise<TransactionSk2>;
7
7
  declare type clearTransaction = () => Promise<void>;
8
8
  declare type clearProducts = () => Promise<void>;
9
9
  declare type promotedProduct = () => Promise<Product | null>;
@@ -72,7 +72,7 @@ export declare type SubscriptionStatus = 'expired' | 'inBillingRetryPeriod' | 'i
72
72
  export declare type ProductStatus = {
73
73
  state: SubscriptionStatus;
74
74
  };
75
- export declare const transactionSk2Map: ({ id, originalPurchaseDate, productID, purchaseDate, purchasedQuantity, originalID, }: TransactionSk2) => Purchase;
75
+ export declare const transactionSk2ToPurchaseMap: ({ id, originalPurchaseDate, productID, purchaseDate, purchasedQuantity, originalID, }: TransactionSk2) => Purchase;
76
76
  /**
77
77
  * Payment discount interface @see https://developer.apple.com/documentation/storekit/skpaymentdiscount?language=objc
78
78
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-iap",
3
- "version": "12.4.6",
3
+ "version": "12.4.8",
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)",
@@ -1,6 +1,6 @@
1
1
  import {EmitterSubscription, NativeEventEmitter} from 'react-native';
2
2
 
3
- import {TransactionEvent, transactionSk2Map} from './types/appleSk2';
3
+ import {TransactionEvent, transactionSk2ToPurchaseMap} from './types/appleSk2';
4
4
  import {isIosStorekit2} from './iap';
5
5
  import {
6
6
  getAndroidModule,
@@ -50,7 +50,7 @@ export const purchaseUpdatedListener = (
50
50
  const eventEmitter = new NativeEventEmitter(getNativeModule());
51
51
  const proxyListener = isIosStorekit2()
52
52
  ? (event: Purchase) => {
53
- listener(transactionSk2Map(event as any));
53
+ listener(transactionSk2ToPurchaseMap(event as any));
54
54
  }
55
55
  : listener;
56
56
  const emitterSubscription = eventEmitter.addListener(
package/src/iap.ts CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  ProductSk2,
11
11
  productSk2Map,
12
12
  subscriptionSk2Map,
13
- transactionSk2Map,
13
+ transactionSk2ToPurchaseMap,
14
14
  } from './types/appleSk2';
15
15
  import {
16
16
  fillProductsWithAdditionalData,
@@ -28,6 +28,7 @@ import {
28
28
  Product,
29
29
  ProductPurchase,
30
30
  ProductType,
31
+ Purchase,
31
32
  PurchaseResult,
32
33
  PurchaseStateAndroid,
33
34
  RequestPurchase,
@@ -345,7 +346,7 @@ export const getPurchaseHistory = ({
345
346
  alsoPublishToEventListener?: boolean;
346
347
  automaticallyFinishRestoredTransactions?: boolean;
347
348
  onlyIncludeActiveItems?: boolean;
348
- } = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>
349
+ } = {}): Promise<Purchase[]> =>
349
350
  (
350
351
  Platform.select({
351
352
  ios: async () => {
@@ -356,7 +357,7 @@ export const getPurchaseHistory = ({
356
357
  alsoPublishToEventListener,
357
358
  onlyIncludeActiveItems,
358
359
  )
359
- ).map(transactionSk2Map),
360
+ ).map(transactionSk2ToPurchaseMap),
360
361
  );
361
362
  } else {
362
363
  return RNIapIos.getAvailableItems(
@@ -472,7 +473,7 @@ export const getAvailablePurchases = ({
472
473
  alsoPublishToEventListener?: boolean;
473
474
  automaticallyFinishRestoredTransactions?: boolean;
474
475
  onlyIncludeActiveItems?: boolean;
475
- } = {}): Promise<(ProductPurchase | SubscriptionPurchase)[]> =>
476
+ } = {}): Promise<Purchase[]> =>
476
477
  (
477
478
  Platform.select({
478
479
  ios: async () => {
@@ -483,7 +484,7 @@ export const getAvailablePurchases = ({
483
484
  alsoPublishToEventListener,
484
485
  onlyIncludeActiveItems,
485
486
  )
486
- ).map(transactionSk2Map),
487
+ ).map(transactionSk2ToPurchaseMap),
487
488
  );
488
489
  } else {
489
490
  return RNIapIos.getAvailableItems(
@@ -603,13 +604,16 @@ export const requestPurchase = (
603
604
  if (isIosStorekit2()) {
604
605
  const offer = offerSk2Map(withOffer);
605
606
 
606
- return RNIapIosSk2.buyProduct(
607
- sku,
608
- andDangerouslyFinishTransactionAutomaticallyIOS,
609
- appAccountToken,
610
- quantity ?? -1,
611
- offer,
607
+ const purchase = transactionSk2ToPurchaseMap(
608
+ await RNIapIosSk2.buyProduct(
609
+ sku,
610
+ andDangerouslyFinishTransactionAutomaticallyIOS,
611
+ appAccountToken,
612
+ quantity ?? -1,
613
+ offer,
614
+ ),
612
615
  );
616
+ return Promise.resolve(purchase);
613
617
  } else {
614
618
  return RNIapIos.buyProduct(
615
619
  sku,
@@ -757,13 +761,16 @@ export const requestSubscription = (
757
761
  if (isIosStorekit2()) {
758
762
  const offer = offerSk2Map(withOffer);
759
763
 
760
- return RNIapIosSk2.buyProduct(
761
- sku,
762
- andDangerouslyFinishTransactionAutomaticallyIOS,
763
- appAccountToken,
764
- quantity ?? -1,
765
- offer,
764
+ const purchase = transactionSk2ToPurchaseMap(
765
+ await RNIapIosSk2.buyProduct(
766
+ sku,
767
+ andDangerouslyFinishTransactionAutomaticallyIOS,
768
+ appAccountToken,
769
+ quantity ?? -1,
770
+ offer,
771
+ ),
766
772
  );
773
+ return Promise.resolve(purchase);
767
774
  } else {
768
775
  return RNIapIos.buyProduct(
769
776
  sku,
@@ -838,13 +845,14 @@ const App = () => {
838
845
  return <Button title="Buy product" onPress={handlePurchase} />;
839
846
  };
840
847
  ```
848
+ @returns {Promise<PurchaseResult | boolean>} Android: PurchaseResult, iOS: true
841
849
  */
842
850
  export const finishTransaction = ({
843
851
  purchase,
844
852
  isConsumable,
845
853
  developerPayloadAndroid,
846
854
  }: {
847
- purchase: ProductPurchase | SubscriptionPurchase;
855
+ purchase: Purchase;
848
856
  isConsumable?: boolean;
849
857
  developerPayloadAndroid?: string;
850
858
  }): Promise<PurchaseResult | boolean> => {
@@ -858,7 +866,8 @@ export const finishTransaction = ({
858
866
  new Error('transactionId required to finish iOS transaction'),
859
867
  );
860
868
  }
861
- return getIosModule().finishTransaction(transactionId);
869
+ await getIosModule().finishTransaction(transactionId);
870
+ return Promise.resolve(true);
862
871
  },
863
872
  android: async () => {
864
873
  if (purchase?.purchaseToken) {
@@ -1,6 +1,6 @@
1
1
  import {NativeModules} from 'react-native';
2
2
 
3
- import type {Product, ProductPurchase, Purchase, Sku} from '../types';
3
+ import type {Product, ProductPurchase, Sku} from '../types';
4
4
  import type {
5
5
  PaymentDiscountSk2,
6
6
  ProductSk2,
@@ -25,7 +25,7 @@ export type BuyProduct = (
25
25
  applicationUsername: string | undefined,
26
26
  quantity: number,
27
27
  withOffer: Record<keyof PaymentDiscountSk2, string> | undefined,
28
- ) => Promise<Purchase>;
28
+ ) => Promise<TransactionSk2>;
29
29
 
30
30
  type clearTransaction = () => Promise<void>;
31
31
  type clearProducts = () => Promise<void>;
@@ -136,7 +136,7 @@ export type ProductStatus = {
136
136
  state: SubscriptionStatus;
137
137
  };
138
138
 
139
- export const transactionSk2Map = ({
139
+ export const transactionSk2ToPurchaseMap = ({
140
140
  id,
141
141
  originalPurchaseDate,
142
142
  productID,