expo-iap 6.1.0 → 6.1.1

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.d.ts","sourceRoot":"","sources":["../src/useIAP.ts"],"names":[],"mappings":"AAMA,OAAO,EAWL,eAAe,IAAI,uBAAuB,EAO1C,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACtB,MAAM,SAAS,CAAC;AAcjB,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EAGnB,8BAA8B,EAC9B,qBAAqB,EACrB,sCAAsC,EAEtC,QAAQ,EACR,2BAA2B,EAE3B,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,EACpB,+BAA+B,EAC/B,gCAAgC,EAChC,eAAe,EACf,aAAa,EACb,UAAU,EACV,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAkBxD,KAAK,MAAM,GAAG;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,kBAAkB,EAAE,QAAQ,EAAE,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,CAAC,EAClB,QAAQ,EACR,YAAY,GACb,EAAE;QACD,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,qBAAqB,EAAE,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,EAAE,gBAAgB,CAAC;KACzB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpB,eAAe,EAAE,CACf,MAAM,EAAE,2BAA2B,KAChC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;IAChD,cAAc,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9E,0BAA0B,EAAE,CAC1B,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC/C,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,qBAAqB,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrD,sBAAsB,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,sBAAsB,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE;;;;OAIG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,2BAA2B,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAC;IACvE,gCAAgC,EAAE,aAAa,CAAC,kCAAkC,CAAC,CAAC;IACpF,2CAA2C,EAAE,aAAa,CAAC,6CAA6C,CAAC,CAAC;IAC1G,yBAAyB,EAAE,aAAa,CAAC,2BAA2B,CAAC,CAAC;IACtE,0CAA0C,EAAE,aAAa,CAAC,4CAA4C,CAAC,CAAC;IACxG,wBAAwB,EAAE,aAAa,CAAC,0BAA0B,CAAC,CAAC;IACpE,mBAAmB,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD;;;;OAIG;IACH,8BAA8B,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAC;IACvE;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,0BAA0B,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACzE;;;OAGG;IACH,iCAAiC,CAAC,EAAE,CAClC,OAAO,EAAE,sCAAsC,KAC5C,IAAI,CAAC;IACV,8DAA8D;IAC9D,0BAA0B,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1D;;;;;OAKG;IACH,2BAA2B,CAAC,EAAE,qBAAqB,CAAC;IACpD;;;OAGG;IACH,8BAA8B,CAAC,EAAE,8BAA8B,CAAC;CACjE;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAqoBtD"}
1
+ {"version":3,"file":"useIAP.d.ts","sourceRoot":"","sources":["../src/useIAP.ts"],"names":[],"mappings":"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"}
package/build/useIAP.js CHANGED
@@ -75,7 +75,7 @@ export function useIAP(options) {
75
75
  ids: purchase.ids ?? undefined,
76
76
  }), []);
77
77
  const invokeOnError = useCallback((error) => {
78
- if (optionsRef.current?.onError) {
78
+ if (isMountedRef.current && optionsRef.current?.onError) {
79
79
  optionsRef.current.onError(error instanceof Error ? error : new Error(String(error)));
80
80
  }
81
81
  }, []);
@@ -232,15 +232,27 @@ export function useIAP(options) {
232
232
  });
233
233
  }, [toPurchaseInput]);
234
234
  const refreshSubscriptionStatus = useCallback(async (productId) => {
235
- try {
236
- if (subscriptionsRefState.current.some((sub) => sub.id === productId)) {
237
- await fetchProductsInternal({ skus: [productId], type: 'subs' });
238
- await getAvailablePurchasesInternal();
239
- await getActiveSubscriptionsInternal();
240
- }
235
+ if (!subscriptionsRefState.current.some((sub) => sub.id === productId)) {
236
+ return;
241
237
  }
242
- catch (error) {
243
- ExpoIapConsole.warn('Failed to refresh subscription status:', error);
238
+ const generation = initializationGenerationRef.current;
239
+ const isCurrent = () => isMountedRef.current &&
240
+ initializationGenerationRef.current === generation;
241
+ for (const refresh of [
242
+ () => fetchProductsInternal({ skus: [productId], type: 'subs' }),
243
+ getAvailablePurchasesInternal,
244
+ getActiveSubscriptionsInternal,
245
+ ]) {
246
+ if (!isCurrent())
247
+ return;
248
+ try {
249
+ await refresh();
250
+ }
251
+ catch (error) {
252
+ if (isCurrent()) {
253
+ ExpoIapConsole.warn('Failed to refresh subscription status:', error);
254
+ }
255
+ }
244
256
  }
245
257
  }, [
246
258
  fetchProductsInternal,
@@ -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 openRedeemOfferCode,\n type ActiveSubscription,\n type ProductTypeInput,\n} from './index';\nimport {ExpoIapConsole} from './utils/debug';\nimport {getPromotedProductIOS} from './modules/ios';\nimport {restorePurchasesNative} from './utils/restorePurchases';\nimport {\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\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\n// Hooks share one native connection; the last mounted hook ends it.\nlet connectionOwnerCount = 0;\n\nconst releaseConnection = (): void => {\n connectionOwnerCount = Math.max(0, connectionOwnerCount - 1);\n if (connectionOwnerCount > 0) return;\n endConnection().catch((error: unknown) => {\n ExpoIapConsole.warn('[useIAP] endConnection failed:', error);\n });\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\nexport interface UseIAPOptions {\n onPurchaseSuccess?: (purchase: Purchase) => void;\n onPurchaseError?: (error: PurchaseError) => void;\n /**\n * Options for the purchase success listener. iOS defaults to suppressing\n * StoreKit replay events for the same transaction ID; set\n * `dedupeTransactionIOS` to false only for diagnostics.\n */\n purchaseUpdatedListenerOptions?: PurchaseUpdatedListenerOptions | null;\n /**\n * Called when a hook method such as fetchProducts, getAvailablePurchases,\n * getActiveSubscriptions or restorePurchases fails.\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 * 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. Mounted hooks share one store\n * connection, which ends when the last of them unmounts.\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\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 ...purchase,\n ids: purchase.ids ?? undefined,\n }),\n [],\n );\n\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 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 Promise-based, unlike the event-based `request*` APIs such as `requestPurchase`.\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,\n * and pending transactions.\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 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 * 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 await restorePurchasesNative();\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; `iapkit` (IAPKit) is the only one.\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 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 handlePurchaseUpdate = useCallback(\n async (purchase: Purchase): Promise<void> => {\n // Deliver first so a store refresh cannot delay finishing the transaction.\n try {\n const callbackResult: unknown =\n optionsRef.current?.onPurchaseSuccess?.(purchase);\n Promise.resolve(callbackResult).catch((error: unknown) => {\n ExpoIapConsole.error('[useIAP] onPurchaseSuccess failed:', error);\n });\n } catch (error) {\n ExpoIapConsole.error('[useIAP] onPurchaseSuccess failed:', error);\n }\n\n // Safe for any purchase: it skips products that are not known subscriptions.\n await refreshSubscriptionStatus(purchase.productId);\n },\n [refreshSubscriptionStatus],\n );\n\n // Registers only missing listeners, so reconnect can restore removed ones.\n const registerListeners = useCallback(() => {\n const current = subscriptionsRef.current;\n if (!current.purchaseUpdate) {\n current.purchaseUpdate = purchaseUpdatedListener(\n handlePurchaseUpdate,\n optionsRef.current?.purchaseUpdatedListenerOptions,\n );\n }\n\n if (!current.purchaseError) {\n current.purchaseError = purchaseErrorListener((error: PurchaseError) => {\n if (!connectedRef.current && error.code === ErrorCode.InitConnection) {\n return; // Ignore initialization error before connected\n }\n if (\n error.code !== ErrorCode.AlreadyOwned &&\n !isUserCancelledError(error) &&\n !isRecoverableError(error)\n ) {\n ExpoIapConsole.warn(\n '[useIAP] Purchase error:',\n getUserFriendlyErrorMessage(error),\n );\n }\n optionsRef.current?.onPurchaseError?.(error);\n });\n }\n\n // Android billing callbacks are read at event time, so they may be set after mount.\n if (Platform.OS === 'android' && !current.userChoiceBillingAndroid) {\n current.userChoiceBillingAndroid = userChoiceBillingListenerAndroid(\n (details) => {\n optionsRef.current?.onUserChoiceBillingAndroid?.(details);\n },\n );\n }\n\n if (Platform.OS === 'android' && !current.developerProvidedBillingAndroid) {\n current.developerProvidedBillingAndroid =\n developerProvidedBillingListenerAndroid((details) => {\n optionsRef.current?.onDeveloperProvidedBillingAndroid?.(details);\n });\n }\n\n if (!current.subscriptionBillingIssue) {\n current.subscriptionBillingIssue = subscriptionBillingIssueListener(\n (purchase) => {\n optionsRef.current?.onSubscriptionBillingIssue?.(purchase);\n },\n );\n }\n\n if (Platform.OS === 'ios' && !current.promotedProductIOS) {\n current.promotedProductIOS = promotedProductListenerIOS(\n (product: Product) => {\n setPromotedProductIOS(product);\n optionsRef.current?.onPromotedProductIOS?.(product);\n },\n );\n }\n }, [handlePurchaseUpdate]);\n\n /**\n * Initiate a purchase or subscription flow. The result arrives through\n * `purchaseUpdatedListener` / `purchaseErrorListener`, 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. `ErrorCode.NotPrepared`, 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 * @see {@link https://openiap.dev/docs/apis/request-purchase}\n */\n const requestPurchase = useCallback(\n (requestObj: MutationRequestPurchaseArgs) => {\n // A failed hook init removes the purchase listener; restore it before buying.\n if (isMountedRef.current) {\n registerListeners();\n }\n return requestPurchaseInternal(requestObj);\n },\n [registerListeners],\n );\n\n // Purchase-error listening stays on so later retries still report errors.\n const removePurchaseListeners = useCallback(() => {\n subscriptionsRef.current.purchaseUpdate?.remove();\n subscriptionsRef.current.promotedProductIOS?.remove();\n subscriptionsRef.current.purchaseUpdate = undefined;\n subscriptionsRef.current.promotedProductIOS = undefined;\n }, []);\n\n const cleanupListeners = useCallback(() => {\n const current = subscriptionsRef.current;\n current.purchaseUpdate?.remove();\n current.purchaseError?.remove();\n current.promotedProductIOS?.remove();\n current.userChoiceBillingAndroid?.remove();\n current.developerProvidedBillingAndroid?.remove();\n current.subscriptionBillingIssue?.remove();\n subscriptionsRef.current = {};\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 connectionOwnerCount += 1;\n\n // Register listeners before initConnection; events can fire as soon as it connects.\n registerListeners();\n\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 releaseConnection();\n }\n return;\n }\n setConnected(result);\n if (!result) {\n ExpoIapConsole.warn(\n '[useIAP] Connection failed, cleaning up listeners...',\n );\n removePurchaseListeners();\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 removePurchaseListeners();\n }\n },\n [\n buildConnectionConfig,\n registerListeners,\n removePurchaseListeners,\n invokeOnError,\n ],\n );\n\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 registerListeners();\n }\n\n return result;\n } catch (error) {\n ExpoIapConsole.error('[useIAP] reconnect failed:', error);\n invokeOnError(error);\n return false;\n }\n }, [buildConnectionConfig, registerListeners, invokeOnError]);\n\n useEffect(() => {\n const generation = ++initializationGenerationRef.current;\n isMountedRef.current = true;\n void Promise.resolve().then(() => initIapWithSubscriptions(generation));\n\n return () => {\n isMountedRef.current = false;\n cleanupListeners();\n if (startedInitializationGenerationRef.current === generation) {\n startedInitializationGenerationRef.current = 0;\n releaseConnection();\n }\n setConnected(false);\n };\n }, [initIapWithSubscriptions, cleanupListeners]);\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,\n verifyPurchase,\n verifyPurchaseWithProvider,\n restorePurchases: restorePurchasesInternal,\n getPromotedProductIOS,\n getActiveSubscriptions: getActiveSubscriptionsInternal,\n hasActiveSubscriptions: hasActiveSubscriptionsInternal,\n reconnect,\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\n // Offer code redemption\n openRedeemOfferCode,\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 {restorePurchasesNative} from './utils/restorePurchases';\nimport {\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\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\n// Hooks share one native connection; the last mounted hook ends it.\nlet connectionOwnerCount = 0;\n\nconst releaseConnection = (): void => {\n connectionOwnerCount = Math.max(0, connectionOwnerCount - 1);\n if (connectionOwnerCount > 0) return;\n endConnection().catch((error: unknown) => {\n ExpoIapConsole.warn('[useIAP] endConnection failed:', error);\n });\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\nexport interface UseIAPOptions {\n onPurchaseSuccess?: (purchase: Purchase) => void;\n onPurchaseError?: (error: PurchaseError) => void;\n /**\n * Options for the purchase success listener. iOS defaults to suppressing\n * StoreKit replay events for the same transaction ID; set\n * `dedupeTransactionIOS` to false only for diagnostics.\n */\n purchaseUpdatedListenerOptions?: PurchaseUpdatedListenerOptions | null;\n /**\n * Called when a hook method such as fetchProducts, getAvailablePurchases,\n * getActiveSubscriptions or restorePurchases fails.\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 * 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. Mounted hooks share one store\n * connection, which ends when the last of them unmounts.\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\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 ...purchase,\n ids: purchase.ids ?? undefined,\n }),\n [],\n );\n\n const invokeOnError = useCallback((error: unknown) => {\n if (isMountedRef.current && 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 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 Promise-based, unlike the event-based `request*` APIs such as `requestPurchase`.\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,\n * and pending transactions.\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 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 if (!subscriptionsRefState.current.some((sub) => sub.id === productId)) {\n return;\n }\n const generation = initializationGenerationRef.current;\n const isCurrent = (): boolean =>\n isMountedRef.current &&\n initializationGenerationRef.current === generation;\n for (const refresh of [\n () => fetchProductsInternal({skus: [productId], type: 'subs'}),\n getAvailablePurchasesInternal,\n getActiveSubscriptionsInternal,\n ]) {\n if (!isCurrent()) return;\n try {\n await refresh();\n } catch (error) {\n if (isCurrent()) {\n ExpoIapConsole.warn(\n 'Failed to refresh subscription status:',\n error,\n );\n }\n }\n }\n },\n [\n fetchProductsInternal,\n getAvailablePurchasesInternal,\n getActiveSubscriptionsInternal,\n ],\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 await restorePurchasesNative();\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; `iapkit` (IAPKit) is the only one.\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 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 handlePurchaseUpdate = useCallback(\n async (purchase: Purchase): Promise<void> => {\n // Deliver first so a store refresh cannot delay finishing the transaction.\n try {\n const callbackResult: unknown =\n optionsRef.current?.onPurchaseSuccess?.(purchase);\n Promise.resolve(callbackResult).catch((error: unknown) => {\n ExpoIapConsole.error('[useIAP] onPurchaseSuccess failed:', error);\n });\n } catch (error) {\n ExpoIapConsole.error('[useIAP] onPurchaseSuccess failed:', error);\n }\n\n // Safe for any purchase: it skips products that are not known subscriptions.\n await refreshSubscriptionStatus(purchase.productId);\n },\n [refreshSubscriptionStatus],\n );\n\n // Registers only missing listeners, so reconnect can restore removed ones.\n const registerListeners = useCallback(() => {\n const current = subscriptionsRef.current;\n if (!current.purchaseUpdate) {\n current.purchaseUpdate = purchaseUpdatedListener(\n handlePurchaseUpdate,\n optionsRef.current?.purchaseUpdatedListenerOptions,\n );\n }\n\n if (!current.purchaseError) {\n current.purchaseError = purchaseErrorListener((error: PurchaseError) => {\n if (!connectedRef.current && error.code === ErrorCode.InitConnection) {\n return; // Ignore initialization error before connected\n }\n if (\n error.code !== ErrorCode.AlreadyOwned &&\n !isUserCancelledError(error) &&\n !isRecoverableError(error)\n ) {\n ExpoIapConsole.warn(\n '[useIAP] Purchase error:',\n getUserFriendlyErrorMessage(error),\n );\n }\n optionsRef.current?.onPurchaseError?.(error);\n });\n }\n\n // Android billing callbacks are read at event time, so they may be set after mount.\n if (Platform.OS === 'android' && !current.userChoiceBillingAndroid) {\n current.userChoiceBillingAndroid = userChoiceBillingListenerAndroid(\n (details) => {\n optionsRef.current?.onUserChoiceBillingAndroid?.(details);\n },\n );\n }\n\n if (Platform.OS === 'android' && !current.developerProvidedBillingAndroid) {\n current.developerProvidedBillingAndroid =\n developerProvidedBillingListenerAndroid((details) => {\n optionsRef.current?.onDeveloperProvidedBillingAndroid?.(details);\n });\n }\n\n if (!current.subscriptionBillingIssue) {\n current.subscriptionBillingIssue = subscriptionBillingIssueListener(\n (purchase) => {\n optionsRef.current?.onSubscriptionBillingIssue?.(purchase);\n },\n );\n }\n\n if (Platform.OS === 'ios' && !current.promotedProductIOS) {\n current.promotedProductIOS = promotedProductListenerIOS(\n (product: Product) => {\n setPromotedProductIOS(product);\n optionsRef.current?.onPromotedProductIOS?.(product);\n },\n );\n }\n }, [handlePurchaseUpdate]);\n\n /**\n * Initiate a purchase or subscription flow. The result arrives through\n * `purchaseUpdatedListener` / `purchaseErrorListener`, 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. `ErrorCode.NotPrepared`, 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 * @see {@link https://openiap.dev/docs/apis/request-purchase}\n */\n const requestPurchase = useCallback(\n (requestObj: MutationRequestPurchaseArgs) => {\n // A failed hook init removes the purchase listener; restore it before buying.\n if (isMountedRef.current) {\n registerListeners();\n }\n return requestPurchaseInternal(requestObj);\n },\n [registerListeners],\n );\n\n // Purchase-error listening stays on so later retries still report errors.\n const removePurchaseListeners = useCallback(() => {\n subscriptionsRef.current.purchaseUpdate?.remove();\n subscriptionsRef.current.promotedProductIOS?.remove();\n subscriptionsRef.current.purchaseUpdate = undefined;\n subscriptionsRef.current.promotedProductIOS = undefined;\n }, []);\n\n const cleanupListeners = useCallback(() => {\n const current = subscriptionsRef.current;\n current.purchaseUpdate?.remove();\n current.purchaseError?.remove();\n current.promotedProductIOS?.remove();\n current.userChoiceBillingAndroid?.remove();\n current.developerProvidedBillingAndroid?.remove();\n current.subscriptionBillingIssue?.remove();\n subscriptionsRef.current = {};\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 connectionOwnerCount += 1;\n\n // Register listeners before initConnection; events can fire as soon as it connects.\n registerListeners();\n\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 releaseConnection();\n }\n return;\n }\n setConnected(result);\n if (!result) {\n ExpoIapConsole.warn(\n '[useIAP] Connection failed, cleaning up listeners...',\n );\n removePurchaseListeners();\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 removePurchaseListeners();\n }\n },\n [\n buildConnectionConfig,\n registerListeners,\n removePurchaseListeners,\n invokeOnError,\n ],\n );\n\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 registerListeners();\n }\n\n return result;\n } catch (error) {\n ExpoIapConsole.error('[useIAP] reconnect failed:', error);\n invokeOnError(error);\n return false;\n }\n }, [buildConnectionConfig, registerListeners, invokeOnError]);\n\n useEffect(() => {\n const generation = ++initializationGenerationRef.current;\n isMountedRef.current = true;\n void Promise.resolve().then(() => initIapWithSubscriptions(generation));\n\n return () => {\n isMountedRef.current = false;\n cleanupListeners();\n if (startedInitializationGenerationRef.current === generation) {\n startedInitializationGenerationRef.current = 0;\n releaseConnection();\n }\n setConnected(false);\n };\n }, [initIapWithSubscriptions, cleanupListeners]);\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,\n verifyPurchase,\n verifyPurchaseWithProvider,\n restorePurchases: restorePurchasesInternal,\n getPromotedProductIOS,\n getActiveSubscriptions: getActiveSubscriptionsInternal,\n hasActiveSubscriptions: hasActiveSubscriptionsInternal,\n reconnect,\n getBillingChoiceInfoAndroid,\n isBillingProgramAvailableAndroid,\n createBillingProgramReportingDetailsAndroid,\n launchExternalLinkAndroid,\n showBillingProgramInformationDialogAndroid,\n showInAppMessagesAndroid,\n // Offer code redemption\n openRedeemOfferCode,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-iap",
3
- "version": "6.1.0",
3
+ "version": "6.1.1",
4
4
  "description": "In App Purchase module in Expo",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
package/src/useIAP.ts CHANGED
@@ -260,7 +260,7 @@ export function useIAP(options?: UseIAPOptions): UseIap {
260
260
  );
261
261
 
262
262
  const invokeOnError = useCallback((error: unknown) => {
263
- if (optionsRef.current?.onError) {
263
+ if (isMountedRef.current && optionsRef.current?.onError) {
264
264
  optionsRef.current.onError(
265
265
  error instanceof Error ? error : new Error(String(error)),
266
266
  );
@@ -478,14 +478,29 @@ export function useIAP(options?: UseIAPOptions): UseIap {
478
478
 
479
479
  const refreshSubscriptionStatus = useCallback(
480
480
  async (productId: string) => {
481
- try {
482
- if (subscriptionsRefState.current.some((sub) => sub.id === productId)) {
483
- await fetchProductsInternal({skus: [productId], type: 'subs'});
484
- await getAvailablePurchasesInternal();
485
- await getActiveSubscriptionsInternal();
481
+ if (!subscriptionsRefState.current.some((sub) => sub.id === productId)) {
482
+ return;
483
+ }
484
+ const generation = initializationGenerationRef.current;
485
+ const isCurrent = (): boolean =>
486
+ isMountedRef.current &&
487
+ initializationGenerationRef.current === generation;
488
+ for (const refresh of [
489
+ () => fetchProductsInternal({skus: [productId], type: 'subs'}),
490
+ getAvailablePurchasesInternal,
491
+ getActiveSubscriptionsInternal,
492
+ ]) {
493
+ if (!isCurrent()) return;
494
+ try {
495
+ await refresh();
496
+ } catch (error) {
497
+ if (isCurrent()) {
498
+ ExpoIapConsole.warn(
499
+ 'Failed to refresh subscription status:',
500
+ error,
501
+ );
502
+ }
486
503
  }
487
- } catch (error) {
488
- ExpoIapConsole.warn('Failed to refresh subscription status:', error);
489
504
  }
490
505
  },
491
506
  [