expo-iap 5.3.2 → 5.4.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"useIAP.js","sourceRoot":"","sources":["../src/useIAP.ts"],"names":[],"mappings":"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","sourcesContent":["// External dependencies\nimport {useCallback, useEffect, useState, useRef} from 'react';\nimport {Platform} from 'react-native';\nimport type {EventSubscription} from 'expo-modules-core';\n\n// Internal modules\nimport {\n endConnection,\n initConnection,\n purchaseErrorListener,\n purchaseUpdatedListener,\n promotedProductListenerIOS,\n userChoiceBillingListenerAndroid,\n developerProvidedBillingListenerAndroid,\n subscriptionBillingIssueListener,\n getAvailablePurchases,\n finishTransaction as finishTransactionInternal,\n requestPurchase as requestPurchaseInternal,\n fetchProducts,\n verifyPurchase as verifyPurchaseInternal,\n verifyPurchaseWithProvider as verifyPurchaseWithProviderInternal,\n getActiveSubscriptions,\n hasActiveSubscriptions,\n type ActiveSubscription,\n type ProductTypeInput,\n} from './index';\nimport {ExpoIapConsole} from './utils/debug';\nimport {getPromotedProductIOS} from './modules/ios';\nimport {restorePurchasesIOSNative} from './utils/restorePurchases';\nimport {\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\n openRedeemOfferCodeAndroid,\n} from './modules/android';\n\n// Types\nimport type {\n Product,\n ProductSubscription,\n ProductQueryType,\n ProductRequest,\n BillingChoiceScreenTypeAndroid,\n BillingProgramAndroid,\n DeveloperProvidedBillingDetailsAndroid,\n InitConnectionConfig,\n Purchase,\n MutationRequestPurchaseArgs,\n PurchaseInput,\n PurchaseUpdatedListenerOptions,\n VerifyPurchaseProps,\n VerifyPurchaseResult,\n VerifyPurchaseWithProviderProps,\n VerifyPurchaseWithProviderResult,\n PurchaseOptions,\n MutationField,\n QueryField,\n UserChoiceBillingDetails,\n} from './types';\nimport {ErrorCode} from './types';\nimport type {PurchaseError} from './utils/errorMapping';\nimport {\n getUserFriendlyErrorMessage,\n isUserCancelledError,\n isRecoverableError,\n} from './utils/errorMapping';\n\nconst PURCHASE_DELIVERY_DEDUP_WINDOW_MS = 30_000;\n\nfunction getPurchaseDeliveryKey(purchase: Purchase): string {\n return [\n purchase.store ?? '',\n purchase.productId ?? '',\n purchase.purchaseToken ??\n purchase.transactionId ??\n purchase.id ??\n purchase.transactionDate ??\n '',\n ].join(':');\n}\n\ntype UseIap = {\n connected: boolean;\n products: Product[];\n subscriptions: ProductSubscription[];\n availablePurchases: Purchase[];\n promotedProductIOS?: Product;\n activeSubscriptions: ActiveSubscription[];\n finishTransaction: ({\n purchase,\n isConsumable,\n }: {\n purchase: Purchase;\n isConsumable?: boolean;\n }) => Promise<void>;\n getAvailablePurchases: (options?: PurchaseOptions) => Promise<void>;\n fetchProducts: (params: {\n skus: string[];\n type?: ProductTypeInput;\n }) => Promise<void>;\n\n requestPurchase: (\n params: MutationRequestPurchaseArgs,\n ) => ReturnType<typeof requestPurchaseInternal>;\n verifyPurchase: (props: VerifyPurchaseProps) => Promise<VerifyPurchaseResult>;\n verifyPurchaseWithProvider: (\n props: VerifyPurchaseWithProviderProps,\n ) => Promise<VerifyPurchaseWithProviderResult>;\n restorePurchases: (options?: PurchaseOptions) => Promise<void>;\n getPromotedProductIOS: () => Promise<Product | null>;\n getActiveSubscriptions: (subscriptionIds?: string[]) => Promise<void>;\n hasActiveSubscriptions: (subscriptionIds?: string[]) => Promise<boolean>;\n /**\n * Manually retry the store connection.\n * Useful when the initial auto-connect fails (e.g., Play Store not ready at mount time).\n * Updates the `connected` state on success.\n */\n reconnect: () => Promise<boolean>;\n getBillingChoiceInfoAndroid: QueryField<'getBillingChoiceInfoAndroid'>;\n isBillingProgramAvailableAndroid: MutationField<'isBillingProgramAvailableAndroid'>;\n createBillingProgramReportingDetailsAndroid: MutationField<'createBillingProgramReportingDetailsAndroid'>;\n launchExternalLinkAndroid: MutationField<'launchExternalLinkAndroid'>;\n showBillingProgramInformationDialogAndroid: MutationField<'showBillingProgramInformationDialogAndroid'>;\n showInAppMessagesAndroid: MutationField<'showInAppMessagesAndroid'>;\n openRedeemOfferCodeAndroid: MutationField<'openRedeemOfferCodeAndroid'>;\n};\n\nexport interface UseIAPOptions {\n onPurchaseSuccess?: (purchase: Purchase) => void;\n onPurchaseError?: (error: PurchaseError) => void;\n /**\n * iOS only. When enabled, the purchase success listener also receives\n * StoreKit replay events for a transaction ID already delivered during the\n * current connection session. Defaults to false.\n */\n purchaseUpdatedListenerOptions?: PurchaseUpdatedListenerOptions | null;\n /**\n * Callback for general errors from hook methods like fetchProducts,\n * getAvailablePurchases, getActiveSubscriptions, restorePurchases, etc.\n * These are Promise-based operations that can fail due to network issues\n * or store unavailability.\n */\n onError?: (error: Error) => void;\n onPromotedProductIOS?: (product: Product) => void;\n onUserChoiceBillingAndroid?: (details: UserChoiceBillingDetails) => void;\n /**\n * Fires when the user selects developer-provided billing in an External\n * Payments or Google-rendered Billing Choice flow.\n */\n onDeveloperProvidedBillingAndroid?: (\n details: DeveloperProvidedBillingDetailsAndroid,\n ) => void;\n /** Fires when a subscription enters a billing-issue state. */\n onSubscriptionBillingIssue?: (purchase: Purchase) => void;\n /**\n * Enable a specific billing program for Android (8.2.0+)\n * When set, enables the specified billing program for external transactions.\n * Use 'external-payments' for Developer Provided Billing (Japan only, 8.3.0+).\n * Use 'user-choice-billing' for User Choice Billing (7.0+).\n * Use 'billing-choice' for Billing Choice (9.1.0+).\n */\n enableBillingProgramAndroid?: BillingProgramAndroid;\n /**\n * Select who renders the Billing Choice screen (9.1.0+). Must match the\n * choiceScreenType returned by isBillingProgramAvailableAndroid.\n */\n billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid;\n}\n\n/**\n * React Hook for managing In-App Purchases.\n * See documentation at https://openiap.dev/docs/setup/expo#useIAP-hook\n */\nexport function useIAP(options?: UseIAPOptions): UseIap {\n const [connected, setConnected] = useState<boolean>(false);\n const [products, setProducts] = useState<Product[]>([]);\n const [subscriptions, setSubscriptions] = useState<ProductSubscription[]>([]);\n\n const [availablePurchases, setAvailablePurchases] = useState<Purchase[]>([]);\n const [promotedProductIOS, setPromotedProductIOS] = useState<Product>();\n const [activeSubscriptions, setActiveSubscriptions] = useState<\n ActiveSubscription[]\n >([]);\n\n const optionsRef = useRef<UseIAPOptions | undefined>(options);\n const connectedRef = useRef<boolean>(false);\n const isMountedRef = useRef<boolean>(false);\n const initializationGenerationRef = useRef(0);\n const startedInitializationGenerationRef = useRef(0);\n const deliveredPurchaseKeysRef = useRef(new Set<string>());\n\n // Helper function to merge arrays with duplicate checking\n const mergeWithDuplicateCheck = useCallback(\n <T>(\n existingItems: T[],\n newItems: T[],\n getKey: (item: T) => string,\n ): T[] => {\n const merged = [...existingItems];\n newItems.forEach((newItem) => {\n const isDuplicate = merged.some(\n (existingItem) => getKey(existingItem) === getKey(newItem),\n );\n if (!isDuplicate) {\n merged.push(newItem);\n }\n });\n return merged;\n },\n [],\n );\n\n useEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n useEffect(() => {\n connectedRef.current = connected;\n }, [connected]);\n\n const subscriptionsRef = useRef<{\n purchaseUpdate?: EventSubscription;\n purchaseError?: EventSubscription;\n promotedProductIOS?: EventSubscription;\n userChoiceBillingAndroid?: EventSubscription;\n developerProvidedBillingAndroid?: EventSubscription;\n subscriptionBillingIssue?: EventSubscription;\n }>({});\n\n const subscriptionsRefState = useRef<ProductSubscription[]>([]);\n\n useEffect(() => {\n subscriptionsRefState.current = subscriptions;\n }, [subscriptions]);\n\n const normalizeProductQueryType = useCallback(\n (type?: ProductTypeInput): ProductQueryType => {\n if (!type || type === 'in-app') {\n return 'in-app';\n }\n return type;\n },\n [],\n );\n\n const canonicalProductType = useCallback(\n (value?: string): ProductQueryType => {\n if (!value) {\n return 'in-app';\n }\n\n const normalized = value.trim().toLowerCase().replace(/[_-]/g, '');\n return normalized === 'subs' ? 'subs' : 'in-app';\n },\n [],\n );\n\n const toPurchaseInput = useCallback(\n (purchase: Purchase): PurchaseInput => ({\n id: purchase.id,\n ids: purchase.ids ?? undefined,\n isAutoRenewing: purchase.isAutoRenewing,\n productId: purchase.productId,\n purchaseState: purchase.purchaseState,\n purchaseToken: purchase.purchaseToken ?? null,\n quantity: purchase.quantity,\n store: purchase.store,\n transactionDate: purchase.transactionDate,\n transactionId: purchase.transactionId,\n }),\n [],\n );\n\n const markPurchaseDelivered = useCallback((purchase: Purchase): boolean => {\n const key = getPurchaseDeliveryKey(purchase);\n if (deliveredPurchaseKeysRef.current.has(key)) {\n return false;\n }\n\n deliveredPurchaseKeysRef.current.add(key);\n setTimeout(() => {\n deliveredPurchaseKeysRef.current.delete(key);\n }, PURCHASE_DELIVERY_DEDUP_WINDOW_MS);\n return true;\n }, []);\n\n // Helper function to invoke onError callback\n const invokeOnError = useCallback((error: unknown) => {\n if (optionsRef.current?.onError) {\n optionsRef.current.onError(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }, []);\n\n /**\n * Retrieve products or subscriptions from the store by SKU.\n *\n * @param params `ProductRequest` — `skus` (string[]) and optional `type`\n * (`'in-app' | 'subs' | 'all'`, defaults to `'in-app'`).\n * @returns Promise that resolves when the request is dispatched; results land in the\n * hook's reactive `products` / `subscriptions` state.\n * @throws When the store rejects the request (empty `skus`, not connected,\n * network/store error). Unknown SKUs are simply omitted from the result, not thrown.\n *\n * @example\n * ```ts\n * const { fetchProducts, products } = useIAP();\n * await fetchProducts({\n * skus: ['com.app.coins_100', 'com.app.premium'],\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks This is a regular promise-based call. Don't confuse with `request*` APIs\n * (`requestPurchase`), which are event-based.\n *\n * @see {@link https://openiap.dev/docs/apis/fetch-products}\n */\n const fetchProductsInternal = useCallback(\n async (params: {\n skus: string[];\n type?: ProductTypeInput;\n }): Promise<void> => {\n try {\n const queryType = normalizeProductQueryType(params.type);\n const request: ProductRequest = {skus: params.skus, type: queryType};\n const result = await fetchProducts(request);\n const items = (result ?? []) as (Product | ProductSubscription)[];\n\n ExpoIapConsole.debug('Fetched products:', items);\n\n if (queryType === 'subs') {\n const subscriptionsResult = items as ProductSubscription[];\n setSubscriptions((prevSubscriptions) =>\n mergeWithDuplicateCheck(\n prevSubscriptions,\n subscriptionsResult,\n (subscription) => subscription.id,\n ),\n );\n } else if (queryType === 'in-app') {\n const productsResult = items as Product[];\n setProducts((prevProducts) =>\n mergeWithDuplicateCheck(\n prevProducts,\n productsResult,\n (product) => product.id,\n ),\n );\n } else {\n const productItems = items.filter(\n (item) => canonicalProductType(item.type as string) === 'in-app',\n ) as Product[];\n\n const subscriptionItems = items.filter(\n (item) => canonicalProductType(item.type as string) === 'subs',\n ) as ProductSubscription[];\n\n setProducts((prevProducts) =>\n mergeWithDuplicateCheck(\n prevProducts,\n productItems,\n (product) => product.id,\n ),\n );\n\n setSubscriptions((prevSubscriptions) =>\n mergeWithDuplicateCheck(\n prevSubscriptions,\n subscriptionItems,\n (subscription) => subscription.id,\n ),\n );\n }\n } catch (error) {\n ExpoIapConsole.error('Error fetching products:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [\n canonicalProductType,\n invokeOnError,\n mergeWithDuplicateCheck,\n normalizeProductQueryType,\n ],\n );\n\n /**\n * List the user's unfinished purchases — non-consumables, active subscriptions, and any\n * pending transactions not yet finished.\n *\n * @param options Optional `PurchaseOptions`. iOS-only flags:\n * `alsoPublishToEventListenerIOS`, `onlyIncludeActiveItemsIOS`.\n * @returns Promise that resolves when the request is dispatched; results land in the\n * hook's reactive `availablePurchases` state.\n * @throws When the platform query fails.\n *\n * @example\n * ```ts\n * const { getAvailablePurchases, availablePurchases } = useIAP();\n * await getAvailablePurchases();\n * for (const p of availablePurchases) {\n * if (await verifyOnServer(p)) await finishTransaction({ purchase: p, isConsumable: false });\n * }\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/get-available-purchases}\n */\n const getAvailablePurchasesInternal = useCallback(\n async (options?: PurchaseOptions): Promise<void> => {\n try {\n const result = await getAvailablePurchases({\n alsoPublishToEventListenerIOS:\n options?.alsoPublishToEventListenerIOS ?? false,\n onlyIncludeActiveItemsIOS: options?.onlyIncludeActiveItemsIOS ?? true,\n includeSuspendedAndroid: options?.includeSuspendedAndroid ?? false,\n });\n setAvailablePurchases(result);\n } catch (error) {\n ExpoIapConsole.error('Error fetching available purchases:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Get details of all currently active subscriptions.\n *\n * @see {@link https://openiap.dev/docs/apis/get-active-subscriptions}\n */\n const getActiveSubscriptionsInternal = useCallback(\n async (subscriptionIds?: string[]): Promise<void> => {\n try {\n const result = await getActiveSubscriptions(subscriptionIds);\n setActiveSubscriptions(result);\n } catch (error) {\n ExpoIapConsole.error('Error getting active subscriptions:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Check whether the user has any active subscription.\n *\n * @see {@link https://openiap.dev/docs/apis/has-active-subscriptions}\n */\n const hasActiveSubscriptionsInternal = useCallback(\n async (subscriptionIds?: string[]): Promise<boolean> => {\n try {\n return await hasActiveSubscriptions(subscriptionIds);\n } catch (error) {\n ExpoIapConsole.error('Error checking active subscriptions:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Complete a purchase transaction. Call after server-side verification to remove it\n * from the queue.\n *\n * @param args.purchase The `Purchase` to finalize.\n * @param args.isConsumable `true` for consumables (consumes the token so the SKU can be\n * re-bought, e.g. coins); `false` (default) for non-consumables and subscriptions.\n * @returns Promise that resolves once the platform finalizes the transaction.\n * @throws When the platform finalize call fails.\n *\n * @example\n * ```ts\n * // Inside purchaseUpdatedListener:\n * if (await verifyOnServer(purchase)) {\n * await finishTransaction({ purchase, isConsumable: false });\n * }\n * ```\n *\n * @remarks **Critical:** Android purchases must be finalized within 3 days or Google\n * auto-refunds. iOS unfinished transactions replay on every app launch.\n *\n * @see {@link https://openiap.dev/docs/apis/finish-transaction}\n */\n const finishTransaction = useCallback(\n async ({\n purchase,\n isConsumable,\n }: {\n purchase: Purchase;\n isConsumable?: boolean;\n }): Promise<void> => {\n await finishTransactionInternal({\n purchase: toPurchaseInput(purchase),\n isConsumable,\n });\n },\n [toPurchaseInput],\n );\n\n const refreshSubscriptionStatus = useCallback(\n async (productId: string) => {\n try {\n if (subscriptionsRefState.current.some((sub) => sub.id === productId)) {\n await fetchProductsInternal({skus: [productId], type: 'subs'});\n await getAvailablePurchasesInternal();\n await getActiveSubscriptionsInternal();\n }\n } catch (error) {\n ExpoIapConsole.warn('Failed to refresh subscription status:', error);\n }\n },\n [\n fetchProductsInternal,\n getAvailablePurchasesInternal,\n getActiveSubscriptionsInternal,\n ],\n );\n\n /**\n * Initiate a purchase or subscription flow. The result is delivered through\n * `purchaseUpdatedListener` — NOT the return value.\n *\n * @param props `RequestPurchaseProps`, discriminated by `type`:\n * - `type: 'in-app'` — pass `request.apple.sku` (iOS) and/or `request.google.skus` (Android).\n * - `type: 'subs'` — same shape, plus `request.google.subscriptionOffers: [{ sku, offerToken }]`.\n * @returns Promise that resolves when the request is dispatched; the actual purchase\n * outcome lands in the hook's `onPurchaseSuccess` / `onPurchaseError` callbacks.\n * @throws Synchronous rejection from the store (e.g. `E_NOT_PREPARED`, validation failure).\n *\n * @example\n * ```ts\n * await requestPurchase({\n * request: {\n * apple: { sku: 'com.app.premium' },\n * google: { skus: ['com.app.premium'] },\n * },\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks Event-based. Listen for the result via {@link purchaseUpdatedListener} /\n * {@link purchaseErrorListener}, or use `useIAP({ onPurchaseSuccess, onPurchaseError })`.\n *\n * @see {@link https://openiap.dev/docs/apis/request-purchase}\n */\n const requestPurchaseWithReset = useCallback(\n async (requestObj: MutationRequestPurchaseArgs) => {\n const purchaseResult = await requestPurchaseInternal(requestObj);\n const purchases = Array.isArray(purchaseResult)\n ? purchaseResult\n : purchaseResult\n ? [purchaseResult]\n : [];\n\n for (const purchase of purchases ?? []) {\n if (!markPurchaseDelivered(purchase)) {\n continue;\n }\n\n if (purchase.productId) {\n await refreshSubscriptionStatus(purchase.productId);\n }\n if (optionsRef.current?.onPurchaseSuccess) {\n optionsRef.current.onPurchaseSuccess(purchase);\n }\n }\n\n return purchaseResult;\n },\n [markPurchaseDelivered, refreshSubscriptionStatus],\n );\n\n /**\n * Restore non-consumable and active subscription purchases.\n *\n * @see {@link https://openiap.dev/docs/apis/restore-purchases}\n */\n const restorePurchasesInternal = useCallback(\n async (options?: PurchaseOptions): Promise<void> => {\n try {\n if (Platform.OS === 'ios') {\n await restorePurchasesIOSNative();\n }\n\n const purchases = await getAvailablePurchases({\n alsoPublishToEventListenerIOS:\n options?.alsoPublishToEventListenerIOS ?? false,\n onlyIncludeActiveItemsIOS: options?.onlyIncludeActiveItemsIOS ?? true,\n includeSuspendedAndroid: options?.includeSuspendedAndroid ?? false,\n });\n setAvailablePurchases(purchases);\n } catch (error) {\n ExpoIapConsole.warn('Failed to restore purchases:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Verify a purchase against your own backend (returns isValid + raw store metadata).\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase}\n */\n const verifyPurchase = useCallback(async (props: VerifyPurchaseProps) => {\n return verifyPurchaseInternal(props);\n }, []);\n\n /**\n * Verify via a managed provider — currently only `iapkit` (IAPKit). The PurchaseVerificationProvider enum exposes no other provider literal today.\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase-with-provider}\n */\n const verifyPurchaseWithProvider = useCallback(\n async (props: VerifyPurchaseWithProviderProps) => {\n return verifyPurchaseWithProviderInternal(props);\n },\n [],\n );\n\n // Build the canonical billing-program connection config.\n const buildConnectionConfig = useCallback(():\n | InitConnectionConfig\n | undefined => {\n if (optionsRef.current?.enableBillingProgramAndroid) {\n return {\n enableBillingProgramAndroid:\n optionsRef.current.enableBillingProgramAndroid,\n ...(optionsRef.current.billingChoiceScreenTypeAndroid\n ? {\n billingChoiceScreenTypeAndroid:\n optionsRef.current.billingChoiceScreenTypeAndroid,\n }\n : {}),\n };\n }\n\n return undefined;\n }, []);\n\n const initIapWithSubscriptions = useCallback(\n async (generation: number): Promise<void> => {\n if (\n !isMountedRef.current ||\n initializationGenerationRef.current !== generation\n ) {\n return;\n }\n startedInitializationGenerationRef.current = generation;\n\n // CRITICAL: Register listeners BEFORE initConnection to avoid race condition\n // Events might fire immediately after initConnection, so listeners must be ready\n // Register purchase update listener BEFORE initConnection to avoid race conditions.\n subscriptionsRef.current.purchaseUpdate = purchaseUpdatedListener(\n async (purchase: Purchase) => {\n if (!markPurchaseDelivered(purchase)) {\n return;\n }\n\n // Refresh subscription status for both iOS and Android subscription purchases.\n // refreshSubscriptionStatus internally checks whether the product is a known\n // subscription, so it is safe to call unconditionally for any purchase event.\n await refreshSubscriptionStatus(purchase.productId);\n\n if (optionsRef.current?.onPurchaseSuccess) {\n optionsRef.current.onPurchaseSuccess(purchase);\n }\n },\n optionsRef.current?.purchaseUpdatedListenerOptions,\n );\n\n // Register purchase error listener EARLY. Ignore init-related errors until connected.\n subscriptionsRef.current.purchaseError = purchaseErrorListener(\n (error: PurchaseError) => {\n if (\n !connectedRef.current &&\n error.code === ErrorCode.InitConnection\n ) {\n return; // Ignore initialization error before connected\n }\n const friendly = getUserFriendlyErrorMessage(error);\n if (\n error?.code !== ErrorCode.AlreadyOwned &&\n error?.code !== ErrorCode.ServiceTimeout &&\n !isUserCancelledError(error) &&\n !isRecoverableError(error)\n ) {\n ExpoIapConsole.warn('[useIAP] Purchase error:', friendly);\n }\n\n if (optionsRef.current?.onPurchaseError) {\n optionsRef.current.onPurchaseError(error);\n }\n },\n );\n\n if (\n Platform.OS === 'android' &&\n optionsRef.current?.onUserChoiceBillingAndroid\n ) {\n subscriptionsRef.current.userChoiceBillingAndroid =\n userChoiceBillingListenerAndroid((details) => {\n optionsRef.current?.onUserChoiceBillingAndroid?.(details);\n });\n }\n\n if (\n Platform.OS === 'android' &&\n optionsRef.current?.onDeveloperProvidedBillingAndroid\n ) {\n subscriptionsRef.current.developerProvidedBillingAndroid =\n developerProvidedBillingListenerAndroid((details) => {\n optionsRef.current?.onDeveloperProvidedBillingAndroid?.(details);\n });\n }\n\n subscriptionsRef.current.subscriptionBillingIssue =\n subscriptionBillingIssueListener((purchase) => {\n optionsRef.current?.onSubscriptionBillingIssue?.(purchase);\n });\n\n if (Platform.OS === 'ios') {\n // iOS promoted products listener\n subscriptionsRef.current.promotedProductIOS =\n promotedProductListenerIOS((product: Product) => {\n setPromotedProductIOS(product);\n\n if (optionsRef.current?.onPromotedProductIOS) {\n optionsRef.current.onPromotedProductIOS(product);\n }\n });\n }\n\n // NOW call initConnection after listeners are ready\n const config = buildConnectionConfig();\n\n try {\n const result = await initConnection(config);\n if (\n !isMountedRef.current ||\n initializationGenerationRef.current !== generation\n ) {\n if (startedInitializationGenerationRef.current === generation) {\n startedInitializationGenerationRef.current = 0;\n await endConnection();\n }\n return;\n }\n setConnected(result);\n if (!result) {\n // If connection failed, clean up listeners\n ExpoIapConsole.warn(\n '[useIAP] Connection failed, cleaning up listeners...',\n );\n subscriptionsRef.current.purchaseUpdate?.remove();\n subscriptionsRef.current.promotedProductIOS?.remove();\n subscriptionsRef.current.purchaseUpdate = undefined;\n subscriptionsRef.current.promotedProductIOS = undefined;\n // Keep purchaseError listener registered to capture subsequent retries\n }\n } catch (error) {\n if (\n !isMountedRef.current ||\n initializationGenerationRef.current !== generation\n ) {\n return;\n }\n ExpoIapConsole.error('initConnection failed:', error);\n invokeOnError(error);\n // Clean up listeners on error\n subscriptionsRef.current.purchaseUpdate?.remove();\n subscriptionsRef.current.promotedProductIOS?.remove();\n subscriptionsRef.current.purchaseUpdate = undefined;\n subscriptionsRef.current.promotedProductIOS = undefined;\n }\n },\n [\n buildConnectionConfig,\n markPurchaseDelivered,\n refreshSubscriptionStatus,\n invokeOnError,\n ],\n );\n\n // Manual reconnect method for when the initial auto-connect fails.\n // Re-runs initConnection and updates the connected state.\n // Re-registers event listeners if they were cleaned up during a previous failure.\n const reconnect = useCallback(async (): Promise<boolean> => {\n const config = buildConnectionConfig();\n\n try {\n const result = await initConnection(config);\n setConnected(result);\n\n if (result) {\n // Re-register listeners if they were cleaned up during a previous failure\n if (!subscriptionsRef.current.purchaseUpdate) {\n subscriptionsRef.current.purchaseUpdate = purchaseUpdatedListener(\n async (purchase: Purchase) => {\n if (!markPurchaseDelivered(purchase)) {\n return;\n }\n\n await refreshSubscriptionStatus(purchase.productId);\n\n if (optionsRef.current?.onPurchaseSuccess) {\n optionsRef.current.onPurchaseSuccess(purchase);\n }\n },\n optionsRef.current?.purchaseUpdatedListenerOptions,\n );\n }\n\n if (\n Platform.OS === 'ios' &&\n !subscriptionsRef.current.promotedProductIOS\n ) {\n subscriptionsRef.current.promotedProductIOS =\n promotedProductListenerIOS((product: Product) => {\n setPromotedProductIOS(product);\n\n if (optionsRef.current?.onPromotedProductIOS) {\n optionsRef.current.onPromotedProductIOS(product);\n }\n });\n }\n }\n\n return result;\n } catch (error) {\n ExpoIapConsole.error('[useIAP] reconnect failed:', error);\n invokeOnError(error);\n return false;\n }\n }, [\n buildConnectionConfig,\n markPurchaseDelivered,\n refreshSubscriptionStatus,\n invokeOnError,\n ]);\n\n useEffect(() => {\n const generation = ++initializationGenerationRef.current;\n isMountedRef.current = true;\n void Promise.resolve().then(() => initIapWithSubscriptions(generation));\n const currentSubscriptions = subscriptionsRef.current;\n\n return () => {\n isMountedRef.current = false;\n currentSubscriptions.purchaseUpdate?.remove();\n currentSubscriptions.purchaseError?.remove();\n currentSubscriptions.promotedProductIOS?.remove();\n currentSubscriptions.userChoiceBillingAndroid?.remove();\n currentSubscriptions.developerProvidedBillingAndroid?.remove();\n currentSubscriptions.subscriptionBillingIssue?.remove();\n if (startedInitializationGenerationRef.current === generation) {\n startedInitializationGenerationRef.current = 0;\n void endConnection();\n }\n setConnected(false);\n };\n }, [initIapWithSubscriptions]);\n\n return {\n connected,\n products,\n subscriptions,\n finishTransaction,\n availablePurchases,\n promotedProductIOS,\n activeSubscriptions,\n getAvailablePurchases: getAvailablePurchasesInternal,\n fetchProducts: fetchProductsInternal,\n requestPurchase: requestPurchaseWithReset,\n verifyPurchase,\n verifyPurchaseWithProvider,\n restorePurchases: restorePurchasesInternal,\n // internal getters kept for hook state management\n getPromotedProductIOS,\n getActiveSubscriptions: getActiveSubscriptionsInternal,\n hasActiveSubscriptions: hasActiveSubscriptionsInternal,\n // Reconnect method for manual retry\n reconnect,\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\n // Offer code redemption (Android only)\n openRedeemOfferCodeAndroid,\n };\n}\n"]}
1
+ {"version":3,"file":"useIAP.js","sourceRoot":"","sources":["../src/useIAP.ts"],"names":[],"mappings":"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","sourcesContent":["// External dependencies\nimport {useCallback, useEffect, useState, useRef} from 'react';\nimport {Platform} from 'react-native';\nimport type {EventSubscription} from 'expo-modules-core';\n\n// Internal modules\nimport {\n endConnection,\n initConnection,\n purchaseErrorListener,\n purchaseUpdatedListener,\n promotedProductListenerIOS,\n userChoiceBillingListenerAndroid,\n developerProvidedBillingListenerAndroid,\n subscriptionBillingIssueListener,\n getAvailablePurchases,\n finishTransaction as finishTransactionInternal,\n requestPurchase as requestPurchaseInternal,\n fetchProducts,\n verifyPurchase as verifyPurchaseInternal,\n verifyPurchaseWithProvider as verifyPurchaseWithProviderInternal,\n getActiveSubscriptions,\n hasActiveSubscriptions,\n openRedeemOfferCode,\n type ActiveSubscription,\n type ProductTypeInput,\n} from './index';\nimport {ExpoIapConsole} from './utils/debug';\nimport {getPromotedProductIOS} from './modules/ios';\nimport {restorePurchasesIOSNative} from './utils/restorePurchases';\nimport {\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\n openRedeemOfferCodeAndroid,\n} from './modules/android';\n\n// Types\nimport type {\n Product,\n ProductSubscription,\n ProductQueryType,\n ProductRequest,\n BillingChoiceScreenTypeAndroid,\n BillingProgramAndroid,\n DeveloperProvidedBillingDetailsAndroid,\n InitConnectionConfig,\n Purchase,\n MutationRequestPurchaseArgs,\n PurchaseInput,\n PurchaseUpdatedListenerOptions,\n VerifyPurchaseProps,\n VerifyPurchaseResult,\n VerifyPurchaseWithProviderProps,\n VerifyPurchaseWithProviderResult,\n PurchaseOptions,\n MutationField,\n QueryField,\n UserChoiceBillingDetails,\n} from './types';\nimport {ErrorCode} from './types';\nimport type {PurchaseError} from './utils/errorMapping';\nimport {\n getUserFriendlyErrorMessage,\n isUserCancelledError,\n isRecoverableError,\n} from './utils/errorMapping';\n\nconst PURCHASE_DELIVERY_DEDUP_WINDOW_MS = 30_000;\n\nfunction getPurchaseDeliveryKey(purchase: Purchase): string {\n return [\n purchase.store ?? '',\n purchase.productId ?? '',\n purchase.purchaseToken ??\n purchase.transactionId ??\n purchase.id ??\n purchase.transactionDate ??\n '',\n ].join(':');\n}\n\ntype UseIap = {\n connected: boolean;\n products: Product[];\n subscriptions: ProductSubscription[];\n availablePurchases: Purchase[];\n promotedProductIOS?: Product;\n activeSubscriptions: ActiveSubscription[];\n finishTransaction: ({\n purchase,\n isConsumable,\n }: {\n purchase: Purchase;\n isConsumable?: boolean;\n }) => Promise<void>;\n getAvailablePurchases: (options?: PurchaseOptions) => Promise<void>;\n fetchProducts: (params: {\n skus: string[];\n type?: ProductTypeInput;\n }) => Promise<void>;\n\n requestPurchase: (\n params: MutationRequestPurchaseArgs,\n ) => ReturnType<typeof requestPurchaseInternal>;\n verifyPurchase: (props: VerifyPurchaseProps) => Promise<VerifyPurchaseResult>;\n verifyPurchaseWithProvider: (\n props: VerifyPurchaseWithProviderProps,\n ) => Promise<VerifyPurchaseWithProviderResult>;\n restorePurchases: (options?: PurchaseOptions) => Promise<void>;\n getPromotedProductIOS: () => Promise<Product | null>;\n getActiveSubscriptions: (subscriptionIds?: string[]) => Promise<void>;\n hasActiveSubscriptions: (subscriptionIds?: string[]) => Promise<boolean>;\n /**\n * Manually retry the store connection.\n * Useful when the initial auto-connect fails (e.g., Play Store not ready at mount time).\n * Updates the `connected` state on success.\n */\n reconnect: () => Promise<boolean>;\n getBillingChoiceInfoAndroid: QueryField<'getBillingChoiceInfoAndroid'>;\n isBillingProgramAvailableAndroid: MutationField<'isBillingProgramAvailableAndroid'>;\n createBillingProgramReportingDetailsAndroid: MutationField<'createBillingProgramReportingDetailsAndroid'>;\n launchExternalLinkAndroid: MutationField<'launchExternalLinkAndroid'>;\n showBillingProgramInformationDialogAndroid: MutationField<'showBillingProgramInformationDialogAndroid'>;\n showInAppMessagesAndroid: MutationField<'showInAppMessagesAndroid'>;\n openRedeemOfferCode: MutationField<'openRedeemOfferCode'>;\n /**\n * @deprecated Use `openRedeemOfferCode` instead. Scheduled for removal in\n * OpenIAP 4.0.\n */\n openRedeemOfferCodeAndroid: MutationField<'openRedeemOfferCodeAndroid'>;\n};\n\nexport interface UseIAPOptions {\n onPurchaseSuccess?: (purchase: Purchase) => void;\n onPurchaseError?: (error: PurchaseError) => void;\n /**\n * iOS only. When enabled, the purchase success listener also receives\n * StoreKit replay events for a transaction ID already delivered during the\n * current connection session. Defaults to false.\n */\n purchaseUpdatedListenerOptions?: PurchaseUpdatedListenerOptions | null;\n /**\n * Callback for general errors from hook methods like fetchProducts,\n * getAvailablePurchases, getActiveSubscriptions, restorePurchases, etc.\n * These are Promise-based operations that can fail due to network issues\n * or store unavailability.\n */\n onError?: (error: Error) => void;\n onPromotedProductIOS?: (product: Product) => void;\n onUserChoiceBillingAndroid?: (details: UserChoiceBillingDetails) => void;\n /**\n * Fires when the user selects developer-provided billing in an External\n * Payments or Google-rendered Billing Choice flow.\n */\n onDeveloperProvidedBillingAndroid?: (\n details: DeveloperProvidedBillingDetailsAndroid,\n ) => void;\n /** Fires when a subscription enters a billing-issue state. */\n onSubscriptionBillingIssue?: (purchase: Purchase) => void;\n /**\n * Enable a specific billing program for Android (8.2.0+)\n * When set, enables the specified billing program for external transactions.\n * Use 'external-payments' for Developer Provided Billing (Japan only, 8.3.0+).\n * Use 'user-choice-billing' for User Choice Billing (7.0+).\n * Use 'billing-choice' for Billing Choice (9.1.0+).\n */\n enableBillingProgramAndroid?: BillingProgramAndroid;\n /**\n * Select who renders the Billing Choice screen (9.1.0+). Must match the\n * choiceScreenType returned by isBillingProgramAvailableAndroid.\n */\n billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid;\n}\n\n/**\n * React Hook for managing In-App Purchases.\n * See documentation at https://openiap.dev/docs/setup/expo#useIAP-hook\n */\nexport function useIAP(options?: UseIAPOptions): UseIap {\n const [connected, setConnected] = useState<boolean>(false);\n const [products, setProducts] = useState<Product[]>([]);\n const [subscriptions, setSubscriptions] = useState<ProductSubscription[]>([]);\n\n const [availablePurchases, setAvailablePurchases] = useState<Purchase[]>([]);\n const [promotedProductIOS, setPromotedProductIOS] = useState<Product>();\n const [activeSubscriptions, setActiveSubscriptions] = useState<\n ActiveSubscription[]\n >([]);\n\n const optionsRef = useRef<UseIAPOptions | undefined>(options);\n const connectedRef = useRef<boolean>(false);\n const isMountedRef = useRef<boolean>(false);\n const initializationGenerationRef = useRef(0);\n const startedInitializationGenerationRef = useRef(0);\n const deliveredPurchaseKeysRef = useRef(new Set<string>());\n\n // Helper function to merge arrays with duplicate checking\n const mergeWithDuplicateCheck = useCallback(\n <T>(\n existingItems: T[],\n newItems: T[],\n getKey: (item: T) => string,\n ): T[] => {\n const merged = [...existingItems];\n newItems.forEach((newItem) => {\n const isDuplicate = merged.some(\n (existingItem) => getKey(existingItem) === getKey(newItem),\n );\n if (!isDuplicate) {\n merged.push(newItem);\n }\n });\n return merged;\n },\n [],\n );\n\n useEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n useEffect(() => {\n connectedRef.current = connected;\n }, [connected]);\n\n const subscriptionsRef = useRef<{\n purchaseUpdate?: EventSubscription;\n purchaseError?: EventSubscription;\n promotedProductIOS?: EventSubscription;\n userChoiceBillingAndroid?: EventSubscription;\n developerProvidedBillingAndroid?: EventSubscription;\n subscriptionBillingIssue?: EventSubscription;\n }>({});\n\n const subscriptionsRefState = useRef<ProductSubscription[]>([]);\n\n useEffect(() => {\n subscriptionsRefState.current = subscriptions;\n }, [subscriptions]);\n\n const normalizeProductQueryType = useCallback(\n (type?: ProductTypeInput): ProductQueryType => {\n if (!type || type === 'in-app') {\n return 'in-app';\n }\n return type;\n },\n [],\n );\n\n const canonicalProductType = useCallback(\n (value?: string): ProductQueryType => {\n if (!value) {\n return 'in-app';\n }\n\n const normalized = value.trim().toLowerCase().replace(/[_-]/g, '');\n return normalized === 'subs' ? 'subs' : 'in-app';\n },\n [],\n );\n\n const toPurchaseInput = useCallback(\n (purchase: Purchase): PurchaseInput => ({\n id: purchase.id,\n ids: purchase.ids ?? undefined,\n isAutoRenewing: purchase.isAutoRenewing,\n productId: purchase.productId,\n purchaseState: purchase.purchaseState,\n purchaseToken: purchase.purchaseToken ?? null,\n quantity: purchase.quantity,\n store: purchase.store,\n transactionDate: purchase.transactionDate,\n transactionId: purchase.transactionId,\n }),\n [],\n );\n\n const markPurchaseDelivered = useCallback((purchase: Purchase): boolean => {\n const key = getPurchaseDeliveryKey(purchase);\n if (deliveredPurchaseKeysRef.current.has(key)) {\n return false;\n }\n\n deliveredPurchaseKeysRef.current.add(key);\n setTimeout(() => {\n deliveredPurchaseKeysRef.current.delete(key);\n }, PURCHASE_DELIVERY_DEDUP_WINDOW_MS);\n return true;\n }, []);\n\n // Helper function to invoke onError callback\n const invokeOnError = useCallback((error: unknown) => {\n if (optionsRef.current?.onError) {\n optionsRef.current.onError(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }, []);\n\n /**\n * Retrieve products or subscriptions from the store by SKU.\n *\n * @param params `ProductRequest` — `skus` (string[]) and optional `type`\n * (`'in-app' | 'subs' | 'all'`, defaults to `'in-app'`).\n * @returns Promise that resolves when the request is dispatched; results land in the\n * hook's reactive `products` / `subscriptions` state.\n * @throws When the store rejects the request (empty `skus`, not connected,\n * network/store error). Unknown SKUs are simply omitted from the result, not thrown.\n *\n * @example\n * ```ts\n * const { fetchProducts, products } = useIAP();\n * await fetchProducts({\n * skus: ['com.app.coins_100', 'com.app.premium'],\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks This is a regular promise-based call. Don't confuse with `request*` APIs\n * (`requestPurchase`), which are event-based.\n *\n * @see {@link https://openiap.dev/docs/apis/fetch-products}\n */\n const fetchProductsInternal = useCallback(\n async (params: {\n skus: string[];\n type?: ProductTypeInput;\n }): Promise<void> => {\n try {\n const queryType = normalizeProductQueryType(params.type);\n const request: ProductRequest = {skus: params.skus, type: queryType};\n const result = await fetchProducts(request);\n const items = (result ?? []) as (Product | ProductSubscription)[];\n\n ExpoIapConsole.debug('Fetched products:', items);\n\n if (queryType === 'subs') {\n const subscriptionsResult = items as ProductSubscription[];\n setSubscriptions((prevSubscriptions) =>\n mergeWithDuplicateCheck(\n prevSubscriptions,\n subscriptionsResult,\n (subscription) => subscription.id,\n ),\n );\n } else if (queryType === 'in-app') {\n const productsResult = items as Product[];\n setProducts((prevProducts) =>\n mergeWithDuplicateCheck(\n prevProducts,\n productsResult,\n (product) => product.id,\n ),\n );\n } else {\n const productItems = items.filter(\n (item) => canonicalProductType(item.type as string) === 'in-app',\n ) as Product[];\n\n const subscriptionItems = items.filter(\n (item) => canonicalProductType(item.type as string) === 'subs',\n ) as ProductSubscription[];\n\n setProducts((prevProducts) =>\n mergeWithDuplicateCheck(\n prevProducts,\n productItems,\n (product) => product.id,\n ),\n );\n\n setSubscriptions((prevSubscriptions) =>\n mergeWithDuplicateCheck(\n prevSubscriptions,\n subscriptionItems,\n (subscription) => subscription.id,\n ),\n );\n }\n } catch (error) {\n ExpoIapConsole.error('Error fetching products:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [\n canonicalProductType,\n invokeOnError,\n mergeWithDuplicateCheck,\n normalizeProductQueryType,\n ],\n );\n\n /**\n * List the user's unfinished purchases — non-consumables, active subscriptions, and any\n * pending transactions not yet finished.\n *\n * @param options Optional `PurchaseOptions`. iOS-only flags:\n * `alsoPublishToEventListenerIOS`, `onlyIncludeActiveItemsIOS`.\n * @returns Promise that resolves when the request is dispatched; results land in the\n * hook's reactive `availablePurchases` state.\n * @throws When the platform query fails.\n *\n * @example\n * ```ts\n * const { getAvailablePurchases, availablePurchases } = useIAP();\n * await getAvailablePurchases();\n * for (const p of availablePurchases) {\n * if (await verifyOnServer(p)) await finishTransaction({ purchase: p, isConsumable: false });\n * }\n * ```\n *\n * @see {@link https://openiap.dev/docs/apis/get-available-purchases}\n */\n const getAvailablePurchasesInternal = useCallback(\n async (options?: PurchaseOptions): Promise<void> => {\n try {\n const result = await getAvailablePurchases({\n alsoPublishToEventListenerIOS:\n options?.alsoPublishToEventListenerIOS ?? false,\n onlyIncludeActiveItemsIOS: options?.onlyIncludeActiveItemsIOS ?? true,\n includeSuspendedAndroid: options?.includeSuspendedAndroid ?? false,\n });\n setAvailablePurchases(result);\n } catch (error) {\n ExpoIapConsole.error('Error fetching available purchases:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Get details of all currently active subscriptions.\n *\n * @see {@link https://openiap.dev/docs/apis/get-active-subscriptions}\n */\n const getActiveSubscriptionsInternal = useCallback(\n async (subscriptionIds?: string[]): Promise<void> => {\n try {\n const result = await getActiveSubscriptions(subscriptionIds);\n setActiveSubscriptions(result);\n } catch (error) {\n ExpoIapConsole.error('Error getting active subscriptions:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Check whether the user has any active subscription.\n *\n * @see {@link https://openiap.dev/docs/apis/has-active-subscriptions}\n */\n const hasActiveSubscriptionsInternal = useCallback(\n async (subscriptionIds?: string[]): Promise<boolean> => {\n try {\n return await hasActiveSubscriptions(subscriptionIds);\n } catch (error) {\n ExpoIapConsole.error('Error checking active subscriptions:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Complete a purchase transaction. Call after server-side verification to remove it\n * from the queue.\n *\n * @param args.purchase The `Purchase` to finalize.\n * @param args.isConsumable `true` for consumables (consumes the token so the SKU can be\n * re-bought, e.g. coins); `false` (default) for non-consumables and subscriptions.\n * @returns Promise that resolves once the platform finalizes the transaction.\n * @throws When the platform finalize call fails.\n *\n * @example\n * ```ts\n * // Inside purchaseUpdatedListener:\n * if (await verifyOnServer(purchase)) {\n * await finishTransaction({ purchase, isConsumable: false });\n * }\n * ```\n *\n * @remarks **Critical:** Android purchases must be finalized within 3 days or Google\n * auto-refunds. iOS unfinished transactions replay on every app launch.\n *\n * @see {@link https://openiap.dev/docs/apis/finish-transaction}\n */\n const finishTransaction = useCallback(\n async ({\n purchase,\n isConsumable,\n }: {\n purchase: Purchase;\n isConsumable?: boolean;\n }): Promise<void> => {\n await finishTransactionInternal({\n purchase: toPurchaseInput(purchase),\n isConsumable,\n });\n },\n [toPurchaseInput],\n );\n\n const refreshSubscriptionStatus = useCallback(\n async (productId: string) => {\n try {\n if (subscriptionsRefState.current.some((sub) => sub.id === productId)) {\n await fetchProductsInternal({skus: [productId], type: 'subs'});\n await getAvailablePurchasesInternal();\n await getActiveSubscriptionsInternal();\n }\n } catch (error) {\n ExpoIapConsole.warn('Failed to refresh subscription status:', error);\n }\n },\n [\n fetchProductsInternal,\n getAvailablePurchasesInternal,\n getActiveSubscriptionsInternal,\n ],\n );\n\n /**\n * Initiate a purchase or subscription flow. The result is delivered through\n * `purchaseUpdatedListener` — NOT the return value.\n *\n * @param props `RequestPurchaseProps`, discriminated by `type`:\n * - `type: 'in-app'` — pass `request.apple.sku` (iOS) and/or `request.google.skus` (Android).\n * - `type: 'subs'` — same shape, plus `request.google.subscriptionOffers: [{ sku, offerToken }]`.\n * @returns Promise that resolves when the request is dispatched; the actual purchase\n * outcome lands in the hook's `onPurchaseSuccess` / `onPurchaseError` callbacks.\n * @throws Synchronous rejection from the store (e.g. `E_NOT_PREPARED`, validation failure).\n *\n * @example\n * ```ts\n * await requestPurchase({\n * request: {\n * apple: { sku: 'com.app.premium' },\n * google: { skus: ['com.app.premium'] },\n * },\n * type: 'in-app',\n * });\n * ```\n *\n * @remarks Event-based. Listen for the result via {@link purchaseUpdatedListener} /\n * {@link purchaseErrorListener}, or use `useIAP({ onPurchaseSuccess, onPurchaseError })`.\n *\n * @see {@link https://openiap.dev/docs/apis/request-purchase}\n */\n const requestPurchaseWithReset = useCallback(\n async (requestObj: MutationRequestPurchaseArgs) => {\n const purchaseResult = await requestPurchaseInternal(requestObj);\n const purchases = Array.isArray(purchaseResult)\n ? purchaseResult\n : purchaseResult\n ? [purchaseResult]\n : [];\n\n for (const purchase of purchases ?? []) {\n if (!markPurchaseDelivered(purchase)) {\n continue;\n }\n\n if (purchase.productId) {\n await refreshSubscriptionStatus(purchase.productId);\n }\n if (optionsRef.current?.onPurchaseSuccess) {\n optionsRef.current.onPurchaseSuccess(purchase);\n }\n }\n\n return purchaseResult;\n },\n [markPurchaseDelivered, refreshSubscriptionStatus],\n );\n\n /**\n * Restore non-consumable and active subscription purchases.\n *\n * @see {@link https://openiap.dev/docs/apis/restore-purchases}\n */\n const restorePurchasesInternal = useCallback(\n async (options?: PurchaseOptions): Promise<void> => {\n try {\n if (Platform.OS === 'ios') {\n await restorePurchasesIOSNative();\n }\n\n const purchases = await getAvailablePurchases({\n alsoPublishToEventListenerIOS:\n options?.alsoPublishToEventListenerIOS ?? false,\n onlyIncludeActiveItemsIOS: options?.onlyIncludeActiveItemsIOS ?? true,\n includeSuspendedAndroid: options?.includeSuspendedAndroid ?? false,\n });\n setAvailablePurchases(purchases);\n } catch (error) {\n ExpoIapConsole.warn('Failed to restore purchases:', error);\n invokeOnError(error);\n throw error;\n }\n },\n [invokeOnError],\n );\n\n /**\n * Verify a purchase against your own backend (returns isValid + raw store metadata).\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase}\n */\n const verifyPurchase = useCallback(async (props: VerifyPurchaseProps) => {\n return verifyPurchaseInternal(props);\n }, []);\n\n /**\n * Verify via a managed provider — currently only `iapkit` (IAPKit). The PurchaseVerificationProvider enum exposes no other provider literal today.\n *\n * @see {@link https://openiap.dev/docs/features/validation#verify-purchase-with-provider}\n */\n const verifyPurchaseWithProvider = useCallback(\n async (props: VerifyPurchaseWithProviderProps) => {\n return verifyPurchaseWithProviderInternal(props);\n },\n [],\n );\n\n // Build the canonical billing-program connection config.\n const buildConnectionConfig = useCallback(():\n | InitConnectionConfig\n | undefined => {\n if (optionsRef.current?.enableBillingProgramAndroid) {\n return {\n enableBillingProgramAndroid:\n optionsRef.current.enableBillingProgramAndroid,\n ...(optionsRef.current.billingChoiceScreenTypeAndroid\n ? {\n billingChoiceScreenTypeAndroid:\n optionsRef.current.billingChoiceScreenTypeAndroid,\n }\n : {}),\n };\n }\n\n return undefined;\n }, []);\n\n const initIapWithSubscriptions = useCallback(\n async (generation: number): Promise<void> => {\n if (\n !isMountedRef.current ||\n initializationGenerationRef.current !== generation\n ) {\n return;\n }\n startedInitializationGenerationRef.current = generation;\n\n // CRITICAL: Register listeners BEFORE initConnection to avoid race condition\n // Events might fire immediately after initConnection, so listeners must be ready\n // Register purchase update listener BEFORE initConnection to avoid race conditions.\n subscriptionsRef.current.purchaseUpdate = purchaseUpdatedListener(\n async (purchase: Purchase) => {\n if (!markPurchaseDelivered(purchase)) {\n return;\n }\n\n // Refresh subscription status for both iOS and Android subscription purchases.\n // refreshSubscriptionStatus internally checks whether the product is a known\n // subscription, so it is safe to call unconditionally for any purchase event.\n await refreshSubscriptionStatus(purchase.productId);\n\n if (optionsRef.current?.onPurchaseSuccess) {\n optionsRef.current.onPurchaseSuccess(purchase);\n }\n },\n optionsRef.current?.purchaseUpdatedListenerOptions,\n );\n\n // Register purchase error listener EARLY. Ignore init-related errors until connected.\n subscriptionsRef.current.purchaseError = purchaseErrorListener(\n (error: PurchaseError) => {\n if (\n !connectedRef.current &&\n error.code === ErrorCode.InitConnection\n ) {\n return; // Ignore initialization error before connected\n }\n const friendly = getUserFriendlyErrorMessage(error);\n if (\n error?.code !== ErrorCode.AlreadyOwned &&\n error?.code !== ErrorCode.ServiceTimeout &&\n !isUserCancelledError(error) &&\n !isRecoverableError(error)\n ) {\n ExpoIapConsole.warn('[useIAP] Purchase error:', friendly);\n }\n\n if (optionsRef.current?.onPurchaseError) {\n optionsRef.current.onPurchaseError(error);\n }\n },\n );\n\n if (\n Platform.OS === 'android' &&\n optionsRef.current?.onUserChoiceBillingAndroid\n ) {\n subscriptionsRef.current.userChoiceBillingAndroid =\n userChoiceBillingListenerAndroid((details) => {\n optionsRef.current?.onUserChoiceBillingAndroid?.(details);\n });\n }\n\n if (\n Platform.OS === 'android' &&\n optionsRef.current?.onDeveloperProvidedBillingAndroid\n ) {\n subscriptionsRef.current.developerProvidedBillingAndroid =\n developerProvidedBillingListenerAndroid((details) => {\n optionsRef.current?.onDeveloperProvidedBillingAndroid?.(details);\n });\n }\n\n subscriptionsRef.current.subscriptionBillingIssue =\n subscriptionBillingIssueListener((purchase) => {\n optionsRef.current?.onSubscriptionBillingIssue?.(purchase);\n });\n\n if (Platform.OS === 'ios') {\n // iOS promoted products listener\n subscriptionsRef.current.promotedProductIOS =\n promotedProductListenerIOS((product: Product) => {\n setPromotedProductIOS(product);\n\n if (optionsRef.current?.onPromotedProductIOS) {\n optionsRef.current.onPromotedProductIOS(product);\n }\n });\n }\n\n // NOW call initConnection after listeners are ready\n const config = buildConnectionConfig();\n\n try {\n const result = await initConnection(config);\n if (\n !isMountedRef.current ||\n initializationGenerationRef.current !== generation\n ) {\n if (startedInitializationGenerationRef.current === generation) {\n startedInitializationGenerationRef.current = 0;\n await endConnection();\n }\n return;\n }\n setConnected(result);\n if (!result) {\n // If connection failed, clean up listeners\n ExpoIapConsole.warn(\n '[useIAP] Connection failed, cleaning up listeners...',\n );\n subscriptionsRef.current.purchaseUpdate?.remove();\n subscriptionsRef.current.promotedProductIOS?.remove();\n subscriptionsRef.current.purchaseUpdate = undefined;\n subscriptionsRef.current.promotedProductIOS = undefined;\n // Keep purchaseError listener registered to capture subsequent retries\n }\n } catch (error) {\n if (\n !isMountedRef.current ||\n initializationGenerationRef.current !== generation\n ) {\n return;\n }\n ExpoIapConsole.error('initConnection failed:', error);\n invokeOnError(error);\n // Clean up listeners on error\n subscriptionsRef.current.purchaseUpdate?.remove();\n subscriptionsRef.current.promotedProductIOS?.remove();\n subscriptionsRef.current.purchaseUpdate = undefined;\n subscriptionsRef.current.promotedProductIOS = undefined;\n }\n },\n [\n buildConnectionConfig,\n markPurchaseDelivered,\n refreshSubscriptionStatus,\n invokeOnError,\n ],\n );\n\n // Manual reconnect method for when the initial auto-connect fails.\n // Re-runs initConnection and updates the connected state.\n // Re-registers event listeners if they were cleaned up during a previous failure.\n const reconnect = useCallback(async (): Promise<boolean> => {\n const config = buildConnectionConfig();\n\n try {\n const result = await initConnection(config);\n setConnected(result);\n\n if (result) {\n // Re-register listeners if they were cleaned up during a previous failure\n if (!subscriptionsRef.current.purchaseUpdate) {\n subscriptionsRef.current.purchaseUpdate = purchaseUpdatedListener(\n async (purchase: Purchase) => {\n if (!markPurchaseDelivered(purchase)) {\n return;\n }\n\n await refreshSubscriptionStatus(purchase.productId);\n\n if (optionsRef.current?.onPurchaseSuccess) {\n optionsRef.current.onPurchaseSuccess(purchase);\n }\n },\n optionsRef.current?.purchaseUpdatedListenerOptions,\n );\n }\n\n if (\n Platform.OS === 'ios' &&\n !subscriptionsRef.current.promotedProductIOS\n ) {\n subscriptionsRef.current.promotedProductIOS =\n promotedProductListenerIOS((product: Product) => {\n setPromotedProductIOS(product);\n\n if (optionsRef.current?.onPromotedProductIOS) {\n optionsRef.current.onPromotedProductIOS(product);\n }\n });\n }\n }\n\n return result;\n } catch (error) {\n ExpoIapConsole.error('[useIAP] reconnect failed:', error);\n invokeOnError(error);\n return false;\n }\n }, [\n buildConnectionConfig,\n markPurchaseDelivered,\n refreshSubscriptionStatus,\n invokeOnError,\n ]);\n\n useEffect(() => {\n const generation = ++initializationGenerationRef.current;\n isMountedRef.current = true;\n void Promise.resolve().then(() => initIapWithSubscriptions(generation));\n const currentSubscriptions = subscriptionsRef.current;\n\n return () => {\n isMountedRef.current = false;\n currentSubscriptions.purchaseUpdate?.remove();\n currentSubscriptions.purchaseError?.remove();\n currentSubscriptions.promotedProductIOS?.remove();\n currentSubscriptions.userChoiceBillingAndroid?.remove();\n currentSubscriptions.developerProvidedBillingAndroid?.remove();\n currentSubscriptions.subscriptionBillingIssue?.remove();\n if (startedInitializationGenerationRef.current === generation) {\n startedInitializationGenerationRef.current = 0;\n void endConnection();\n }\n setConnected(false);\n };\n }, [initIapWithSubscriptions]);\n\n return {\n connected,\n products,\n subscriptions,\n finishTransaction,\n availablePurchases,\n promotedProductIOS,\n activeSubscriptions,\n getAvailablePurchases: getAvailablePurchasesInternal,\n fetchProducts: fetchProductsInternal,\n requestPurchase: requestPurchaseWithReset,\n verifyPurchase,\n verifyPurchaseWithProvider,\n restorePurchases: restorePurchasesInternal,\n // internal getters kept for hook state management\n getPromotedProductIOS,\n getActiveSubscriptions: getActiveSubscriptionsInternal,\n hasActiveSubscriptions: hasActiveSubscriptionsInternal,\n // Reconnect method for manual retry\n reconnect,\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\n // Offer code redemption\n openRedeemOfferCode,\n openRedeemOfferCodeAndroid,\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  {
2
- "spec": "3.2.1",
3
- "google": "3.3.2",
4
- "apple": "3.2.1"
2
+ "spec": "3.3.0",
3
+ "google": "3.4.0",
4
+ "apple": "3.3.0"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-iap",
3
- "version": "5.3.2",
3
+ "version": "5.4.0",
4
4
  "description": "In App Purchase module in Expo",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -253,6 +253,9 @@ export const getPromotedProductIOS: QueryField<
253
253
  export const showManageSubscriptionsIOS: MutationField<
254
254
  'showManageSubscriptionsIOS'
255
255
  > = async () => [];
256
+ /**
257
+ * @deprecated Use `openRedeemOfferCode` instead. Scheduled for removal in OpenIAP 4.0.
258
+ */
256
259
  export const presentCodeRedemptionSheetIOS: MutationField<
257
260
  'presentCodeRedemptionSheetIOS'
258
261
  > = async () => null;
@@ -263,6 +266,14 @@ export const presentExternalPurchaseLinkIOS: MutationField<
263
266
  export const deepLinkToSubscriptions: MutationField<
264
267
  'deepLinkToSubscriptions'
265
268
  > = async () => unsupported('deepLinkToSubscriptions');
269
+ // Vega has no offer-code redemption surface; resolve null without launching.
270
+ export const openRedeemOfferCode: MutationField<
271
+ 'openRedeemOfferCode'
272
+ > = async () => null;
273
+ /**
274
+ * @deprecated Use `openRedeemOfferCode` instead. Scheduled for removal in
275
+ * OpenIAP 4.0.
276
+ */
266
277
  export const openRedeemOfferCodeAndroid: MutationField<
267
278
  'openRedeemOfferCodeAndroid'
268
279
  > = async () => false;
package/src/index.ts CHANGED
@@ -4,10 +4,15 @@ import {Platform} from 'react-native';
4
4
  // Internal modules
5
5
  import ExpoIapModule, {getNativeModule} from './ExpoIapModule';
6
6
  import {isVegaOS} from './vega';
7
- import {isProductIOS, deepLinkToSubscriptionsIOS} from './modules/ios';
7
+ import {
8
+ isProductIOS,
9
+ deepLinkToSubscriptionsIOS,
10
+ presentCodeRedemptionSheetIOS,
11
+ } from './modules/ios';
8
12
  import {
9
13
  isProductAndroid,
10
14
  deepLinkToSubscriptionsAndroid,
15
+ openRedeemOfferCodeAndroid,
11
16
  } from './modules/android';
12
17
  import {ExpoIapConsole} from './utils/debug';
13
18
  import {restorePurchasesIOSNative} from './utils/restorePurchases';
@@ -1301,6 +1306,34 @@ export const deepLinkToSubscriptions: MutationField<
1301
1306
  throw unsupportedPlatformError();
1302
1307
  };
1303
1308
 
1309
+ /**
1310
+ * Open the platform's offer/promo code redemption flow.
1311
+ *
1312
+ * Resolves the redeemed purchase only when the store reports it synchronously;
1313
+ * every other path resolves null, so reconcile with `getAvailablePurchases`
1314
+ * when the app resumes.
1315
+ *
1316
+ * @returns Promise resolving to the redeemed purchase, or null
1317
+ * @throws Error when a redemption flow exists but cannot be opened
1318
+ *
1319
+ * @see {@link https://openiap.dev/docs/apis/open-redeem-offer-code}
1320
+ */
1321
+ export const openRedeemOfferCode: MutationField<
1322
+ 'openRedeemOfferCode'
1323
+ > = async () => {
1324
+ if (Platform.OS === 'ios') {
1325
+ return presentCodeRedemptionSheetIOS();
1326
+ }
1327
+
1328
+ if (isAndroidStoreRuntime()) {
1329
+ // Native returns Boolean; false also maps to null until the SDK adopts openiap-google 3.4.0.
1330
+ await openRedeemOfferCodeAndroid();
1331
+ return null;
1332
+ }
1333
+
1334
+ throw unsupportedPlatformError();
1335
+ };
1336
+
1304
1337
  /**
1305
1338
  * Verify purchase with the configured providers
1306
1339
  *
@@ -177,6 +177,9 @@ export const acknowledgePurchaseAndroid: MutationField<
177
177
  *
178
178
  * @returns Promise resolving to true when launched, or false when unsupported
179
179
  *
180
+ * @deprecated Use `openRedeemOfferCode` instead. Scheduled for removal in
181
+ * OpenIAP 4.0.
182
+ *
180
183
  * @see {@link https://openiap.dev/docs/apis/android/open-redeem-offer-code-android}
181
184
  */
182
185
  export const openRedeemOfferCodeAndroid: MutationField<
@@ -290,6 +290,9 @@ export const getTransactionJwsIOS: QueryField<'getTransactionJwsIOS'> = async (
290
290
  *
291
291
  * @platform iOS
292
292
  *
293
+ * @deprecated Use `openRedeemOfferCode` instead. Scheduled for removal in
294
+ * OpenIAP 4.0.
295
+ *
293
296
  * @see {@link https://openiap.dev/docs/apis/ios/present-code-redemption-sheet-ios}
294
297
  */
295
298
  export const presentCodeRedemptionSheetIOS: MutationField<
package/src/types.ts CHANGED
@@ -801,7 +801,18 @@ export interface Mutation {
801
801
  */
802
802
  launchExternalLinkAndroid: Promise<boolean>;
803
803
  /**
804
- * Open the Google Play offer/promo code redemption flow so the user can enter a code.
804
+ * Open the platform's offer/promo code redemption flow.
805
+ * Resolves the redeemed purchase only when the store reports it synchronously;
806
+ * every other path resolves null, so reconcile through the purchase listeners.
807
+ * Throws when a redemption flow exists but cannot be opened.
808
+ * Available in OpenIAP Spec 3.3.0 / openiap-apple 3.3.0 / openiap-google 3.4.0.
809
+ * Replaces presentCodeRedemptionSheetIOS and openRedeemOfferCodeAndroid.
810
+ * See: https://openiap.dev/docs/apis/open-redeem-offer-code
811
+ */
812
+ openRedeemOfferCode?: Promise<(Purchase | null)>;
813
+ /**
814
+ * Deprecated. Open the Google Play offer/promo code redemption flow — use
815
+ * openRedeemOfferCode instead.
805
816
  * On Google Play builds, launches the Play Store redeem page
806
817
  * (https://play.google.com/redeem). A purchase listener can receive the redeemed
807
818
  * purchase while the app is running with an active billing connection; always
@@ -812,10 +823,12 @@ export interface Mutation {
812
823
  * Returns true when the redemption flow was launched, or false when the current
813
824
  * store flavor does not provide an equivalent redemption flow.
814
825
  * See: https://openiap.dev/docs/apis/android/open-redeem-offer-code-android
826
+ * @deprecated Use openRedeemOfferCode. Scheduled for removal in OpenIAP 4.0.
815
827
  */
816
828
  openRedeemOfferCodeAndroid: Promise<boolean>;
817
829
  /**
818
- * Show the App Store offer code redemption sheet.
830
+ * Deprecated. Show the App Store offer code redemption sheet — use
831
+ * openRedeemOfferCode instead.
819
832
  * When built with Xcode 27+ and running on iOS 27+, Mac Catalyst 27+, or
820
833
  * visionOS 27+, returns the verified transaction produced by the redemption.
821
834
  * StoreKit 2's scene-based sheet returns null after presentation on iOS 16–26,
@@ -826,6 +839,7 @@ export interface Mutation {
826
839
  * sheet through the normal transaction listener or an explicit
827
840
  * available-purchases refresh.
828
841
  * See: https://openiap.dev/docs/apis/ios/present-code-redemption-sheet-ios
842
+ * @deprecated Use openRedeemOfferCode. Scheduled for removal in OpenIAP 4.0.
829
843
  */
830
844
  presentCodeRedemptionSheetIOS?: Promise<(PurchaseIOS | null)>;
831
845
  /**
@@ -2298,6 +2312,7 @@ export type MutationArgsMap = {
2298
2312
  initConnection: MutationInitConnectionArgs;
2299
2313
  isBillingProgramAvailableAndroid: MutationIsBillingProgramAvailableAndroidArgs;
2300
2314
  launchExternalLinkAndroid: MutationLaunchExternalLinkAndroidArgs;
2315
+ openRedeemOfferCode: never;
2301
2316
  openRedeemOfferCodeAndroid: never;
2302
2317
  presentCodeRedemptionSheetIOS: never;
2303
2318
  presentExternalPurchaseLinkIOS: MutationPresentExternalPurchaseLinkIosArgs;
package/src/useIAP.ts CHANGED
@@ -21,6 +21,7 @@ import {
21
21
  verifyPurchaseWithProvider as verifyPurchaseWithProviderInternal,
22
22
  getActiveSubscriptions,
23
23
  hasActiveSubscriptions,
24
+ openRedeemOfferCode,
24
25
  type ActiveSubscription,
25
26
  type ProductTypeInput,
26
27
  } from './index';
@@ -125,6 +126,11 @@ type UseIap = {
125
126
  launchExternalLinkAndroid: MutationField<'launchExternalLinkAndroid'>;
126
127
  showBillingProgramInformationDialogAndroid: MutationField<'showBillingProgramInformationDialogAndroid'>;
127
128
  showInAppMessagesAndroid: MutationField<'showInAppMessagesAndroid'>;
129
+ openRedeemOfferCode: MutationField<'openRedeemOfferCode'>;
130
+ /**
131
+ * @deprecated Use `openRedeemOfferCode` instead. Scheduled for removal in
132
+ * OpenIAP 4.0.
133
+ */
128
134
  openRedeemOfferCodeAndroid: MutationField<'openRedeemOfferCodeAndroid'>;
129
135
  };
130
136
 
@@ -897,7 +903,8 @@ export function useIAP(options?: UseIAPOptions): UseIap {
897
903
  launchExternalLinkAndroid,
898
904
  showBillingProgramInformationDialogAndroid,
899
905
  showInAppMessagesAndroid,
900
- // Offer code redemption (Android only)
906
+ // Offer code redemption
907
+ openRedeemOfferCode,
901
908
  openRedeemOfferCodeAndroid,
902
909
  };
903
910
  }