UNPKG

@revenuecat/purchases-capacitor-ui

Version:
226 lines (225 loc) 9.4 kB
import type { PluginListenerHandle } from '@capacitor/core'; import type { CustomerInfo, PurchasesError, PurchasesOffering, PurchasesPackage, PurchasesStoreTransaction } from '@revenuecat/purchases-typescript-internal-esm'; import { PAYWALL_RESULT } from '@revenuecat/purchases-typescript-internal-esm'; export interface RevenueCatUIPlugin { /** * Presents a paywall configured in the RevenueCat dashboard. * @param options The options for presenting the paywall. * @returns A PaywallResult indicating what happened during the paywall presentation. */ presentPaywall(options?: PresentPaywallOptions): Promise<PaywallResult>; /** * Presents a paywall only if the user does not have the specified entitlement. * @param options The options for presenting the paywall if needed. * @returns A PaywallResult indicating what happened during the paywall presentation. */ presentPaywallIfNeeded(options: PresentPaywallIfNeededOptions): Promise<PaywallResult>; /** * Presents the customer center where users can manage their subscriptions. */ presentCustomerCenter(): Promise<void>; /** * Used for web only. Enables or disables returning mock results instead of rejecting promises with "not supported". * For testing purposes only. * @param options Options for mock web results */ setMockWebResults?(options: { shouldMockWebResults: boolean; }): Promise<void>; /** * Listen for when a paywall is displayed or dismissed. * @param eventName The event to listen for * @param listener The listener to call when the event is triggered */ addListener(eventName: 'paywallDisplayed' | 'paywallDismissed', listener: () => void): Promise<PluginListenerHandle>; /** * Remove all listeners for this plugin. */ removeAllListeners(): Promise<void>; } /** * Object passed to onPurchaseInitiated that allows the developer to * control when (and whether) the purchase flow continues. * The developer can store this and call resume() asynchronously * (e.g., after an auth flow on a different screen). */ export interface PurchaseResumable { /** Call to proceed with or cancel the purchase. Defaults to true (proceed). */ resume(shouldProceed?: boolean): void; } /** * Callbacks for observing paywall lifecycle events such as purchases, * restores, and errors. All callbacks are optional. * * Pass as `listener` in {@link PresentPaywallOptions} to receive events * while the paywall is displayed. */ export interface PaywallListener { /** Called when a purchase begins for a package. */ onPurchaseStarted?: (args: { packageBeingPurchased: PurchasesPackage; }) => void; /** Called when a purchase completes successfully. */ onPurchaseCompleted?: (args: { customerInfo: CustomerInfo; storeTransaction: PurchasesStoreTransaction; }) => void; /** Called when a purchase fails with an error. */ onPurchaseError?: (args: { error: PurchasesError; }) => void; /** Called when the user cancels a purchase. */ onPurchaseCancelled?: () => void; /** Called when a restore operation begins. */ onRestoreStarted?: () => void; /** Called when a restore operation completes successfully. */ onRestoreCompleted?: (args: { customerInfo: CustomerInfo; }) => void; /** Called when a restore operation fails with an error. */ onRestoreError?: (args: { error: PurchasesError; }) => void; /** * Called before the payment sheet is displayed, allowing the app to gate * the purchase flow (e.g., require authentication first). * * The developer receives a {@link PurchaseResumable} that can be stored * and called asynchronously. Call `resumable.resume(true)` to proceed * with the purchase, or `resumable.resume(false)` to cancel it. * * If this callback is not provided, the purchase proceeds automatically. */ onPurchaseInitiated?: (args: { packageBeingPurchased: PurchasesPackage; resumable: PurchaseResumable; }) => void; } /** * Custom purchase and restore handlers for apps that manage their own * purchase flow (`purchasesAreCompletedBy: MY_APP`). * * When provided in {@link PresentPaywallOptions}, the paywall delegates * purchase and restore operations to these handlers instead of using * RevenueCat's built-in purchase flow. */ export interface PurchaseLogic { /** * Called when the user initiates a purchase from the paywall. * Perform the purchase using your own payment system and return the result. */ performPurchase: (args: { packageToPurchase: PurchasesPackage; }) => Promise<PurchaseLogicResult>; /** * Called when the user initiates a restore from the paywall. * Perform the restore using your own system and return the result. */ performRestore: () => Promise<PurchaseLogicResult>; } /** * The result of a custom purchase or restore operation performed by {@link PurchaseLogic}. */ export type PurchaseLogicResult = { result: PURCHASE_LOGIC_RESULT.SUCCESS; } | { result: PURCHASE_LOGIC_RESULT.CANCELLATION; } | { result: PURCHASE_LOGIC_RESULT.ERROR; error?: PurchasesError; }; /** * Possible outcomes from a custom {@link PurchaseLogic} operation. */ export declare enum PURCHASE_LOGIC_RESULT { /** The purchase or restore completed successfully. */ SUCCESS = "SUCCESS", /** The user cancelled the purchase or restore. */ CANCELLATION = "CANCELLATION", /** The purchase or restore failed with an error. */ ERROR = "ERROR" } /** Presentation styles available for paywalls on iOS. */ export type IOSPaywallPresentationStyle = (typeof IOS_PAYWALL_PRESENTATION_STYLE)[keyof typeof IOS_PAYWALL_PRESENTATION_STYLE]; /** @see {@link IOSPaywallPresentationStyle} */ export declare const IOS_PAYWALL_PRESENTATION_STYLE: { /** Presents the paywall in full-screen mode. */ readonly FULL_SCREEN: "FULL_SCREEN"; /** Presents the paywall as a sheet. This is the default on iOS. */ readonly SHEET: "SHEET"; }; /** Presentation styles available for paywalls on Android. */ export type AndroidPaywallPresentationStyle = (typeof ANDROID_PAYWALL_PRESENTATION_STYLE)[keyof typeof ANDROID_PAYWALL_PRESENTATION_STYLE]; /** @see {@link AndroidPaywallPresentationStyle} */ export declare const ANDROID_PAYWALL_PRESENTATION_STYLE: { /** Presents the paywall in full-screen mode. This is the default on Android. */ readonly FULL_SCREEN: "FULL_SCREEN"; }; /** * Per-platform configuration for how a paywall is presented. * Use the convenience presets {@link PaywallPresentationConfiguration.FULL_SCREEN} * or {@link PaywallPresentationConfiguration.DEFAULT}, or provide a custom * configuration with per-platform styles. */ export interface PaywallPresentationConfiguration { /** Presentation style on iOS. Defaults to sheet if not specified. */ ios?: IOSPaywallPresentationStyle; /** Presentation style on Android. Defaults to full-screen if not specified. */ android?: AndroidPaywallPresentationStyle; } /** Convenience presets for {@link PaywallPresentationConfiguration}. */ export declare const PaywallPresentationConfiguration: { /** Full-screen presentation on all platforms. */ readonly FULL_SCREEN: PaywallPresentationConfiguration; /** Default presentation: sheet on iOS, full-screen on Android. */ readonly DEFAULT: PaywallPresentationConfiguration; }; export interface PresentPaywallOptions { /** * The offering to present. * If not provided, the current offering will be used. */ offering?: PurchasesOffering; /** * Controls how the paywall is presented on each platform. * Use `PaywallPresentationConfiguration.FULL_SCREEN` for full-screen on all platforms, * or provide a custom configuration with per-platform styles. * Defaults to sheet on iOS and full-screen on Android. */ presentationConfiguration?: PaywallPresentationConfiguration; /** * Whether to display a close button on the paywall. * Only applicable for original template paywalls, ignored for V2 Paywalls. */ displayCloseButton?: boolean; /** * Optional listener for paywall lifecycle events such as purchase * completion, restoration, and errors. */ listener?: PaywallListener; /** * Optional custom purchase/restore logic for when * `purchasesAreCompletedBy` is set to `MY_APP`. */ purchaseLogic?: PurchaseLogic; /** * Optional custom variables for paywall text substitution. * Variables can be referenced in paywalls using the `{{ custom.variable_name }}` syntax. * Keys must start with a letter and contain only alphanumeric characters and underscores. */ customVariables?: Record<string, string | number | boolean>; } export interface PresentPaywallIfNeededOptions extends PresentPaywallOptions { /** * The identifier of the entitlement that is required. * The paywall will only be presented if the user doesn't have this entitlement. */ requiredEntitlementIdentifier: string; } export { PAYWALL_RESULT as PaywallResultEnum }; export interface PaywallResult { /** * The result of the paywall presentation. */ result: PAYWALL_RESULT; }