react-native-iap
Version:
React Native In App Purchase Module.
213 lines (172 loc) • 5.24 kB
text/typescript
import {EmitterSubscription, NativeEventEmitter} from 'react-native';
import {TransactionEvent, transactionSk2ToPurchaseMap} from './types/appleSk2';
import {isIosStorekit2} from './iap';
import {
getAndroidModule,
getIosModule,
getNativeModule,
isAndroid,
isIos,
} from './internal';
import type {PurchaseError} from './purchaseError';
import type {Purchase} from './types';
/**
* Add IAP purchase event
* 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.
## Signature
```ts
purchaseUpdatedListener((purchase: Purchase) => {});
```
## Usage
```tsx
import React, {useEffect} from 'react';
import {View} from 'react-native';
import {purchaseUpdatedListener} from 'react-native-iap';
const App = () => {
useEffect(() => {
const subscription = purchaseUpdatedListener((purchase: Purchase) => {
console.log(purchase);
});
return () => {
subscription.remove();
};
}, []);
return <View />;
};
```
*/
export const purchaseUpdatedListener = (
listener: (event: Purchase) => void,
errorCallback?: (error: unknown) => void,
) => {
const eventEmitter = new NativeEventEmitter(getNativeModule());
const proxyListener = isIosStorekit2()
? (event: Purchase) => {
listener(transactionSk2ToPurchaseMap(event as any));
}
: listener;
const emitterSubscription = eventEmitter.addListener(
'purchase-updated',
proxyListener,
);
if (isAndroid) {
getAndroidModule()
.startListening()
.catch((error: unknown) => {
if (errorCallback) {
errorCallback(error);
} else {
throw error;
}
});
}
return emitterSubscription;
};
/**
* Add IAP purchase error event
* 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.
## Signature
```ts
purchaseErrorListener((error: PurchaseError) => {});
```
## Usage
```tsx
import React, {useEffect} from 'react';
import {View} from 'react-native';
import {purchaseErrorListener} from 'react-native-iap';
const App = () => {
useEffect(() => {
const subscription = purchaseErrorListener((error: PurchaseError) => {
console.log(error);
});
return () => {
subscription.remove();
};
}, []);
return <View />;
};
```
*/
export const purchaseErrorListener = (
listener: (error: PurchaseError) => void,
): EmitterSubscription => {
const eventEmitter = new NativeEventEmitter(getNativeModule());
return eventEmitter.addListener('purchase-error', listener);
};
/**
* Add IAP promoted subscription event
* Add IAP promoted subscription event.
## Signature
```ts
promotedProductListener((productId?: string) => {});
```
## Usage
```tsx
import React, {useEffect} from 'react';
import {View} from 'react-native';
import {promotedProductListener} from 'react-native-iap';
const App = () => {
useEffect(() => {
const subscription = promotedProductListener((productId) => {
console.log(productId);
});
return () => {
subscription.remove();
};
}, []);
return <View />;
};
```
*
* @platform iOS
*/
export const promotedProductListener = (listener: () => void) => {
if (isIos && !isIosStorekit2()) {
const eventEmitter = new NativeEventEmitter(getIosModule());
return eventEmitter.addListener('iap-promoted-product', listener);
}
return null;
};
/**
* Updated transactions for iOS Sk2
* 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.
* 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.
**Warning**
This is only available for iOS 15 and higher and Storekit 2 is activated
## Signature
```ts
purchaseUpdatedListener((transactionOrError: TransactionOrError) => {});
```
## Usage
```tsx
import React, {useEffect} from 'react';
import {View} from 'react-native';
import {purchaseUpdatedListener} from 'react-native-iap';
const App = () => {
useEffect(() => {
const subscription = purchaseUpdatedListener((transactionOrError: TransactionOrError) => {
if(transactionOrError.transaction){
console.log("There's an update to a transaction", transactionOrError.transaction);
}else{
console.log("There's been an error with a received transaction")
}
});
return () => {
subscription.remove();
};
}, []);
return <View />;
};
```
*
* @platform iOS (Sk2)
*/
export const transactionListener = (
listener: (event: TransactionEvent) => void,
) => {
if (isIos && isIosStorekit2()) {
const eventEmitter = new NativeEventEmitter(getIosModule());
return eventEmitter.addListener('iap-transaction-updated', listener);
}
return null;
};