Skip to content

Commit

Permalink
Fixes #690
Browse files Browse the repository at this point in the history
  • Loading branch information
hyochan committed Sep 4, 2019
1 parent 24811a1 commit 79ad95d
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 41 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ _*deprecated_<br>~~`buySubscription(sku: string)`~~<ul><li>sku: subscription ID/
`clearTransactionIOS()` | `void` | **iOS only**<br>Clear up the unfinished transanction which sometimes causes problem.<br>Read more in below README.
`clearProductsIOS()` | `void` | **iOS only**<br>Clear all products and subscriptions.<br>Read more in below README.
`requestReceiptIOS()` | `Promise<string>` | **iOS only**<br>Get the current receipt.
`requestPendingPurchasesIOS()` | `Promise<ProductPurchase[]>` | **IOS only**<br>Gets all the transactions which are pending to be finished.
`getPendingPurchasesIOS()` | `Promise<ProductPurchase[]>` | **IOS only**<br>Gets all the transactions which are pending to be finished.
`validateReceiptIos(body: Object, devMode: boolean)`<ul><li>body: receiptBody</li><li>devMode: isTest</li></ul> | `Object\|boolean` | **iOS only**<br>Validate receipt.
`endConnectionAndroid()` | `Promise<void>` | **Android only**<br>End billing connection.
`consumeAllItemsAndroid()` | `Promise<void>` | **Android only**<br>Consume all items so they are able to buy again.
Expand Down
206 changes: 166 additions & 40 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { EmitterSubscription } from 'react-native';

import * as Apple from './apple'
import * as Apple from './apple';

interface ID extends string {}

interface Common {
title: string;
Expand All @@ -10,12 +12,12 @@ interface Common {
localizedPrice: string;
}

export interface Product<ID extends string> extends Common {
export interface Product<ID> extends Common {
type: 'inapp' | 'iap';
productId: ID;
}

export interface Subscription<ID extends string> extends Common {
export interface Subscription<ID> extends Common {
type: 'subs' | 'sub';
productId: ID;

Expand Down Expand Up @@ -74,94 +76,192 @@ export type Purchase = ProductPurchase | SubscriptionPurchase;
* Init module for purchase flow. Required on Android. In ios it will check wheter user canMakePayment.
* @returns {Promise<string>}
*/
export function initConnection() : Promise<string>;
export function initConnection(): Promise<string>;

/**
* End billing client. Will enchance android app's performance by releasing service. No-op on iOS.
* @returns {Promise<void>}
*/
export function endConnectionAndroid() : Promise<void>;
export function endConnectionAndroid(): Promise<void>;

/**
* Consume all items in android. No-op in iOS.
* @returns {Promise<void>}
*/
export function consumeAllItemsAndroid() : Promise<void>;
export function consumeAllItemsAndroid(): Promise<void>;

/**
* Get a list of products (consumable and non-consumable items, but not subscriptions)
* @param skus The item skus
*/
export function getProducts<A extends string, B extends string, C extends string, D extends string, E extends string, F extends string>(skus: [A, B, C, D, E, F]): Promise<[Product<A>, Product<B>, Product<C>, Product<D>, Product<E>, Product<F>]>;
export function getProducts<A extends string, B extends string, C extends string, D extends string, E extends string>(skus: [A, B, C, D, E]): Promise<[Product<A>, Product<B>, Product<C>, Product<D>, Product<E>]>;
export function getProducts<A extends string, B extends string, C extends string, D extends string>(skus: [A, B, C, D]): Promise<[Product<A>, Product<B>, Product<C>, Product<D>]>;
export function getProducts<A extends string, B extends string, C extends string>(skus: [A, B, C]): Promise<[Product<A>, Product<B>, Product<C>]>;
export function getProducts<A extends string, B extends string>(skus: [A, B]): Promise<[Product<A>, Product<B>]>;
export function getProducts<
A extends string,
B extends string,
C extends string,
D extends string,
E extends string,
F extends string
>(
skus: [A, B, C, D, E, F],
): Promise<
[Product<A>, Product<B>, Product<C>, Product<D>, Product<E>, Product<F>]
>;
export function getProducts<
A extends string,
B extends string,
C extends string,
D extends string,
E extends string
>(
skus: [A, B, C, D, E],
): Promise<[Product<A>, Product<B>, Product<C>, Product<D>, Product<E>]>;
export function getProducts<
A extends string,
B extends string,
C extends string,
D extends string
>(
skus: [A, B, C, D],
): Promise<[Product<A>, Product<B>, Product<C>, Product<D>]>;
export function getProducts<
A extends string,
B extends string,
C extends string
>(skus: [A, B, C]): Promise<[Product<A>, Product<B>, Product<C>]>;
export function getProducts<A extends string, B extends string>(
skus: [A, B],
): Promise<[Product<A>, Product<B>]>;
export function getProducts<A extends string>(skus: [A]): Promise<[Product<A>]>;
export function getProducts(skus: string[]): Promise<Product<string>[]>;

/**
* Get a list of subscriptions
* @param skus The item skus
*/
export function getSubscriptions<A extends string, B extends string, C extends string, D extends string, E extends string, F extends string>(skus: [A, B, C, D, E, F]): Promise<[Subscription<A>, Subscription<B>, Subscription<C>, Subscription<D>, Subscription<E>, Subscription<F>]>;
export function getSubscriptions<A extends string, B extends string, C extends string, D extends string, E extends string>(skus: [A, B, C, D, E]): Promise<[Subscription<A>, Subscription<B>, Subscription<C>, Subscription<D>, Subscription<E>]>;
export function getSubscriptions<A extends string, B extends string, C extends string, D extends string>(skus: [A, B, C, D]): Promise<[Subscription<A>, Subscription<B>, Subscription<C>, Subscription<D>]>;
export function getSubscriptions<A extends string, B extends string, C extends string>(skus: [A, B, C]): Promise<[Subscription<A>, Subscription<B>, Subscription<C>]>;
export function getSubscriptions<A extends string, B extends string>(skus: [A, B]): Promise<[Subscription<A>, Subscription<B>]>;
export function getSubscriptions<A extends string>(skus: [A]): Promise<[Subscription<A>]>;
export function getSubscriptions(skus: string[]): Promise<Subscription<string>[]>;
export function getSubscriptions<
A extends string,
B extends string,
C extends string,
D extends string,
E extends string,
F extends string
>(
skus: [A, B, C, D, E, F],
): Promise<
[
Subscription<A>,
Subscription<B>,
Subscription<C>,
Subscription<D>,
Subscription<E>,
Subscription<F>,
]
>;
export function getSubscriptions<
A extends string,
B extends string,
C extends string,
D extends string,
E extends string
>(
skus: [A, B, C, D, E],
): Promise<
[
Subscription<A>,
Subscription<B>,
Subscription<C>,
Subscription<D>,
Subscription<E>,
]
>;
export function getSubscriptions<
A extends string,
B extends string,
C extends string,
D extends string
>(
skus: [A, B, C, D],
): Promise<
[Subscription<A>, Subscription<B>, Subscription<C>, Subscription<D>]
>;
export function getSubscriptions<
A extends string,
B extends string,
C extends string
>(
skus: [A, B, C],
): Promise<[Subscription<A>, Subscription<B>, Subscription<C>]>;
export function getSubscriptions<A extends string, B extends string>(
skus: [A, B],
): Promise<[Subscription<A>, Subscription<B>]>;
export function getSubscriptions<A extends string>(
skus: [A],
): Promise<[Subscription<A>]>;
export function getSubscriptions(
skus: string[],
): Promise<Subscription<string>[]>;

/**
* Gets an invetory of purchases made by the user regardless of consumption status
* @returns {Promise<Purchase[]>}
*/
export function getPurchaseHistory() : Promise<Purchase[]>;
export function getPurchaseHistory(): Promise<Purchase[]>;

/**
* Get all purchases made by the user (either non-consumable, or haven't been consumed yet)
* @returns {Promise<Purchase[]>}
*/
export function getAvailablePurchases() : Promise<Purchase[]>;
export function getAvailablePurchases(): Promise<Purchase[]>;

/**
* Buy a product
*
*
* @deprecated
* @param {string} sku The product's sku/ID
* @returns {Promise<Purchase>}
*/
export function buyProduct(sku: string) : Promise<ProductPurchase>;
export function buyProduct(sku: string): Promise<ProductPurchase>;

/**
* Request a purchase
*
*
* @param {string} sku The product's sku/ID
* @param {boolean} andDangerouslyFinishTransactionAutomatically You should set this to false and call finishTransaction manually when you have delivered the purchased goods to the user. It defaults to true to provide backwards compatibility. Will default to false in version 4.0.0.
* @returns {Promise<string>}
*/
export function requestPurchase(sku: string, andDangerouslyFinishTransactionAutomatically?: boolean) : Promise<string>;
export function requestPurchase(
sku: string,
andDangerouslyFinishTransactionAutomatically?: boolean,
): Promise<string>;

/**
* Create a subscription to a sku
*
*
* @deprecated
* @param {string} sku The product's sku/ID
* @param {string} [oldSku] Optional old product's ID for upgrade/downgrade (Android only)
* @param {number} [prorationMode] Optional proration mode for upgrade/downgrade (Android only)
* @returns {Promise<Purchase>}
*/
export function buySubscription(sku: string, oldSku?: string, prorationMode?: number) : Promise<SubscriptionPurchase>;
export function buySubscription(
sku: string,
oldSku?: string,
prorationMode?: number,
): Promise<SubscriptionPurchase>;

/**
* Request a subscription to a sku
*
*
* @param {string} sku The product's sku/ID
* @param {string} [oldSku] Optional old product's ID for upgrade/downgrade (Android only)
* @param {number} [prorationMode] Optional proration mode for upgrade/downgrade (Android only)
* @returns {Promise<string>}
*/
export function requestSubscription(sku: string, oldSku?: string, prorationMode?: number) : Promise<string>;
export function requestSubscription(
sku: string,
oldSku?: string,
prorationMode?: number,
): Promise<string>;

/**
* Buy a product with offer
Expand All @@ -172,24 +272,34 @@ export function requestSubscription(sku: string, oldSku?: string, prorationMode?
*
* @returns {Promise<void>}
*/
export function buyProductWithOfferIOS(sku: string, forUser: string, withOffer: Apple.PaymentDiscount) : Promise<void>;
export function buyProductWithOfferIOS(
sku: string,
forUser: string,
withOffer: Apple.PaymentDiscount,
): Promise<void>;

/**
* Buy a product with a specified quantity (iOS only)
* @param {string} sku The product's sku/ID
* @param {number} quantity The amount of product to buy
* @returns {Promise<Purchase>}
*/
export function buyProductWithQuantityIOS(sku: string, quantity: number) : Promise<ProductPurchase>;
export function buyProductWithQuantityIOS(
sku: string,
quantity: number,
): Promise<ProductPurchase>;

/**
* Request a purchase with specified quantity (iOS only)
*
*
* @param {string} sku The product's sku/ID
* @param {number} quantity The amount of product to buy
* @returns {Promise<Purchase>}
*/
export function requestPurchaseWithQuantityIOS(sku: string, quantity: number) : Promise<string>;
export function requestPurchaseWithQuantityIOS(
sku: string,
quantity: number,
): Promise<string>;

/**
* Finish Transaction (iOS only)
Expand Down Expand Up @@ -222,22 +332,31 @@ export function clearProductsIOS(): void;
* @param {string} token The product's token (on Android)
* @returns {Promise}
*/
export function acknowledgePurchaseAndroid(token: string, developerPayload?: string) : Promise<PurchaseResult>;
export function acknowledgePurchaseAndroid(
token: string,
developerPayload?: string,
): Promise<PurchaseResult>;

/**
* Consume a purchase (on Android.) No-op on iOS.
* It acknowledges consumable products. If it isn't consumable, use `acknowledgePurchaseAndroid` instead.
* @param {string} token The product's token (on Android)
* @returns {Promise}
*/
export function consumePurchaseAndroid(token: string, developerPayload?: string) : Promise<PurchaseResult>;
export function consumePurchaseAndroid(
token: string,
developerPayload?: string,
): Promise<PurchaseResult>;

/**
* Validate receipt for iOS.
* @param receiptBody the receipt body to send to apple server.
* @param isTest whether this is in test environment which is sandbox.
*/
export function validateReceiptIos(receiptBody: Apple.ReceiptValidationRequest, isTest: boolean): Promise<Apple.ReceiptValidationResponse | false>;
export function validateReceiptIos(
receiptBody: Apple.ReceiptValidationRequest,
isTest: boolean,
): Promise<Apple.ReceiptValidationResponse | false>;

/**
* Validate receipt for Android.
Expand All @@ -247,26 +366,34 @@ export function validateReceiptIos(receiptBody: Apple.ReceiptValidationRequest,
* @param accessToken accessToken from googleApis.
* @param isSub whether this is subscription or inapp. `true` for subscription.
*/
export function validateReceiptAndroid(packageName: string, productId: string, productToken: string, accessToken: string, isSub: boolean): Promise<object | false>;
export function validateReceiptAndroid(
packageName: string,
productId: string,
productToken: string,
accessToken: string,
isSub: boolean,
): Promise<object | false>;

/**
* Add IAP purchase event in ios.
* @deprecated
* @returns {callback(e: Event)}
*/
export function addAdditionalSuccessPurchaseListenerIOS(fn: Function) : EmitterSubscription;
export function addAdditionalSuccessPurchaseListenerIOS(
fn: Function,
): EmitterSubscription;

/**
* Subscribe a listener when purchase is updated.
* @returns {callback(e: ProductPurchase)}
*/
export function purchaseUpdatedListener(fn: Function) : EmitterSubscription;
export function purchaseUpdatedListener(fn: Function): EmitterSubscription;

/**
* Subscribe a listener when purchase got error.
* @returns {callback(e: PurchaseError)}
*/
export function purchaseErrorListener(fn: Function) : EmitterSubscription;
export function purchaseErrorListener(fn: Function): EmitterSubscription;

/**
* Request current receipt base64 encoded (IOS only)
Expand All @@ -279,4 +406,3 @@ export function requestReceiptIOS(): Promise<string>;
* @returns {Promise<ProductPurchase[]>}
*/
export function getPendingPurchasesIOS(): Promise<ProductPurchase[]>;

1 change: 1 addition & 0 deletions index.js.flow
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ declare module.exports: {
purchaseErrorListener(
fn: (PurchaseError) => any,
): EmitterSubscription,
getPendingPurchasesIOS(): Promise<ProductPurchase[]>,
}

/**
Expand Down

0 comments on commit 79ad95d

Please sign in to comment.