react-native-nami-sdk
Version:
React Native Module for Nami - Easy subscriptions & in-app purchases, with powerful built-in paywalls and A/B testing.
101 lines (96 loc) • 3.03 kB
text/typescript
import { NativeModules, NativeEventEmitter, Platform } from 'react-native';
import { EmitterSubscription } from 'react-native';
import {
NamiPurchase,
NamiPurchasesState,
NamiRestorePurchasesState,
} from './types';
export const { NamiPurchaseManagerBridge, RNNamiPurchaseManager } =
NativeModules;
export enum NamiPurchaseManagerEvents {
PurchasesChanged = 'PurchasesChanged',
RestorePurchasesStateChanged = 'RestorePurchasesStateChanged',
}
export interface INamiPurchaseManager {
emitter: NativeEventEmitter;
allPurchases: () => NamiPurchase[];
anySkuPurchased: (skuIds: string[]) => boolean;
consumePurchasedSku: (skuId: string) => void;
presentCodeRedemptionSheet: () => void;
restorePurchases: (
callback: (
purchaseState: NamiPurchasesState,
purchases: NamiPurchase[],
error: string,
) => void,
) => EmitterSubscription['remove'];
skuPurchased: (skuId: string) => boolean;
registerPurchasesChangedHandler: (
callback: (
purchaseState: NamiPurchasesState,
purchases: NamiPurchase[],
error: string,
) => void,
) => EmitterSubscription['remove'];
registerRestorePurchasesHandler: (
callback: (
state: NamiRestorePurchasesState,
newPurchases: NamiPurchase[],
oldPurchases: NamiPurchase[],
) => void,
) => EmitterSubscription['remove'];
}
export const NamiPurchaseManager: INamiPurchaseManager = {
emitter: new NativeEventEmitter(RNNamiPurchaseManager),
...NamiPurchaseManagerBridge,
...RNNamiPurchaseManager,
registerPurchasesChangedHandler: (
callback: (
purchaseState: NamiPurchasesState,
purchases: NamiPurchase[],
error: string,
) => void,
) => {
const subscription = NamiPurchaseManager.emitter.addListener(
NamiPurchaseManagerEvents.PurchasesChanged,
body => {
let purchases = body.purchases;
let purchaseState =
body.purchaseState.toLowerCase() as NamiPurchasesState;
let error = body.error;
callback(purchaseState, purchases, error);
},
);
RNNamiPurchaseManager.registerPurchasesChangedHandler();
return () => {
if (subscription) {
subscription.remove();
}
};
},
registerRestorePurchasesHandler: (
callback: (
state: NamiRestorePurchasesState,
newPurchases: NamiPurchase[],
oldPurchases: NamiPurchase[],
) => void,
) => {
if (Platform.OS === 'ios') {
const subscription = NamiPurchaseManager.emitter.addListener(
NamiPurchaseManagerEvents.RestorePurchasesStateChanged,
body => {
let state = body.state.toLowerCase() as NamiRestorePurchasesState;
let newPurchases = body.newPurchases;
let oldPurchases = body.oldPurchases;
callback(state, newPurchases, oldPurchases);
},
);
RNNamiPurchaseManager.registerRestorePurchasesHandler();
return () => {
if (subscription) {
subscription.remove();
}
};
}
},
};