@virex-tech/paywallo-sdk 1.1.0 → 1.1.3

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,"sources":["../src/errors/PaywalloError.ts","../src/domains/analytics/AnalyticsError.ts","../src/errors/ClientError.ts","../src/domains/paywall/PaywallModal.tsx","../src/domains/paywall/usePaywallActions.ts","../src/domains/iap/IAPService.ts","../src/domains/iap/PurchaseError.ts","../src/domains/iap/NativeStoreKit.ts","../src/domains/identity/IdentityError.ts","../src/utils/uuid.ts","../src/core/storage/SecureStorage.ts","../src/domains/identity/IdentityManager.ts","../src/domains/paywall/usePaywallTracking.ts","../src/domains/paywall/usePaywallLoader.ts","../src/domains/paywall/PaywallError.ts","../src/domains/paywall/PaywallWebView.tsx","../src/domains/paywall/parseWebViewMessage.ts","../src/domains/paywall/paywallScripts.ts","../src/domains/paywall/PaywallErrorBoundary.tsx","../src/domains/paywall/PaywallContext.ts","../src/domains/paywall/usePaywallPresenter.ts","../src/domains/affiliate/AffiliateError.ts","../src/domains/affiliate/affiliateHttp.ts","../src/domains/affiliate/affiliateDateMappers.ts","../src/domains/affiliate/AffiliateManager.ts","../src/domains/affiliate/PaywalloAffiliate.ts","../src/core/ApiClient.ts","../src/core/apiUrlUtils.ts","../src/domains/iap/apiPurchaseMethods.ts","../src/core/http/types.ts","../src/core/http/HttpClient.ts","../src/core/network/NetworkMonitor.ts","../src/core/network/types.ts","../src/core/queue/OfflineQueue.ts","../src/core/queue/deduplication.ts","../src/core/queue/types.ts","../src/core/queue/QueueProcessor.ts","../src/core/ApiCache.ts","../src/domains/campaign/CampaignError.ts","../src/domains/campaign/CampaignGateService.ts","../src/domains/identity/AdvertisingIdManager.ts","../src/domains/identity/FacebookIdManager.ts","../src/domains/identity/InstallTracker.ts","../src/domains/identity/InstallReferrerManager.ts","../src/domains/session/SessionManager.ts","../src/domains/session/SessionError.ts","../src/domains/session/sessionTracking.ts","../src/core/PaywalloClient.ts","../src/context/PaywalloContext.ts","../src/utils/localization.ts","../src/hooks/usePaywallo.ts","../src/hooks/useProducts.ts","../src/utils/productMappers.ts","../src/hooks/usePurchase.ts","../src/hooks/useSubscription.ts","../src/domains/subscription/SubscriptionManager.ts","../src/domains/subscription/SubscriptionCache.ts","../src/PaywalloProvider.tsx","../src/hooks/useCampaignPreload.ts","../src/utils/serverProduct.ts","../src/utils/loadCampaignProducts.ts","../src/utils/preloadCache.ts","../src/hooks/useProductLoader.ts","../src/hooks/usePurchaseOrchestrator.ts","../src/hooks/useSubscriptionSync.ts","../src/utils/productVariableResolver.ts","../src/utils/variableResolver.ts","../src/index.ts"],"sourcesContent":["export class PaywalloError extends Error {\n readonly code: string;\n readonly domain: string;\n\n constructor(domain: string, code: string, message: string) {\n super(message);\n this.name = \"PaywalloError\";\n this.domain = domain;\n this.code = code;\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class AnalyticsError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"analytics\", code, message);\n this.name = \"AnalyticsError\";\n }\n}\n\nexport const ANALYTICS_ERROR_CODES = {\n NOT_INITIALIZED: \"ANALYTICS_NOT_INITIALIZED\",\n INVALID_STEP_INDEX: \"ANALYTICS_INVALID_STEP_INDEX\",\n INVALID_ACTION_NAME: \"ANALYTICS_INVALID_ACTION_NAME\",\n} as const;\n","import { PaywalloError } from \"./PaywalloError\";\n\nexport class ClientError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"client\", code, message);\n this.name = \"ClientError\";\n }\n}\n\nexport const CLIENT_ERROR_CODES = {\n NOT_INITIALIZED: \"CLIENT_NOT_INITIALIZED\",\n MISSING_APP_KEY: \"CLIENT_MISSING_APP_KEY\",\n INVALID_EVENT_NAME: \"CLIENT_INVALID_EVENT_NAME\",\n PROVIDER_MISSING: \"CLIENT_PROVIDER_MISSING\",\n UNKNOWN: \"CLIENT_UNKNOWN\",\n} as const;\n","import React, { useEffect, useRef } from \"react\";\nimport { Animated, Dimensions, Easing, Modal, StyleSheet, Text, View } from \"react-native\";\n\nimport { usePaywallActions } from \"./usePaywallActions\";\nimport { usePaywallLoader } from \"./usePaywallLoader\";\nimport type { PaywallResult } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\n\nimport { PaywallWebView } from \"./PaywallWebView\";\n\nconst SCREEN_HEIGHT = Dimensions.get(\"window\").height;\n\ninterface PaywallModalProps {\n placement: string;\n visible: boolean;\n onResult: (result: PaywallResult) => void;\n paywallConfig?: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n}\n\nexport function PaywallModal({\n placement,\n visible,\n onResult,\n paywallConfig: preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId,\n}: PaywallModalProps): React.ReactElement | null {\n const { paywallConfig, products, error } = usePaywallLoader(\n placement,\n visible,\n preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId\n );\n\n const { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore } =\n usePaywallActions(placement, paywallConfig, onResult, variantKey, campaignId);\n\n const openAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n useEffect(() => {\n if (visible) {\n openAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(openAnim, {\n toValue: 0,\n duration: 550,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }\n }, [visible, openAnim]);\n\n if (!visible) return null;\n\n return (\n <Modal\n visible={visible}\n animationType=\"none\"\n presentationStyle=\"overFullScreen\"\n onRequestClose={handleClose}\n transparent\n statusBarTranslucent\n >\n <View style={styles.overlay}>\n <Animated.View style={[styles.animatedContainer, { transform: [{ translateY: openAnim }] }]}>\n <View style={styles.container}>\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error.message}</Text>\n </View>\n )}\n\n {!error && paywallConfig && \"craftData\" in paywallConfig.config && (\n <PaywallWebView\n paywallId={paywallConfig.id}\n craftData={paywallConfig.config.craftData}\n products={products}\n primaryProductId={paywallConfig.primaryProductId}\n secondaryProductId={paywallConfig.secondaryProductId}\n isPurchasing={isPurchasing}\n onClose={handleClose}\n onPurchase={handlePurchase}\n onRestore={handleRestore}\n />\n )}\n </View>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: \"rgba(0,0,0,0.3)\",\n },\n animatedContainer: {\n flex: 1,\n backgroundColor: \"#fff\",\n borderTopLeftRadius: 0,\n borderTopRightRadius: 0,\n },\n container: {\n flex: 1,\n backgroundColor: \"#fff\",\n },\n errorContainer: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n errorText: {\n fontSize: 16,\n color: \"#ef4444\",\n textAlign: \"center\",\n },\n});\n","import { useCallback, useRef, useState } from \"react\";\nimport { Animated, Dimensions } from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getIAPService } from \"../iap/IAPService\";\nimport type { PaywallConfig, PaywallResult } from \"../../types\";\n\nimport { usePaywallTracking } from \"./usePaywallTracking\";\n\nconst SCREEN_HEIGHT = Dimensions.get(\"window\").height;\n\nexport interface UsePaywallActionsResult {\n isPurchasing: boolean;\n slideAnim: Animated.Value;\n handleClose: () => void;\n handlePurchase: (productId: string) => Promise<void>;\n handleRestore: () => Promise<void>;\n}\n\nexport function usePaywallActions(\n placement: string,\n paywallConfig: PaywallConfig | null,\n onResult: (result: PaywallResult) => void,\n variantKey?: string,\n campaignId?: string\n): UsePaywallActionsResult {\n const [isPurchasing, setIsPurchasing] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n const slideAnim = useRef(new Animated.Value(0)).current;\n const presentedAtRef = useRef<number>(Date.now());\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const handleClose = useCallback(() => {\n if (isClosing) return;\n setIsClosing(true);\n Animated.timing(slideAnim, { toValue: SCREEN_HEIGHT, duration: 300, useNativeDriver: true }).start(() => {\n if (paywallConfig) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n void trackDismissed({ placement, paywallId: paywallConfig.id, durationSeconds, action: \"close\", variantKey, campaignId });\n }\n slideAnim.setValue(0);\n setIsClosing(false);\n onResult({ presented: true, purchased: false, cancelled: true, restored: false });\n });\n }, [isClosing, onResult, paywallConfig, placement, slideAnim, trackDismissed, variantKey, campaignId]);\n\n const handlePurchase = useCallback(async (productId: string) => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n try {\n if (paywallConfig) trackProductSelected({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId });\n const result = await getIAPService().purchase(productId, { paywallPlacement: placement, variantKey });\n if (result.success) {\n if (paywallConfig) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement, paywallId: paywallConfig.id, durationSeconds, action: \"purchase\", variantKey, campaignId });\n await trackPurchased({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId });\n }\n onResult({ presented: true, purchased: true, cancelled: false, restored: false });\n } else if (result.error) {\n // Real error (validation failed, store error) — notify caller\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n // No error and no success = user cancelled — keep paywall open for retry\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Purchase error:\", error);\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, trackProductSelected, trackPurchased, variantKey, campaignId]);\n\n const handleRestore = useCallback(async () => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length > 0) {\n if (paywallConfig) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement, paywallId: paywallConfig.id, durationSeconds, action: \"restore\", variantKey, campaignId });\n }\n onResult({ presented: true, purchased: false, cancelled: false, restored: true });\n } else {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Restore error:\", error);\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, variantKey, campaignId]);\n\n return { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore };\n}\n","import { Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport type { Product, Purchase, PurchaseResult, ValidatePurchaseResponse } from \"../../types/purchase\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { nativeStoreKit as NativeStoreKit } from \"./NativeStoreKit\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\nexport class IAPService {\n private productsCache: Map<string, Product> = new Map();\n private apiClient: ApiClient | null = null;\n\n constructor(apiClient?: ApiClient) {\n this.apiClient = apiClient ?? null;\n }\n\n private get debug(): boolean {\n return PaywalloClient.getConfig()?.debug ?? false;\n }\n\n private getDeviceCountry(): string {\n try {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n const parts = locale.split(\"-\");\n return parts[parts.length - 1]?.toUpperCase() || \"US\";\n } catch {\n return \"US\";\n }\n }\n\n private getApiClient(): ApiClient {\n if (this.apiClient) return this.apiClient;\n const client = PaywalloClient.getApiClient();\n if (!client)\n throw new PurchaseError(PURCHASE_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return client;\n }\n\n isAvailable(): boolean {\n return NativeStoreKit.isAvailable();\n }\n\n async loadProducts(productIds: string[]): Promise<Product[]> {\n if (!NativeStoreKit.isAvailable()) {\n return [];\n }\n\n try {\n const products = await NativeStoreKit.getProducts(productIds);\n for (const product of products) {\n this.productsCache.set(product.productId, product);\n }\n return products;\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo][Products] StoreKit error:\", error);\n return [];\n }\n }\n\n getProduct(productId: string): Product | undefined {\n return this.productsCache.get(productId);\n }\n\n getCachedProducts(): Map<string, Product> {\n return new Map(this.productsCache);\n }\n\n private async validateWithServer(\n purchase: Purchase,\n productId: string,\n options?: { paywallPlacement?: string; variantKey?: string }\n ): Promise<ValidatePurchaseResponse> {\n const apiClient = this.getApiClient();\n const product = this.productsCache.get(productId);\n const platform = Platform.OS as \"ios\" | \"android\";\n const distinctId = PaywalloClient.getDistinctId();\n\n const validation = await apiClient.validatePurchase(\n platform,\n purchase.receipt,\n purchase.productId,\n purchase.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId,\n options?.paywallPlacement,\n options?.variantKey\n );\n\n return validation;\n }\n\n private async finishTransaction(transactionId: string): Promise<void> {\n try {\n await NativeStoreKit.finishTransaction(transactionId);\n } catch (finishError) {\n if (this.debug) console.warn(\"[Paywallo][Purchase] Failed to finish transaction:\", finishError instanceof Error ? finishError.message : finishError);\n }\n }\n\n async purchase(productId: string, options?: { paywallPlacement?: string; variantKey?: string }): Promise<PurchaseResult> {\n if (!NativeStoreKit.isAvailable()) {\n if (this.debug) console.warn(\"[Paywallo][Purchase] StoreKit not available\");\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE, \"In-app purchases are not available on this device\"),\n };\n }\n\n try {\n const purchase = await NativeStoreKit.purchase(productId);\n\n if (!purchase) {\n return { success: false };\n }\n\n let validation: ValidatePurchaseResponse | null = null;\n try {\n validation = await this.validateWithServer(purchase, productId, options);\n } catch (validationError) {\n if (this.debug) console.warn(\"[Paywallo][Purchase] Server validation FAILED:\", validationError instanceof Error ? validationError.message : validationError);\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.VALIDATION_FAILED, validationError instanceof Error ? validationError.message : \"Server validation failed\"),\n };\n }\n\n if (!validation?.success) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.VALIDATION_FAILED, validation?.error ? `Server validation: ${validation.error}` : \"Server validation failed\"),\n };\n }\n\n await this.finishTransaction(purchase.transactionId);\n return { success: true, purchase };\n } catch (error) {\n const e = error instanceof PurchaseError ? error : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, error instanceof Error ? error.message : String(error));\n if (this.debug) console.warn(\"[Paywallo][Purchase] FAILED:\", e.message);\n return { success: false, error: e };\n }\n }\n\n async restore(): Promise<Purchase[]> {\n if (!NativeStoreKit.isAvailable()) {\n return [];\n }\n\n try {\n const transactions = await NativeStoreKit.getActiveTransactions();\n\n const apiClient = this.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n const platform = Platform.OS as \"ios\" | \"android\";\n\n const results = await Promise.allSettled(\n transactions.map((tx) => {\n const product = this.productsCache.get(tx.productId);\n return apiClient.validatePurchase(\n platform,\n tx.receipt,\n tx.productId,\n tx.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId\n );\n })\n );\n\n const validated: Purchase[] = [];\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const tx = transactions[i];\n if (r.status === \"fulfilled\" && r.value.success) {\n try {\n await NativeStoreKit.finishTransaction(tx.transactionId);\n } catch (finishError) {\n if (this.debug) console.warn(\"[Paywallo][Restore] Failed to finish tx:\", tx.transactionId, finishError instanceof Error ? finishError.message : finishError);\n }\n validated.push(tx);\n }\n }\n\n return validated;\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo][Restore] ❌ FAILED:\", error instanceof Error ? error.message : error);\n return [];\n }\n }\n}\n\nlet _instance: IAPService | null = null;\n\nexport function getIAPService(): IAPService {\n if (!_instance) {\n _instance = new IAPService();\n }\n return _instance;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PurchaseError extends PaywalloError {\n readonly userCancelled: boolean;\n\n constructor(code: string, message: string, userCancelled = false) {\n super(\"purchase\", code, message);\n this.name = \"PurchaseError\";\n this.userCancelled = userCancelled;\n }\n}\n\nexport const PURCHASE_ERROR_CODES = {\n NOT_INITIALIZED: \"PURCHASE_NOT_INITIALIZED\",\n PRODUCT_NOT_FOUND: \"PRODUCT_NOT_FOUND\",\n PURCHASE_FAILED: \"PURCHASE_FAILED\",\n RESTORE_FAILED: \"RESTORE_FAILED\",\n VALIDATION_FAILED: \"VALIDATION_FAILED\",\n USER_CANCELLED: \"USER_CANCELLED\",\n NETWORK_ERROR: \"PURCHASE_NETWORK_ERROR\",\n STORE_ERROR: \"PURCHASE_STORE_ERROR\",\n PENDING_PURCHASE: \"PURCHASE_PENDING\",\n DEFERRED_PURCHASE: \"PURCHASE_DEFERRED\",\n STORE_NOT_AVAILABLE: \"PURCHASE_STORE_NOT_AVAILABLE\",\n} as const;\n\nconst DEFAULT_MESSAGES: Record<keyof typeof PURCHASE_ERROR_CODES, string> = {\n NOT_INITIALIZED: \"Purchase controller not initialized. Call init() first.\",\n PRODUCT_NOT_FOUND: \"Product not found in store.\",\n PURCHASE_FAILED: \"Purchase failed. Please try again.\",\n RESTORE_FAILED: \"Failed to restore purchases. Please try again.\",\n VALIDATION_FAILED: \"Failed to validate purchase with server.\",\n USER_CANCELLED: \"Purchase was cancelled.\",\n NETWORK_ERROR: \"Network error. Please check your connection.\",\n STORE_ERROR: \"Store error. Please try again later.\",\n PENDING_PURCHASE: \"Purchase is pending approval.\",\n DEFERRED_PURCHASE: \"Purchase is deferred (e.g., parental approval required).\",\n STORE_NOT_AVAILABLE: \"In-app purchases are not available on this device.\",\n};\n\nexport function createPurchaseError(\n code: keyof typeof PURCHASE_ERROR_CODES,\n message?: string\n): PurchaseError {\n return new PurchaseError(\n PURCHASE_ERROR_CODES[code],\n message ?? DEFAULT_MESSAGES[code] ?? \"Unknown purchase error\",\n code === \"USER_CANCELLED\"\n );\n}\n","import { NativeModules, Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product, Purchase } from \"../../types/purchase\";\n\ninterface NativeStoreKitModule {\n getProducts(productIds: string[]): Promise<NativeProduct[]>;\n purchase(productId: string, appAccountToken: string | null): Promise<NativePurchaseResult | null>;\n finishTransaction(transactionId: string): Promise<void>;\n getActiveTransactions(): Promise<NativePurchaseResult[]>;\n}\n\ninterface NativeProduct {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n introductoryPriceValue?: number;\n freeTrialPeriod?: string;\n}\n\ninterface NativePurchaseResult {\n transactionId: string;\n productId: string;\n receipt: string;\n transactionDate: number;\n pending?: boolean;\n}\n\nconst PaywalloStoreKitNative: NativeStoreKitModule | null =\n (NativeModules.PaywalloStoreKit as NativeStoreKitModule | undefined) ?? null;\n\nfunction isAvailable(): boolean {\n return PaywalloStoreKitNative != null;\n}\n\nfunction mapNativeProduct(native: NativeProduct): Product {\n const product: Product = {\n productId: native.productId,\n title: native.title,\n description: native.description,\n price: native.price,\n priceValue: native.priceValue,\n currency: native.currency ?? \"USD\",\n localizedPrice: native.localizedPrice,\n type: mapProductType(native.type),\n subscriptionPeriod: native.subscriptionPeriod,\n introductoryPrice: native.introductoryPrice,\n introductoryPriceValue: native.introductoryPriceValue,\n freeTrialPeriod: native.freeTrialPeriod,\n };\n\n if (native.subscriptionPeriod) {\n const prices = calculatePerPeriodPrices(native.priceValue, native.subscriptionPeriod);\n product.pricePerMonth = prices.perMonth;\n product.pricePerWeek = prices.perWeek;\n product.pricePerDay = prices.perDay;\n }\n\n return product;\n}\n\nfunction mapProductType(type: string): Product[\"type\"] {\n switch (type) {\n case \"subscription\":\n case \"autoRenewable\":\n return \"subscription\";\n case \"consumable\":\n return \"consumable\";\n default:\n return \"non_consumable\";\n }\n}\n\nfunction calculatePerPeriodPrices(\n priceValue: number,\n period: string\n): { perMonth?: string; perWeek?: string; perDay?: string } {\n const totalDays = periodToDays(period);\n if (totalDays <= 0) return {};\n\n const perDay = priceValue / totalDays;\n const perWeek = perDay * 7;\n const perMonth = perDay * 30;\n\n return {\n perDay: perDay.toFixed(2),\n perWeek: perWeek.toFixed(2),\n perMonth: perMonth.toFixed(2),\n };\n}\n\nfunction periodToDays(period: string): number {\n const match = period.match(/^P(\\d+)([DWMY])$/);\n if (!match) return 0;\n\n const value = parseInt(match[1], 10);\n switch (match[2]) {\n case \"D\":\n return value;\n case \"W\":\n return value * 7;\n case \"M\":\n return value * 30;\n case \"Y\":\n return value * 365;\n default:\n return 0;\n }\n}\n\nfunction mapNativePurchase(native: NativePurchaseResult): Purchase {\n return {\n productId: native.productId,\n transactionId: native.transactionId,\n transactionDate: native.transactionDate,\n receipt: native.receipt,\n platform: Platform.OS as \"ios\" | \"android\",\n };\n}\n\nexport const nativeStoreKit = {\n isAvailable,\n\n async getProducts(productIds: string[]): Promise<Product[]> {\n if (!PaywalloStoreKitNative) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] StoreKit native module not available\");\n return [];\n }\n const nativeProducts = await PaywalloStoreKitNative.getProducts(productIds);\n return nativeProducts.map(mapNativeProduct);\n },\n\n async purchase(productId: string): Promise<Purchase | null> {\n if (!PaywalloStoreKitNative) {\n throw new PurchaseError(\n PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE,\n \"StoreKit native module not available\"\n );\n }\n const distinctId = identityManager.getDistinctId();\n const result = await PaywalloStoreKitNative.purchase(productId, distinctId ?? null);\n if (!result || result.pending) {\n return null;\n }\n return mapNativePurchase(result);\n },\n\n async finishTransaction(transactionId: string): Promise<void> {\n if (!PaywalloStoreKitNative) return;\n await PaywalloStoreKitNative.finishTransaction(transactionId);\n },\n\n async getActiveTransactions(): Promise<Purchase[]> {\n if (!PaywalloStoreKitNative) return [];\n const results = await PaywalloStoreKitNative.getActiveTransactions();\n return results.map(mapNativePurchase);\n },\n};\n\n/** @deprecated Use `nativeStoreKit` (camelCase) */\nexport const NativeStoreKit = nativeStoreKit;\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class IdentityError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"identity\", code, message);\n this.name = \"IdentityError\";\n }\n}\n\nexport const IDENTITY_ERROR_CODES = {\n NOT_INITIALIZED: \"IDENTITY_NOT_INITIALIZED\",\n DEVICE_ID_UNAVAILABLE: \"IDENTITY_DEVICE_ID_UNAVAILABLE\",\n STORAGE_READ_FAILED: \"IDENTITY_STORAGE_READ_FAILED\",\n STORAGE_WRITE_FAILED: \"IDENTITY_STORAGE_WRITE_FAILED\",\n IDENTIFY_FAILED: \"IDENTITY_IDENTIFY_FAILED\",\n} as const;\n","export function generateUUID(): string {\n const template = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";\n return template.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\n\ntype KeychainModule = {\n setGenericPassword: (username: string, password: string, options?: { service?: string }) => Promise<boolean>;\n getGenericPassword: (options?: { service?: string }) => Promise<false | { password: string }>;\n resetGenericPassword: (options?: { service?: string }) => Promise<boolean>;\n};\n\nlet _keychain: KeychainModule | null | undefined = undefined;\n\nasync function loadKeychain(): Promise<KeychainModule | null> {\n if (_keychain !== undefined) return _keychain;\n try {\n const mod = await import(\"react-native-keychain\");\n _keychain = mod.default as KeychainModule;\n } catch {\n _keychain = null;\n }\n return _keychain;\n}\n\nconst KEYCHAIN_SERVICE_PREFIX = \"com.paywallo.sdk.\";\n\nexport class SecureStorage {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(_debug = false) {}\n\n /**\n * Get a value, trying Keychain first (survives reinstalls on iOS), then AsyncStorage.\n */\n async get(key: string): Promise<string | null> {\n // Try Keychain first for keys that need reinstall persistence\n const keychainValue = await this.getFromKeychain(key);\n if (keychainValue) {\n return keychainValue;\n }\n\n try {\n const value = await AsyncStorage.getItem(`@paywallo:${key}`);\n if (value) {\n // Migrate to Keychain if available\n await this.setToKeychain(key, value);\n }\n return value;\n } catch {\n return null;\n }\n }\n\n /**\n * Set a value in both Keychain (if available) and AsyncStorage.\n */\n async set(key: string, value: string): Promise<boolean> {\n try {\n // Store in both for redundancy\n await Promise.all([\n AsyncStorage.setItem(`@paywallo:${key}`, value),\n this.setToKeychain(key, value),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n async remove(key: string): Promise<boolean> {\n try {\n await Promise.all([\n AsyncStorage.removeItem(`@paywallo:${key}`),\n this.removeFromKeychain(key),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n hasKeychainSupport(): boolean {\n return _keychain !== null && _keychain !== undefined;\n }\n\n private async getFromKeychain(key: string): Promise<string | null> {\n const keychain = await loadKeychain();\n if (!keychain) return null;\n try {\n const result = await keychain.getGenericPassword({ service: `${KEYCHAIN_SERVICE_PREFIX}${key}` });\n if (result && result.password) {\n return result.password;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private async setToKeychain(key: string, value: string): Promise<boolean> {\n const keychain = await loadKeychain();\n if (!keychain) return false;\n try {\n await keychain.setGenericPassword(\"panel\", value, { service: `${KEYCHAIN_SERVICE_PREFIX}${key}` });\n return true;\n } catch {\n return false;\n }\n }\n\n private async removeFromKeychain(key: string): Promise<boolean> {\n const keychain = await loadKeychain();\n if (!keychain) return false;\n try {\n await keychain.resetGenericPassword({ service: `${KEYCHAIN_SERVICE_PREFIX}${key}` });\n return true;\n } catch {\n return false;\n }\n }\n\n}\n\nexport const secureStorage = new SecureStorage();\n","import { IDENTITY_ERROR_CODES, IdentityError } from \"./IdentityError\";\nimport type { IdentifyOptions, UserProperties } from \"../../types\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst DEVICE_ID_KEY = \"device_id\";\nconst USER_EMAIL_KEY = \"user_email\";\nconst USER_PROPERTIES_KEY = \"user_properties\";\n\nexport interface IdentityState {\n deviceId: string;\n email: string | null;\n properties: UserProperties;\n}\n\nexport class IdentityManager {\n private deviceId: string | null = null;\n private email: string | null = null;\n private properties: UserProperties = {};\n private apiClient: ApiClient | null = null;\n private secureStorage: SecureStorage | null = null;\n private debug = false;\n private initialized = false;\n\n async initialize(apiClient: ApiClient, debug = false): Promise<string> {\n if (this.initialized) {\n return this.deviceId ?? \"\";\n }\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n\n await this.loadPersistedState();\n\n if (!this.deviceId) {\n type DeviceInfoMod = { getUniqueId: () => Promise<string> };\n let DeviceInfo: DeviceInfoMod | null = null;\n try {\n const mod = await import(\"react-native-device-info\");\n DeviceInfo = mod.default as DeviceInfoMod;\n } catch {\n DeviceInfo = null;\n }\n\n try {\n if (DeviceInfo) {\n this.deviceId = await DeviceInfo.getUniqueId();\n this.log(\"Got device ID from DeviceInfo:\", this.deviceId);\n } else {\n this.deviceId = generateUUID();\n this.log(\"DeviceInfo not installed, using generated UUID:\", this.deviceId);\n }\n } catch {\n this.deviceId = generateUUID();\n this.log(\"DeviceInfo unavailable, using generated UUID:\", this.deviceId);\n }\n const stored = await this.secureStorage.set(DEVICE_ID_KEY, this.deviceId);\n if (!stored) {\n this.log(\"Failed to persist device ID to secure storage, using fallback\");\n await this.secureStorage.set(\"device_id_fallback\", this.deviceId).catch(() => {\n this.log(\"Fallback also failed — device ID only in memory\");\n });\n }\n }\n\n this.initialized = true;\n return this.deviceId ?? \"\";\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n\n let email: string | undefined;\n let properties: UserProperties | undefined;\n\n if (options) {\n if (\"email\" in options || \"properties\" in options) {\n email = (options as IdentifyOptions).email;\n properties = (options as IdentifyOptions).properties;\n } else {\n properties = options as UserProperties;\n }\n }\n\n if (email) {\n this.email = email;\n await this.secureStorage!.set(USER_EMAIL_KEY, email);\n }\n\n if (properties) {\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n }\n\n if (this.apiClient && this.deviceId) {\n try {\n await this.apiClient.identify(this.deviceId, properties, email);\n this.log(\"Identity updated on server\");\n } catch (error) {\n this.log(\"Failed to update identity on server:\", error);\n }\n }\n }\n\n getDistinctId(): string {\n if (!this.initialized || !this.deviceId) {\n if (this.debug) console.warn(\"[Paywallo Identity] getDistinctId called before initialization\");\n return \"\";\n }\n return this.deviceId;\n }\n\n getDeviceId(): string | null {\n return this.deviceId;\n }\n\n getEmail(): string | null {\n return this.email;\n }\n\n getProperties(): UserProperties {\n return { ...this.properties };\n }\n\n async updateProperties(properties: UserProperties): Promise<void> {\n this.ensureInitialized();\n\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n\n if (this.apiClient && this.deviceId) {\n try {\n await this.apiClient.identify(this.deviceId, this.properties, this.email ?? undefined);\n } catch (error) {\n this.log(\"Failed to update properties on server:\", error);\n }\n }\n }\n\n async reset(): Promise<void> {\n this.email = null;\n this.properties = {};\n this.initialized = false;\n this.apiClient = null;\n // Clear in-memory deviceId so getDeviceId() returns null until re-initialized.\n // SecureStorage is intentionally preserved — the same device ID is recovered on the\n // next initialize() call (desired behaviour for soft-reset / logout flows).\n this.deviceId = null;\n\n await Promise.all([\n this.secureStorage?.remove(USER_EMAIL_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PROPERTIES_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(\"device_id_fallback\") ?? Promise.resolve(false),\n ]);\n }\n\n getState(): IdentityState {\n return {\n deviceId: this.deviceId ?? \"\",\n email: this.email,\n properties: this.getProperties(),\n };\n }\n\n isSecureStorageAvailable(): boolean {\n return this.secureStorage !== null;\n }\n\n private async loadPersistedState(): Promise<void> {\n if (!this.secureStorage) {\n return;\n }\n\n const [storedDeviceId, storedEmail, storedPropertiesJson] = await Promise.all([\n this.secureStorage.get(DEVICE_ID_KEY),\n this.secureStorage.get(USER_EMAIL_KEY),\n this.secureStorage.get(USER_PROPERTIES_KEY),\n ]);\n\n if (storedDeviceId) {\n this.deviceId = storedDeviceId;\n this.log(\"Loaded device ID from storage:\", this.deviceId);\n } else {\n const fallbackDeviceId = await this.secureStorage.get(\"device_id_fallback\");\n if (fallbackDeviceId) {\n this.deviceId = fallbackDeviceId;\n this.log(\"Loaded device ID from fallback storage:\", this.deviceId);\n }\n }\n\n if (storedEmail) {\n this.email = storedEmail;\n }\n\n if (storedPropertiesJson) {\n try {\n this.properties = JSON.parse(storedPropertiesJson) as UserProperties;\n } catch {\n this.properties = {};\n }\n }\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new IdentityError(\n IDENTITY_ERROR_CODES.NOT_INITIALIZED,\n \"IdentityManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.warn(\"[Paywallo Identity]\", ...args);\n }\n }\n}\n\nexport const identityManager = new IdentityManager();\n","import { useCallback } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\ninterface TrackDismissedOptions {\n placement: string;\n paywallId: string;\n durationSeconds: number;\n action: \"close\" | \"purchase\" | \"restore\";\n variantKey?: string;\n campaignId?: string;\n}\n\ninterface TrackProductSelectedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n}\n\ninterface TrackPurchasedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n}\n\nexport interface UsePaywallTrackingResult {\n trackDismissed: (opts: TrackDismissedOptions) => Promise<void>;\n trackProductSelected: (opts: TrackProductSelectedOptions) => void;\n trackPurchased: (opts: TrackPurchasedOptions) => Promise<void>;\n}\n\nexport function usePaywallTracking(): UsePaywallTrackingResult {\n const trackDismissed = useCallback(async (opts: TrackDismissedOptions): Promise<void> => {\n try {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n await api.trackEvent(\"$paywall_dismissed\", PaywalloClient.getDistinctId(), {\n placement: opts.placement,\n paywallId: opts.paywallId,\n durationSeconds: opts.durationSeconds,\n action: opts.action,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(sessionId && { sessionId }),\n });\n } catch { /* non-critical */ }\n }, []);\n\n const trackProductSelected = useCallback((opts: TrackProductSelectedOptions): void => {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n void api.trackEvent(\"$paywall_product_selected\", PaywalloClient.getDistinctId(), {\n placement: opts.placement,\n paywallId: opts.paywallId,\n productId: opts.productId,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(sessionId && { sessionId }),\n }).catch(() => { /* non-critical */ });\n }, []);\n\n const trackPurchased = useCallback(async (opts: TrackPurchasedOptions): Promise<void> => {\n try {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n await api.trackEvent(\"$paywall_purchased\", PaywalloClient.getDistinctId(), {\n placement: opts.placement,\n paywallId: opts.paywallId,\n productId: opts.productId,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(sessionId && { sessionId }),\n });\n } catch { /* non-critical */ }\n }, []);\n\n return { trackDismissed, trackProductSelected, trackPurchased };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getIAPService } from \"../iap/IAPService\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\nimport type { PaywallConfig } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\n\ninterface PreloadedConfig {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\ninterface UsePaywallLoaderResult {\n paywallConfig: PaywallConfig | null;\n products: Map<string, Product>;\n error: Error | null;\n}\n\nexport function usePaywallLoader(\n placement: string,\n visible: boolean,\n preloadedConfig?: PreloadedConfig,\n preloadedProducts?: Map<string, Product>,\n variantKey?: string,\n campaignId?: string\n): UsePaywallLoaderResult {\n const [error, setError] = useState<Error | null>(null);\n const [paywallConfig, setPaywallConfig] = useState<PaywallConfig | null>(null);\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const preloadedConfigRef = useRef(preloadedConfig);\n preloadedConfigRef.current = preloadedConfig;\n const preloadedProductsRef = useRef(preloadedProducts);\n preloadedProductsRef.current = preloadedProducts;\n const trackingDoneRef = useRef(false);\n\n useEffect(() => {\n if (!visible) { trackingDoneRef.current = false; return; }\n\n const load = async () => {\n setError(null);\n try {\n const apiClient = PaywalloClient.getApiClient();\n if (!apiClient) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n\n let config: PaywallConfig;\n const snap = preloadedConfigRef.current;\n if (snap) {\n config = { id: snap.id, placement: snap.placement, config: snap.config as { craftData: string },\n primaryProductId: snap.primaryProductId, secondaryProductId: snap.secondaryProductId };\n } else {\n const fetched = await apiClient.getPaywall(placement);\n if (!fetched) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_FOUND, `Paywall not found for placement: ${placement}`);\n config = fetched;\n }\n setPaywallConfig(config);\n\n const productIds: string[] = [];\n if (config.primaryProductId) productIds.push(config.primaryProductId);\n if (config.secondaryProductId) productIds.push(config.secondaryProductId);\n\n const snapProducts = preloadedProductsRef.current;\n if (snapProducts && snapProducts.size > 0) {\n setProducts(snapProducts);\n } else if (productIds.length > 0) {\n try {\n const storeProducts = await getIAPService().loadProducts(productIds);\n const map = new Map<string, Product>();\n for (const p of storeProducts) map.set(p.productId, p);\n setProducts(map);\n } catch { setProducts(new Map()); }\n } else {\n setProducts(new Map());\n }\n\n if (!trackingDoneRef.current) {\n trackingDoneRef.current = true;\n const sessionId = PaywalloClient.getSessionId();\n await apiClient.trackEvent(\"$paywall_viewed\", PaywalloClient.getDistinctId(), {\n placement, paywallId: config.id,\n ...(sessionId && { sessionId }),\n ...(variantKey && { variantKey }),\n ...(campaignId && { campaignId }),\n });\n }\n } catch (err) {\n const e = err instanceof Error ? err : new PaywallError(PAYWALL_ERROR_CODES.LOAD_FAILED, String(err));\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Error loading paywall:\", e.message);\n setError(e);\n }\n };\n\n void load();\n }, [placement, visible, variantKey, campaignId]);\n\n return { paywallConfig, products, error };\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PaywallError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"paywall\", code, message);\n this.name = \"PaywallError\";\n }\n}\n\nexport const PAYWALL_ERROR_CODES = {\n NOT_INITIALIZED: \"PAYWALL_NOT_INITIALIZED\",\n NOT_FOUND: \"PAYWALL_NOT_FOUND\",\n RENDER_FAILED: \"PAYWALL_RENDER_FAILED\",\n LOAD_FAILED: \"PAYWALL_LOAD_FAILED\",\n DISMISS_FAILED: \"PAYWALL_DISMISS_FAILED\",\n INVALID_CONFIG: \"PAYWALL_INVALID_CONFIG\",\n} as const;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Linking,\n NativeEventEmitter,\n NativeModules,\n requireNativeComponent,\n StyleProp,\n StyleSheet,\n View,\n ViewStyle,\n} from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product } from \"../../types/purchase\";\nimport { parseWebViewMessage, WebViewMessage } from \"./parseWebViewMessage\";\nimport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\n\ninterface NativeWebViewProps {\n sourceUrl: string;\n injectedJavaScript?: string;\n onMessage?: (event: { nativeEvent: { data: string } }) => void;\n onLoadEnd?: () => void;\n style?: StyleProp<ViewStyle>;\n ref?: React.Ref<View>;\n}\n\nlet NativeWebViewComponent: ReturnType<typeof requireNativeComponent<NativeWebViewProps>> | null =\n null;\n\nfunction getNativeWebView(): ReturnType<typeof requireNativeComponent<NativeWebViewProps>> {\n if (!NativeWebViewComponent) {\n NativeWebViewComponent = requireNativeComponent<NativeWebViewProps>(\"PaywalloWebView\");\n }\n return NativeWebViewComponent;\n}\n\nlet webViewEmitter: NativeEventEmitter | null = null;\nfunction getWebViewEmitter(): NativeEventEmitter {\n if (!webViewEmitter) {\n webViewEmitter = new NativeEventEmitter(NativeModules.PaywalloWebViewModule);\n }\n return webViewEmitter;\n}\n\ninterface PaywallWebViewProps {\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n isPurchasing: boolean;\n onPurchase: (productId: string) => void;\n onClose: () => void;\n onRestore: () => void;\n onReady?: () => void;\n}\n\nexport function PaywallWebView({\n paywallId,\n craftData,\n products,\n primaryProductId,\n secondaryProductId,\n isPurchasing,\n onPurchase,\n onClose,\n onRestore,\n onReady,\n}: PaywallWebViewProps): React.ReactElement {\n const paywallDataSent = useRef(false);\n const loadEndReceived = useRef(false);\n const [scriptToInject, setScriptToInject] = useState<string | undefined>(undefined);\n\n const NativeWebView = useMemo(() => getNativeWebView(), []);\n const webUrl = useMemo(() => PaywalloClient.getWebUrl() ?? \"http://localhost:3000\", []);\n\n const buildAndSetInjectionScript = useCallback(() => {\n if (!craftData || paywallDataSent.current) return;\n paywallDataSent.current = true;\n const script = buildPaywallInjectionScript({\n craftData,\n products: Array.from(products.values()),\n primaryProductId,\n secondaryProductId,\n });\n setScriptToInject(script);\n onReady?.();\n }, [craftData, products, primaryProductId, secondaryProductId, onReady]);\n\n // Deduplication: both NativeEventEmitter and RCTDirectEventBlock fire for the same message.\n // Track last processed message to prevent double execution of actions.\n const lastProcessedRef = useRef<{ type: string; time: number }>({ type: \"\", time: 0 });\n\n const handleParsedMessage = useCallback(\n (message: WebViewMessage) => {\n // Deduplicate: ignore same message type within 500ms\n const now = Date.now();\n if (message.type === lastProcessedRef.current.type && now - lastProcessedRef.current.time < 500) {\n return;\n }\n lastProcessedRef.current = { type: message.type, time: now };\n\n switch (message.type) {\n case \"ready\":\n if (!paywallDataSent.current) buildAndSetInjectionScript();\n break;\n case \"purchase\":\n if (message.payload?.productId) onPurchase(message.payload.productId);\n break;\n case \"close\":\n onClose();\n break;\n case \"restore\":\n onRestore();\n break;\n case \"open-url\":\n if (message.payload?.url) {\n const url = message.payload.url;\n if (/^https?:\\/\\//i.test(url) || /^mailto:/i.test(url)) {\n void Linking.openURL(url);\n }\n }\n break;\n }\n },\n [buildAndSetInjectionScript, onPurchase, onClose, onRestore]\n );\n\n useEffect(() => {\n const emitter = getWebViewEmitter();\n\n const loadEndSub = emitter.addListener(\"PaywalloWebViewLoadEnd\", () => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n });\n\n const messageSub = emitter.addListener(\"PaywalloWebViewMessage\", (event: { data: string }) => {\n const message = parseWebViewMessage(event.data);\n if (message) handleParsedMessage(message);\n });\n\n return () => {\n loadEndSub.remove();\n messageSub.remove();\n };\n }, [buildAndSetInjectionScript, handleParsedMessage]);\n\n // Also handle events via RCTDirectEventBlock (old arch fallback)\n const handleLoadEnd = useCallback(() => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n }, [buildAndSetInjectionScript]);\n\n const handleMessage = useCallback(\n (event: { nativeEvent: { data: string } }) => {\n const message = parseWebViewMessage(event.nativeEvent.data);\n if (message) handleParsedMessage(message);\n },\n [handleParsedMessage]\n );\n\n useEffect(() => {\n if (!paywallDataSent.current) return;\n setScriptToInject(buildPurchaseStateScript(isPurchasing));\n }, [isPurchasing]);\n\n const paywallUrl = `${webUrl}/paywall/${paywallId}`;\n\n return (\n <View style={styles.container}>\n <NativeWebView\n sourceUrl={paywallUrl}\n injectedJavaScript={scriptToInject}\n onMessage={handleMessage}\n onLoadEnd={handleLoadEnd}\n style={styles.webview}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n webview: { flex: 1, backgroundColor: \"transparent\" },\n});\n","export interface WebViewMessage {\n type: \"purchase\" | \"close\" | \"restore\" | \"select-product\" | \"open-url\" | \"ready\";\n payload?: {\n productId?: string;\n url?: string;\n };\n}\n\n/**\n * Parses a raw JSON string from a WebView message event.\n * Returns the typed WebViewMessage or null if parsing fails or the message is invalid.\n */\nexport function parseWebViewMessage(raw: string): WebViewMessage | null {\n try {\n const parsed = JSON.parse(raw) as WebViewMessage;\n if (typeof parsed?.type !== \"string\") {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n","import type { Product } from \"../../types/purchase\";\n\ninterface PaywallInjectionData {\n craftData: string;\n products: Product[];\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\n/** Builds the JS injection script that sends paywall data into the WebView. */\nexport function buildPaywallInjectionScript(data: PaywallInjectionData): string {\n const paywallData = {\n type: \"paywall\",\n data: {\n craftData: data.craftData,\n products: data.products,\n primaryProductId: data.primaryProductId,\n secondaryProductId: data.secondaryProductId,\n },\n };\n\n return `(function(){var d=${JSON.stringify(paywallData)},a=0,m=50;function t(){a++;if(window.receiveNativeMessage){window.receiveNativeMessage(d);return;}if(a<m){setTimeout(t,100);}else{console.warn('[Paywallo WV] FAILED to inject after '+m+' attempts');}}t();})();true;`;\n}\n\n/** Builds the JS script that updates purchase state inside the WebView. */\nexport function buildPurchaseStateScript(isPurchasing: boolean): string {\n return `if(window.receiveNativeMessage){window.receiveNativeMessage({type:\"purchaseState\",data:{isPurchasing:${isPurchasing}}});}true;`;\n}\n","import React, { Component } from \"react\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\nexport class PaywallErrorBoundary extends Component<{ children: React.ReactNode }, { hasError: boolean }> {\n state = { hasError: false };\n static getDerivedStateFromError(): { hasError: boolean } { return { hasError: true }; }\n componentDidCatch(error: Error): void { if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Paywall render error:\", error.message); }\n render(): React.ReactNode { return this.state.hasError ? null : this.props.children; }\n}\n","import { createContext, useContext } from \"react\";\n\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\nimport type { PaywallNode, TapBehavior } from \"../../types/blocks\";\nimport type { Product } from \"../../types/purchase\";\n\nexport interface PaywallContextValue {\n nodes: Record<string, PaywallNode>;\n rootId: string;\n language: string;\n defaultLanguage: string;\n products: Map<string, Product>;\n selectedProductId: string | null;\n primaryProductId: string | null;\n secondaryProductId: string | null;\n currentNavigationIndex: number;\n currentTabIndex: number;\n trialEnabled: boolean;\n selectedPeriod: string | null;\n isPurchasing: boolean;\n exitOfferVisible: boolean;\n exitOfferTriggeredByBackButton: boolean;\n\n onClose: () => void;\n onTryClose: () => void;\n onSelectProduct: (productId: string) => void;\n onPurchase: (productId: string) => void;\n onRestore: () => void;\n onNavigate: (target: \"next\" | \"previous\" | \"first\" | \"last\" | number) => void;\n onSetTab: (index: number) => void;\n onSetVariable: (name: string, value: string) => void;\n onToggleTrial: (enabled: boolean) => void;\n onSelectPeriod: (value: string) => void;\n onOpenUrl: (url: string, inBrowser?: boolean) => void;\n onTapBehavior: (behavior: TapBehavior) => void;\n onShowExitOffer: () => void;\n onDismissExitOffer: () => void;\n onTriggerBackButton: () => void;\n}\n\nexport const PaywallContext = createContext<PaywallContextValue | null>(null);\n\nexport function usePaywallContext(): PaywallContextValue {\n const context = useContext(PaywallContext);\n if (!context) {\n throw new PaywallError(\n PAYWALL_ERROR_CODES.NOT_INITIALIZED,\n \"usePaywallContext must be used within a Paywall component\"\n );\n }\n return context;\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PaywallResult } from \"../../types\";\n\nimport type { PreloadedWebView } from \"../../hooks/useCampaignPreload\";\n\ntype SetPreloadedWebView = Dispatch<SetStateAction<PreloadedWebView | null>>;\n\ninterface UsePaywallPresenterReturn {\n showingPreloadedWebView: boolean;\n presentPreloadedWebView: () => Promise<PaywallResult>;\n resolvePreloadedPaywall: (result: PaywallResult) => void;\n handlePreloadedWebViewReady: () => void;\n handlePreloadedClose: () => void;\n setShowingPreloadedWebView: Dispatch<SetStateAction<boolean>>;\n presentedAtRef: MutableRefObject<number>;\n}\n\nexport function usePaywallPresenter(\n preloadedWebView: PreloadedWebView | null,\n clearPreloadedWebView: () => void,\n setPreloadedWebView: SetPreloadedWebView\n): UsePaywallPresenterReturn {\n const [showingPreloadedWebView, setShowingPreloadedWebView] = useState(false);\n const resolverRef = useRef<((result: PaywallResult) => void) | null>(null);\n const presentedAtRef = useRef<number>(Date.now());\n\n useEffect(() => {\n return () => {\n if (resolverRef.current) {\n resolverRef.current({ presented: false, purchased: false, cancelled: true, restored: false });\n resolverRef.current = null;\n }\n };\n }, []);\n\n const presentPreloadedWebView = useCallback((): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => {\n resolverRef.current = resolve;\n presentedAtRef.current = Date.now();\n setShowingPreloadedWebView(true);\n });\n }, []);\n\n const resolvePreloadedPaywall = useCallback((result: PaywallResult): void => {\n if (resolverRef.current) { resolverRef.current(result); resolverRef.current = null; }\n }, []);\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n setPreloadedWebView((prev) => (prev ? { ...prev, loaded: true } : null));\n }, [setPreloadedWebView]);\n\n const handlePreloadedClose = useCallback((): void => {\n const track = async (): Promise<void> => {\n try {\n const apiClient = PaywalloClient.getApiClient();\n if (!apiClient || !preloadedWebView) return;\n const sessionId = PaywalloClient.getSessionId();\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await apiClient.trackEvent(\"$paywall_dismissed\", PaywalloClient.getDistinctId(), {\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n durationSeconds,\n action: \"close\",\n ...(sessionId && { sessionId }),\n ...(preloadedWebView.variantKey && { variantKey: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaignId: preloadedWebView.campaignId }),\n });\n } catch { /* Tracking failure is non-critical */ }\n };\n void track();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: true, restored: false });\n }, [preloadedWebView, clearPreloadedWebView, resolvePreloadedPaywall]);\n\n return { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef };\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class AffiliateError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"affiliate\", code, message);\n this.name = \"AffiliateError\";\n }\n}\n\nexport const AFFILIATE_ERROR_CODES = {\n NOT_INITIALIZED: \"AFFILIATE_NOT_INITIALIZED\",\n COUPON_REGISTER_FAILED: \"AFFILIATE_COUPON_REGISTER_FAILED\",\n COUPON_APPLY_FAILED: \"AFFILIATE_COUPON_APPLY_FAILED\",\n BALANCE_FETCH_FAILED: \"AFFILIATE_BALANCE_FETCH_FAILED\",\n WITHDRAWAL_FAILED: \"AFFILIATE_WITHDRAWAL_FAILED\",\n NETWORK_ERROR: \"AFFILIATE_NETWORK_ERROR\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\n\n/** Builds a query string from a params object, URL-encoding keys and values. */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params) return \"\";\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return \"\";\n return `?${entries.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`).join(\"&\")}`;\n}\n\n/** GET helper — returns the parsed response body. */\nexport async function affiliateGet<T>(\n apiClient: ApiClient,\n path: string,\n params?: Record<string, unknown>\n): Promise<T> {\n const response = await apiClient.get<T>(`${path}${buildQueryString(params)}`);\n return response.data;\n}\n\n/** POST helper — returns the parsed response body. */\nexport async function affiliatePost<T>(\n apiClient: ApiClient,\n path: string,\n body: Record<string, unknown>\n): Promise<T> {\n const response = await apiClient.post<T>(path, body);\n return response.data;\n}\n","import type { AffiliateCoupon, AffiliateCommission, WithdrawalRequest } from \"../../types\";\n\ntype RawCoupon = { code: string; status: string; createdAt: string };\ntype RawCommission = {\n id: string;\n referredDistinctId: string;\n purchaseAmount: number;\n commissionAmount: number;\n status: \"pending\" | \"eligible\" | \"ineligible\" | \"withdrawn\";\n createdAt: string;\n};\ntype RawWithdrawal = {\n id: string;\n amount: number;\n status: \"pending\" | \"approved\" | \"rejected\" | \"paid\";\n createdAt: string;\n};\n\nexport function mapRawCoupon(raw: RawCoupon): AffiliateCoupon {\n return { code: raw.code, status: raw.status, createdAt: new Date(raw.createdAt) };\n}\n\nexport function mapRawCommission(raw: RawCommission): AffiliateCommission {\n return { ...raw, createdAt: new Date(raw.createdAt) };\n}\n\nexport function mapRawWithdrawal(raw: RawWithdrawal): WithdrawalRequest {\n return { ...raw, createdAt: new Date(raw.createdAt) };\n}\n","import { AFFILIATE_ERROR_CODES, AffiliateError } from \"./AffiliateError\";\nimport type { AffiliateBalance, AffiliateCommission, AffiliateCoupon, WithdrawalRequest } from \"../../types\";\n\nimport { affiliateGet, affiliatePost } from \"./affiliateHttp\";\nimport { mapRawCommission, mapRawCoupon, mapRawWithdrawal } from \"./affiliateDateMappers\";\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\n\nexport class AffiliateManager {\n private apiClient: ApiClient | null = null;\n private debug = false;\n\n initialize(apiClient: ApiClient, debug = false): void {\n this.apiClient = apiClient;\n this.debug = debug;\n this.log(\"AffiliateManager initialized\");\n }\n\n async registerCoupon(code: string): Promise<{\n success: boolean;\n coupon?: AffiliateCoupon;\n error?: string;\n }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.post<{\n success: boolean;\n coupon?: {\n code: string;\n status: string;\n createdAt: string;\n };\n error?: string;\n }>(\"/api/v1/affiliate/register-coupon\", {\n code,\n distinctId,\n });\n\n if (response.success && response.coupon) {\n this.log(\"Coupon registered:\", code);\n return { success: true, coupon: mapRawCoupon(response.coupon) };\n }\n\n return {\n success: false,\n error: response.error,\n };\n } catch (error) {\n this.log(\"Failed to register coupon:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n async applyCoupon(code: string): Promise<{\n success: boolean;\n applied?: boolean;\n error?: string;\n }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.post<{\n success: boolean;\n applied?: boolean;\n error?: string;\n }>(\"/api/v1/affiliate/apply-coupon\", {\n code,\n distinctId,\n });\n\n if (response.success) {\n this.log(\"Coupon applied:\", code);\n }\n\n return response;\n } catch (error) {\n this.log(\"Failed to apply coupon:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n async getMyCoupon(): Promise<{ coupon: AffiliateCoupon | null }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n coupon: {\n code: string;\n status: string;\n createdAt: string;\n } | null;\n }>(\"/api/v1/affiliate/my-coupon\", { distinctId });\n\n if (response.coupon) {\n return { coupon: mapRawCoupon(response.coupon) };\n }\n\n return { coupon: null };\n } catch (error) {\n this.log(\"Failed to get my coupon:\", error);\n return { coupon: null };\n }\n }\n\n async getAppliedCoupon(): Promise<{ coupon: { code: string } | null }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n coupon: { code: string } | null;\n }>(\"/api/v1/affiliate/applied-coupon\", { distinctId });\n\n return response;\n } catch (error) {\n this.log(\"Failed to get applied coupon:\", error);\n return { coupon: null };\n }\n }\n\n async getBalance(): Promise<AffiliateBalance> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<AffiliateBalance>(\"/api/v1/affiliate/balance\", {\n distinctId,\n });\n\n return response;\n } catch (error) {\n this.log(\"Failed to get balance:\", error);\n return {\n total: 0,\n pending: 0,\n available: 0,\n withdrawn: 0,\n };\n }\n }\n\n async getCommissions(): Promise<AffiliateCommission[]> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n commissions: Array<{\n id: string;\n referredDistinctId: string;\n purchaseAmount: number;\n commissionAmount: number;\n status: \"pending\" | \"eligible\" | \"ineligible\" | \"withdrawn\";\n createdAt: string;\n }>;\n }>(\"/api/v1/affiliate/commissions\", { distinctId });\n\n return response.commissions.map(mapRawCommission);\n } catch (error) {\n this.log(\"Failed to get commissions:\", error);\n return [];\n }\n }\n\n async requestWithdrawal(amount: number): Promise<{\n success: boolean;\n withdrawal?: WithdrawalRequest;\n error?: string;\n }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.post<{\n success: boolean;\n withdrawal?: {\n id: string;\n amount: number;\n status: \"pending\" | \"approved\" | \"rejected\" | \"paid\";\n createdAt: string;\n };\n error?: string;\n }>(\"/api/v1/affiliate/withdraw\", {\n amount,\n distinctId,\n });\n\n if (response.success && response.withdrawal) {\n this.log(\"Withdrawal requested:\", amount);\n return { success: true, withdrawal: mapRawWithdrawal(response.withdrawal) };\n }\n\n return {\n success: false,\n error: response.error,\n };\n } catch (error) {\n this.log(\"Failed to request withdrawal:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n async getWithdrawals(): Promise<WithdrawalRequest[]> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n withdrawals: Array<{\n id: string;\n amount: number;\n status: \"pending\" | \"approved\" | \"rejected\" | \"paid\";\n createdAt: string;\n }>;\n }>(\"/api/v1/affiliate/withdrawals\", { distinctId });\n\n return response.withdrawals.map(mapRawWithdrawal);\n } catch (error) {\n this.log(\"Failed to get withdrawals:\", error);\n return [];\n }\n }\n\n private async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n this.ensureInitialized();\n return affiliateGet<T>(this.apiClient!, path, params);\n }\n\n private async post<T>(path: string, body: Record<string, unknown>): Promise<T> {\n this.ensureInitialized();\n return affiliatePost<T>(this.apiClient!, path, body);\n }\n\n private ensureInitialized(): void {\n if (!this.apiClient) {\n throw new AffiliateError(\n AFFILIATE_ERROR_CODES.NOT_INITIALIZED,\n \"AffiliateManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.warn(\"[AffiliateManager]\", ...args);\n }\n }\n}\n\nexport const affiliateManager = new AffiliateManager();\n","import { affiliateManager } from \"./AffiliateManager\";\n\nexport const PaywalloAffiliate = {\n registerCoupon: (code: string) => affiliateManager.registerCoupon(code),\n applyCoupon: (code: string) => affiliateManager.applyCoupon(code),\n getMyCoupon: () => affiliateManager.getMyCoupon(),\n getAppliedCoupon: () => affiliateManager.getAppliedCoupon(),\n getBalance: () => affiliateManager.getBalance(),\n getCommissions: () => affiliateManager.getCommissions(),\n requestWithdrawal: (amount: number) => affiliateManager.requestWithdrawal(amount),\n getWithdrawals: () => affiliateManager.getWithdrawals(),\n};\n","import { Platform } from \"react-native\";\n\nconst SDK_VERSION = \"1.0.0\";\n\nimport type {\n ApiClientConfig,\n CampaignResponse,\n ConditionalFlagContext,\n ConditionalFlagResult,\n EmergencyPaywallResponse,\n Environment,\n FlagVariant,\n PaywallConfig,\n SubscriptionStatusResponse,\n UserProperties,\n ValidatePurchaseResponse,\n} from \"../types\";\n\nimport { buildConditionalFlagUrl, deriveWebUrl } from \"./apiUrlUtils\";\nimport {\n getCampaignData,\n getEmergencyPaywall,\n getSubscriptionStatus,\n validatePurchase,\n} from \"../domains/iap/apiPurchaseMethods\";\nimport { HttpClient, type HttpResponse } from \"./http\";\nimport { networkMonitor } from \"./network\";\nimport { offlineQueue } from \"./queue\";\nimport { ApiCache } from \"./ApiCache\";\n\nconst DEFAULT_BASE_URL = \"https://panel.lucasqueiroga.shop\";\n\nexport type { ApiClientConfig };\n\nexport class ApiClient {\n private baseUrl: string;\n private webUrl: string;\n private appKey: string;\n private debug: boolean;\n private environment: Environment;\n private offlineQueueEnabled: boolean;\n private httpClient: HttpClient;\n private readonly cache = new ApiCache();\n\n constructor(\n appKey: string,\n debug = false,\n environment: Environment = \"Production\",\n offlineQueueEnabled = true,\n timeout = 30000\n ) {\n this.appKey = appKey;\n this.baseUrl = DEFAULT_BASE_URL;\n this.webUrl = deriveWebUrl(this.baseUrl);\n this.debug = debug;\n this.environment = environment;\n this.offlineQueueEnabled = offlineQueueEnabled;\n this.httpClient = new HttpClient(this.baseUrl, { timeout, debug });\n }\n\n // ─── Infrastructure ──────────────────────────────────────────────────────────\n\n /** Exposed only for QueueProcessor initialization. Prefer get()/post() for requests. */\n getHttpClient(): HttpClient { return this.httpClient; }\n getWebUrl(): string { return this.webUrl; }\n getEnvironment(): Environment { return this.environment; }\n getQueueSize(): number { return offlineQueue.getSize(); }\n setofflineQueueEnabled(enabled: boolean): void { this.offlineQueueEnabled = enabled; }\n isofflineQueueEnabled(): boolean { return this.offlineQueueEnabled; }\n\n setEnvironment(environment: Environment): void {\n this.environment = environment;\n }\n\n setDebug(debug: boolean): void {\n this.debug = debug;\n this.httpClient.setDebug(debug);\n }\n\n async clearQueue(): Promise<void> { await offlineQueue.clear(); }\n\n // ─── Public HTTP facade (headers injected automatically) ─────────────────────\n\n async get<T>(path: string): Promise<HttpResponse<T>> {\n return this.httpClient.get<T>(path, { headers: { \"X-App-Key\": this.appKey } });\n }\n\n async post<T>(path: string, body: unknown, skipRetry = false): Promise<HttpResponse<T>> {\n return this.httpClient.post<T>(path, body, { headers: { \"X-App-Key\": this.appKey }, skipRetry });\n }\n\n async reportError(errorType: string, message: string, context?: Record<string, unknown>): Promise<void> {\n try {\n await this.post(\"/api/v1/sdk/errors\", {\n errorType, message, context,\n sdkVersion: SDK_VERSION,\n platform: Platform.OS,\n }, true);\n } catch {\n // Error reporting failure is non-critical — never block the caller\n }\n }\n\n // ─── Business methods ────────────────────────────────────────────────────────\n\n async trackEvent(eventName: string, distinctId: string, properties?: UserProperties, timestamp?: number): Promise<void> {\n await this.postWithQueue(\"/api/v1/events\", {\n eventName, distinctId,\n properties: { ...properties, platform: Platform.OS },\n timestamp: timestamp ?? Date.now(),\n environment: this.environment.toLowerCase(),\n }, `event:${eventName}`);\n }\n\n async identify(distinctId: string, properties?: UserProperties, email?: string): Promise<void> {\n await this.postWithQueue(\"/api/v1/identify\", { distinctId, properties: properties ?? {}, email, platform: Platform.OS }, \"identify\");\n }\n\n async startSession(distinctId: string, sessionId: string, platform?: string): Promise<{ success: boolean }> {\n await this.postWithQueue(\"/api/v1/sessions/start\", {\n distinctId, sessionId, platform: platform ?? Platform.OS, environment: this.environment.toLowerCase(),\n }, `session.start:${sessionId}`);\n return { success: true };\n }\n\n async endSession(sessionId: string, durationSeconds: number): Promise<{ success: boolean }> {\n await this.postWithQueue(\"/api/v1/sessions/end\", { sessionId, durationSeconds }, `session.end:${sessionId}`);\n return { success: true };\n }\n\n async getVariant(flagKey: string, distinctId: string): Promise<FlagVariant> {\n const key = `${flagKey}:${distinctId}`;\n const hit = this.cache.getVariant(key);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<FlagVariant>(`/api/v1/flags/${flagKey}?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) {\n const v: FlagVariant = { variant: null };\n this.cache.setVariant(key, v, this.cache.nullTTL);\n return v;\n }\n if (!res.ok) {\n this.log(\"Non-OK response for variant:\", flagKey, res.status);\n const stale = this.cache.getStaleVariant(key);\n if (stale !== undefined) return stale;\n return { variant: null };\n }\n this.cache.setVariant(key, res.data);\n return res.data;\n } catch (error) {\n this.log(\"Failed to get variant:\", flagKey, error);\n const stale = this.cache.getStaleVariant(key);\n if (stale !== undefined) return stale;\n return { variant: null };\n }\n }\n\n async getPaywall(placement: string): Promise<PaywallConfig | null> {\n const hit = this.cache.getPaywall(placement);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<PaywallConfig>(`/api/v1/paywalls/${placement}`);\n if (res.status === 404) { this.cache.setPaywall(placement, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n this.log(\"Non-OK response for paywall:\", placement, res.status);\n const stale = this.cache.getStalePaywall(placement);\n if (stale !== undefined) return stale;\n return null;\n }\n this.cache.setPaywall(placement, res.data);\n return res.data;\n } catch (error) {\n this.log(\"Failed to get paywall:\", placement, error);\n const stale = this.cache.getStalePaywall(placement);\n if (stale !== undefined) return stale;\n return null;\n }\n }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n const result = await getEmergencyPaywall(this);\n this.log(\"Got emergency paywall:\", result.enabled);\n return result;\n }\n\n async getCampaign(\n placement: string,\n distinctId: string,\n context?: Record<string, unknown>\n ): Promise<CampaignResponse | null> {\n const key = `${placement}:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const result = await getCampaignData(this, this.baseUrl, placement, distinctId, context);\n if (!result) {\n this.log(\"No campaign found for placement:\", placement);\n this.cache.setCampaign(key, null);\n return null;\n }\n this.log(\"Got campaign:\", placement, result.variantKey);\n this.cache.setCampaign(key, result);\n return result;\n } catch (error) {\n this.log(\"Failed to get campaign:\", placement, error);\n const stale = this.cache.getStaleCampaign(key);\n if (stale !== undefined) return stale;\n return null;\n }\n }\n\n async validatePurchase(\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string\n ): Promise<ValidatePurchaseResponse> {\n const result = await validatePurchase(\n this, this.appKey, platform, receipt, productId, transactionId,\n priceLocal, currency, country, distinctId, paywallPlacement, variantKey\n );\n this.log(\"Purchase validated:\", result.success);\n return result;\n }\n\n async getSubscriptionStatus(distinctId: string): Promise<SubscriptionStatusResponse> {\n const result = await getSubscriptionStatus(this, this.baseUrl, this.appKey, distinctId);\n this.log(\"Subscription status:\", result.hasActiveSubscription);\n return result;\n }\n\n async getConditionalFlag(\n flagKey: string,\n context: ConditionalFlagContext\n ): Promise<ConditionalFlagResult> {\n try {\n const url = buildConditionalFlagUrl(this.baseUrl, flagKey, context);\n const response = await this.get<{ value: boolean }>(url);\n if (response.status === 404) return { value: false, flagKey };\n if (!response.ok) {\n this.log(\"Non-OK response for conditional flag:\", flagKey, response.status);\n return { value: false, flagKey };\n }\n this.log(\"Got conditional flag:\", flagKey, response.data.value);\n return { value: response.data.value, flagKey };\n } catch {\n this.log(\"Failed to get conditional flag:\", flagKey);\n return { value: false, flagKey };\n }\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n /**\n * POST with offline queue fallback. Enqueues when offline or on network failure.\n * Throws only when offlineQueueEnabled is false and the request fails.\n */\n private async postWithQueue(\n url: string,\n payload: Record<string, unknown>,\n label: string\n ): Promise<void> {\n if (this.offlineQueueEnabled && !networkMonitor.isOnline()) {\n await offlineQueue.enqueue(\"POST\", url, payload, { \"X-App-Key\": this.appKey });\n this.log(\"Queued for offline:\", label);\n return;\n }\n try {\n await this.post(url, payload);\n } catch (error) {\n this.log(\"Request failed:\", label, error);\n if (this.offlineQueueEnabled) {\n await offlineQueue.enqueue(\"POST\", url, payload, { \"X-App-Key\": this.appKey });\n this.log(\"Queued after failure:\", label);\n return;\n }\n throw error;\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.warn(\"[Paywallo API]\", ...args);\n }\n}\n","import type { ConditionalFlagContext } from \"../types\";\n\nconst DEFAULT_WEB_URL = \"https://paywallo.com.br\";\n\n/**\n * Derives the web (dashboard) URL from the API base URL.\n * - Local dev (192.168.x or localhost): same host, port 3000\n * - Production: uses DEFAULT_WEB_URL (paywallo.com.br)\n * - api.* → app.*\n */\nexport function deriveWebUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n if (url.hostname.startsWith(\"192.168\") || url.hostname === \"localhost\") {\n url.port = \"3000\";\n return url.toString().replace(/\\/$/, \"\");\n }\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = url.hostname.replace(\"api.\", \"app.\");\n return url.toString().replace(/\\/$/, \"\");\n }\n return DEFAULT_WEB_URL;\n } catch {\n return DEFAULT_WEB_URL;\n }\n}\n\n/** Builds a URL with optional query params appended. */\nexport function buildUrl(base: string, params?: Record<string, unknown>): string {\n if (!params) return base;\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return base;\n const query = entries\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n return `${base}?${query}`;\n}\n\n/** Builds the URL for the conditional-flags endpoint including context query params. */\nexport function buildConditionalFlagUrl(\n baseUrl: string,\n flagKey: string,\n context: ConditionalFlagContext\n): string {\n const url = new URL(`${baseUrl}/api/v1/conditional-flags/${flagKey}`);\n if (context.platform) url.searchParams.set(\"platform\", context.platform);\n if (context.appVersion) url.searchParams.set(\"appVersion\", context.appVersion);\n if (context.country) url.searchParams.set(\"country\", context.country);\n if (context.distinctId) url.searchParams.set(\"distinctId\", context.distinctId);\n return url.toString();\n}\n","import type {\n CampaignResponse,\n EmergencyPaywallResponse,\n SubscriptionStatusResponse,\n ValidatePurchaseResponse,\n} from \"../../types\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\n\nexport async function validatePurchase(\n client: ApiClient,\n appKey: string,\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string\n): Promise<ValidatePurchaseResponse> {\n const response = await client.post<ValidatePurchaseResponse>(\n `/purchases/validate/${appKey}`,\n {\n platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId,\n ...(paywallPlacement !== undefined && { paywallPlacement }),\n ...(variantKey !== undefined && { variantKey }),\n },\n false\n );\n return response.data;\n}\n\nexport async function getSubscriptionStatus(\n client: ApiClient,\n baseUrl: string,\n appKey: string,\n distinctId: string\n): Promise<SubscriptionStatusResponse> {\n const url = new URL(`${baseUrl}/purchases/status/${appKey}`);\n url.searchParams.set(\"distinctId\", distinctId);\n const response = await client.get<SubscriptionStatusResponse>(url.toString());\n return response.data;\n}\n\nexport async function getEmergencyPaywall(\n client: ApiClient\n): Promise<EmergencyPaywallResponse> {\n try {\n const response = await client.get<EmergencyPaywallResponse>(\"/api/v1/emergency-paywall\");\n if (response.status === 404) return { enabled: false };\n return response.data;\n } catch {\n return { enabled: false };\n }\n}\n\nexport async function getCampaignData(\n client: ApiClient,\n baseUrl: string,\n placement: string,\n distinctId: string,\n context?: Record<string, unknown>\n): Promise<CampaignResponse | null> {\n const url = new URL(`${baseUrl}/api/v1/campaigns/${placement}`);\n url.searchParams.set(\"distinctId\", distinctId);\n if (context) url.searchParams.set(\"context\", JSON.stringify(context));\n\n const response = await client.get<CampaignResponse | { paywall: null }>(url.toString());\n if (response.status === 404) return null;\n\n const data = response.data;\n if (\"paywall\" in data && data.paywall === null && !(\"campaignId\" in data)) return null;\n return data as CampaignResponse;\n}\n","export interface RetryConfig {\n maxRetries: number;\n baseDelay: number;\n maxDelay: number;\n retryableStatusCodes: number[];\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeout: number;\n retry: RetryConfig;\n debug: boolean;\n}\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers?: Record<string, string>;\n body?: unknown;\n skipRetry?: boolean;\n timeout?: number;\n}\n\nexport interface HttpResponse<T = unknown> {\n ok: boolean;\n status: number;\n data: T;\n headers: Record<string, string>;\n}\n\nexport interface RetryState {\n attempt: number;\n lastError: Error | null;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 2,\n baseDelay: 500,\n maxDelay: 4000,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n};\n\nexport const DEFAULT_HTTP_CONFIG: Partial<HttpClientConfig> = {\n timeout: 10000,\n retry: DEFAULT_RETRY_CONFIG,\n debug: false,\n};\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nimport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\n\nexport class HttpClient {\n private config: HttpClientConfig;\n\n constructor(baseUrl: string, config?: Partial<Omit<HttpClientConfig, \"baseUrl\">>) {\n this.config = {\n baseUrl,\n timeout: config?.timeout ?? (DEFAULT_HTTP_CONFIG.timeout as number),\n retry: { ...DEFAULT_RETRY_CONFIG, ...config?.retry },\n debug: config?.debug ?? false,\n };\n }\n\n async get<T>(path: string, options?: Partial<RequestOptions>): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"GET\" });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n options?: Partial<RequestOptions>\n ): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"POST\", body });\n }\n\n async request<T>(path: string, options: RequestOptions): Promise<HttpResponse<T>> {\n const url = this.buildUrl(path);\n const fetchOptions = this.buildFetchOptions(options);\n const timeout = options.timeout ?? this.config.timeout;\n\n if (options.skipRetry) {\n return this.executeRequest<T>(url, fetchOptions, timeout);\n }\n\n return this.executeWithRetry<T>(url, fetchOptions, options);\n }\n\n private async executeWithRetry<T>(\n url: string,\n fetchOptions: RequestInit,\n options: RequestOptions\n ): Promise<HttpResponse<T>> {\n const retryConfig = this.config.retry;\n const timeout = options.timeout ?? this.config.timeout;\n const state: RetryState = { attempt: 0, lastError: null };\n\n // maxRetries = number of retries after initial attempt\n // Total attempts = 1 (initial) + maxRetries\n while (state.attempt <= retryConfig.maxRetries) {\n try {\n const response = await this.executeRequest<T>(url, fetchOptions, timeout);\n\n if (this.shouldRetry(response.status, retryConfig)) {\n if (state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelay(state.attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n }\n\n return response;\n } catch (error) {\n state.lastError = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n\n if (this.isNetworkError(state.lastError) && state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelay(state.attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n\n throw state.lastError;\n }\n }\n\n throw state.lastError ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, \"Max retries exceeded\");\n }\n\n private async executeRequest<T>(\n url: string,\n options: RequestInit,\n timeout: number\n ): Promise<HttpResponse<T>> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isCompleted = false;\n\n timeoutId = setTimeout(() => {\n if (!isCompleted) {\n controller.abort();\n }\n }, timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n isCompleted = true;\n\n let data: T;\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n data = (await response.json()) as T;\n } else {\n const textData = await response.text();\n data = textData as unknown as T;\n }\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n headers,\n };\n } catch (error) {\n this.log(\"Request failed\", {\n url,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n isCompleted = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n private buildUrl(path: string): string {\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n return `${this.config.baseUrl}${path}`;\n }\n\n private buildFetchOptions(options: RequestOptions): RequestInit {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n return fetchOptions;\n }\n\n private shouldRetry(status: number, config: RetryConfig): boolean {\n return config.retryableStatusCodes.includes(status);\n }\n\n private isNetworkError(error: Error): boolean {\n const networkErrorPatterns = [\n \"network\",\n \"fetch\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"ENOTFOUND\",\n \"aborted\",\n \"timeout\",\n ];\n\n const message = error.message.toLowerCase();\n return networkErrorPatterns.some((pattern) => message.includes(pattern.toLowerCase()));\n }\n\n private calculateDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay = config.baseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay;\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[HttpClient]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n\n getConfig(): Readonly<HttpClientConfig> {\n return { ...this.config };\n }\n}\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nimport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n\ntype NetInfoState = {\n isConnected: boolean | null;\n isInternetReachable: boolean | null;\n};\n\ntype NetInfoSubscription = () => void;\n\ntype NetInfoModule = {\n addEventListener: (listener: (state: NetInfoState) => void) => NetInfoSubscription;\n fetch: () => Promise<NetInfoState>;\n};\n\nclass NetworkMonitorClass {\n private config: NetworkMonitorConfig = DEFAULT_NETWORK_CONFIG;\n private listeners: Set<NetworkListener> = new Set();\n private currentState: NetworkState = \"unknown\";\n private netInfoModule: NetInfoModule | null = null;\n private netInfoSubscription: NetInfoSubscription | null = null;\n private appStateSubscription: ReturnType<typeof AppState.addEventListener> | null = null;\n private initialized = false;\n private checkIntervalId: ReturnType<typeof setInterval> | null = null;\n\n async initialize(config?: Partial<NetworkMonitorConfig>): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.config = { ...DEFAULT_NETWORK_CONFIG, ...config };\n\n // Start as unknown — setupFallbackDetection will resolve to online/offline\n this.currentState = \"unknown\";\n this.initialized = true;\n\n this.log(\"Initialized (state: unknown, awaiting first connectivity check)\");\n\n // Skip NetInfo — it can freeze the JS thread on some devices/simulators\n // Use simple HTTP-based fallback detection instead\n void this.setupFallbackDetection();\n this.setupAppStateListener();\n }\n\n private setupNetInfoListener(): void {\n if (!this.netInfoModule) return;\n\n this.netInfoSubscription = this.netInfoModule.addEventListener((state) => {\n const newState = this.netInfoStateToNetworkState(state);\n this.updateState(newState);\n });\n }\n\n private async setupFallbackDetection(): Promise<void> {\n // Don't assume online - check connectivity first\n await this.checkConnectivity();\n\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n\n private setupAppStateListener(): void {\n this.appStateSubscription = AppState.addEventListener(\"change\", (state: AppStateStatus) => {\n if (state === \"active\") {\n void this.checkConnectivity();\n }\n });\n }\n\n private async checkConnectivity(): Promise<void> {\n // Don't use netInfoModule.fetch() — it can hang on some devices/simulators\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(this.config.checkUrl, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n this.updateState(response.ok ? \"online\" : \"offline\");\n } catch {\n this.updateState(\"offline\");\n }\n }\n\n private netInfoStateToNetworkState(state: NetInfoState): NetworkState {\n if (state.isConnected === null) {\n return \"unknown\";\n }\n if (!state.isConnected) {\n return \"offline\";\n }\n return \"online\";\n }\n\n private updateState(newState: NetworkState): void {\n const previousState = this.currentState;\n if (previousState === newState) {\n return;\n }\n\n this.currentState = newState;\n this.log(\"Network state changed\", { from: previousState, to: newState });\n this.notifyListeners(newState);\n }\n\n private notifyListeners(state: NetworkState): void {\n for (const listener of this.listeners) {\n try {\n listener(state);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n isOnline(): boolean {\n // If not initialized or unknown, assume online to not block operations\n if (!this.initialized || this.currentState === \"unknown\") {\n return true;\n }\n return this.currentState === \"online\";\n }\n\n getState(): NetworkState {\n return this.currentState;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n addListener(listener: NetworkListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: NetworkListener): void {\n this.listeners.delete(listener);\n }\n\n async forceCheck(): Promise<NetworkState> {\n await this.checkConnectivity();\n return this.currentState;\n }\n\n dispose(): void {\n if (this.netInfoSubscription) {\n this.netInfoSubscription();\n this.netInfoSubscription = null;\n }\n\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n\n this.listeners.clear();\n this.initialized = false;\n this.currentState = \"unknown\";\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[NetworkMonitor]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const networkMonitor = new NetworkMonitorClass();\n/** @deprecated Use `networkMonitor` (camelCase) */\nexport const NetworkMonitor = networkMonitor;\n","export type NetworkState = \"online\" | \"offline\" | \"unknown\";\n\nexport type NetworkListener = (state: NetworkState) => void;\n\nexport interface NetworkMonitorConfig {\n debug: boolean;\n checkInterval: number;\n checkUrl: string;\n}\n\nexport const DEFAULT_NETWORK_CONFIG: NetworkMonitorConfig = {\n debug: false,\n checkInterval: 30000,\n checkUrl: \"https://clients3.google.com/generate_204\",\n};\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\n\nimport { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { findDuplicateIndex } from \"./deduplication\";\nimport type { OfflineQueueConfig, QueueEvent, QueueItem, QueueListener } from \"./types\";\nimport { DEFAULT_QUEUE_CONFIG } from \"./types\";\n\nclass OfflineQueueClass {\n private config: OfflineQueueConfig = DEFAULT_QUEUE_CONFIG;\n private queue: QueueItem[] = [];\n private listeners: Set<QueueListener> = new Set();\n private initialized = false;\n private processing = false;\n private processingLock = false;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n async initialize(config?: Partial<OfflineQueueConfig>): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.config = { ...DEFAULT_QUEUE_CONFIG, ...config };\n await this.loadFromStorage();\n this.cleanupExpired();\n\n this.cleanupTimer = setInterval(() => this.cleanupExpired(), 60 * 60 * 1000);\n\n this.initialized = true;\n }\n\n private async loadFromStorage(): Promise<void> {\n try {\n const stored = await AsyncStorage.getItem(this.config.storageKey);\n if (stored) {\n this.queue = JSON.parse(stored) as QueueItem[];\n }\n } catch {\n this.queue = [];\n }\n }\n\n private async saveToStorage(): Promise<boolean> {\n try {\n await AsyncStorage.setItem(this.config.storageKey, JSON.stringify(this.queue));\n return true;\n } catch (error) {\n this.log(\"Failed to save queue to storage\", error);\n this.emit({\n type: \"item:failed\",\n error: new ClientError(CLIENT_ERROR_CODES.UNKNOWN, \"Storage save failed - items may be lost on restart\"),\n queueSize: this.queue.length,\n });\n return false;\n }\n }\n\n private cleanupExpired(): void {\n const now = Date.now();\n const before = this.queue.length;\n\n this.queue = this.queue.filter((item) => Date.now() - item.timestamp < this.config.maxAge);\n\n if (before !== this.queue.length) {\n void this.saveToStorage();\n }\n }\n\n async enqueue(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<QueueItem> {\n const item: QueueItem = {\n id: generateUUID(),\n method,\n url,\n body,\n headers,\n timestamp: Date.now(),\n attempts: 0,\n maxAttempts: this.config.maxAttempts,\n };\n\n const existingIndex = this.findDuplicateIndex(item);\n if (existingIndex !== -1) {\n this.queue[existingIndex].timestamp = Date.now();\n await this.saveToStorage();\n return this.queue[existingIndex];\n }\n\n if (this.queue.length >= this.config.maxItems) {\n const removed = this.queue.shift();\n if (removed) {\n this.emit({ type: \"item:evicted\", item: removed, queueSize: this.queue.length });\n }\n }\n\n this.queue.push(item);\n await this.saveToStorage();\n\n this.emit({ type: \"item:added\", item, queueSize: this.queue.length });\n\n return item;\n }\n\n private findDuplicateIndex(item: QueueItem): number {\n return findDuplicateIndex(this.queue, item);\n }\n\n async dequeue(): Promise<QueueItem | null> {\n const item = this.queue.shift() ?? null;\n if (item) {\n await this.saveToStorage();\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n }\n return item;\n }\n\n async removeItem(id: string): Promise<boolean> {\n const index = this.queue.findIndex((item) => item.id === id);\n if (index === -1) return false;\n const [item] = this.queue.splice(index, 1);\n await this.saveToStorage();\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n return true;\n }\n\n async processQueue(\n processor: (item: QueueItem) => Promise<boolean | { success: boolean; permanent?: boolean }>,\n options?: { delayBetweenItems?: number }\n ): Promise<{ processed: number; failed: number }> {\n if (this.processingLock || this.queue.length === 0) {\n return { processed: 0, failed: 0 };\n }\n\n this.processingLock = true;\n this.processing = true;\n this.emit({ type: \"processing:start\", queueSize: this.queue.length });\n\n let processed = 0;\n let failed = 0;\n const delayMs = options?.delayBetweenItems ?? 100;\n\n // Snapshot item IDs so removals during iteration don't affect the loop\n const itemIds = this.queue.map((item) => item.id);\n\n for (let i = 0; i < itemIds.length; i++) {\n const item = this.queue.find((q) => q.id === itemIds[i]);\n if (!item) continue;\n\n item.attempts++;\n\n try {\n const result = await processor(item);\n const success = typeof result === \"boolean\" ? result : result.success;\n const permanent = typeof result === \"object\" ? (result.permanent ?? false) : false;\n\n if (success) {\n await this.removeItem(item.id);\n processed++;\n this.emit({ type: \"item:success\", item, queueSize: this.queue.length });\n } else {\n const didFail = await this.handleItemFailure(item, undefined, permanent);\n if (didFail) failed++;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n const didFail = await this.handleItemFailure(item, err, false);\n if (didFail) failed++;\n }\n\n if (i < itemIds.length - 1 && delayMs > 0) await this.sleep(delayMs);\n }\n\n this.processing = false;\n this.processingLock = false;\n this.emit({ type: \"processing:end\", queueSize: this.queue.length });\n\n return { processed, failed };\n }\n\n /** Returns true if the item was permanently removed (counted as failed). */\n private async handleItemFailure(item: QueueItem, error?: Error, permanent = false): Promise<boolean> {\n if (permanent || item.attempts >= item.maxAttempts) {\n await this.removeItem(item.id);\n this.emit({\n type: \"item:failed\",\n item,\n error: error ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, permanent ? \"Permanent failure\" : \"Max attempts reached\"),\n queueSize: this.queue.length,\n });\n return true;\n }\n await this.saveToStorage();\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n getQueue(): ReadonlyArray<QueueItem> {\n return [...this.queue];\n }\n\n getSize(): number {\n return this.queue.length;\n }\n\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n isProcessing(): boolean {\n return this.processing;\n }\n\n async clear(): Promise<void> {\n this.queue = [];\n await this.saveToStorage();\n }\n\n async clearItemsWithInvalidAppKey(validAppKey: string): Promise<number> {\n const before = this.queue.length;\n this.queue = this.queue.filter((item) => {\n const itemAppKey = item.headers?.[\"X-App-Key\"];\n return itemAppKey === validAppKey || !itemAppKey;\n });\n const removed = before - this.queue.length;\n if (removed > 0) {\n await this.saveToStorage();\n }\n return removed;\n }\n\n addListener(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: QueueListener): void {\n this.listeners.delete(listener);\n }\n\n private emit(event: QueueEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[OfflineQueue]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.listeners.clear();\n this.queue = [];\n this.initialized = false;\n this.processing = false;\n this.processingLock = false;\n }\n}\n\nexport const offlineQueue = new OfflineQueueClass();\n/** @deprecated Use `offlineQueue` (camelCase) */\nexport const OfflineQueue = offlineQueue;\n","import type { QueueItem } from \"./types\";\n\n/**\n * Deterministic comparison for deduplication.\n * Normalizes objects by sorting keys recursively before comparison.\n */\nexport function normalizeForComparison(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return String(obj);\n }\n\n if (typeof obj !== \"object\") {\n return JSON.stringify(obj);\n }\n\n if (Array.isArray(obj)) {\n return \"[\" + obj.map((item) => normalizeForComparison(item)).join(\",\") + \"]\";\n }\n\n const sortedKeys = Object.keys(obj as Record<string, unknown>).sort();\n const pairs = sortedKeys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n return `${JSON.stringify(key)}:${normalizeForComparison(value)}`;\n });\n return \"{\" + pairs.join(\",\") + \"}\";\n}\n\nexport function findDuplicateIndex(queue: QueueItem[], item: QueueItem): number {\n const normalizedBody = normalizeForComparison(item.body);\n return queue.findIndex(\n (existing) =>\n existing.url === item.url && normalizeForComparison(existing.body) === normalizedBody\n );\n}\n","export interface QueueItem {\n id: string;\n method: \"POST\" | \"PUT\";\n url: string;\n body: unknown;\n headers?: Record<string, string>;\n timestamp: number;\n attempts: number;\n maxAttempts: number;\n}\n\nexport interface OfflineQueueConfig {\n maxItems: number;\n maxAge: number;\n maxAttempts: number;\n storageKey: string;\n debug: boolean;\n}\n\nexport type QueueEventType =\n | \"item:added\"\n | \"item:removed\"\n | \"item:success\"\n | \"item:failed\"\n | \"item:evicted\"\n | \"processing:start\"\n | \"processing:end\";\n\nexport interface QueueEvent {\n type: QueueEventType;\n item?: QueueItem;\n error?: Error;\n queueSize: number;\n}\n\nexport type QueueListener = (event: QueueEvent) => void;\n\nexport const DEFAULT_QUEUE_CONFIG: OfflineQueueConfig = {\n maxItems: 100,\n maxAge: 24 * 60 * 60 * 1000,\n maxAttempts: 3,\n storageKey: \"@paywallo:offline_queue\",\n debug: false,\n};\n","import { HttpClient } from \"../http\";\nimport { networkMonitor, type NetworkState } from \"../network\";\n\nimport { offlineQueue } from \"./OfflineQueue\";\nimport type { QueueItem } from \"./types\";\n\ninterface QueueItemResult {\n success: boolean;\n permanent?: boolean;\n status?: number;\n}\n\nexport interface QueueProcessorConfig {\n debounceMs: number;\n debug: boolean;\n}\n\nconst DEFAULT_PROCESSOR_CONFIG: QueueProcessorConfig = {\n debounceMs: 2000,\n debug: false,\n};\n\nclass QueueProcessorClass {\n private config: QueueProcessorConfig = DEFAULT_PROCESSOR_CONFIG;\n private httpClient: HttpClient | null = null;\n private networkUnsubscribe: (() => void) | null = null;\n private debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n private retryIntervalId: ReturnType<typeof setInterval> | null = null;\n private initialized = false;\n\n initialize(httpClient: HttpClient, config?: Partial<QueueProcessorConfig>): void {\n if (this.initialized) {\n return;\n }\n\n this.httpClient = httpClient;\n this.config = { ...DEFAULT_PROCESSOR_CONFIG, ...config };\n\n this.networkUnsubscribe = networkMonitor.addListener((state: NetworkState) => {\n if (state === \"online\") {\n this.scheduleProcessing();\n }\n });\n\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n\n this.retryIntervalId = setInterval(() => {\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n }, 60000);\n\n this.initialized = true;\n this.log(\"QueueProcessor initialized\");\n }\n\n private scheduleProcessing(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n this.debounceTimeout = setTimeout(() => {\n void this.processQueue();\n }, this.config.debounceMs);\n }\n\n async processQueue(): Promise<{ processed: number; failed: number }> {\n if (!this.httpClient) {\n this.log(\"HttpClient not initialized\");\n return { processed: 0, failed: 0 };\n }\n\n if (!networkMonitor.isOnline()) {\n this.log(\"Offline, skipping queue processing\");\n return { processed: 0, failed: 0 };\n }\n\n return offlineQueue.processQueue(async (item: QueueItem) => {\n return this.processItem(item);\n });\n }\n\n private async processItem(item: QueueItem): Promise<QueueItemResult> {\n if (!this.httpClient) {\n return { success: false, permanent: false };\n }\n\n this.log(\"Processing queue item\", {\n id: item.id,\n url: item.url,\n method: item.method,\n headers: item.headers,\n attempts: item.attempts,\n });\n\n const response = await this.httpClient.request(item.url, {\n method: item.method,\n body: item.body,\n headers: item.headers,\n skipRetry: false,\n });\n\n // Only 2xx status codes count as success\n if (response.ok) {\n this.log(\"Queue item processed successfully\", { id: item.id });\n return { success: true, permanent: false };\n }\n\n // 4xx errors are PERMANENT failures - they will NEVER succeed on retry\n // Examples: 401 (invalid app key), 400 (bad request), 403 (forbidden)\n if (response.status >= 400 && response.status < 500) {\n this.log(\"Request failed with permanent client error - removing from queue\", {\n id: item.id,\n url: item.url,\n status: response.status,\n appKeyInHeaders: item.headers?.[\"X-App-Key\"],\n });\n // Return permanent failure to remove item immediately without retry\n return { success: false, permanent: true, status: response.status };\n }\n\n // 5xx errors might succeed on retry, return false to allow retry\n this.log(\"Request failed with server error - will retry\", {\n id: item.id,\n status: response.status,\n });\n return { success: false, permanent: false, status: response.status };\n }\n\n async enqueueIfOffline(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<{ queued: boolean; item?: QueueItem }> {\n if (networkMonitor.isOnline()) {\n return { queued: false };\n }\n\n const item = await offlineQueue.enqueue(method, url, body, headers);\n this.log(\"Request queued for offline\", { id: item.id, url });\n return { queued: true, item };\n }\n\n getQueueSize(): number {\n return offlineQueue.getSize();\n }\n\n async clearQueue(): Promise<void> {\n await offlineQueue.clear();\n }\n\n dispose(): void {\n // Clear debounce timeout FIRST to prevent any pending processing\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n this.debounceTimeout = null;\n }\n\n if (this.retryIntervalId) {\n clearInterval(this.retryIntervalId);\n this.retryIntervalId = null;\n }\n\n // Then unsubscribe from network changes\n if (this.networkUnsubscribe) {\n this.networkUnsubscribe();\n this.networkUnsubscribe = null;\n }\n\n this.httpClient = null;\n this.initialized = false;\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[QueueProcessor]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const queueProcessor = new QueueProcessorClass();\n/** @deprecated Use `queueProcessor` (camelCase) */\nexport const QueueProcessor = queueProcessor;\n","import type { CampaignResponse, FlagVariant, PaywallConfig } from \"../types\";\n\ntype CacheEntry<T> = { value: T; ts: number; ttl?: number };\n\nexport class ApiCache {\n private readonly CACHE_TTL = 300_000; // 5 minutes\n private readonly CACHE_NULL_TTL = 30_000; // 30 seconds — for null/404 variants\n private readonly MAX_SIZE = 200;\n\n private variantCache = new Map<string, CacheEntry<FlagVariant>>();\n private paywallCache = new Map<string, CacheEntry<PaywallConfig | null>>();\n private campaignCache = new Map<string, CacheEntry<CampaignResponse | null>>();\n\n getCached<T>(cache: Map<string, CacheEntry<T>>, key: string): T | undefined {\n const entry = cache.get(key);\n if (!entry) return undefined;\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (Date.now() - entry.ts < ttl) return entry.value;\n // Eagerly evict expired entry on read to free memory without waiting for size overflow\n cache.delete(key);\n return undefined;\n }\n\n setCached<T>(\n cache: Map<string, CacheEntry<T>>,\n key: string,\n value: T,\n ttlOverride?: number\n ): void {\n const entry: CacheEntry<T> = { value, ts: Date.now() };\n if (ttlOverride !== undefined) entry.ttl = ttlOverride;\n cache.set(key, entry);\n }\n\n evictExpiredEntries<T>(cache: Map<string, CacheEntry<T>>): void {\n if (cache.size <= this.MAX_SIZE) return;\n const now = Date.now();\n for (const [key, entry] of cache) {\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (now - entry.ts > ttl) cache.delete(key);\n }\n }\n\n getVariant(key: string): FlagVariant | undefined {\n return this.getCached(this.variantCache, key);\n }\n\n setVariant(key: string, value: FlagVariant, ttlOverride?: number): void {\n this.setCached(this.variantCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.variantCache);\n }\n\n get nullTTL(): number {\n return this.CACHE_NULL_TTL;\n }\n\n getStaleVariant(key: string): FlagVariant | undefined {\n const entry = this.variantCache.get(key);\n if (entry && Date.now() - entry.ts < 86400000) return entry.value;\n return undefined;\n }\n\n getPaywall(key: string): PaywallConfig | null | undefined {\n return this.getCached(this.paywallCache, key);\n }\n\n setPaywall(key: string, value: PaywallConfig | null, ttlOverride?: number): void {\n this.setCached(this.paywallCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.paywallCache);\n }\n\n getStalePaywall(key: string): PaywallConfig | null | undefined {\n const entry = this.paywallCache.get(key);\n if (entry && Date.now() - entry.ts < 86400000) return entry.value;\n return undefined;\n }\n\n getCampaign(key: string): CampaignResponse | null | undefined {\n return this.getCached(this.campaignCache, key);\n }\n\n setCampaign(key: string, value: CampaignResponse | null): void {\n this.setCached(this.campaignCache, key, value);\n this.evictExpiredEntries(this.campaignCache);\n }\n\n getStaleCampaign(key: string): CampaignResponse | null | undefined {\n const entry = this.campaignCache.get(key);\n if (entry && Date.now() - entry.ts < 86400000) return entry.value;\n return undefined;\n }\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class CampaignError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"campaign\", code, message);\n this.name = \"CampaignError\";\n }\n}\n\nexport const CAMPAIGN_ERROR_CODES = {\n NOT_INITIALIZED: \"CAMPAIGN_NOT_INITIALIZED\",\n FETCH_FAILED: \"CAMPAIGN_FETCH_FAILED\",\n PRELOAD_FAILED: \"CAMPAIGN_PRELOAD_FAILED\",\n NOT_FOUND: \"CAMPAIGN_NOT_FOUND\",\n PRESENT_FAILED: \"CAMPAIGN_PRESENT_FAILED\",\n} as const;\n","import { CAMPAIGN_ERROR_CODES, CampaignError } from \"./CampaignError\";\nimport { PaywalloError } from \"../../errors/PaywalloError\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"../paywall/PaywallError\";\nimport type { CampaignResponse, CampaignResult, PaywallResult } from \"../../types\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport type { PreloadCampaignResult } from \"../../core/types\";\n\ntype PaywallPresenter = (placement: string) => Promise<PaywallResult>;\ntype CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\n\nconst PRELOAD_CACHE_TTL_MS = 5 * 60 * 1000;\ninterface PreloadedCampaignCache { campaign: CampaignResponse; preloadedAt: number }\n\nexport class CampaignGateService {\n private readonly preloadedCampaigns: Map<string, PreloadedCampaignCache> = new Map();\n\n async getCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return null;\n return apiClient.getCampaign(placement, distinctId, context);\n }\n\n async presentCampaign(\n apiClient: ApiClient,\n placement: string,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<CampaignResult> {\n const campaign = await this.getCampaign(apiClient, placement, context);\n if (!campaign) {\n return { presented: false, purchased: false, cancelled: false, restored: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, \"No campaign found\") };\n }\n if (campaignPresenter) return campaignPresenter(campaign);\n if (!paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return { ...(await paywallPresenter(campaign.paywall.placement)), campaignId: campaign.campaignId, variantKey: campaign.variantKey };\n }\n\n async requireSubscriptionWithCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<boolean> {\n if (await hasActive()) return true;\n const r = await this.presentCampaign(apiClient, placement, paywallPresenter, campaignPresenter, context);\n return r.purchased || r.restored;\n }\n\n async preloadCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n try {\n const campaign = await this.getCampaign(apiClient, placement, context);\n if (!campaign?.paywall) {\n return { success: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, `Campaign or paywall not found: ${placement}`) };\n }\n this.preloadedCampaigns.set(placement, { campaign, preloadedAt: Date.now() });\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error : new PaywalloError(\"panel\", \"PANEL_UNKNOWN\", String(error)) };\n }\n }\n\n getPreloadedCampaign(placement: string): CampaignResponse | null {\n const cached = this.preloadedCampaigns.get(placement);\n if (!cached) return null;\n if (Date.now() - cached.preloadedAt >= PRELOAD_CACHE_TTL_MS) { this.preloadedCampaigns.delete(placement); return null; }\n return cached.campaign;\n }\n\n clearPreloaded(): void { this.preloadedCampaigns.clear(); }\n}\n\nexport const campaignGateService = new CampaignGateService();\n","import { Platform } from \"react-native\";\n\nconst ZERO_IDFA = \"00000000-0000-0000-0000-000000000000\";\n\nexport type AttStatus = \"granted\" | \"denied\" | \"restricted\" | \"undetermined\" | \"unavailable\";\n\nexport interface AdvertisingIdResult {\n idfv: string | null;\n idfa: string | null;\n gaid: string | null;\n attStatus: AttStatus;\n}\n\nexport class AdvertisingIdManager {\n private cached: AdvertisingIdResult | null = null;\n\n async collect(requestATT = false): Promise<AdvertisingIdResult> {\n if (this.cached) return this.cached;\n\n const fallback: AdvertisingIdResult = { idfv: null, idfa: null, gaid: null, attStatus: \"unavailable\" };\n\n try {\n const tracking = await import(\"expo-tracking-transparency\");\n\n if (Platform.OS === \"ios\") {\n if (!tracking.isAvailable()) {\n // Still attempt IDFV collection — it does not require ATT\n const idfv = await this.collectIdfv();\n this.cached = { ...fallback, idfv };\n return this.cached;\n }\n\n const current = await tracking.getTrackingPermissionsAsync();\n let status = current.status as AttStatus;\n let granted = current.granted;\n\n if (status === \"undetermined\" && requestATT) {\n const result = await tracking.requestTrackingPermissionsAsync();\n status = result.status as AttStatus;\n granted = result.granted;\n }\n\n const idfv = await this.collectIdfv();\n const idfa = granted ? this.sanitizeId(tracking.getAdvertisingId()) : null;\n this.cached = { idfv, idfa, gaid: null, attStatus: status };\n return this.cached;\n }\n\n if (Platform.OS === \"android\") {\n // On Android, getTrackingPermissionsAsync reflects the user's \"Opt out of Ads Personalization\" setting.\n // Only include GAID when the user has not opted out.\n const androidStatus = await tracking.getTrackingPermissionsAsync();\n const optedIn = androidStatus.granted;\n const rawGaid = optedIn ? tracking.getAdvertisingId() : null;\n const gaid = this.sanitizeId(rawGaid);\n // attStatus is an iOS-specific concept; use \"unavailable\" on Android (no ATT dialog).\n // IDFV is also iOS-specific; Android has no vendor identifier equivalent.\n this.cached = { idfv: null, idfa: null, gaid, attStatus: \"unavailable\" };\n return this.cached;\n }\n\n this.cached = fallback;\n return this.cached;\n } catch {\n // expo-tracking-transparency not installed or any other error — never crash the SDK\n this.cached = fallback;\n return this.cached;\n }\n }\n\n private async collectIdfv(): Promise<string | null> {\n try {\n const app = await import(\"expo-application\");\n const idfv = await app.getIosIdForVendorAsync();\n return this.sanitizeId(idfv);\n } catch {\n return null;\n }\n }\n\n private sanitizeId(id: string | null | undefined): string | null {\n if (!id || id === ZERO_IDFA) return null;\n return id;\n }\n}\n","const TIMEOUT_MS = 2000;\n\nexport class FacebookIdManager {\n async getAnonId(): Promise<string | null> {\n try {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<null>((resolve) => {\n timerId = setTimeout(() => resolve(null), TIMEOUT_MS);\n });\n const result = await Promise.race([this.fetchAnonId(), timeoutPromise]);\n clearTimeout(timerId);\n return result;\n } catch {\n return null;\n }\n }\n\n private async fetchAnonId(): Promise<string | null> {\n try {\n const fbsdk = await import(\"react-native-fbsdk-next\");\n const anonId = await fbsdk.AppEventsLogger.getAnonymousID();\n return anonId || null;\n } catch {\n return null;\n }\n }\n}\n\nexport const facebookIdManager = new FacebookIdManager();\n","import { Dimensions, Platform } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { AdvertisingIdManager } from \"./AdvertisingIdManager\";\nimport { facebookIdManager } from \"./FacebookIdManager\";\nimport { identityManager } from \"./IdentityManager\";\nimport { installReferrerManager } from \"./InstallReferrerManager\";\nimport { sessionManager } from \"../session/SessionManager\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nexport class InstallTracker {\n private readonly debug: boolean;\n private readonly advertisingIdManager: AdvertisingIdManager;\n\n constructor(debug = false, advertisingIdManager?: AdvertisingIdManager) {\n this.debug = debug;\n this.advertisingIdManager = advertisingIdManager ?? new AdvertisingIdManager();\n }\n\n async trackIfNeeded(apiClient: ApiClient, requestATT = false): Promise<void> {\n const storage = new SecureStorage(this.debug);\n // Check both SecureStorage and AsyncStorage fallback to avoid duplicate $app_installed\n const alreadyTracked = await storage.get(\"install_tracked\");\n if (alreadyTracked) return;\n let fallbackTracked: string | null = null;\n try {\n const AsyncStorage = (await import(\"@react-native-async-storage/async-storage\")).default;\n fallbackTracked = await AsyncStorage.getItem(\"@paywallo:install_tracked\");\n } catch { /* AsyncStorage not available */ }\n if (fallbackTracked) return;\n\n const distinctId = identityManager.getDistinctId();\n const sessionId = sessionManager.getSessionId();\n const installedAt = Date.now();\n\n if (!distinctId) return;\n\n type DeviceInfoType = { getModel: () => string; getSystemVersion: () => string; getVersion: () => string; getBuildNumber: () => string };\n let deviceInfo: DeviceInfoType | null = null;\n try {\n const mod = await import(\"react-native-device-info\");\n deviceInfo = mod.default as DeviceInfoType;\n } catch {\n deviceInfo = null;\n }\n\n let deviceData: Record<string, string | number> = {};\n try {\n const screen = Dimensions.get(\"screen\");\n const screenWidth = Math.round(screen.width ?? 0);\n const screenHeight = Math.round(screen.height ?? 0);\n const locale = Intl.DateTimeFormat().resolvedOptions().locale ?? \"unknown\";\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"unknown\";\n const deviceModel = deviceInfo?.getModel() || \"unknown\";\n const osVersion = deviceInfo?.getSystemVersion() || \"unknown\";\n const appVersion = deviceInfo?.getVersion() || \"unknown\";\n const buildNumber = deviceInfo?.getBuildNumber() || \"0\";\n deviceData = {\n deviceModel,\n osVersion,\n appVersion,\n buildNumber,\n ...(screenWidth > 0 && { screenWidth }),\n ...(screenHeight > 0 && { screenHeight }),\n timezone,\n locale,\n };\n } catch {\n if (this.debug) {\n console.warn(\"[Paywallo] Failed to collect device data for install event\");\n }\n }\n\n const [fbAnonId, referrer, adIds] = await Promise.all([\n facebookIdManager.getAnonId(),\n installReferrerManager.getReferrer(),\n this.advertisingIdManager.collect(requestATT),\n ]);\n\n try {\n await apiClient.trackEvent(\"$app_installed\", distinctId, {\n installedAt,\n platform: Platform.OS,\n ...(sessionId && { sessionId }),\n ...deviceData,\n ...(fbAnonId && { fbAnonId }),\n ...(referrer.rawReferrer && { installReferrer: referrer.rawReferrer }),\n ...(referrer.trackingId && { referrerTrackingId: referrer.trackingId }),\n ...(referrer.fbclid && { referrerFbclid: referrer.fbclid }),\n ...(referrer.utmSource && { referrerUtmSource: referrer.utmSource }),\n ...(referrer.utmMedium && { referrerUtmMedium: referrer.utmMedium }),\n ...(referrer.utmCampaign && { referrerUtmCampaign: referrer.utmCampaign }),\n ...(adIds.idfa && { idfa: adIds.idfa }),\n ...(adIds.idfv && { idfv: adIds.idfv }),\n ...(adIds.gaid && { gaid: adIds.gaid }),\n attStatus: adIds.attStatus,\n });\n const stored = await storage.set(\"install_tracked\", String(installedAt));\n // Also persist to AsyncStorage as fallback to prevent duplicate tracking\n try {\n const AsyncStorage = (await import(\"@react-native-async-storage/async-storage\")).default;\n await AsyncStorage.setItem(\"@paywallo:install_tracked\", String(installedAt));\n } catch { /* non-critical */ }\n if (this.debug && !stored) {\n console.warn(\"[Paywallo] Install event tracked but flag storage failed — may re-track on next launch\");\n }\n } catch (error) {\n if (this.debug) {\n console.warn(\"[Paywallo] Failed to track install:\", error);\n }\n }\n }\n}\n","import { Platform } from \"react-native\";\n\nconst REFERRER_TIMEOUT_MS = 5000;\n\ninterface ReferrerResult {\n rawReferrer: string | null;\n trackingId: string | null;\n fbclid: string | null;\n utmSource: string | null;\n utmMedium: string | null;\n utmCampaign: string | null;\n}\n\nexport class InstallReferrerManager {\n async getReferrer(): Promise<ReferrerResult> {\n if (Platform.OS !== \"android\") {\n return this.emptyResult();\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<ReferrerResult>((resolve) => {\n timerId = setTimeout(() => resolve(this.emptyResult()), REFERRER_TIMEOUT_MS);\n });\n\n const fetchPromise = this.fetchReferrer();\n\n const result = await Promise.race([fetchPromise, timeoutPromise]);\n clearTimeout(timerId);\n return result;\n }\n\n private async fetchReferrer(): Promise<ReferrerResult> {\n try {\n const Application = await import(\"expo-application\");\n const referrer = await Application.getInstallReferrerAsync();\n\n if (!referrer) return this.emptyResult();\n\n const capped = referrer.slice(0, 2048);\n const params = this.parseReferrer(capped);\n return {\n rawReferrer: capped,\n trackingId: params[\"tracking_id\"] || null,\n fbclid: params[\"fbclid\"] || null,\n utmSource: params[\"utm_source\"] || null,\n utmMedium: params[\"utm_medium\"] || null,\n utmCampaign: params[\"utm_campaign\"] || null,\n };\n } catch {\n return this.emptyResult();\n }\n }\n\n private parseReferrer(referrer: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const pair of referrer.split(\"&\")) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) continue;\n try {\n const key = decodeURIComponent(pair.slice(0, eqIndex).replace(/\\+/g, \" \"));\n const raw = pair.slice(eqIndex + 1).replace(/\\+/g, \" \");\n const value = decodeURIComponent(raw);\n if (key) result[key] = value;\n } catch {\n // malformed percent-encoding — skip this pair\n }\n }\n return result;\n }\n\n private emptyResult(): ReferrerResult {\n return {\n rawReferrer: null,\n trackingId: null,\n fbclid: null,\n utmSource: null,\n utmMedium: null,\n utmCampaign: null,\n };\n }\n}\n\nexport const installReferrerManager = new InstallReferrerManager();\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport { SESSION_ERROR_CODES, SessionError } from \"./SessionError\";\nimport { EmergencyPaywallHandler, SessionConfig, SessionState } from \"./types\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport {\n trackAppBackground,\n trackAppOpen,\n trackSessionEnd,\n trackSessionStart,\n} from \"./sessionTracking\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst SESSION_ID_KEY = \"current_session_id\";\nconst SESSION_START_KEY = \"session_start\";\nconst EMERGENCY_PAYWALL_SHOWN_KEY = \"emergency_paywall_shown\";\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport class SessionManager {\n private sessionId: string | null = null;\n private sessionStartedAt: Date | null = null;\n private appState: AppStateStatus = \"active\";\n private apiClient: ApiClient | null = null;\n private debug = false;\n private initialized = false;\n private config: SessionConfig = {};\n private backgroundTimestamp: number | null = null;\n private appStateSubscription: { remove: () => void } | null = null;\n private emergencyPaywallHandler: EmergencyPaywallHandler | null = null;\n private emergencyPaywallShownInSession = false;\n private secureStorage: SecureStorage | null = null;\n\n async initialize(apiClient: ApiClient, config: SessionConfig = {}, debug = false): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n this.config = {\n sessionTimeoutMs: config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS,\n trackAppState: config.trackAppState ?? true,\n };\n\n await this.restoreSession();\n\n if (this.config.trackAppState) {\n this.setupAppStateListener();\n }\n\n this.initialized = true;\n }\n\n async startSession(): Promise<string> {\n this.ensureInitialized();\n\n if (this.sessionId) {\n await this.endSession();\n }\n\n this.sessionId = generateUUID();\n this.sessionStartedAt = new Date();\n this.emergencyPaywallShownInSession = false;\n\n await Promise.all([\n this.secureStorage!.set(SESSION_ID_KEY, this.sessionId),\n this.secureStorage!.set(SESSION_START_KEY, this.sessionStartedAt.toISOString()),\n this.secureStorage!.remove(EMERGENCY_PAYWALL_SHOWN_KEY),\n ]);\n\n await this.trackSessionStart();\n\n return this.sessionId;\n }\n\n async endSession(): Promise<void> {\n this.ensureInitialized();\n\n if (!this.sessionId || !this.sessionStartedAt) {\n return;\n }\n\n await this.trackSessionEnd();\n\n this.sessionId = null;\n this.sessionStartedAt = null;\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]);\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n getSessionDuration(): number {\n if (!this.sessionStartedAt) {\n return 0;\n }\n return Math.floor((Date.now() - this.sessionStartedAt.getTime()) / 1000);\n }\n\n isSessionActive(): boolean {\n return this.sessionId !== null;\n }\n\n getState(): SessionState {\n return {\n sessionId: this.sessionId,\n startedAt: this.sessionStartedAt,\n isActive: this.isSessionActive(),\n duration: this.getSessionDuration(),\n };\n }\n\n destroy(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n this.initialized = false;\n }\n\n registerEmergencyPaywallHandler(handler: EmergencyPaywallHandler): void {\n this.emergencyPaywallHandler = handler;\n }\n\n private async restoreSession(): Promise<void> {\n const [sessionId, sessionStart] = await Promise.all([\n this.secureStorage!.get(SESSION_ID_KEY),\n this.secureStorage!.get(SESSION_START_KEY),\n ]).catch(() => [null, null]);\n\n if (sessionId && sessionStart) {\n const startedAt = new Date(sessionStart);\n const elapsed = Date.now() - startedAt.getTime();\n\n if (elapsed < (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS)) {\n this.sessionId = sessionId;\n this.sessionStartedAt = startedAt;\n return;\n }\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]).catch(() => {});\n }\n }\n\n private setupAppStateListener(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n }\n\n this.appStateSubscription = AppState.addEventListener(\"change\", this.handleAppStateChange);\n }\n\n private handleAppStateChange = async (nextAppState: AppStateStatus): Promise<void> => {\n const previousState = this.appState;\n this.appState = nextAppState;\n\n if (nextAppState === \"active\" && previousState !== \"active\") {\n await this.handleForeground();\n } else if (nextAppState === \"background\" && previousState === \"active\") {\n await this.handleBackground();\n }\n };\n\n private async handleForeground(): Promise<void> {\n if (this.backgroundTimestamp) {\n const elapsed = Date.now() - this.backgroundTimestamp;\n this.backgroundTimestamp = null;\n\n if (elapsed > (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS)) {\n await this.startSession();\n await this.trackAppOpen();\n await this.checkEmergencyPaywall();\n return;\n }\n }\n\n if (!this.sessionId) {\n await this.startSession();\n }\n\n await this.trackAppOpen();\n await this.checkEmergencyPaywall();\n }\n\n private async handleBackground(): Promise<void> {\n this.backgroundTimestamp = Date.now();\n await this.trackAppBackground();\n }\n\n private async checkEmergencyPaywall(): Promise<void> {\n if (!this.apiClient || !this.emergencyPaywallHandler) {\n return;\n }\n\n if (this.emergencyPaywallShownInSession) {\n return;\n }\n\n const response = await this.apiClient.getEmergencyPaywall().catch(() => null);\n\n if (response?.enabled && response.paywallId) {\n this.emergencyPaywallShownInSession = true;\n await this.secureStorage!.set(EMERGENCY_PAYWALL_SHOWN_KEY, \"true\");\n await this.emergencyPaywallHandler(response.paywallId);\n }\n }\n\n private async trackSessionStart(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionStart(this.apiClient, this.sessionId, this.sessionStartedAt);\n }\n\n private async trackSessionEnd(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionEnd(this.apiClient, this.sessionId, this.getSessionDuration(), this.sessionStartedAt);\n }\n\n private async trackAppOpen(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppOpen(this.apiClient, this.sessionId);\n }\n\n private async trackAppBackground(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppBackground(this.apiClient, this.sessionId, this.getSessionDuration());\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SessionManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.warn(\"[Paywallo Session]\", ...args);\n }\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class SessionError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"session\", code, message);\n this.name = \"SessionError\";\n }\n}\n\nexport const SESSION_ERROR_CODES = {\n NOT_INITIALIZED: \"SESSION_NOT_INITIALIZED\",\n START_FAILED: \"SESSION_START_FAILED\",\n END_FAILED: \"SESSION_END_FAILED\",\n RESTORE_FAILED: \"SESSION_RESTORE_FAILED\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\n\nexport async function trackSessionStart(\n apiClient: ApiClient,\n sessionId: string,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$session_start\", distinctId, {\n sessionId,\n timestamp: sessionStartedAt?.toISOString() ?? null,\n })\n .catch(() => {});\n}\n\nexport async function trackSessionEnd(\n apiClient: ApiClient,\n sessionId: string,\n durationSeconds: number,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$session_end\", distinctId, {\n sessionId,\n durationSeconds,\n startedAt: sessionStartedAt?.toISOString() ?? null,\n endedAt: new Date().toISOString(),\n })\n .catch(() => {});\n}\n\nexport async function trackAppOpen(\n apiClient: ApiClient,\n sessionId: string | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$app_open\", distinctId, {\n sessionId,\n timestamp: new Date().toISOString(),\n })\n .catch(() => {});\n}\n\nexport async function trackAppBackground(\n apiClient: ApiClient,\n sessionId: string | null,\n durationSeconds: number\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$app_background\", distinctId, {\n sessionId,\n durationSeconds,\n timestamp: new Date().toISOString(),\n })\n .catch(() => {});\n}\n","import { ANALYTICS_ERROR_CODES,AnalyticsError } from \"../domains/analytics\";\nimport { CLIENT_ERROR_CODES,ClientError } from \"../errors/ClientError\";\nimport { PAYWALL_ERROR_CODES,PaywallError } from \"../domains/paywall\";\nimport type {\n CampaignResponse,\n CampaignResult,\n ConditionalFlagContext,\n IdentifyOptions,\n PaywallResult,\n RestoreResult,\n Subscription,\n TrackEventOptions,\n UserProperties,\n} from \"../types\";\n\nimport { affiliateManager } from \"../domains/affiliate\";\nimport { ApiClient } from \"./ApiClient\";\nimport { campaignGateService } from \"../domains/campaign\";\nimport { identityManager } from \"../domains/identity\";\nimport { InstallTracker } from \"../domains/identity\";\nimport { networkMonitor } from \"./network\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport type { EmergencyPaywallHandler } from \"../domains/session/types\";\nimport { sessionManager } from \"../domains/session\";\nimport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\nexport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\ntype PaywallPresenter = (placement: string) => Promise<PaywallResult>;\ntype CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\ntype SubscriptionGetter = () => Promise<Subscription | null>;\ntype ActiveChecker = () => Promise<boolean>;\ntype RestoreHandler = () => Promise<RestoreResult>;\n\nfunction isValidEventName(name: string): boolean {\n if (name.startsWith(\"$\")) return /^\\$[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n}\n\nclass PaywalloClientClass {\n private config: import(\"../types\").PaywalloConfig | null = null;\n private apiClient: ApiClient | null = null;\n private initPromise: Promise<void> | null = null;\n private paywallPresenter: PaywallPresenter | null = null;\n private campaignPresenter: CampaignPresenter | null = null;\n private subscriptionGetter: SubscriptionGetter | null = null;\n private activeChecker: ActiveChecker | null = null;\n private restoreHandler: RestoreHandler | null = null;\n private lastOnboardingStepTimestamp: number | null = null;\n private pendingConfig: PaywalloInitConfig | null = null;\n private networkCleanup: (() => void) | null = null;\n private initAttempts = 0;\n\n private static readonly MAX_INIT_RETRIES = 3;\n private static readonly RETRY_DELAYS = [2000, 5000, 10000];\n\n async init(config: PaywalloInitConfig): Promise<void> {\n console.warn(\"[Paywallo INIT]\", \"init() called — appKey:\", config.appKey ? config.appKey.substring(0, 8) + \"...\" : \"MISSING\");\n if (this.config && this.apiClient) {\n console.warn(\"[Paywallo INIT]\", \"Already initialized — skipping\");\n return;\n }\n if (this.initPromise) {\n console.warn(\"[Paywallo INIT]\", \"Init already in progress — awaiting...\");\n await this.initPromise;\n console.warn(\"[Paywallo INIT]\", \"Awaited existing init — done\");\n return;\n }\n if (!config.appKey) throw new ClientError(CLIENT_ERROR_CODES.MISSING_APP_KEY, \"appKey is required\");\n console.warn(\"[Paywallo INIT]\", \"Starting fresh init...\");\n this.pendingConfig = config;\n this.initAttempts = 0;\n this.initPromise = this.initWithRetry(config);\n try {\n await this.initPromise;\n console.warn(\"[Paywallo INIT]\", \"init() SUCCESS\");\n } catch (error) {\n console.warn(\"[Paywallo INIT]\", \"init() FAILED:\", error instanceof Error ? error.message : String(error));\n this.initPromise = null;\n this.config = null;\n this.apiClient = null;\n this.reportInitFailure(config, error, \"ALL_RETRIES_EXHAUSTED\");\n this.setupNetworkRecovery(config);\n throw error;\n }\n }\n\n private async initWithRetry(config: PaywalloInitConfig): Promise<void> {\n while (this.initAttempts <= PaywalloClientClass.MAX_INIT_RETRIES) {\n try {\n await this.doInit(config);\n if (this.initAttempts > 0) {\n this.reportInitSuccess(config, this.initAttempts);\n }\n this.cleanupNetworkRecovery();\n this.pendingConfig = null;\n return;\n } catch (error) {\n this.initAttempts++;\n if (this.initAttempts > PaywalloClientClass.MAX_INIT_RETRIES) throw error;\n const delay = PaywalloClientClass.RETRY_DELAYS[this.initAttempts - 1] ?? 10000;\n if (config.debug) console.warn(\"[Paywallo]\", `Init attempt ${this.initAttempts} failed, retrying in ${delay}ms`, error);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n private setupNetworkRecovery(config: PaywalloInitConfig): void {\n if (this.networkCleanup) return;\n if (!networkMonitor.isInitialized()) return;\n this.networkCleanup = networkMonitor.addListener((state) => {\n if (state !== \"online\") return;\n if (this.config && this.apiClient) return; // already init'd\n if (config.debug) console.warn(\"[Paywallo]\", \"Network recovered — retrying init\");\n this.initPromise = this.initWithRetry(config);\n this.initPromise\n .then(() => { if (config.debug) console.warn(\"[Paywallo]\", \"Init succeeded after network recovery\"); })\n .catch(() => { this.reportInitFailure(config, null, \"NETWORK_RECOVERY_FAILED\"); });\n });\n }\n\n private cleanupNetworkRecovery(): void {\n if (this.networkCleanup) { this.networkCleanup(); this.networkCleanup = null; }\n }\n\n private reportInitFailure(config: PaywalloInitConfig, error: unknown, reason: string): void {\n try {\n const tempClient = new ApiClient(config.appKey, config.debug);\n void tempClient.reportError(\"INIT_FAILED\", reason, {\n attempts: this.initAttempts,\n error: error instanceof Error ? error.message : String(error),\n });\n } catch { /* non-critical */ }\n }\n\n private reportInitSuccess(config: PaywalloInitConfig, attempts: number): void {\n try {\n if (this.apiClient) {\n void this.apiClient.reportError(\"INIT_RECOVERED\", `Succeeded after ${attempts} retries`, { attempts });\n }\n } catch { /* non-critical */ }\n }\n\n private async doInit(config: PaywalloInitConfig): Promise<void> {\n const environment = config.environment ?? (typeof __DEV__ !== \"undefined\" && __DEV__ ? \"Sandbox\" : \"Production\");\n const offlineQueueEnabled = config.offlineQueueEnabled !== false;\n\n console.warn(\"[Paywallo INIT]\", \"Step 1: networkMonitor + offlineQueue...\");\n // Group 1 — IO that doesn't depend on each other\n await Promise.all([\n networkMonitor.initialize({ debug: config.debug }),\n offlineQueue.initialize({ debug: config.debug }).then(() =>\n offlineQueue.clearItemsWithInvalidAppKey(config.appKey)\n ),\n ]);\n console.warn(\"[Paywallo INIT]\", \"Step 1 DONE\");\n\n console.warn(\"[Paywallo INIT]\", \"Step 2: ApiClient + queueProcessor + affiliate...\");\n this.apiClient = new ApiClient(config.appKey, config.debug, environment, offlineQueueEnabled, config.timeout);\n queueProcessor.initialize(this.apiClient.getHttpClient(), { debug: config.debug });\n affiliateManager.initialize(this.apiClient, config.debug);\n console.warn(\"[Paywallo INIT]\", \"Step 2 DONE\");\n\n console.warn(\"[Paywallo INIT]\", \"Step 3: identityManager + sessionManager...\");\n // Group 2 — both read SecureStorage independently\n await Promise.all([\n identityManager.initialize(this.apiClient, config.debug),\n sessionManager.initialize(this.apiClient, config.sessionConfig, config.debug),\n ]);\n const distinctId = identityManager.getDistinctId();\n console.warn(\"[Paywallo INIT]\", \"Step 3 DONE — distinctId:\", distinctId ? distinctId.substring(0, 8) + \"...\" : \"EMPTY\");\n\n // Fire-and-forget — don't block SDK ready\n if (config.autoStartSession !== false) {\n sessionManager.startSession().catch(() => {\n if (config.debug) console.warn(\"[Paywallo]\", \"Session start failed during init — continuing\");\n });\n }\n new InstallTracker(config.debug).trackIfNeeded(this.apiClient, config.requestATT === true).catch(() => {});\n this.config = config;\n console.warn(\"[Paywallo INIT]\", \"COMPLETE — SDK ready, environment:\", environment);\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n await identityManager.identify(options);\n }\n async track(eventName: string, options?: TrackEventOptions): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n console.warn(\"[Paywallo TRACK]\", \"SKIPPED — no distinctId\", eventName);\n return;\n }\n if (!isValidEventName(eventName)) {\n const msg = `Invalid event name: \"${eventName}\". Use snake_case or $reserved_name.`;\n throw new ClientError(CLIENT_ERROR_CODES.INVALID_EVENT_NAME, msg);\n }\n const sessionId = sessionManager.getSessionId();\n if (eventName === \"$purchase_completed\") {\n console.warn(\"[Paywallo PURCHASE]\", \"tracking purchase:\", JSON.stringify({\n distinctId: distinctId.substring(0, 8) + \"...\",\n productId: options?.properties?.productId,\n priceUsd: options?.properties?.priceUsd,\n price: options?.properties?.price,\n currency: options?.properties?.currency,\n placement: options?.properties?.placement,\n }));\n } else if (eventName === \"$paywall_viewed\" || eventName === \"$paywall_closed\") {\n console.warn(\"[Paywallo PAYWALL]\", eventName, JSON.stringify({\n distinctId: distinctId.substring(0, 8) + \"...\",\n placement: options?.properties?.placement,\n variantKey: options?.properties?.variantKey,\n timeOnPaywall: options?.properties?.timeOnPaywall,\n }));\n } else {\n console.warn(\"[Paywallo TRACK]\", eventName, \"distinctId:\", distinctId.substring(0, 8) + \"...\");\n }\n await apiClient.trackEvent(eventName, distinctId, {\n ...identityManager.getProperties(), ...options?.properties, ...(sessionId && { sessionId }),\n }, options?.timestamp);\n }\n\n async onboardingStep(index: number, name: string): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (this.config?.debug) console.warn(\"[Paywallo] Skipping event — no distinctId available\");\n return;\n }\n if (!Number.isInteger(index) || index < 0) {\n const msg = `Invalid stepIndex: \"${index}\". Must be a non-negative integer.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_STEP_INDEX, msg);\n }\n const now = Date.now();\n const timeOnPreviousStep = this.lastOnboardingStepTimestamp !== null\n ? Math.round((now - this.lastOnboardingStepTimestamp) / 1000)\n : 0;\n this.lastOnboardingStepTimestamp = now;\n const sessionId = sessionManager.getSessionId();\n await apiClient.trackEvent(\"$onboarding_step\", distinctId, {\n ...identityManager.getProperties(),\n stepIndex: index, stepName: name, timestamp: now, timeOnPreviousStep,\n ...(sessionId && { sessionId }),\n });\n }\n\n async coreAction(actionName: string): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (this.config?.debug) console.warn(\"[Paywallo] Skipping event — no distinctId available\");\n return;\n }\n if (!actionName || typeof actionName !== \"string\") {\n const msg = `Invalid actionName: \"${actionName}\". Must be a non-empty string.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_ACTION_NAME, msg);\n }\n const sessionId = sessionManager.getSessionId();\n await apiClient.trackEvent(\"$core_action\", distinctId, {\n ...identityManager.getProperties(), actionName, timestamp: Date.now(), ...(sessionId && { sessionId }),\n });\n }\n\n async getVariant(flagKey: string): Promise<import(\"../types\").FlagVariant> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n console.warn(\"[Paywallo AB]\", \"getVariant SKIPPED — no distinctId\", flagKey);\n return { variant: null };\n }\n const result = await this.getApiClientOrThrow().getVariant(flagKey, distinctId);\n console.warn(\"[Paywallo AB]\", `getVariant(\"${flagKey}\") =`, result.variant);\n return result;\n } catch (error) {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"getVariant failed — returning null\", error);\n if (this.apiClient) void this.apiClient.reportError(\"GET_VARIANT_FAILED\", error instanceof Error ? error.message : String(error));\n return { variant: null };\n }\n }\n async getConditionalFlag(flagKey: string, context?: Partial<ConditionalFlagContext>): Promise<boolean> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return false;\n const result = await this.getApiClientOrThrow().getConditionalFlag(flagKey, { distinctId, ...context });\n return result.value;\n } catch (error) {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"getConditionalFlag failed — returning false\", error);\n if (this.apiClient) void this.apiClient.reportError(\"GET_CONDITIONAL_FLAG_FAILED\", error instanceof Error ? error.message : String(error));\n return false;\n }\n }\n async getPaywall(placement: string): Promise<import(\"../types\").PaywallConfig | null> {\n return this.getApiClientOrThrow().getPaywall(placement);\n }\n async presentPaywall(placement: string): Promise<PaywallResult> {\n this.ensureInitialized();\n if (!this.paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return this.paywallPresenter(placement);\n }\n async getCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n return campaignGateService.getCampaign(this.getApiClientOrThrow(), placement, context);\n }\n async presentCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResult> {\n this.ensureInitialized();\n return campaignGateService.presentCampaign(this.getApiClientOrThrow(), placement, this.paywallPresenter, this.campaignPresenter, context);\n }\n async hasActiveSubscription(): Promise<boolean> {\n this.ensureInitialized();\n try {\n if (this.activeChecker) return await this.activeChecker();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !this.apiClient) return false;\n return (await this.apiClient.getSubscriptionStatus(distinctId)).hasActiveSubscription;\n } catch {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"hasActiveSubscription failed — returning false\");\n if (this.apiClient) void this.apiClient.reportError(\"SUBSCRIPTION_CHECK_FAILED\", \"hasActiveSubscription failed\");\n return false;\n }\n }\n\n async getSubscription(): Promise<Subscription | null> {\n this.ensureInitialized();\n try {\n if (this.subscriptionGetter) return await this.subscriptionGetter();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !this.apiClient) return null;\n const status = await this.apiClient.getSubscriptionStatus(distinctId);\n if (!status.subscription) return null;\n return { ...status.subscription, expiresAt: status.subscription.expiresAt ? new Date(status.subscription.expiresAt) : null };\n } catch {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"getSubscription failed — returning null\");\n return null;\n }\n }\n\n async restorePurchases(): Promise<RestoreResult> {\n this.ensureInitialized();\n if (!this.restoreHandler) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return this.restoreHandler();\n }\n async reset(): Promise<void> { await identityManager.reset(); }\n async fullReset(): Promise<void> {\n const wasDebug = this.config?.debug ?? false;\n await sessionManager.endSession();\n await identityManager.reset();\n queueProcessor.dispose(); offlineQueue.dispose(); networkMonitor.dispose();\n campaignGateService.clearPreloaded();\n this.cleanupNetworkRecovery();\n this.apiClient = null; this.config = null; this.initPromise = null;\n this.pendingConfig = null; this.initAttempts = 0;\n this.paywallPresenter = null; this.campaignPresenter = null;\n this.subscriptionGetter = null; this.activeChecker = null; this.restoreHandler = null;\n this.lastOnboardingStepTimestamp = null;\n if (wasDebug) console.warn(\"[Paywallo]\", \"Full reset complete\");\n }\n\n getConfig(): import(\"../types\").PaywalloConfig | null { return this.config; }\n getDistinctId(): string { return identityManager.getDistinctId(); }\n getDeviceId(): string | null { return identityManager.getDeviceId(); }\n getEmail(): string | null { return identityManager.getEmail(); }\n getEnvironment(): import(\"../types\").Environment { return this.apiClient?.getEnvironment() ?? \"Production\"; }\n setEnvironment(environment: import(\"../types\").Environment): void { this.apiClient?.setEnvironment(environment); }\n getApiClient(): ApiClient | null { return this.apiClient; }\n getWebUrl(): string | null { return this.apiClient?.getWebUrl() ?? null; }\n getIdentityState(): import(\"../domains/identity/IdentityManager\").IdentityState { return identityManager.getState(); }\n getSessionState(): import(\"../domains/session/types\").SessionState { return sessionManager.getState(); }\n getSessionId(): string | null { return sessionManager.getSessionId(); }\n async startSession(): Promise<string> { return sessionManager.startSession(); }\n async endSession(): Promise<void> { return sessionManager.endSession(); }\n registerPaywallPresenter(p: PaywallPresenter): void { this.paywallPresenter = p; }\n registerCampaignPresenter(p: CampaignPresenter): void { this.campaignPresenter = p; }\n registerSubscriptionGetter(g: SubscriptionGetter): void { this.subscriptionGetter = g; }\n registerActiveChecker(c: ActiveChecker): void { this.activeChecker = c; }\n registerRestoreHandler(h: RestoreHandler): void { this.restoreHandler = h; }\n registerEmergencyPaywallHandler(h: EmergencyPaywallHandler): void { sessionManager.registerEmergencyPaywallHandler(h); }\n\n async requireSubscription(paywallPlacement?: string): Promise<boolean> {\n this.ensureInitialized();\n if (await this.hasActiveSubscription()) return true;\n if (!paywallPlacement) return false;\n const r = await this.presentPaywall(paywallPlacement);\n return r.purchased || r.restored;\n }\n async requireSubscriptionWithCampaign(placement: string, context?: Record<string, unknown>): Promise<boolean> {\n this.ensureInitialized();\n return campaignGateService.requireSubscriptionWithCampaign(\n this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(),\n this.paywallPresenter, this.campaignPresenter, context,\n );\n }\n async gateContent<T>(content: () => T | Promise<T>, paywallPlacement?: string): Promise<T | null> {\n return (await this.requireSubscription(paywallPlacement)) ? content() : null;\n }\n async gateContentWithCampaign<T>(content: () => T | Promise<T>, placement: string, context?: Record<string, unknown>): Promise<T | null> {\n return (await this.requireSubscriptionWithCampaign(placement, context)) ? content() : null;\n }\n async preloadCampaign(placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n return campaignGateService.preloadCampaign(this.getApiClientOrThrow(), placement, context);\n }\n getPreloadedCampaign(placement: string): CampaignResponse | null { return campaignGateService.getPreloadedCampaign(placement); }\n isOnline(): boolean { return networkMonitor.isOnline(); }\n getOfflineQueueSize(): number { return offlineQueue.getSize(); }\n async clearOfflineQueue(): Promise<void> { await offlineQueue.clear(); }\n async processOfflineQueue(): Promise<{ processed: number; failed: number }> { return queueProcessor.processQueue(); }\n\n private getApiClientOrThrow(): ApiClient {\n if (!this.config || !this.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n return this.apiClient;\n }\n\n private ensureInitialized(): void {\n if (!this.config || !this.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n }\n}\n\nexport const PaywalloClient: IPaywalloClient = new PaywalloClientClass();\n\nexport { PaywalloAffiliate } from \"../domains/affiliate\";\n","import { createContext } from \"react\";\n\nimport type {\n CampaignResult,\n PaywalloConfig,\n PaywallConfig,\n PaywallResult,\n Subscription,\n} from \"../types\";\nimport type { Product } from \"../types/purchase\";\n\nexport interface PreloadResult {\n success: boolean;\n error?: Error;\n}\n\nexport interface PaywalloContextValue {\n config: PaywalloConfig | null;\n isInitialized: boolean;\n initError: Error | null;\n distinctId: string | null;\n subscription: Subscription | null;\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n presentPaywall: (placement: string) => Promise<PaywallResult>;\n presentCampaign: (\n placement: string,\n context?: Record<string, unknown>\n ) => Promise<CampaignResult>;\n preloadCampaign: (placement: string, context?: Record<string, unknown>) => Promise<PreloadResult>;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n restorePurchases: () => Promise<{ success: boolean; error?: Error }>;\n getPaywallConfig: (placement: string) => Promise<PaywallConfig | null>;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport const PaywalloContext = createContext<PaywalloContextValue | null>(null);\n","import { NativeModules, Platform } from \"react-native\";\n\nimport type { LocalizedText } from \"../types/blocks\";\n\nlet currentLanguage = \"pt-BR\";\nlet defaultLanguage = \"pt-BR\";\n\nexport function setCurrentLanguage(language: string): void {\n currentLanguage = language;\n}\n\nexport function setDefaultLanguage(language: string): void {\n defaultLanguage = language;\n}\n\nexport function getCurrentLanguage(): string {\n return currentLanguage;\n}\n\nexport function getDefaultLanguage(): string {\n return defaultLanguage;\n}\n\nexport function getLocalizedString(text: string | LocalizedText | undefined): string {\n if (!text) return \"\";\n if (typeof text === \"string\") return text;\n\n return text[currentLanguage] ?? text[defaultLanguage] ?? Object.values(text)[0] ?? \"\";\n}\n\nexport function detectDeviceLanguage(): string {\n try {\n if (Platform.OS === \"ios\") {\n const settings = (\n NativeModules as {\n SettingsManager?: { settings?: { AppleLocale?: string; AppleLanguages?: string[] } };\n }\n ).SettingsManager?.settings;\n return settings?.AppleLocale ?? settings?.AppleLanguages?.[0] ?? \"en-US\";\n }\n\n return (\n (NativeModules as { I18nManager?: { localeIdentifier?: string } }).I18nManager\n ?.localeIdentifier ?? \"en-US\"\n );\n } catch {\n return \"en-US\";\n }\n}\n\nexport function initLocalization(options?: {\n defaultLanguage?: string;\n detectDevice?: boolean;\n}): void {\n if (options?.defaultLanguage) {\n defaultLanguage = options.defaultLanguage;\n }\n\n if (options?.detectDevice !== false) {\n const deviceLanguage = detectDeviceLanguage();\n currentLanguage = deviceLanguage;\n }\n}\n","import { useContext } from \"react\";\n\nimport { PaywalloContext, PaywalloContextValue } from \"../context/PaywalloContext\";\nimport { CLIENT_ERROR_CODES,ClientError } from \"../errors/ClientError\";\n\nexport function usePaywallo(): PaywalloContextValue {\n const context = useContext(PaywalloContext);\n\n if (!context) {\n throw new ClientError(CLIENT_ERROR_CODES.PROVIDER_MISSING, \"usePaywallo must be used within a PaywalloProvider\");\n }\n\n return context;\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { getIAPService } from \"../domains/iap\";\nimport type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\nimport { mapToFormattedProduct, mapToIAPProduct } from \"../utils/productMappers\";\nimport type { FormattedProduct } from \"../utils/productMappers\";\n\ninterface UseProductsResult {\n products: IAPProduct[];\n formattedProducts: FormattedProduct[];\n isLoading: boolean;\n error: Error | null;\n loadProducts: (productIds: string[]) => Promise<void>;\n getProduct: (productId: string) => IAPProduct | undefined;\n getFormattedProduct: (productId: string) => FormattedProduct | undefined;\n getPriceInfo: (productId: string) => ProductPriceInfo | undefined;\n}\n\nexport function useProducts(initialProductIds?: string[]): UseProductsResult {\n const [products, setProducts] = useState<IAPProduct[]>([]);\n const [formattedProducts, setFormattedProducts] = useState<FormattedProduct[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const iapService = getIAPService();\n const storeProducts = await iapService.loadProducts(productIds);\n\n setProducts(storeProducts.map(mapToIAPProduct));\n setFormattedProducts(storeProducts.map(mapToFormattedProduct));\n } catch (err) {\n setError(err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err)));\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (initialProductIds && initialProductIds.length > 0) {\n void loadProducts(initialProductIds);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getProduct = useCallback(\n (productId: string): IAPProduct | undefined => {\n return products.find((p) => p.productId === productId);\n },\n [products]\n );\n\n const getFormattedProduct = useCallback(\n (productId: string): FormattedProduct | undefined => {\n return formattedProducts.find((p) => p.productId === productId);\n },\n [formattedProducts]\n );\n\n const getPriceInfo = useCallback(\n (productId: string): ProductPriceInfo | undefined => {\n const p = formattedProducts.find((fp) => fp.productId === productId);\n if (!p) return undefined;\n return {\n price: p.price,\n priceValue: p.priceValue,\n currency: p.currency,\n localizedPrice: p.localizedPrice,\n pricePerMonth: p.pricePerMonth,\n pricePerWeek: p.pricePerWeek,\n pricePerDay: p.pricePerDay,\n };\n },\n [formattedProducts]\n );\n\n return {\n products,\n formattedProducts,\n isLoading,\n error,\n loadProducts,\n getProduct,\n getFormattedProduct,\n getPriceInfo,\n };\n}\n","import type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\n\ntype RawStoreProduct = {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n pricePerMonth?: string;\n pricePerWeek?: string;\n pricePerDay?: string;\n};\n\nexport interface FormattedProduct extends ProductPriceInfo {\n productId: string;\n title: string;\n description: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n}\n\nexport function mapToIAPProduct(product: RawStoreProduct): IAPProduct {\n return {\n productId: product.productId,\n price: product.price,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n title: product.title,\n description: product.description,\n type: product.type === \"subscription\" ? \"subs\" : \"inapp\",\n subscriptionPeriodAndroid: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriodAndroid: product.freeTrialPeriod,\n };\n}\n\nexport function mapToFormattedProduct(product: RawStoreProduct): FormattedProduct {\n return {\n productId: product.productId,\n title: product.title,\n description: product.description,\n price: product.price,\n priceValue: product.priceValue,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n subscriptionPeriod: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriod: product.freeTrialPeriod,\n pricePerMonth: product.pricePerMonth,\n pricePerWeek: product.pricePerWeek,\n pricePerDay: product.pricePerDay,\n };\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { createPurchaseError, PURCHASE_ERROR_CODES,PurchaseError } from \"../domains/iap\";\nimport type { IAPPurchase, PurchaseState } from \"../domains/iap/types\";\n\ninterface UsePurchaseResult {\n state: PurchaseState;\n purchase: (productId: string) => Promise<IAPPurchase>;\n restore: () => Promise<IAPPurchase[]>;\n error: PurchaseError | null;\n isLoading: boolean;\n isPurchasing: boolean;\n isRestoring: boolean;\n}\n\nexport function usePurchase(): UsePurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n const [error, setError] = useState<PurchaseError | null>(null);\n\n const purchase = useCallback(async (productId: string): Promise<IAPPurchase> => {\n setState(\"purchasing\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n if (result.success && result.purchase) {\n setState(\"idle\");\n return {\n productId: result.purchase.productId,\n transactionId: result.purchase.transactionId,\n transactionDate: result.purchase.transactionDate,\n transactionReceipt: result.purchase.receipt,\n };\n }\n\n if (result.error) {\n const purchaseError = createPurchaseError(\"PURCHASE_FAILED\", result.error.message);\n setError(purchaseError);\n setState(\"error\");\n throw result.error;\n }\n\n // User cancelled\n setState(\"idle\");\n throw new PurchaseError(PURCHASE_ERROR_CODES.USER_CANCELLED, \"Purchase cancelled by user\", true);\n } catch (err) {\n setState(\"error\");\n throw err;\n }\n }, []);\n\n const restore = useCallback(async (): Promise<IAPPurchase[]> => {\n setState(\"restoring\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const transactions = await iapService.restore();\n\n setState(\"idle\");\n return transactions.map((tx) => ({\n productId: tx.productId,\n transactionId: tx.transactionId,\n transactionDate: tx.transactionDate,\n transactionReceipt: tx.receipt,\n }));\n } catch (err) {\n const e = err instanceof PurchaseError ? err : createPurchaseError(\"RESTORE_FAILED\", String(err));\n setError(e);\n setState(\"error\");\n throw e;\n }\n }, []);\n\n return {\n state,\n purchase,\n restore,\n error,\n isLoading: state === \"loading\",\n isPurchasing: state === \"purchasing\",\n isRestoring: state === \"restoring\",\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\nimport type { SubscriptionInfo, SubscriptionStatusResponse } from \"../domains/subscription/types\";\n\ninterface UseSubscriptionResult {\n subscription: SubscriptionInfo | null;\n isActive: boolean;\n isLoading: boolean;\n error: Error | null;\n entitlements: string[];\n refresh: () => Promise<void>;\n restore: () => Promise<void>;\n}\n\nexport function useSubscription(): UseSubscriptionResult {\n const [status, setStatus] = useState<SubscriptionStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.getSubscriptionStatus(true);\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const restore = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.restorePurchases();\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void subscriptionManager.getSubscriptionStatus().then((s) => {\n setStatus(s);\n setIsLoading(false);\n });\n\n const removeListener = subscriptionManager.addListener((newStatus) => {\n setStatus(newStatus);\n });\n\n return () => {\n removeListener();\n };\n }, []);\n\n return {\n subscription: status?.subscription ?? null,\n isActive: status?.hasActiveSubscription ?? false,\n isLoading,\n error,\n entitlements: status?.entitlements ?? [],\n refresh,\n restore,\n };\n}\n","import { Platform } from \"react-native\";\n\nimport { SESSION_ERROR_CODES, SessionError } from \"../session/SessionError\";\n\nimport { SubscriptionCache } from \"./SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionManagerConfig,\n SubscriptionStatusResponse,\n} from \"./types\";\n\ntype SubscriptionListener = (subscription: SubscriptionStatusResponse) => void;\n\nclass SubscriptionManagerClass {\n private config: SubscriptionManagerConfig | null = null;\n private cache: SubscriptionCache;\n private listeners: Set<SubscriptionListener> = new Set();\n private userId: string | null = null;\n\n constructor() {\n this.cache = new SubscriptionCache();\n }\n\n init(config: SubscriptionManagerConfig): void {\n this.config = config;\n if (config.cacheTTL) {\n this.cache.setTTL(config.cacheTTL);\n }\n }\n\n setUserId(userId: string | null): void {\n if (this.userId !== userId) {\n this.userId = userId;\n void this.cache.invalidate();\n }\n }\n\n async hasActiveSubscription(forceRefresh = false): Promise<boolean> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.hasActiveSubscription;\n }\n\n async getSubscription(forceRefresh = false): Promise<SubscriptionInfo | null> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.subscription;\n }\n\n async getEntitlements(forceRefresh = false): Promise<string[]> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.entitlements;\n }\n\n async getSubscriptionStatus(forceRefresh = false): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n if (!forceRefresh) {\n const cached = await this.cache.get();\n if (cached && !cached.isStale) {\n return cached.data;\n }\n }\n\n try {\n const status = await this.fetchSubscriptionStatus();\n await this.cache.set(status);\n this.notifyListeners(status);\n return status;\n } catch (error) {\n this.log(\"Failed to fetch subscription status\", error);\n\n const cached = await this.cache.get();\n if (cached) {\n return cached.data;\n }\n\n return this.getEmptyStatus();\n }\n }\n\n async restorePurchases(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SubscriptionManager not initialized\"\n );\n }\n\n await this.cache.invalidate();\n return this.getSubscriptionStatus(true);\n }\n\n private async fetchSubscriptionStatus(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n const url = new URL(`${this.config.serverUrl}/subscriptions/status`);\n if (this.userId) {\n url.searchParams.set(\"userId\", this.userId);\n }\n url.searchParams.set(\"platform\", Platform.OS);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-App-Key\": this.config.appKey,\n },\n });\n\n if (!response.ok) {\n throw new SessionError(\n SESSION_ERROR_CODES.RESTORE_FAILED,\n `Failed to fetch subscription status: ${response.status}`\n );\n }\n\n const data = (await response.json()) as SubscriptionStatusResponse;\n\n if (data.subscription) {\n data.subscription.expiresAt = new Date(data.subscription.expiresAt);\n data.subscription.originalPurchaseDate = new Date(data.subscription.originalPurchaseDate);\n data.subscription.latestPurchaseDate = new Date(data.subscription.latestPurchaseDate);\n if (data.subscription.cancellationDate) {\n data.subscription.cancellationDate = new Date(data.subscription.cancellationDate);\n }\n if (data.subscription.gracePeriodExpiresAt) {\n data.subscription.gracePeriodExpiresAt = new Date(data.subscription.gracePeriodExpiresAt);\n }\n }\n\n return data;\n }\n\n private getEmptyStatus(): SubscriptionStatusResponse {\n return {\n hasActiveSubscription: false,\n subscription: null,\n entitlements: [],\n };\n }\n\n addListener(listener: SubscriptionListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(status: SubscriptionStatusResponse): void {\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n\n async onPurchaseComplete(): Promise<void> {\n await this.cache.invalidate();\n await this.getSubscriptionStatus(true);\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config?.debug) {\n console.warn(`[SubscriptionManager] ${message}`, data ?? \"\");\n }\n }\n}\n\nexport const subscriptionManager = new SubscriptionManagerClass();\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedSubscription, SubscriptionStatusResponse } from \"./types\";\n\nconst CACHE_KEY = \"subscription_cache\";\nconst DEFAULT_TTL = 5 * 60 * 1000;\n\nexport class SubscriptionCache {\n private ttl: number;\n private memoryCache: CachedSubscription | null = null;\n private storage: SecureStorage;\n\n constructor(ttl: number = DEFAULT_TTL) {\n this.ttl = ttl;\n this.storage = new SecureStorage();\n }\n\n async get(): Promise<CachedSubscription | null> {\n if (this.memoryCache && !this.isExpired(this.memoryCache)) {\n return this.memoryCache;\n }\n\n try {\n const stored = await this.storage.get(CACHE_KEY);\n if (!stored) {\n return null;\n }\n\n const cached = JSON.parse(stored) as CachedSubscription;\n\n if (cached.data.subscription?.expiresAt) {\n cached.data.subscription.expiresAt = new Date(cached.data.subscription.expiresAt);\n }\n if (cached.data.subscription?.originalPurchaseDate) {\n cached.data.subscription.originalPurchaseDate = new Date(\n cached.data.subscription.originalPurchaseDate\n );\n }\n if (cached.data.subscription?.latestPurchaseDate) {\n cached.data.subscription.latestPurchaseDate = new Date(\n cached.data.subscription.latestPurchaseDate\n );\n }\n if (cached.data.subscription?.cancellationDate) {\n cached.data.subscription.cancellationDate = new Date(\n cached.data.subscription.cancellationDate\n );\n }\n if (cached.data.subscription?.gracePeriodExpiresAt) {\n cached.data.subscription.gracePeriodExpiresAt = new Date(\n cached.data.subscription.gracePeriodExpiresAt\n );\n }\n\n cached.isStale = this.isExpired(cached);\n // Only warm in-memory cache for fresh entries; stale entries are returned\n // to the caller but not cached in memory, so the next call re-reads from\n // disk and gets a fresh value if the caller has since refreshed storage.\n if (!cached.isStale) {\n this.memoryCache = cached;\n }\n\n return cached;\n } catch {\n return null;\n }\n }\n\n async set(data: SubscriptionStatusResponse): Promise<void> {\n const cached: CachedSubscription = {\n data,\n cachedAt: Date.now(),\n isStale: false,\n };\n\n this.memoryCache = cached;\n\n try {\n await this.storage.set(CACHE_KEY, JSON.stringify(cached));\n } catch {\n }\n }\n\n async invalidate(): Promise<void> {\n this.memoryCache = null;\n\n try {\n await this.storage.remove(CACHE_KEY);\n } catch {\n }\n }\n\n private isExpired(cached: CachedSubscription): boolean {\n return Date.now() - cached.cachedAt > this.ttl;\n }\n\n setTTL(ttl: number): void {\n this.ttl = ttl;\n }\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Dimensions, Easing, StyleSheet } from \"react-native\";\nimport { PaywallErrorBoundary } from \"./domains/paywall\";\nimport { PaywallModal } from \"./domains/paywall\";\nimport { PaywallWebView } from \"./domains/paywall\";\nimport { PaywalloContext, PaywalloContextValue } from \"./context/PaywalloContext\";\nimport { getIAPService } from \"./domains/iap\";\nimport { PaywalloClient } from \"./core/PaywalloClient\";\nimport { useCampaignPreload } from \"./hooks/useCampaignPreload\";\nimport { usePaywallPresenter } from \"./domains/paywall\";\nimport { useProductLoader } from \"./hooks/useProductLoader\";\nimport { usePurchaseOrchestrator } from \"./hooks/usePurchaseOrchestrator\";\nimport { useSubscriptionSync } from \"./hooks/useSubscriptionSync\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"./domains/campaign\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"./errors/ClientError\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./domains/iap\";\nimport type { CampaignResult, PaywalloConfig, PaywallConfig, PaywallResult, RestoreResult } from \"./types\";\nimport type { Product } from \"./types/purchase\";\nimport { initLocalization } from \"./utils/localization\";\n\ninterface PaywalloProviderProps { children: React.ReactNode; config: PaywalloConfig; }\ninterface ActivePaywall {\n placement: string;\n resolver: (result: PaywallResult) => void;\n paywallConfig?: { id: string; placement: string; config: Record<string, unknown>; primaryProductId?: string; secondaryProductId?: string };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n}\nexport function PaywalloProvider({ children, config }: PaywalloProviderProps): React.ReactElement {\n const [isInitialized, setIsInitialized] = useState(false);\n const [initError, setInitError] = useState<Error | null>(null);\n const [distinctId, setDistinctId] = useState<string | null>(null);\n const [activePaywall, setActivePaywall] = useState<ActivePaywall | null>(null);\n\n const { products, isLoadingProducts, refreshProducts } = useProductLoader();\n const { subscription, hasActiveSubscription, getSubscription, invalidateCache } = useSubscriptionSync();\n const { preloadedWebView, setPreloadedWebView, preloadCampaign, consumePreloadedCampaign, isPreloadValid } = useCampaignPreload();\n const clearPreloadedWebView = useCallback((): void => setPreloadedWebView(null), [setPreloadedWebView]);\n\n const { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef } =\n usePaywallPresenter(preloadedWebView, clearPreloadedWebView, setPreloadedWebView);\n\n const { handlePreloadedPurchase: rawPreloadedPurchase, handlePreloadedRestore } = usePurchaseOrchestrator(\n preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef\n );\n const [isPreloadPurchasing, setIsPreloadPurchasing] = useState(false);\n const handlePreloadedPurchase = useCallback(async (productId: string) => {\n setIsPreloadPurchasing(true);\n try { await rawPreloadedPurchase(productId); } finally { setIsPreloadPurchasing(false); }\n }, [rawPreloadedPurchase]);\n\n useEffect(() => {\n initLocalization({ detectDevice: true });\n PaywalloClient.init(config)\n .then(() => { setDistinctId(PaywalloClient.getDistinctId()); setIsInitialized(true); })\n .catch((err: unknown) => { setInitError(err instanceof Error ? err : new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, String(err))); });\n }, [config]);\n\n const getPaywallConfig = useCallback(async (p: string): Promise<PaywallConfig | null> => {\n const api = PaywalloClient.getApiClient(); return api ? api.getPaywall(p) : null;\n }, []);\n\n const presentPaywall = useCallback((placement: string): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => setActivePaywall({ placement, resolver: resolve }));\n }, []);\n\n const trackCampaignImpression = useCallback((placement: string, variantKey: string, campaignId: string): void => {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n void api.trackEvent(\"$campaign_impression\", PaywalloClient.getDistinctId(), { placement, variantKey, campaignId, ...(sessionId && { sessionId }) }).catch(() => {});\n }, []);\n\n const presentCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<CampaignResult> => {\n try {\n if (preloadedWebView?.placement === placement && preloadedWebView.loaded && isPreloadValid(placement)) {\n consumePreloadedCampaign(placement);\n const apiClient = PaywalloClient.getApiClient();\n if (apiClient) {\n const sessionId = PaywalloClient.getSessionId();\n void apiClient.trackEvent(\"$paywall_viewed\", PaywalloClient.getDistinctId(), {\n placement, paywallId: preloadedWebView.paywallId, preloaded: true,\n variantKey: preloadedWebView.variantKey ?? \"\", campaignId: preloadedWebView.campaignId ?? \"\",\n ...(sessionId && { sessionId }),\n });\n }\n trackCampaignImpression(placement, preloadedWebView.variantKey ?? \"\", preloadedWebView.campaignId ?? \"\");\n const r = await presentPreloadedWebView();\n return { ...r, campaignId: preloadedWebView.campaignId ?? \"\", variantKey: preloadedWebView.variantKey ?? \"\" };\n }\n const preloaded = consumePreloadedCampaign(placement);\n if (preloaded) {\n trackCampaignImpression(placement, preloaded.variantKey, preloaded.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: preloaded.paywall.placement, resolver: resolve,\n paywallConfig: preloaded.paywall, preloadedProducts: preloaded.products,\n variantKey: preloaded.variantKey, campaignId: preloaded.campaignId,\n }));\n return { ...r, campaignId: preloaded.campaignId, variantKey: preloaded.variantKey };\n }\n const campaign = PaywalloClient.getPreloadedCampaign(placement) ?? await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) return { presented: false, purchased: false, cancelled: false, restored: false,\n error: new CampaignError(campaign ? CAMPAIGN_ERROR_CODES.PRELOAD_FAILED : CAMPAIGN_ERROR_CODES.NOT_FOUND, campaign ? `No paywall: ${placement}` : `Campaign not found: ${placement}`) };\n trackCampaignImpression(placement, campaign.variantKey, campaign.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: campaign.paywall.placement, resolver: resolve,\n paywallConfig: { id: campaign.paywall.id, placement: campaign.paywall.placement, config: campaign.paywall.config,\n primaryProductId: campaign.paywall.primaryProductId, secondaryProductId: campaign.paywall.secondaryProductId },\n variantKey: campaign.variantKey, campaignId: campaign.campaignId,\n }));\n return { ...r, campaignId: campaign.campaignId, variantKey: campaign.variantKey };\n } catch (error) {\n return { presented: false, purchased: false, cancelled: false, restored: false,\n error: error instanceof Error ? error : new CampaignError(CAMPAIGN_ERROR_CODES.PRESENT_FAILED, String(error)) };\n }\n },\n [preloadedWebView, isPreloadValid, consumePreloadedCampaign, presentPreloadedWebView, trackCampaignImpression]\n );\n\n const restorePurchases = useCallback(async (): Promise<RestoreResult> => {\n invalidateCache();\n try {\n const txs = await getIAPService().restore();\n return txs.length > 0 ? { success: true, restoredProducts: txs.map((tx) => tx.productId) } : { success: false, restoredProducts: [] };\n } catch (error) {\n return { success: false, restoredProducts: [], error: error instanceof Error ? error : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(error)) };\n }\n }, [invalidateCache]);\n\n const handlePaywallResult = useCallback((result: PaywallResult): void => {\n if (activePaywall) { activePaywall.resolver(result); setActivePaywall(null); }\n }, [activePaywall]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const onEmergency = async (id: string): Promise<void> => { try { await presentPaywall(id); } catch { /* non-critical */ } };\n PaywalloClient.registerPaywallPresenter(presentPaywall);\n PaywalloClient.registerSubscriptionGetter(getSubscription);\n PaywalloClient.registerActiveChecker(hasActiveSubscription);\n PaywalloClient.registerRestoreHandler(restorePurchases);\n PaywalloClient.registerEmergencyPaywallHandler(onEmergency);\n }, [isInitialized, presentPaywall, getSubscription, hasActiveSubscription, restorePurchases]);\n\n useEffect(() => { if (activePaywall) setPreloadedWebView(null); }, [activePaywall, setPreloadedWebView]);\n\n const noOp = useCallback(() => {}, []);\n const contextValue: PaywalloContextValue = useMemo(() => ({\n config: PaywalloClient.getConfig(), isInitialized, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts,\n }), [isInitialized, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts]);\n\n const SCREEN_HEIGHT = useMemo(() => Dimensions.get(\"window\").height, []);\n const slideAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n useEffect(() => {\n if (showingPreloadedWebView) {\n slideAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(slideAnim, { toValue: 0, duration: 320, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n } else { slideAnim.setValue(SCREEN_HEIGHT); }\n }, [showingPreloadedWebView, slideAnim, SCREEN_HEIGHT]);\n\n const preloadStyle = [styles.preloadOverlay, showingPreloadedWebView ? styles.visible : styles.hidden,\n { transform: [{ translateY: showingPreloadedWebView ? slideAnim : SCREEN_HEIGHT }] }];\n\n return (\n <PaywalloContext.Provider value={contextValue}>\n {children}\n <PaywallErrorBoundary>\n {!!preloadedWebView?.craftData && (\n <Animated.View style={preloadStyle} pointerEvents={showingPreloadedWebView ? \"auto\" : \"none\"}>\n <PaywallWebView\n paywallId={preloadedWebView.paywallId} craftData={preloadedWebView.craftData}\n products={preloadedWebView.products} primaryProductId={preloadedWebView.primaryProductId}\n secondaryProductId={preloadedWebView.secondaryProductId} isPurchasing={isPreloadPurchasing}\n onReady={handlePreloadedWebViewReady} onClose={showingPreloadedWebView ? handlePreloadedClose : noOp}\n onPurchase={showingPreloadedWebView ? handlePreloadedPurchase : noOp}\n onRestore={showingPreloadedWebView ? handlePreloadedRestore : noOp}\n />\n </Animated.View>\n )}\n </PaywallErrorBoundary>\n <PaywallErrorBoundary>\n {activePaywall && (\n <PaywallModal placement={activePaywall.placement} visible={true} onResult={handlePaywallResult}\n paywallConfig={activePaywall.paywallConfig} preloadedProducts={activePaywall.preloadedProducts}\n variantKey={activePaywall.variantKey} campaignId={activePaywall.campaignId} />\n )}\n </PaywallErrorBoundary>\n </PaywalloContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n preloadOverlay: { position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: \"#ffffff\" },\n hidden: { zIndex: -1 },\n visible: { zIndex: 9999 },\n});\n","import { useCallback, useRef, useState } from \"react\";\n\nimport type { PreloadResult } from \"../context/PaywalloContext\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign/CampaignError\";\nimport { loadCampaignProducts } from \"../utils/loadCampaignProducts\";\nimport {\n consumeCacheEntry,\n isCacheEntryValid,\n type PreloadedCampaign,\n type PreloadedWebView,\n} from \"../utils/preloadCache\";\n\nexport type { PreloadedCampaign, PreloadedWebView };\n\nexport function useCampaignPreload() {\n const [preloadedWebView, setPreloadedWebView] = useState<PreloadedWebView | null>(null);\n const preloadedCampaignsRef = useRef<Map<string, PreloadedCampaign>>(new Map());\n\n const isPreloadValid = useCallback(\n (placement: string): boolean => isCacheEntryValid(preloadedCampaignsRef.current.get(placement)),\n []\n );\n\n const consumePreloadedCampaign = useCallback(\n (placement: string): PreloadedCampaign | null =>\n consumeCacheEntry(preloadedCampaignsRef.current, placement),\n []\n );\n\n const preloadCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<PreloadResult> => {\n try {\n const campaign = await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) {\n return {\n success: false,\n error: new CampaignError(\n CAMPAIGN_ERROR_CODES.NOT_FOUND,\n `Campaign or paywall not found: ${placement}`\n ),\n };\n }\n\n const { paywall } = campaign;\n const serverProducts = [paywall.primaryProduct, paywall.secondaryProduct].filter(Boolean);\n const storeProductIds = serverProducts.map((p) => p!.storeProductId).filter(Boolean);\n const productsMap = await loadCampaignProducts(\n serverProducts.map((p) => p!),\n storeProductIds\n );\n\n preloadedCampaignsRef.current.set(placement, {\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n paywall: {\n id: paywall.id,\n placement: paywall.placement,\n config: paywall.config,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n },\n products: productsMap,\n preloadedAt: Date.now(),\n });\n\n const craftData = (paywall.config as { craftData?: string })?.craftData ?? \"\";\n setPreloadedWebView({\n placement, paywallId: paywall.id, craftData, products: productsMap,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n loaded: false, campaignId: campaign.campaignId, variantKey: campaign.variantKey,\n });\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error\n ? error\n : new CampaignError(CAMPAIGN_ERROR_CODES.FETCH_FAILED, String(error)),\n };\n }\n },\n []\n );\n\n return {\n preloadedCampaignsRef,\n preloadedWebView,\n setPreloadedWebView,\n preloadCampaign,\n consumePreloadedCampaign,\n isPreloadValid,\n };\n}\n","import type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nconst PERIOD_MAP: Record<string, string> = {\n P1Y: \"ano\",\n P1M: \"mês\",\n P1W: \"semana\",\n P3M: \"trimestre\",\n P6M: \"semestre\",\n};\n\nexport function buildProductFromServerInfo(info: ServerProductInfo): Product {\n const period = PERIOD_MAP[info.billingPeriod ?? \"\"] ?? \"\";\n const priceStr = info.price != null ? `R$ ${info.price.toFixed(2).replace(\".\", \",\")}` : \"\";\n return {\n productId: info.storeProductId,\n title: info.name,\n description: \"\",\n price: priceStr,\n priceValue: info.price ?? 0,\n currency: \"BRL\",\n localizedPrice: priceStr,\n type: \"subscription\",\n subscriptionPeriod: period,\n freeTrialPeriod: info.trialDays ? `${info.trialDays} dias` : undefined,\n };\n}\n","import { getIAPService } from \"../domains/iap/IAPService\";\nimport { buildProductFromServerInfo } from \"./serverProduct\";\nimport type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nexport async function loadCampaignProducts(\n serverProducts: ServerProductInfo[],\n storeProductIds: string[]\n): Promise<Map<string, Product>> {\n const productsMap = new Map<string, Product>();\n\n if (storeProductIds.length > 0) {\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const storeProducts = await getIAPService().loadProducts(storeProductIds);\n if (storeProducts.length > 0) {\n for (const p of storeProducts) productsMap.set(p.productId, p as never);\n }\n if (productsMap.size >= storeProductIds.length) break;\n if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt)));\n } catch { if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt))); }\n }\n }\n\n for (const sp of serverProducts) {\n if (!productsMap.has(sp.storeProductId)) {\n const prod = buildProductFromServerInfo(sp);\n productsMap.set(prod.productId, prod as never);\n }\n }\n\n return productsMap;\n}\n","import type { Product } from \"../types/purchase\";\n\nexport interface PreloadedCampaign {\n campaignId: string;\n variantKey: string;\n paywall: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n products: Map<string, Product>;\n preloadedAt: number;\n}\n\nexport interface PreloadedWebView {\n placement: string;\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n loaded: boolean;\n campaignId?: string;\n variantKey?: string;\n}\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport function isCacheEntryValid(entry: PreloadedCampaign | undefined): boolean {\n return !!entry && Date.now() - entry.preloadedAt < CACHE_TTL_MS;\n}\n\nexport function consumeCacheEntry(\n cache: Map<string, PreloadedCampaign>,\n placement: string\n): PreloadedCampaign | null {\n const entry = cache.get(placement);\n if (!isCacheEntryValid(entry)) return null;\n cache.delete(placement);\n return entry ?? null;\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { Product } from \"../types/purchase\";\n\ninterface UseProductLoaderReturn {\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport function useProductLoader(): UseProductLoaderReturn {\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const [isLoadingProducts, setIsLoadingProducts] = useState(false);\n\n const refreshProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoadingProducts(true);\n try {\n const iapService = getIAPService();\n const loaded = await iapService.loadProducts(productIds);\n const map = new Map<string, Product>();\n for (const p of loaded) map.set(p.productId, p);\n setProducts(map);\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Product load failed:\", error);\n } finally {\n setIsLoadingProducts(false);\n }\n }, []);\n\n return { products, isLoadingProducts, refreshProducts };\n}\n","import { useCallback } from \"react\";\nimport type React from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { PaywallResult } from \"../types\";\n\nimport type { PreloadedWebView } from \"./useCampaignPreload\";\nimport { usePaywallTracking } from \"../domains/paywall\";\n\ninterface UsePurchaseOrchestratorReturn {\n handlePreloadedPurchase: (productId: string) => Promise<void>;\n handlePreloadedRestore: () => Promise<void>;\n}\n\nexport function usePurchaseOrchestrator(\n preloadedWebView: PreloadedWebView | null,\n resolvePreloadedPaywall: (result: PaywallResult) => void,\n clearPreloadedWebView: () => void,\n setShowingPreloadedWebView: React.Dispatch<React.SetStateAction<boolean>>,\n presentedAtRef: React.MutableRefObject<number>\n): UsePurchaseOrchestratorReturn {\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const handlePreloadedPurchase = useCallback(\n async (productId: string): Promise<void> => {\n try {\n if (preloadedWebView) {\n trackProductSelected({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n const result = await getIAPService().purchase(productId, {\n paywallPlacement: preloadedWebView?.placement,\n variantKey: preloadedWebView?.variantKey,\n });\n if (!result.success) {\n if (result.error) {\n // Real error (validation failed, network error) — close and resolve\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n // No error = user cancelled — stay open to retry\n return;\n }\n\n if (preloadedWebView) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, durationSeconds, action: \"purchase\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n await trackPurchased({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: true, cancelled: false, restored: false });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Preloaded purchase error:\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n },\n [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, trackProductSelected, trackPurchased]\n );\n\n const handlePreloadedRestore = useCallback(async (): Promise<void> => {\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length === 0) return; // Nothing found — stay open\n\n if (preloadedWebView) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, durationSeconds, action: \"restore\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: true });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Preloaded restore error:\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n }, [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed]);\n\n return { handlePreloadedPurchase, handlePreloadedRestore };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { Subscription } from \"../types\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\ninterface CacheEntry {\n data: Subscription | null;\n expiresAt: number;\n}\n\nconst ACTIVE_STATUSES = [\"active\", \"in_grace_period\"];\n\ninterface UseSubscriptionSyncReturn {\n subscription: Subscription | null;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n invalidateCache: () => void;\n}\n\nexport function useSubscriptionSync(): UseSubscriptionSyncReturn {\n const [subscription, setSubscription] = useState<Subscription | null>(null);\n const cacheRef = useRef<CacheEntry | null>(null);\n\n const invalidateCache = useCallback((): void => {\n cacheRef.current = null;\n }, []);\n\n const fetchAndCache = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const status = await apiClient.getSubscriptionStatus(distinctId);\n const sub = status.subscription\n ? {\n ...status.subscription,\n expiresAt: status.subscription.expiresAt\n ? new Date(status.subscription.expiresAt)\n : null,\n }\n : null;\n\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n return sub;\n }, []);\n\n const hasActiveSubscription = useCallback(async (): Promise<boolean> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return false;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) {\n if (!cached.data) return false;\n if (!ACTIVE_STATUSES.includes(cached.data.status)) return false;\n if (cached.data.expiresAt && cached.data.expiresAt < new Date()) return false;\n return true;\n }\n\n try {\n const status = await apiClient.getSubscriptionStatus(distinctId);\n const sub = status.subscription\n ? {\n ...status.subscription,\n expiresAt: status.subscription.expiresAt\n ? new Date(status.subscription.expiresAt)\n : null,\n }\n : null;\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n return status.hasActiveSubscription;\n } catch {\n return false;\n }\n }, []);\n\n const getSubscription = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return cached.data;\n\n try {\n return await fetchAndCache();\n } catch {\n return null;\n }\n }, [fetchAndCache]);\n\n return { subscription, hasActiveSubscription, getSubscription, invalidateCache };\n}\n","import type { Product } from \"../types/purchase\";\nimport type { VariableContext } from \"./variableResolver\";\n\nexport function getProductVariable(product: Product | undefined, property: string): string {\n if (!product) return \"\";\n\n switch (property) {\n case \"id\": return product.productId;\n case \"name\": return product.title;\n case \"price\": return product.localizedPrice;\n case \"pricePerMonth\": return product.pricePerMonth ?? product.localizedPrice;\n case \"pricePerWeek\": return product.pricePerWeek ?? \"\";\n case \"pricePerDay\": return product.pricePerDay ?? \"\";\n case \"period\": return product.subscriptionPeriod ?? \"\";\n case \"trialPeriod\": return product.freeTrialPeriod ?? \"\";\n case \"introPrice\": return product.introductoryPrice ?? \"\";\n case \"savings\": return product.savings ?? \"\";\n case \"savingsPercent\": return product.savingsPercent ?? \"\";\n case \"hasFreeTrial\": return product.freeTrialPeriod ? \"true\" : \"false\";\n case \"hasIntroOffer\": return product.introductoryPrice ? \"true\" : \"false\";\n case \"renewalPeriod\": return product.subscriptionPeriod ?? \"\";\n default: return \"\";\n }\n}\n\nexport function resolveProductsVariable(parts: string[], context: VariableContext): string | null {\n if (parts[0] !== \"products\") return null;\n\n if (parts[1] === \"selected\" && context.selectedProductId) {\n return getProductVariable(context.products.get(context.selectedProductId), parts[2]);\n }\n if (parts[1] === \"primary\" && context.primaryProductId) {\n return getProductVariable(context.products.get(context.primaryProductId), parts[2]);\n }\n if (parts[1] === \"secondary\" && context.secondaryProductId) {\n return getProductVariable(context.products.get(context.secondaryProductId), parts[2]);\n }\n if (parts[1] === \"hasIntroductoryOffer\") {\n return Array.from(context.products.values()).some((p) => p.introductoryPrice) ? \"true\" : \"false\";\n }\n\n return null;\n}\n\nexport function resolveLegacyVariable(variableName: string, context: VariableContext): string | null {\n if (variableName === \"device_name\") return context.deviceInfo?.name ?? \"\";\n if (variableName === \"product_price\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.localizedPrice ?? \"\";\n }\n if (variableName === \"trial_period\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.freeTrialPeriod ?? \"\";\n }\n return null;\n}\n","import type { Product } from \"../types/purchase\";\nimport { resolveProductsVariable, resolveLegacyVariable } from \"./productVariableResolver\";\n\nexport interface VariableContext {\n selectedProductId?: string;\n primaryProductId?: string;\n secondaryProductId?: string;\n products: Map<string, Product>;\n customVariables?: Record<string, string>;\n deviceInfo?: {\n name?: string;\n model?: string;\n os?: string;\n osVersion?: string;\n locale?: string;\n };\n userInfo?: {\n id?: string;\n name?: string;\n email?: string;\n };\n}\n\nfunction resolveVariable(variableName: string, context: VariableContext): string {\n const parts = variableName.split(\".\");\n\n if (parts[0] === \"device\" && context.deviceInfo) {\n switch (parts[1]) {\n case \"name\": return context.deviceInfo.name ?? \"\";\n case \"model\": return context.deviceInfo.model ?? \"\";\n case \"os\": return context.deviceInfo.os ?? \"\";\n case \"osVersion\": return context.deviceInfo.osVersion ?? \"\";\n case \"locale\": return context.deviceInfo.locale ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"user\" && context.userInfo) {\n switch (parts[1]) {\n case \"id\": return context.userInfo.id ?? \"\";\n case \"name\": return context.userInfo.name ?? \"\";\n case \"email\": return context.userInfo.email ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"products\") {\n return resolveProductsVariable(parts, context) ?? \"\";\n }\n\n return resolveLegacyVariable(variableName, context) ?? context.customVariables?.[variableName] ?? \"\";\n}\n\nexport function resolveText(text: string, context: VariableContext): string {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n return text.replace(regex, (_, variableName: string) => {\n return resolveVariable(variableName.trim(), context);\n });\n}\n\nexport function parseVariables(text: string): string[] {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n const variables: string[] = [];\n let match;\n while ((match = regex.exec(text)) !== null) {\n variables.push(match[1].trim());\n }\n return variables;\n}\n\nexport function hasVariables(text: string): boolean {\n return /\\{\\{[^}]+\\}\\}/.test(text);\n}\n","import { PaywalloClient } from \"./core/PaywalloClient\";\n\nexport { PaywallModal } from \"./domains/paywall\";\nexport { PaywalloContext, type PreloadResult } from \"./context/PaywalloContext\";\nexport { PaywallContext, usePaywallContext } from \"./domains/paywall\";\nexport { AffiliateManager, affiliateManager } from \"./domains/affiliate\";\nexport { ApiClient, type ApiClientConfig } from \"./core/ApiClient\";\nexport {\n HttpClient,\n type HttpClientConfig,\n type HttpResponse,\n type RequestOptions,\n type RetryConfig,\n} from \"./core/http\";\nexport { getIAPService, IAPService } from \"./domains/iap\";\nexport { IdentityManager, identityManager, type IdentityState } from \"./domains/identity\";\nexport { nativeStoreKit } from \"./domains/iap\";\nexport {\n type NetworkListener,\n networkMonitor,\n type NetworkMonitorConfig,\n type NetworkState,\n} from \"./core/network\";\nexport {\n type IPaywalloClient,\n PaywalloClient,\n type PaywalloInitConfig,\n type PreloadCampaignResult,\n} from \"./core/PaywalloClient\";\nexport { PaywalloAffiliate } from \"./domains/affiliate\";\nexport {\n offlineQueue,\n type OfflineQueueConfig,\n type QueueEvent,\n type QueueItem,\n type QueueListener,\n queueProcessor,\n type QueueProcessorConfig,\n} from \"./core/queue\";\nexport {\n type SessionConfig,\n SessionManager,\n sessionManager,\n type SessionState,\n} from \"./domains/session\";\nexport {\n AFFILIATE_ERROR_CODES,\n AffiliateError,\n ANALYTICS_ERROR_CODES,\n AnalyticsError,\n CAMPAIGN_ERROR_CODES,\n CampaignError,\n createPurchaseError,\n IDENTITY_ERROR_CODES,\n IdentityError,\n PaywalloError,\n PAYWALL_ERROR_CODES,\n PaywallError,\n PURCHASE_ERROR_CODES,\n PurchaseError,\n SESSION_ERROR_CODES,\n SessionError,\n} from \"./errors\";\nexport { usePaywallo } from \"./hooks/usePaywallo\";\nexport { useProducts } from \"./hooks/useProducts\";\nexport { usePurchase } from \"./hooks/usePurchase\";\nexport { useSubscription } from \"./hooks/useSubscription\";\nexport { PaywalloProvider } from \"./PaywalloProvider\";\nexport type {\n IAPProduct,\n IAPPurchase,\n ProductPriceInfo,\n PurchaseControllerConfig,\n PurchaseState,\n} from \"./domains/iap\";\nexport { ERROR_CODES } from \"./domains/iap\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./domains/subscription\";\nexport { SubscriptionCache, subscriptionManager } from \"./domains/subscription\";\nexport type {\n AffiliateBalance,\n AffiliateCommission,\n AffiliateCoupon,\n BlockType,\n BoxSpacing,\n CampaignPresentOptions,\n CampaignResponse,\n CampaignResult,\n ConditionalFlagContext,\n ConditionalFlagResult,\n Environment,\n FlagVariant,\n IdentifyOptions,\n LocalizedText,\n PaywalloConfig,\n PaywallBlockConfig,\n PaywallConfig,\n PaywallNode,\n PaywallPresentOptions,\n PaywallResult,\n PaywallState,\n Product,\n Purchase,\n PurchaseResult,\n RestoreResult,\n Subscription,\n SubscriptionPlatform,\n SubscriptionStatus,\n SubscriptionStatusResponse,\n TapBehavior,\n TrackEventOptions,\n UserProperties,\n ValidatePurchaseResponse,\n WithdrawalRequest,\n} from \"./types\";\nexport {\n detectDeviceLanguage,\n getCurrentLanguage,\n getDefaultLanguage,\n getLocalizedString,\n initLocalization,\n setCurrentLanguage,\n setDefaultLanguage,\n} from \"./utils/localization\";\nexport type { VariableContext } from \"./utils/variableResolver\";\nexport { hasVariables, parseVariables, resolveText } from \"./utils/variableResolver\";\n\nexport const Paywallo = PaywalloClient;\nexport default Paywallo;\n"],"mappings":"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","names":["useEffect","useRef","Animated","Dimensions","StyleSheet","View","useCallback","Platform","Platform","useCallback","useRef","useState","useState","useRef","useCallback","useEffect","useRef","useState","NativeModules","NativeModules","useRef","useState","useCallback","useEffect","jsx","SCREEN_HEIGHT","Dimensions","useRef","Animated","useEffect","View","styles","StyleSheet","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","Platform","AsyncStorage","AsyncStorage","item","Platform","Platform","idfv","Dimensions","Platform","Platform","AppState","AppState","AsyncStorage","Dimensions","Platform","createContext","NativeModules","Platform","useContext","useContext","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useState","useState","useCallback","useCallback","useEffect","useState","Platform","Platform","useState","useCallback","useEffect","useCallback","useEffect","useMemo","useRef","useState","Animated","Dimensions","Easing","StyleSheet","useCallback","useRef","useState","useState","useRef","useCallback","useCallback","useState","useState","useCallback","useCallback","useCallback","useCallback","useRef","useState","CACHE_TTL_MS","useState","useRef","useCallback","jsx","jsxs","useState","useCallback","useEffect","r","useMemo","SCREEN_HEIGHT","Dimensions","useRef","Animated","Easing","styles","StyleSheet"]}
1
+ {"version":3,"sources":["../src/errors/PaywalloError.ts","../src/domains/analytics/AnalyticsError.ts","../src/errors/ClientError.ts","../src/domains/paywall/PaywallModal.tsx","../src/domains/paywall/usePaywallActions.ts","../src/domains/iap/IAPService.ts","../src/domains/iap/PurchaseError.ts","../src/domains/iap/NativeStoreKit.ts","../src/domains/identity/IdentityError.ts","../src/utils/uuid.ts","../src/core/storage/SecureStorage.ts","../src/domains/identity/IdentityManager.ts","../src/domains/paywall/usePaywallTracking.ts","../src/domains/paywall/usePaywallLoader.ts","../src/domains/paywall/PaywallError.ts","../src/domains/paywall/PaywallWebView.tsx","../src/domains/paywall/parseWebViewMessage.ts","../src/domains/paywall/paywallScripts.ts","../src/domains/paywall/PaywallErrorBoundary.tsx","../src/domains/paywall/PaywallContext.ts","../src/domains/paywall/usePaywallPresenter.ts","../src/domains/affiliate/AffiliateError.ts","../src/domains/affiliate/affiliateHttp.ts","../src/domains/affiliate/affiliateDateMappers.ts","../src/domains/affiliate/AffiliateManager.ts","../src/domains/affiliate/PaywalloAffiliate.ts","../src/domains/subscription/SubscriptionCache.ts","../src/core/ApiClient.ts","../src/core/apiUrlUtils.ts","../src/domains/iap/apiPurchaseMethods.ts","../src/core/http/types.ts","../src/core/http/HttpClient.ts","../src/core/network/NetworkMonitor.ts","../src/core/network/types.ts","../src/core/queue/OfflineQueue.ts","../src/core/queue/deduplication.ts","../src/core/queue/types.ts","../src/core/queue/QueueProcessor.ts","../src/core/ApiCache.ts","../src/domains/campaign/CampaignError.ts","../src/domains/campaign/CampaignGateService.ts","../src/domains/identity/AdvertisingIdManager.ts","../src/domains/identity/FacebookIdManager.ts","../src/domains/identity/InstallTracker.ts","../src/domains/identity/InstallReferrerManager.ts","../src/domains/session/SessionManager.ts","../src/domains/session/SessionError.ts","../src/domains/session/sessionTracking.ts","../src/core/PaywalloClient.ts","../src/context/PaywalloContext.ts","../src/utils/localization.ts","../src/hooks/usePaywallo.ts","../src/hooks/useProducts.ts","../src/utils/productMappers.ts","../src/hooks/usePurchase.ts","../src/hooks/useSubscription.ts","../src/domains/subscription/SubscriptionManager.ts","../src/PaywalloProvider.tsx","../src/hooks/useCampaignPreload.ts","../src/utils/serverProduct.ts","../src/utils/loadCampaignProducts.ts","../src/utils/preloadCache.ts","../src/hooks/useProductLoader.ts","../src/hooks/usePurchaseOrchestrator.ts","../src/hooks/useSubscriptionSync.ts","../src/utils/productVariableResolver.ts","../src/utils/variableResolver.ts","../src/index.ts"],"sourcesContent":["export class PaywalloError extends Error {\n readonly code: string;\n readonly domain: string;\n\n constructor(domain: string, code: string, message: string) {\n super(message);\n this.name = \"PaywalloError\";\n this.domain = domain;\n this.code = code;\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class AnalyticsError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"analytics\", code, message);\n this.name = \"AnalyticsError\";\n }\n}\n\nexport const ANALYTICS_ERROR_CODES = {\n NOT_INITIALIZED: \"ANALYTICS_NOT_INITIALIZED\",\n INVALID_STEP_INDEX: \"ANALYTICS_INVALID_STEP_INDEX\",\n INVALID_ACTION_NAME: \"ANALYTICS_INVALID_ACTION_NAME\",\n} as const;\n","import { PaywalloError } from \"./PaywalloError\";\n\nexport class ClientError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"client\", code, message);\n this.name = \"ClientError\";\n }\n}\n\nexport const CLIENT_ERROR_CODES = {\n NOT_INITIALIZED: \"CLIENT_NOT_INITIALIZED\",\n MISSING_APP_KEY: \"CLIENT_MISSING_APP_KEY\",\n INVALID_EVENT_NAME: \"CLIENT_INVALID_EVENT_NAME\",\n PROVIDER_MISSING: \"CLIENT_PROVIDER_MISSING\",\n UNKNOWN: \"CLIENT_UNKNOWN\",\n} as const;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Animated,\n Dimensions,\n Easing,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n View,\n} from \"react-native\";\n\nimport { usePaywallActions } from \"./usePaywallActions\";\nimport { usePaywallLoader } from \"./usePaywallLoader\";\nimport type { PaywallResult } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\n\nimport { PaywallWebView } from \"./PaywallWebView\";\n\nconst SCREEN_HEIGHT = Dimensions.get(\"window\").height;\n\ninterface PaywallModalProps {\n placement: string;\n visible: boolean;\n onResult: (result: PaywallResult) => void;\n paywallConfig?: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n}\n\nexport function PaywallModal({\n placement,\n visible,\n onResult,\n paywallConfig: preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId,\n}: PaywallModalProps): React.ReactElement | null {\n const { paywallConfig, products, error } = usePaywallLoader(\n placement,\n visible,\n preloadedConfig,\n preloadedProducts,\n variantKey,\n campaignId\n );\n\n const { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore } =\n usePaywallActions(placement, paywallConfig, onResult, variantKey, campaignId);\n\n const [webViewError, setWebViewError] = useState<{\n code: number;\n description: string;\n } | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n\n const retryCountRef = useRef(0);\n\n const handleWebViewError = useCallback(\n (err: { code: number; description: string; url?: string }) => {\n if (retryCountRef.current >= 1) {\n setWebViewError({ code: err.code, description: err.description });\n } else {\n retryCountRef.current += 1;\n setRetryCount(retryCountRef.current);\n }\n },\n []\n );\n\n const handleRetry = useCallback(() => {\n retryCountRef.current = 0;\n setWebViewError(null);\n setRetryCount(0);\n }, []);\n\n const openAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n useEffect(() => {\n if (visible) {\n openAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(openAnim, {\n toValue: 0,\n duration: 550,\n easing: Easing.out(Easing.cubic),\n useNativeDriver: true,\n }).start();\n }\n }, [visible, openAnim]);\n\n if (!visible) return null;\n\n return (\n <Modal\n visible={visible}\n animationType=\"none\"\n presentationStyle=\"overFullScreen\"\n onRequestClose={handleClose}\n transparent\n statusBarTranslucent\n >\n <View style={styles.overlay}>\n <Animated.View style={[styles.animatedContainer, { transform: [{ translateY: openAnim }] }]}>\n <View style={styles.container}>\n {error && (\n <View style={styles.errorContainer}>\n <Text style={styles.errorText}>{error.message}</Text>\n </View>\n )}\n\n {!error && paywallConfig && \"craftData\" in paywallConfig.config && (\n <>\n {webViewError ? (\n <View style={styles.fallbackContainer}>\n <View style={styles.fallbackCard}>\n <Text style={styles.fallbackTitle}>Algo deu errado</Text>\n <Text style={styles.fallbackDescription}>\n {webViewError.description}\n </Text>\n <Pressable style={styles.retryButton} onPress={handleRetry}>\n <Text style={styles.retryButtonText}>Tentar novamente</Text>\n </Pressable>\n <Pressable style={styles.closeButton} onPress={handleClose}>\n <Text style={styles.closeButtonText}>Fechar</Text>\n </Pressable>\n </View>\n </View>\n ) : (\n <PaywallWebView\n key={retryCount}\n paywallId={paywallConfig.id}\n craftData={paywallConfig.config.craftData}\n products={products}\n primaryProductId={paywallConfig.primaryProductId}\n secondaryProductId={paywallConfig.secondaryProductId}\n isPurchasing={isPurchasing}\n onClose={handleClose}\n onPurchase={handlePurchase}\n onRestore={handleRestore}\n onError={handleWebViewError}\n />\n )}\n </>\n )}\n </View>\n </Animated.View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { flex: 1, backgroundColor: \"rgba(0,0,0,0.3)\" },\n animatedContainer: { flex: 1, backgroundColor: \"#fff\" },\n container: { flex: 1, backgroundColor: \"#fff\" },\n errorContainer: { flex: 1, justifyContent: \"center\", alignItems: \"center\", padding: 20 },\n errorText: { fontSize: 16, color: \"#ef4444\", textAlign: \"center\" },\n fallbackContainer: {\n flex: 1, justifyContent: \"center\", alignItems: \"center\",\n backgroundColor: \"#111010\", padding: 24,\n },\n fallbackCard: {\n width: \"100%\", maxWidth: 360, alignItems: \"center\",\n backgroundColor: \"rgba(255,255,255,0.07)\", borderRadius: 16, padding: 28,\n },\n fallbackTitle: {\n fontSize: 18, fontWeight: \"600\", color: \"#f5f5f5\",\n marginBottom: 10, textAlign: \"center\",\n },\n fallbackDescription: {\n fontSize: 14, color: \"rgba(255,255,255,0.55)\",\n textAlign: \"center\", marginBottom: 28, lineHeight: 20,\n },\n retryButton: {\n width: \"100%\", backgroundColor: \"#ffffff\", borderRadius: 10,\n paddingVertical: 14, alignItems: \"center\", marginBottom: 12,\n },\n retryButtonText: { fontSize: 15, fontWeight: \"600\", color: \"#111010\" },\n closeButton: {\n width: \"100%\", borderRadius: 10, paddingVertical: 14,\n alignItems: \"center\", backgroundColor: \"rgba(255,255,255,0.1)\",\n },\n closeButtonText: { fontSize: 15, fontWeight: \"500\", color: \"rgba(255,255,255,0.7)\" },\n});\n","import { useCallback, useRef, useState } from \"react\";\nimport { Animated, Dimensions } from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getIAPService } from \"../iap/IAPService\";\nimport type { PaywallConfig, PaywallResult } from \"../../types\";\n\nimport { usePaywallTracking } from \"./usePaywallTracking\";\n\nconst SCREEN_HEIGHT = Dimensions.get(\"window\").height;\n\nexport interface UsePaywallActionsResult {\n isPurchasing: boolean;\n slideAnim: Animated.Value;\n handleClose: () => void;\n handlePurchase: (productId: string) => Promise<void>;\n handleRestore: () => Promise<void>;\n}\n\nexport function usePaywallActions(\n placement: string,\n paywallConfig: PaywallConfig | null,\n onResult: (result: PaywallResult) => void,\n variantKey?: string,\n campaignId?: string\n): UsePaywallActionsResult {\n const [isPurchasing, setIsPurchasing] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n const slideAnim = useRef(new Animated.Value(0)).current;\n const presentedAtRef = useRef<number>(Date.now());\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const handleClose = useCallback(() => {\n if (isClosing) return;\n setIsClosing(true);\n Animated.timing(slideAnim, { toValue: SCREEN_HEIGHT, duration: 300, useNativeDriver: true }).start(() => {\n if (paywallConfig) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n void trackDismissed({ placement, paywallId: paywallConfig.id, durationSeconds, action: \"close\", variantKey, campaignId });\n }\n slideAnim.setValue(0);\n setIsClosing(false);\n onResult({ presented: true, purchased: false, cancelled: true, restored: false });\n });\n }, [isClosing, onResult, paywallConfig, placement, slideAnim, trackDismissed, variantKey, campaignId]);\n\n const handlePurchase = useCallback(async (productId: string) => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n try {\n if (paywallConfig) trackProductSelected({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId });\n const result = await getIAPService().purchase(productId, { paywallPlacement: placement, variantKey });\n if (result.success) {\n if (paywallConfig) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement, paywallId: paywallConfig.id, durationSeconds, action: \"purchase\", variantKey, campaignId });\n await trackPurchased({ placement, paywallId: paywallConfig.id, productId, variantKey, campaignId });\n }\n onResult({ presented: true, purchased: true, cancelled: false, restored: false });\n } else if (result.error) {\n // Real error (validation failed, store error) — notify caller\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n // No error and no success = user cancelled — keep paywall open for retry\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Purchase error:\", error);\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, trackProductSelected, trackPurchased, variantKey, campaignId]);\n\n const handleRestore = useCallback(async () => {\n if (isPurchasing) return;\n setIsPurchasing(true);\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length > 0) {\n if (paywallConfig) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement, paywallId: paywallConfig.id, durationSeconds, action: \"restore\", variantKey, campaignId });\n }\n onResult({ presented: true, purchased: false, cancelled: false, restored: true });\n } else {\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Restore error:\", error);\n onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n } finally {\n setIsPurchasing(false);\n }\n }, [isPurchasing, onResult, paywallConfig, placement, trackDismissed, variantKey, campaignId]);\n\n return { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore };\n}\n","import { Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport type { Product, Purchase, PurchaseResult, ValidatePurchaseResponse } from \"../../types/purchase\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { nativeStoreKit as NativeStoreKit } from \"./NativeStoreKit\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\nexport class IAPService {\n private productsCache: Map<string, Product> = new Map();\n private apiClient: ApiClient | null = null;\n\n constructor(apiClient?: ApiClient) {\n this.apiClient = apiClient ?? null;\n }\n\n private get debug(): boolean {\n return PaywalloClient.getConfig()?.debug ?? false;\n }\n\n private getDeviceCountry(): string {\n try {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n const parts = locale.split(\"-\");\n return parts[parts.length - 1]?.toUpperCase() || \"US\";\n } catch {\n return \"US\";\n }\n }\n\n private getApiClient(): ApiClient {\n if (this.apiClient) return this.apiClient;\n const client = PaywalloClient.getApiClient();\n if (!client)\n throw new PurchaseError(PURCHASE_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return client;\n }\n\n isAvailable(): boolean {\n return NativeStoreKit.isAvailable();\n }\n\n async loadProducts(productIds: string[]): Promise<Product[]> {\n if (!NativeStoreKit.isAvailable()) {\n return [];\n }\n\n try {\n const products = await NativeStoreKit.getProducts(productIds);\n for (const product of products) {\n this.productsCache.set(product.productId, product);\n }\n return products;\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo][Products] StoreKit error:\", error);\n return [];\n }\n }\n\n getProduct(productId: string): Product | undefined {\n return this.productsCache.get(productId);\n }\n\n getCachedProducts(): Map<string, Product> {\n return new Map(this.productsCache);\n }\n\n private async validateWithServer(\n purchase: Purchase,\n productId: string,\n options?: { paywallPlacement?: string; variantKey?: string }\n ): Promise<ValidatePurchaseResponse> {\n const apiClient = this.getApiClient();\n const product = this.productsCache.get(productId);\n const platform = Platform.OS as \"ios\" | \"android\";\n const distinctId = PaywalloClient.getDistinctId();\n\n const validation = await apiClient.validatePurchase(\n platform,\n purchase.receipt,\n purchase.productId,\n purchase.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId,\n options?.paywallPlacement,\n options?.variantKey\n );\n\n return validation;\n }\n\n private async finishTransaction(transactionId: string): Promise<void> {\n try {\n await NativeStoreKit.finishTransaction(transactionId);\n } catch (finishError) {\n if (this.debug) console.warn(\"[Paywallo][Purchase] Failed to finish transaction:\", finishError instanceof Error ? finishError.message : finishError);\n }\n }\n\n async purchase(productId: string, options?: { paywallPlacement?: string; variantKey?: string }): Promise<PurchaseResult> {\n if (!NativeStoreKit.isAvailable()) {\n if (this.debug) console.warn(\"[Paywallo][Purchase] StoreKit not available\");\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE, \"In-app purchases are not available on this device\"),\n };\n }\n\n try {\n const purchase = await NativeStoreKit.purchase(productId);\n\n if (!purchase) {\n return { success: false };\n }\n\n let validation: ValidatePurchaseResponse | null = null;\n try {\n validation = await this.validateWithServer(purchase, productId, options);\n } catch (validationError) {\n if (this.debug) console.warn(\"[Paywallo][Purchase] Server validation FAILED:\", validationError instanceof Error ? validationError.message : validationError);\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.VALIDATION_FAILED, validationError instanceof Error ? validationError.message : \"Server validation failed\"),\n };\n }\n\n if (!validation?.success) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.VALIDATION_FAILED, validation?.error ? `Server validation: ${validation.error}` : \"Server validation failed\"),\n };\n }\n\n await this.finishTransaction(purchase.transactionId);\n return { success: true, purchase };\n } catch (error) {\n const e = error instanceof PurchaseError ? error : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, error instanceof Error ? error.message : String(error));\n if (this.debug) console.warn(\"[Paywallo][Purchase] FAILED:\", e.message);\n return { success: false, error: e };\n }\n }\n\n async restore(): Promise<Purchase[]> {\n if (!NativeStoreKit.isAvailable()) {\n return [];\n }\n\n try {\n const transactions = await NativeStoreKit.getActiveTransactions();\n\n const apiClient = this.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n const platform = Platform.OS as \"ios\" | \"android\";\n\n const results = await Promise.allSettled(\n transactions.map((tx) => {\n const product = this.productsCache.get(tx.productId);\n return apiClient.validatePurchase(\n platform,\n tx.receipt,\n tx.productId,\n tx.transactionId,\n product?.priceValue ?? 0,\n product?.currency ?? \"USD\",\n this.getDeviceCountry(),\n distinctId\n );\n })\n );\n\n const validated: Purchase[] = [];\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n const tx = transactions[i];\n if (r.status === \"fulfilled\" && r.value.success) {\n try {\n await NativeStoreKit.finishTransaction(tx.transactionId);\n } catch (finishError) {\n if (this.debug) console.warn(\"[Paywallo][Restore] Failed to finish tx:\", tx.transactionId, finishError instanceof Error ? finishError.message : finishError);\n }\n validated.push(tx);\n }\n }\n\n return validated;\n } catch (error) {\n if (this.debug) console.warn(\"[Paywallo][Restore] ❌ FAILED:\", error instanceof Error ? error.message : error);\n return [];\n }\n }\n}\n\nlet _instance: IAPService | null = null;\n\nexport function getIAPService(): IAPService {\n if (!_instance) {\n _instance = new IAPService();\n }\n return _instance;\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PurchaseError extends PaywalloError {\n readonly userCancelled: boolean;\n\n constructor(code: string, message: string, userCancelled = false) {\n super(\"purchase\", code, message);\n this.name = \"PurchaseError\";\n this.userCancelled = userCancelled;\n }\n}\n\nexport const PURCHASE_ERROR_CODES = {\n NOT_INITIALIZED: \"PURCHASE_NOT_INITIALIZED\",\n PRODUCT_NOT_FOUND: \"PRODUCT_NOT_FOUND\",\n PURCHASE_FAILED: \"PURCHASE_FAILED\",\n RESTORE_FAILED: \"RESTORE_FAILED\",\n VALIDATION_FAILED: \"VALIDATION_FAILED\",\n USER_CANCELLED: \"USER_CANCELLED\",\n NETWORK_ERROR: \"PURCHASE_NETWORK_ERROR\",\n STORE_ERROR: \"PURCHASE_STORE_ERROR\",\n PENDING_PURCHASE: \"PURCHASE_PENDING\",\n DEFERRED_PURCHASE: \"PURCHASE_DEFERRED\",\n STORE_NOT_AVAILABLE: \"PURCHASE_STORE_NOT_AVAILABLE\",\n} as const;\n\nconst DEFAULT_MESSAGES: Record<keyof typeof PURCHASE_ERROR_CODES, string> = {\n NOT_INITIALIZED: \"Purchase controller not initialized. Call init() first.\",\n PRODUCT_NOT_FOUND: \"Product not found in store.\",\n PURCHASE_FAILED: \"Purchase failed. Please try again.\",\n RESTORE_FAILED: \"Failed to restore purchases. Please try again.\",\n VALIDATION_FAILED: \"Failed to validate purchase with server.\",\n USER_CANCELLED: \"Purchase was cancelled.\",\n NETWORK_ERROR: \"Network error. Please check your connection.\",\n STORE_ERROR: \"Store error. Please try again later.\",\n PENDING_PURCHASE: \"Purchase is pending approval.\",\n DEFERRED_PURCHASE: \"Purchase is deferred (e.g., parental approval required).\",\n STORE_NOT_AVAILABLE: \"In-app purchases are not available on this device.\",\n};\n\nexport function createPurchaseError(\n code: keyof typeof PURCHASE_ERROR_CODES,\n message?: string\n): PurchaseError {\n return new PurchaseError(\n PURCHASE_ERROR_CODES[code],\n message ?? DEFAULT_MESSAGES[code] ?? \"Unknown purchase error\",\n code === \"USER_CANCELLED\"\n );\n}\n","import { NativeModules, Platform } from \"react-native\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product, Purchase } from \"../../types/purchase\";\n\ninterface NativeStoreKitModule {\n getProducts(productIds: string[]): Promise<NativeProduct[]>;\n purchase(productId: string, appAccountToken: string | null): Promise<NativePurchaseResult | null>;\n finishTransaction(transactionId: string): Promise<void>;\n getActiveTransactions(): Promise<NativePurchaseResult[]>;\n}\n\ninterface NativeProduct {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n introductoryPriceValue?: number;\n freeTrialPeriod?: string;\n}\n\ninterface NativePurchaseResult {\n transactionId: string;\n productId: string;\n receipt: string;\n transactionDate: number;\n pending?: boolean;\n}\n\nconst PaywalloStoreKitNative: NativeStoreKitModule | null =\n (NativeModules.PaywalloStoreKit as NativeStoreKitModule | undefined) ?? null;\n\nfunction isAvailable(): boolean {\n return PaywalloStoreKitNative != null;\n}\n\nfunction mapNativeProduct(native: NativeProduct): Product {\n const product: Product = {\n productId: native.productId,\n title: native.title,\n description: native.description,\n price: native.price,\n priceValue: native.priceValue,\n currency: native.currency ?? \"USD\",\n localizedPrice: native.localizedPrice,\n type: mapProductType(native.type),\n subscriptionPeriod: native.subscriptionPeriod,\n introductoryPrice: native.introductoryPrice,\n introductoryPriceValue: native.introductoryPriceValue,\n freeTrialPeriod: native.freeTrialPeriod,\n };\n\n if (native.subscriptionPeriod) {\n const prices = calculatePerPeriodPrices(native.priceValue, native.subscriptionPeriod);\n product.pricePerMonth = prices.perMonth;\n product.pricePerWeek = prices.perWeek;\n product.pricePerDay = prices.perDay;\n }\n\n return product;\n}\n\nfunction mapProductType(type: string): Product[\"type\"] {\n switch (type) {\n case \"subscription\":\n case \"autoRenewable\":\n return \"subscription\";\n case \"consumable\":\n return \"consumable\";\n default:\n return \"non_consumable\";\n }\n}\n\nfunction calculatePerPeriodPrices(\n priceValue: number,\n period: string\n): { perMonth?: string; perWeek?: string; perDay?: string } {\n const totalDays = periodToDays(period);\n if (totalDays <= 0) return {};\n\n const perDay = priceValue / totalDays;\n const perWeek = perDay * 7;\n const perMonth = perDay * 30;\n\n return {\n perDay: perDay.toFixed(2),\n perWeek: perWeek.toFixed(2),\n perMonth: perMonth.toFixed(2),\n };\n}\n\nfunction periodToDays(period: string): number {\n const match = period.match(/^P(\\d+)([DWMY])$/);\n if (!match) return 0;\n\n const value = parseInt(match[1], 10);\n switch (match[2]) {\n case \"D\":\n return value;\n case \"W\":\n return value * 7;\n case \"M\":\n return value * 30;\n case \"Y\":\n return value * 365;\n default:\n return 0;\n }\n}\n\nfunction mapNativePurchase(native: NativePurchaseResult): Purchase {\n return {\n productId: native.productId,\n transactionId: native.transactionId,\n transactionDate: native.transactionDate,\n receipt: native.receipt,\n platform: Platform.OS as \"ios\" | \"android\",\n };\n}\n\nexport const nativeStoreKit = {\n isAvailable,\n\n async getProducts(productIds: string[]): Promise<Product[]> {\n if (!PaywalloStoreKitNative) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] StoreKit native module not available\");\n return [];\n }\n const nativeProducts = await PaywalloStoreKitNative.getProducts(productIds);\n return nativeProducts.map(mapNativeProduct);\n },\n\n async purchase(productId: string): Promise<Purchase | null> {\n if (!PaywalloStoreKitNative) {\n throw new PurchaseError(\n PURCHASE_ERROR_CODES.STORE_NOT_AVAILABLE,\n \"StoreKit native module not available\"\n );\n }\n const distinctId = identityManager.getDistinctId();\n const result = await PaywalloStoreKitNative.purchase(productId, distinctId ?? null);\n if (!result || result.pending) {\n return null;\n }\n return mapNativePurchase(result);\n },\n\n async finishTransaction(transactionId: string): Promise<void> {\n if (!PaywalloStoreKitNative) return;\n await PaywalloStoreKitNative.finishTransaction(transactionId);\n },\n\n async getActiveTransactions(): Promise<Purchase[]> {\n if (!PaywalloStoreKitNative) return [];\n const results = await PaywalloStoreKitNative.getActiveTransactions();\n return results.map(mapNativePurchase);\n },\n};\n\n/** @deprecated Use `nativeStoreKit` (camelCase) */\nexport const NativeStoreKit = nativeStoreKit;\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class IdentityError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"identity\", code, message);\n this.name = \"IdentityError\";\n }\n}\n\nexport const IDENTITY_ERROR_CODES = {\n NOT_INITIALIZED: \"IDENTITY_NOT_INITIALIZED\",\n DEVICE_ID_UNAVAILABLE: \"IDENTITY_DEVICE_ID_UNAVAILABLE\",\n STORAGE_READ_FAILED: \"IDENTITY_STORAGE_READ_FAILED\",\n STORAGE_WRITE_FAILED: \"IDENTITY_STORAGE_WRITE_FAILED\",\n IDENTIFY_FAILED: \"IDENTITY_IDENTIFY_FAILED\",\n} as const;\n","export function generateUUID(): string {\n const template = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";\n return template.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\n\ntype KeychainModule = {\n setGenericPassword: (username: string, password: string, options?: { service?: string }) => Promise<boolean>;\n getGenericPassword: (options?: { service?: string }) => Promise<false | { password: string }>;\n resetGenericPassword: (options?: { service?: string }) => Promise<boolean>;\n};\n\nlet _keychain: KeychainModule | null | undefined = undefined;\n\nasync function loadKeychain(): Promise<KeychainModule | null> {\n if (_keychain !== undefined) return _keychain;\n try {\n const mod = await import(\"react-native-keychain\");\n _keychain = mod.default as KeychainModule;\n } catch {\n _keychain = null;\n }\n return _keychain;\n}\n\nconst KEYCHAIN_SERVICE_PREFIX = \"com.paywallo.sdk.\";\n\nexport class SecureStorage {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(_debug = false) {}\n\n /**\n * Get a value, trying Keychain first (survives reinstalls on iOS), then AsyncStorage.\n */\n async get(key: string): Promise<string | null> {\n // Try Keychain first for keys that need reinstall persistence\n const keychainValue = await this.getFromKeychain(key);\n if (keychainValue) {\n return keychainValue;\n }\n\n try {\n const value = await AsyncStorage.getItem(`@paywallo:${key}`);\n if (value) {\n // Migrate to Keychain if available\n await this.setToKeychain(key, value);\n }\n return value;\n } catch {\n return null;\n }\n }\n\n /**\n * Set a value in both Keychain (if available) and AsyncStorage.\n */\n async set(key: string, value: string): Promise<boolean> {\n try {\n // Store in both for redundancy\n await Promise.all([\n AsyncStorage.setItem(`@paywallo:${key}`, value),\n this.setToKeychain(key, value),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n async remove(key: string): Promise<boolean> {\n try {\n await Promise.all([\n AsyncStorage.removeItem(`@paywallo:${key}`),\n this.removeFromKeychain(key),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n hasKeychainSupport(): boolean {\n return _keychain !== null && _keychain !== undefined;\n }\n\n private async getFromKeychain(key: string): Promise<string | null> {\n const keychain = await loadKeychain();\n if (!keychain) return null;\n try {\n const result = await keychain.getGenericPassword({ service: `${KEYCHAIN_SERVICE_PREFIX}${key}` });\n if (result && result.password) {\n return result.password;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private async setToKeychain(key: string, value: string): Promise<boolean> {\n const keychain = await loadKeychain();\n if (!keychain) return false;\n try {\n await keychain.setGenericPassword(\"panel\", value, { service: `${KEYCHAIN_SERVICE_PREFIX}${key}` });\n return true;\n } catch {\n return false;\n }\n }\n\n private async removeFromKeychain(key: string): Promise<boolean> {\n const keychain = await loadKeychain();\n if (!keychain) return false;\n try {\n await keychain.resetGenericPassword({ service: `${KEYCHAIN_SERVICE_PREFIX}${key}` });\n return true;\n } catch {\n return false;\n }\n }\n\n}\n\nexport const secureStorage = new SecureStorage();\n","import { IDENTITY_ERROR_CODES, IdentityError } from \"./IdentityError\";\nimport type { IdentifyOptions, UserProperties } from \"../../types\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst DEVICE_ID_KEY = \"device_id\";\nconst USER_EMAIL_KEY = \"user_email\";\nconst USER_PROPERTIES_KEY = \"user_properties\";\n\nexport interface IdentityState {\n deviceId: string;\n email: string | null;\n properties: UserProperties;\n}\n\nexport class IdentityManager {\n private deviceId: string | null = null;\n private email: string | null = null;\n private properties: UserProperties = {};\n private apiClient: ApiClient | null = null;\n private secureStorage: SecureStorage | null = null;\n private debug = false;\n private initialized = false;\n\n async initialize(apiClient: ApiClient, debug = false): Promise<string> {\n if (this.initialized) {\n return this.deviceId ?? \"\";\n }\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n\n await this.loadPersistedState();\n\n if (!this.deviceId) {\n type DeviceInfoMod = { getUniqueId: () => Promise<string> };\n let DeviceInfo: DeviceInfoMod | null = null;\n try {\n const mod = await import(\"react-native-device-info\");\n DeviceInfo = mod.default as DeviceInfoMod;\n } catch {\n DeviceInfo = null;\n }\n\n try {\n if (DeviceInfo) {\n this.deviceId = await DeviceInfo.getUniqueId();\n this.log(\"Got device ID from DeviceInfo:\", this.deviceId);\n } else {\n this.deviceId = generateUUID();\n this.log(\"DeviceInfo not installed, using generated UUID:\", this.deviceId);\n }\n } catch {\n this.deviceId = generateUUID();\n this.log(\"DeviceInfo unavailable, using generated UUID:\", this.deviceId);\n }\n const stored = await this.secureStorage.set(DEVICE_ID_KEY, this.deviceId);\n if (!stored) {\n this.log(\"Failed to persist device ID to secure storage, using fallback\");\n await this.secureStorage.set(\"device_id_fallback\", this.deviceId).catch(() => {\n this.log(\"Fallback also failed — device ID only in memory\");\n });\n }\n }\n\n this.initialized = true;\n return this.deviceId ?? \"\";\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n\n let email: string | undefined;\n let properties: UserProperties | undefined;\n\n if (options) {\n if (\"email\" in options || \"properties\" in options) {\n email = (options as IdentifyOptions).email;\n properties = (options as IdentifyOptions).properties;\n } else {\n properties = options as UserProperties;\n }\n }\n\n if (email) {\n this.email = email;\n await this.secureStorage!.set(USER_EMAIL_KEY, email);\n }\n\n if (properties) {\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n }\n\n if (this.apiClient && this.deviceId) {\n try {\n await this.apiClient.identify(this.deviceId, properties, email);\n this.log(\"Identity updated on server\");\n } catch (error) {\n this.log(\"Failed to update identity on server:\", error);\n }\n }\n }\n\n getDistinctId(): string {\n if (!this.initialized || !this.deviceId) {\n if (this.debug) console.warn(\"[Paywallo Identity] getDistinctId called before initialization\");\n return \"\";\n }\n return this.deviceId;\n }\n\n getDeviceId(): string | null {\n return this.deviceId;\n }\n\n getEmail(): string | null {\n return this.email;\n }\n\n getProperties(): UserProperties {\n return { ...this.properties };\n }\n\n async updateProperties(properties: UserProperties): Promise<void> {\n this.ensureInitialized();\n\n this.properties = { ...this.properties, ...properties };\n await this.secureStorage!.set(USER_PROPERTIES_KEY, JSON.stringify(this.properties));\n\n if (this.apiClient && this.deviceId) {\n try {\n await this.apiClient.identify(this.deviceId, this.properties, this.email ?? undefined);\n } catch (error) {\n this.log(\"Failed to update properties on server:\", error);\n }\n }\n }\n\n async reset(): Promise<void> {\n this.email = null;\n this.properties = {};\n this.initialized = false;\n this.apiClient = null;\n // Clear in-memory deviceId so getDeviceId() returns null until re-initialized.\n // SecureStorage is intentionally preserved — the same device ID is recovered on the\n // next initialize() call (desired behaviour for soft-reset / logout flows).\n this.deviceId = null;\n\n await Promise.all([\n this.secureStorage?.remove(USER_EMAIL_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PROPERTIES_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(\"device_id_fallback\") ?? Promise.resolve(false),\n ]);\n }\n\n getState(): IdentityState {\n return {\n deviceId: this.deviceId ?? \"\",\n email: this.email,\n properties: this.getProperties(),\n };\n }\n\n isSecureStorageAvailable(): boolean {\n return this.secureStorage !== null;\n }\n\n private async loadPersistedState(): Promise<void> {\n if (!this.secureStorage) {\n return;\n }\n\n const [storedDeviceId, storedEmail, storedPropertiesJson] = await Promise.all([\n this.secureStorage.get(DEVICE_ID_KEY),\n this.secureStorage.get(USER_EMAIL_KEY),\n this.secureStorage.get(USER_PROPERTIES_KEY),\n ]);\n\n if (storedDeviceId) {\n this.deviceId = storedDeviceId;\n this.log(\"Loaded device ID from storage:\", this.deviceId);\n } else {\n const fallbackDeviceId = await this.secureStorage.get(\"device_id_fallback\");\n if (fallbackDeviceId) {\n this.deviceId = fallbackDeviceId;\n this.log(\"Loaded device ID from fallback storage:\", this.deviceId);\n }\n }\n\n if (storedEmail) {\n this.email = storedEmail;\n }\n\n if (storedPropertiesJson) {\n try {\n this.properties = JSON.parse(storedPropertiesJson) as UserProperties;\n } catch {\n this.properties = {};\n }\n }\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new IdentityError(\n IDENTITY_ERROR_CODES.NOT_INITIALIZED,\n \"IdentityManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.warn(\"[Paywallo Identity]\", ...args);\n }\n }\n}\n\nexport const identityManager = new IdentityManager();\n","import { useCallback } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\ninterface TrackDismissedOptions {\n placement: string;\n paywallId: string;\n durationSeconds: number;\n action: \"close\" | \"purchase\" | \"restore\";\n variantKey?: string;\n campaignId?: string;\n}\n\ninterface TrackProductSelectedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n}\n\ninterface TrackPurchasedOptions {\n placement: string;\n paywallId: string;\n productId: string;\n variantKey?: string;\n campaignId?: string;\n}\n\nexport interface UsePaywallTrackingResult {\n trackDismissed: (opts: TrackDismissedOptions) => Promise<void>;\n trackProductSelected: (opts: TrackProductSelectedOptions) => void;\n trackPurchased: (opts: TrackPurchasedOptions) => Promise<void>;\n}\n\nexport function usePaywallTracking(): UsePaywallTrackingResult {\n const trackDismissed = useCallback(async (opts: TrackDismissedOptions): Promise<void> => {\n try {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n await api.trackEvent(\"$paywall_dismissed\", PaywalloClient.getDistinctId(), {\n placement: opts.placement,\n paywallId: opts.paywallId,\n durationSeconds: opts.durationSeconds,\n action: opts.action,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(sessionId && { sessionId }),\n });\n } catch { /* non-critical */ }\n }, []);\n\n const trackProductSelected = useCallback((opts: TrackProductSelectedOptions): void => {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n void api.trackEvent(\"$paywall_product_selected\", PaywalloClient.getDistinctId(), {\n placement: opts.placement,\n paywallId: opts.paywallId,\n productId: opts.productId,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(sessionId && { sessionId }),\n }).catch(() => { /* non-critical */ });\n }, []);\n\n const trackPurchased = useCallback(async (opts: TrackPurchasedOptions): Promise<void> => {\n try {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n await api.trackEvent(\"$paywall_purchased\", PaywalloClient.getDistinctId(), {\n placement: opts.placement,\n paywallId: opts.paywallId,\n productId: opts.productId,\n ...(opts.variantKey && { variantKey: opts.variantKey }),\n ...(opts.campaignId && { campaignId: opts.campaignId }),\n ...(sessionId && { sessionId }),\n });\n } catch { /* non-critical */ }\n }, []);\n\n return { trackDismissed, trackProductSelected, trackPurchased };\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getIAPService } from \"../iap/IAPService\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\nimport type { PaywallConfig } from \"../../types\";\nimport type { Product } from \"../../types/purchase\";\n\ninterface PreloadedConfig {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\ninterface UsePaywallLoaderResult {\n paywallConfig: PaywallConfig | null;\n products: Map<string, Product>;\n error: Error | null;\n}\n\nexport function usePaywallLoader(\n placement: string,\n visible: boolean,\n preloadedConfig?: PreloadedConfig,\n preloadedProducts?: Map<string, Product>,\n variantKey?: string,\n campaignId?: string\n): UsePaywallLoaderResult {\n const [error, setError] = useState<Error | null>(null);\n const [paywallConfig, setPaywallConfig] = useState<PaywallConfig | null>(null);\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const preloadedConfigRef = useRef(preloadedConfig);\n preloadedConfigRef.current = preloadedConfig;\n const preloadedProductsRef = useRef(preloadedProducts);\n preloadedProductsRef.current = preloadedProducts;\n const trackingDoneRef = useRef(false);\n\n useEffect(() => {\n if (!visible) { trackingDoneRef.current = false; return; }\n\n const load = async () => {\n setError(null);\n try {\n const apiClient = PaywalloClient.getApiClient();\n if (!apiClient) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n\n let config: PaywallConfig;\n const snap = preloadedConfigRef.current;\n if (snap) {\n config = { id: snap.id, placement: snap.placement, config: snap.config as { craftData: string },\n primaryProductId: snap.primaryProductId, secondaryProductId: snap.secondaryProductId };\n } else {\n const fetched = await apiClient.getPaywall(placement);\n if (!fetched) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_FOUND, `Paywall not found for placement: ${placement}`);\n config = fetched;\n }\n setPaywallConfig(config);\n\n const productIds: string[] = [];\n if (config.primaryProductId) productIds.push(config.primaryProductId);\n if (config.secondaryProductId) productIds.push(config.secondaryProductId);\n\n const snapProducts = preloadedProductsRef.current;\n if (snapProducts && snapProducts.size > 0) {\n setProducts(snapProducts);\n } else if (productIds.length > 0) {\n try {\n const storeProducts = await getIAPService().loadProducts(productIds);\n const map = new Map<string, Product>();\n for (const p of storeProducts) map.set(p.productId, p);\n setProducts(map);\n } catch { setProducts(new Map()); }\n } else {\n setProducts(new Map());\n }\n\n if (!trackingDoneRef.current) {\n trackingDoneRef.current = true;\n const sessionId = PaywalloClient.getSessionId();\n await apiClient.trackEvent(\"$paywall_viewed\", PaywalloClient.getDistinctId(), {\n placement, paywallId: config.id,\n ...(sessionId && { sessionId }),\n ...(variantKey && { variantKey }),\n ...(campaignId && { campaignId }),\n });\n }\n } catch (err) {\n const e = err instanceof Error ? err : new PaywallError(PAYWALL_ERROR_CODES.LOAD_FAILED, String(err));\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Error loading paywall:\", e.message);\n setError(e);\n }\n };\n\n void load();\n }, [placement, visible, variantKey, campaignId]);\n\n return { paywallConfig, products, error };\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class PaywallError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"paywall\", code, message);\n this.name = \"PaywallError\";\n }\n}\n\nexport const PAYWALL_ERROR_CODES = {\n NOT_INITIALIZED: \"PAYWALL_NOT_INITIALIZED\",\n NOT_FOUND: \"PAYWALL_NOT_FOUND\",\n RENDER_FAILED: \"PAYWALL_RENDER_FAILED\",\n LOAD_FAILED: \"PAYWALL_LOAD_FAILED\",\n DISMISS_FAILED: \"PAYWALL_DISMISS_FAILED\",\n INVALID_CONFIG: \"PAYWALL_INVALID_CONFIG\",\n} as const;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Linking,\n NativeEventEmitter,\n NativeModules,\n requireNativeComponent,\n StyleProp,\n StyleSheet,\n View,\n ViewStyle,\n} from \"react-native\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { Product } from \"../../types/purchase\";\nimport { parseWebViewMessage, WebViewMessage } from \"./parseWebViewMessage\";\nimport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\n\ninterface NativeWebViewProps {\n sourceUrl: string;\n injectedJavaScript?: string;\n onMessage?: (event: { nativeEvent: { data: string } }) => void;\n onLoadEnd?: () => void;\n onError?: (event: { nativeEvent: Record<string, unknown> }) => void;\n style?: StyleProp<ViewStyle>;\n ref?: React.Ref<View>;\n}\n\ninterface WebViewError {\n code: number;\n description: string;\n url?: string;\n}\n\nlet NativeWebViewComponent: ReturnType<typeof requireNativeComponent<NativeWebViewProps>> | null =\n null;\n\nfunction getNativeWebView(): ReturnType<typeof requireNativeComponent<NativeWebViewProps>> {\n if (!NativeWebViewComponent) {\n NativeWebViewComponent = requireNativeComponent<NativeWebViewProps>(\"PaywalloWebView\");\n }\n return NativeWebViewComponent;\n}\n\nlet webViewEmitter: NativeEventEmitter | null = null;\nfunction getWebViewEmitter(): NativeEventEmitter {\n if (!webViewEmitter) {\n webViewEmitter = new NativeEventEmitter(NativeModules.PaywalloWebViewModule);\n }\n return webViewEmitter;\n}\n\nfunction parseErrorEvent(raw: Record<string, unknown>): WebViewError {\n return {\n code: typeof raw[\"code\"] === \"number\" ? raw[\"code\"] : -1,\n description: typeof raw[\"description\"] === \"string\" ? raw[\"description\"] : \"WebView error\",\n url: typeof raw[\"url\"] === \"string\" ? raw[\"url\"] : undefined,\n };\n}\n\ninterface PaywallWebViewProps {\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n isPurchasing: boolean;\n onPurchase: (productId: string) => void;\n onClose: () => void;\n onRestore: () => void;\n onReady?: () => void;\n onError?: (error: WebViewError) => void;\n}\n\nexport function PaywallWebView({\n paywallId,\n craftData,\n products,\n primaryProductId,\n secondaryProductId,\n isPurchasing,\n onPurchase,\n onClose,\n onRestore,\n onReady,\n onError,\n}: PaywallWebViewProps): React.ReactElement {\n const paywallDataSent = useRef(false);\n const loadEndReceived = useRef(false);\n const [scriptToInject, setScriptToInject] = useState<string | undefined>(undefined);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n const NativeWebView = useMemo(() => getNativeWebView(), []);\n const webUrl = useMemo(() => PaywalloClient.getWebUrl() ?? \"http://localhost:3000\", []);\n\n const buildAndSetInjectionScript = useCallback(() => {\n if (!craftData || paywallDataSent.current) return;\n paywallDataSent.current = true;\n const script = buildPaywallInjectionScript({\n craftData,\n products: Array.from(products.values()),\n primaryProductId,\n secondaryProductId,\n });\n setScriptToInject(script);\n onReady?.();\n }, [craftData, products, primaryProductId, secondaryProductId, onReady]);\n\n // Deduplication: both NativeEventEmitter and RCTDirectEventBlock fire for the same message.\n // Track last processed message to prevent double execution of actions.\n const lastProcessedRef = useRef<{ type: string; time: number }>({ type: \"\", time: 0 });\n\n const handleParsedMessage = useCallback(\n (message: WebViewMessage) => {\n // Deduplicate: ignore same message type within 500ms\n const now = Date.now();\n if (message.type === lastProcessedRef.current.type && now - lastProcessedRef.current.time < 500) {\n return;\n }\n lastProcessedRef.current = { type: message.type, time: now };\n\n switch (message.type) {\n case \"ready\":\n if (!paywallDataSent.current) buildAndSetInjectionScript();\n break;\n case \"purchase\":\n if (message.payload?.productId) onPurchase(message.payload.productId);\n break;\n case \"close\":\n onClose();\n break;\n case \"restore\":\n onRestore();\n break;\n case \"open-url\":\n if (message.payload?.url) {\n const url = message.payload.url;\n if (/^https?:\\/\\//i.test(url) || /^mailto:/i.test(url)) {\n void Linking.openURL(url);\n }\n }\n break;\n }\n },\n [buildAndSetInjectionScript, onPurchase, onClose, onRestore]\n );\n\n useEffect(() => {\n const emitter = getWebViewEmitter();\n\n const loadEndSub = emitter.addListener(\"PaywalloWebViewLoadEnd\", () => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n });\n\n const messageSub = emitter.addListener(\"PaywalloWebViewMessage\", (event: { data: string }) => {\n const message = parseWebViewMessage(event.data);\n if (message) handleParsedMessage(message);\n });\n\n const errorSub = emitter.addListener(\n \"PaywalloWebViewError\",\n (event: Record<string, unknown>) => {\n onErrorRef.current?.(parseErrorEvent(event));\n }\n );\n\n return () => {\n loadEndSub.remove();\n messageSub.remove();\n errorSub.remove();\n };\n }, [buildAndSetInjectionScript, handleParsedMessage]);\n\n // 10-second load timeout: if paywallDataSent is still false, report a timeout error\n useEffect(() => {\n const timer = setTimeout(() => {\n if (!paywallDataSent.current) {\n onErrorRef.current?.({\n code: -1001,\n description: \"Paywall load timed out after 10 seconds\",\n });\n }\n }, 10_000);\n\n return () => clearTimeout(timer);\n }, []);\n\n // Also handle events via RCTDirectEventBlock (old arch fallback)\n const handleLoadEnd = useCallback(() => {\n if (!loadEndReceived.current) {\n loadEndReceived.current = true;\n buildAndSetInjectionScript();\n }\n }, [buildAndSetInjectionScript]);\n\n const handleNativeError = useCallback((event: { nativeEvent: Record<string, unknown> }) => {\n const ne = event.nativeEvent;\n let errorData: Record<string, unknown>;\n if (ne[\"payload\"] && typeof ne[\"payload\"] === \"object\") {\n errorData = ne[\"payload\"] as Record<string, unknown>;\n } else if (typeof ne[\"data\"] === \"string\") {\n try {\n errorData = JSON.parse(ne[\"data\"]) as Record<string, unknown>;\n } catch {\n errorData = {};\n }\n } else {\n errorData = {};\n }\n onErrorRef.current?.(parseErrorEvent(errorData));\n }, []);\n\n const handleMessage = useCallback(\n (event: { nativeEvent: { data: string } }) => {\n const message = parseWebViewMessage(event.nativeEvent.data);\n if (message) handleParsedMessage(message);\n },\n [handleParsedMessage]\n );\n\n useEffect(() => {\n if (!paywallDataSent.current) return;\n setScriptToInject(buildPurchaseStateScript(isPurchasing));\n }, [isPurchasing]);\n\n const paywallUrl = `${webUrl}/paywall/${paywallId}`;\n\n return (\n <View style={styles.container}>\n <NativeWebView\n sourceUrl={paywallUrl}\n injectedJavaScript={scriptToInject}\n onMessage={handleMessage}\n onLoadEnd={handleLoadEnd}\n onError={handleNativeError}\n style={styles.webview}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n webview: { flex: 1, backgroundColor: \"transparent\" },\n});\n","export interface WebViewMessage {\n type: \"purchase\" | \"close\" | \"restore\" | \"select-product\" | \"open-url\" | \"ready\";\n payload?: {\n productId?: string;\n url?: string;\n };\n}\n\n/**\n * Parses a raw JSON string from a WebView message event.\n * Returns the typed WebViewMessage or null if parsing fails or the message is invalid.\n */\nexport function parseWebViewMessage(raw: string): WebViewMessage | null {\n try {\n const parsed = JSON.parse(raw) as WebViewMessage;\n if (typeof parsed?.type !== \"string\") {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n","import type { Product } from \"../../types/purchase\";\n\ninterface PaywallInjectionData {\n craftData: string;\n products: Product[];\n primaryProductId?: string;\n secondaryProductId?: string;\n}\n\n/** Builds the JS injection script that sends paywall data into the WebView. */\nexport function buildPaywallInjectionScript(data: PaywallInjectionData): string {\n const paywallData = {\n type: \"paywall\",\n data: {\n craftData: data.craftData,\n products: data.products,\n primaryProductId: data.primaryProductId,\n secondaryProductId: data.secondaryProductId,\n },\n };\n\n return `(function(){var d=${JSON.stringify(paywallData)},a=0,m=50;function t(){a++;if(window.receiveNativeMessage){window.receiveNativeMessage(d);return;}if(a<m){setTimeout(t,100);}else{console.warn('[Paywallo WV] FAILED to inject after '+m+' attempts');}}t();})();true;`;\n}\n\n/** Builds the JS script that updates purchase state inside the WebView. */\nexport function buildPurchaseStateScript(isPurchasing: boolean): string {\n return `if(window.receiveNativeMessage){window.receiveNativeMessage({type:\"purchaseState\",data:{isPurchasing:${isPurchasing}}});}true;`;\n}\n","import React, { Component } from \"react\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\n\nexport class PaywallErrorBoundary extends Component<{ children: React.ReactNode }, { hasError: boolean }> {\n state = { hasError: false };\n static getDerivedStateFromError(): { hasError: boolean } { return { hasError: true }; }\n componentDidCatch(error: Error): void { if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Paywall render error:\", error.message); }\n render(): React.ReactNode { return this.state.hasError ? null : this.props.children; }\n}\n","import { createContext, useContext } from \"react\";\n\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"./PaywallError\";\nimport type { PaywallNode, TapBehavior } from \"../../types/blocks\";\nimport type { Product } from \"../../types/purchase\";\n\nexport interface PaywallContextValue {\n nodes: Record<string, PaywallNode>;\n rootId: string;\n language: string;\n defaultLanguage: string;\n products: Map<string, Product>;\n selectedProductId: string | null;\n primaryProductId: string | null;\n secondaryProductId: string | null;\n currentNavigationIndex: number;\n currentTabIndex: number;\n trialEnabled: boolean;\n selectedPeriod: string | null;\n isPurchasing: boolean;\n exitOfferVisible: boolean;\n exitOfferTriggeredByBackButton: boolean;\n\n onClose: () => void;\n onTryClose: () => void;\n onSelectProduct: (productId: string) => void;\n onPurchase: (productId: string) => void;\n onRestore: () => void;\n onNavigate: (target: \"next\" | \"previous\" | \"first\" | \"last\" | number) => void;\n onSetTab: (index: number) => void;\n onSetVariable: (name: string, value: string) => void;\n onToggleTrial: (enabled: boolean) => void;\n onSelectPeriod: (value: string) => void;\n onOpenUrl: (url: string, inBrowser?: boolean) => void;\n onTapBehavior: (behavior: TapBehavior) => void;\n onShowExitOffer: () => void;\n onDismissExitOffer: () => void;\n onTriggerBackButton: () => void;\n}\n\nexport const PaywallContext = createContext<PaywallContextValue | null>(null);\n\nexport function usePaywallContext(): PaywallContextValue {\n const context = useContext(PaywallContext);\n if (!context) {\n throw new PaywallError(\n PAYWALL_ERROR_CODES.NOT_INITIALIZED,\n \"usePaywallContext must be used within a Paywall component\"\n );\n }\n return context;\n}\n","import type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport type { PaywallResult } from \"../../types\";\n\nimport type { PreloadedWebView } from \"../../hooks/useCampaignPreload\";\n\ntype SetPreloadedWebView = Dispatch<SetStateAction<PreloadedWebView | null>>;\n\ninterface UsePaywallPresenterReturn {\n showingPreloadedWebView: boolean;\n presentPreloadedWebView: () => Promise<PaywallResult>;\n resolvePreloadedPaywall: (result: PaywallResult) => void;\n handlePreloadedWebViewReady: () => void;\n handlePreloadedClose: () => void;\n setShowingPreloadedWebView: Dispatch<SetStateAction<boolean>>;\n presentedAtRef: MutableRefObject<number>;\n}\n\nexport function usePaywallPresenter(\n preloadedWebView: PreloadedWebView | null,\n clearPreloadedWebView: () => void,\n setPreloadedWebView: SetPreloadedWebView\n): UsePaywallPresenterReturn {\n const [showingPreloadedWebView, setShowingPreloadedWebView] = useState(false);\n const resolverRef = useRef<((result: PaywallResult) => void) | null>(null);\n const presentedAtRef = useRef<number>(Date.now());\n\n useEffect(() => {\n return () => {\n if (resolverRef.current) {\n resolverRef.current({ presented: false, purchased: false, cancelled: true, restored: false });\n resolverRef.current = null;\n }\n };\n }, []);\n\n const presentPreloadedWebView = useCallback((): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => {\n resolverRef.current = resolve;\n presentedAtRef.current = Date.now();\n setShowingPreloadedWebView(true);\n });\n }, []);\n\n const resolvePreloadedPaywall = useCallback((result: PaywallResult): void => {\n if (resolverRef.current) { resolverRef.current(result); resolverRef.current = null; }\n }, []);\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n setPreloadedWebView((prev) => (prev ? { ...prev, loaded: true } : null));\n }, [setPreloadedWebView]);\n\n const handlePreloadedClose = useCallback((): void => {\n const track = async (): Promise<void> => {\n try {\n const apiClient = PaywalloClient.getApiClient();\n if (!apiClient || !preloadedWebView) return;\n const sessionId = PaywalloClient.getSessionId();\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await apiClient.trackEvent(\"$paywall_dismissed\", PaywalloClient.getDistinctId(), {\n placement: preloadedWebView.placement,\n paywallId: preloadedWebView.paywallId,\n durationSeconds,\n action: \"close\",\n ...(sessionId && { sessionId }),\n ...(preloadedWebView.variantKey && { variantKey: preloadedWebView.variantKey }),\n ...(preloadedWebView.campaignId && { campaignId: preloadedWebView.campaignId }),\n });\n } catch { /* Tracking failure is non-critical */ }\n };\n void track();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: true, restored: false });\n }, [preloadedWebView, clearPreloadedWebView, resolvePreloadedPaywall]);\n\n return { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef };\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class AffiliateError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"affiliate\", code, message);\n this.name = \"AffiliateError\";\n }\n}\n\nexport const AFFILIATE_ERROR_CODES = {\n NOT_INITIALIZED: \"AFFILIATE_NOT_INITIALIZED\",\n COUPON_REGISTER_FAILED: \"AFFILIATE_COUPON_REGISTER_FAILED\",\n COUPON_APPLY_FAILED: \"AFFILIATE_COUPON_APPLY_FAILED\",\n BALANCE_FETCH_FAILED: \"AFFILIATE_BALANCE_FETCH_FAILED\",\n WITHDRAWAL_FAILED: \"AFFILIATE_WITHDRAWAL_FAILED\",\n NETWORK_ERROR: \"AFFILIATE_NETWORK_ERROR\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\n\n/** Builds a query string from a params object, URL-encoding keys and values. */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params) return \"\";\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return \"\";\n return `?${entries.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`).join(\"&\")}`;\n}\n\n/** GET helper — returns the parsed response body. */\nexport async function affiliateGet<T>(\n apiClient: ApiClient,\n path: string,\n params?: Record<string, unknown>\n): Promise<T> {\n const response = await apiClient.get<T>(`${path}${buildQueryString(params)}`);\n return response.data;\n}\n\n/** POST helper — returns the parsed response body. */\nexport async function affiliatePost<T>(\n apiClient: ApiClient,\n path: string,\n body: Record<string, unknown>\n): Promise<T> {\n const response = await apiClient.post<T>(path, body);\n return response.data;\n}\n","import type { AffiliateCoupon, AffiliateCommission, WithdrawalRequest } from \"../../types\";\n\ntype RawCoupon = { code: string; status: string; createdAt: string };\ntype RawCommission = {\n id: string;\n referredDistinctId: string;\n purchaseAmount: number;\n commissionAmount: number;\n status: \"pending\" | \"eligible\" | \"ineligible\" | \"withdrawn\";\n createdAt: string;\n};\ntype RawWithdrawal = {\n id: string;\n amount: number;\n status: \"pending\" | \"approved\" | \"rejected\" | \"paid\";\n createdAt: string;\n};\n\nexport function mapRawCoupon(raw: RawCoupon): AffiliateCoupon {\n return { code: raw.code, status: raw.status, createdAt: new Date(raw.createdAt) };\n}\n\nexport function mapRawCommission(raw: RawCommission): AffiliateCommission {\n return { ...raw, createdAt: new Date(raw.createdAt) };\n}\n\nexport function mapRawWithdrawal(raw: RawWithdrawal): WithdrawalRequest {\n return { ...raw, createdAt: new Date(raw.createdAt) };\n}\n","import { AFFILIATE_ERROR_CODES, AffiliateError } from \"./AffiliateError\";\nimport type { AffiliateBalance, AffiliateCommission, AffiliateCoupon, WithdrawalRequest } from \"../../types\";\n\nimport { affiliateGet, affiliatePost } from \"./affiliateHttp\";\nimport { mapRawCommission, mapRawCoupon, mapRawWithdrawal } from \"./affiliateDateMappers\";\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\n\nexport class AffiliateManager {\n private apiClient: ApiClient | null = null;\n private debug = false;\n\n initialize(apiClient: ApiClient, debug = false): void {\n this.apiClient = apiClient;\n this.debug = debug;\n this.log(\"AffiliateManager initialized\");\n }\n\n async registerCoupon(code: string): Promise<{\n success: boolean;\n coupon?: AffiliateCoupon;\n error?: string;\n }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.post<{\n success: boolean;\n coupon?: {\n code: string;\n status: string;\n createdAt: string;\n };\n error?: string;\n }>(\"/api/v1/affiliate/register-coupon\", {\n code,\n distinctId,\n });\n\n if (response.success && response.coupon) {\n this.log(\"Coupon registered:\", code);\n return { success: true, coupon: mapRawCoupon(response.coupon) };\n }\n\n return {\n success: false,\n error: response.error,\n };\n } catch (error) {\n this.log(\"Failed to register coupon:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n async applyCoupon(code: string): Promise<{\n success: boolean;\n applied?: boolean;\n error?: string;\n }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.post<{\n success: boolean;\n applied?: boolean;\n error?: string;\n }>(\"/api/v1/affiliate/apply-coupon\", {\n code,\n distinctId,\n });\n\n if (response.success) {\n this.log(\"Coupon applied:\", code);\n }\n\n return response;\n } catch (error) {\n this.log(\"Failed to apply coupon:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n async getMyCoupon(): Promise<{ coupon: AffiliateCoupon | null }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n coupon: {\n code: string;\n status: string;\n createdAt: string;\n } | null;\n }>(\"/api/v1/affiliate/my-coupon\", { distinctId });\n\n if (response.coupon) {\n return { coupon: mapRawCoupon(response.coupon) };\n }\n\n return { coupon: null };\n } catch (error) {\n this.log(\"Failed to get my coupon:\", error);\n return { coupon: null };\n }\n }\n\n async getAppliedCoupon(): Promise<{ coupon: { code: string } | null }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n coupon: { code: string } | null;\n }>(\"/api/v1/affiliate/applied-coupon\", { distinctId });\n\n return response;\n } catch (error) {\n this.log(\"Failed to get applied coupon:\", error);\n return { coupon: null };\n }\n }\n\n async getBalance(): Promise<AffiliateBalance> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<AffiliateBalance>(\"/api/v1/affiliate/balance\", {\n distinctId,\n });\n\n return response;\n } catch (error) {\n this.log(\"Failed to get balance:\", error);\n return {\n total: 0,\n pending: 0,\n available: 0,\n withdrawn: 0,\n };\n }\n }\n\n async getCommissions(): Promise<AffiliateCommission[]> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n commissions: Array<{\n id: string;\n referredDistinctId: string;\n purchaseAmount: number;\n commissionAmount: number;\n status: \"pending\" | \"eligible\" | \"ineligible\" | \"withdrawn\";\n createdAt: string;\n }>;\n }>(\"/api/v1/affiliate/commissions\", { distinctId });\n\n return response.commissions.map(mapRawCommission);\n } catch (error) {\n this.log(\"Failed to get commissions:\", error);\n return [];\n }\n }\n\n async requestWithdrawal(amount: number): Promise<{\n success: boolean;\n withdrawal?: WithdrawalRequest;\n error?: string;\n }> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.post<{\n success: boolean;\n withdrawal?: {\n id: string;\n amount: number;\n status: \"pending\" | \"approved\" | \"rejected\" | \"paid\";\n createdAt: string;\n };\n error?: string;\n }>(\"/api/v1/affiliate/withdraw\", {\n amount,\n distinctId,\n });\n\n if (response.success && response.withdrawal) {\n this.log(\"Withdrawal requested:\", amount);\n return { success: true, withdrawal: mapRawWithdrawal(response.withdrawal) };\n }\n\n return {\n success: false,\n error: response.error,\n };\n } catch (error) {\n this.log(\"Failed to request withdrawal:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n async getWithdrawals(): Promise<WithdrawalRequest[]> {\n this.ensureInitialized();\n\n const distinctId = identityManager.getDistinctId();\n\n try {\n const response = await this.get<{\n withdrawals: Array<{\n id: string;\n amount: number;\n status: \"pending\" | \"approved\" | \"rejected\" | \"paid\";\n createdAt: string;\n }>;\n }>(\"/api/v1/affiliate/withdrawals\", { distinctId });\n\n return response.withdrawals.map(mapRawWithdrawal);\n } catch (error) {\n this.log(\"Failed to get withdrawals:\", error);\n return [];\n }\n }\n\n private async get<T>(path: string, params?: Record<string, unknown>): Promise<T> {\n this.ensureInitialized();\n return affiliateGet<T>(this.apiClient!, path, params);\n }\n\n private async post<T>(path: string, body: Record<string, unknown>): Promise<T> {\n this.ensureInitialized();\n return affiliatePost<T>(this.apiClient!, path, body);\n }\n\n private ensureInitialized(): void {\n if (!this.apiClient) {\n throw new AffiliateError(\n AFFILIATE_ERROR_CODES.NOT_INITIALIZED,\n \"AffiliateManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.warn(\"[AffiliateManager]\", ...args);\n }\n }\n}\n\nexport const affiliateManager = new AffiliateManager();\n","import { affiliateManager } from \"./AffiliateManager\";\n\nexport const PaywalloAffiliate = {\n registerCoupon: (code: string) => affiliateManager.registerCoupon(code),\n applyCoupon: (code: string) => affiliateManager.applyCoupon(code),\n getMyCoupon: () => affiliateManager.getMyCoupon(),\n getAppliedCoupon: () => affiliateManager.getAppliedCoupon(),\n getBalance: () => affiliateManager.getBalance(),\n getCommissions: () => affiliateManager.getCommissions(),\n requestWithdrawal: (amount: number) => affiliateManager.requestWithdrawal(amount),\n getWithdrawals: () => affiliateManager.getWithdrawals(),\n};\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedSubscription, SubscriptionStatusResponse } from \"./types\";\n\nconst CACHE_KEY = \"subscription_cache\";\nconst DEFAULT_TTL = 24 * 60 * 60 * 1000;\n\nexport class SubscriptionCache {\n private ttl: number;\n private memoryCache: CachedSubscription | null = null;\n private storage: SecureStorage;\n\n constructor(ttl: number = DEFAULT_TTL) {\n this.ttl = ttl;\n this.storage = new SecureStorage();\n }\n\n async get(): Promise<CachedSubscription | null> {\n if (this.memoryCache && !this.isExpired(this.memoryCache)) {\n return this.memoryCache;\n }\n\n try {\n const stored = await this.storage.get(CACHE_KEY);\n if (!stored) {\n return null;\n }\n\n const parsed: unknown = JSON.parse(stored);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n !(\"data\" in parsed) ||\n typeof (parsed as Record<string, unknown>).data !== \"object\" ||\n (parsed as Record<string, unknown>).data === null ||\n !(\"cachedAt\" in parsed) ||\n typeof (parsed as Record<string, unknown>).cachedAt !== \"number\"\n ) {\n await this.storage.remove(CACHE_KEY);\n return null;\n }\n const cached = parsed as CachedSubscription;\n\n if (cached.data.subscription?.expiresAt) {\n cached.data.subscription.expiresAt = new Date(cached.data.subscription.expiresAt);\n }\n if (cached.data.subscription?.originalPurchaseDate) {\n cached.data.subscription.originalPurchaseDate = new Date(\n cached.data.subscription.originalPurchaseDate\n );\n }\n if (cached.data.subscription?.latestPurchaseDate) {\n cached.data.subscription.latestPurchaseDate = new Date(\n cached.data.subscription.latestPurchaseDate\n );\n }\n if (cached.data.subscription?.cancellationDate) {\n cached.data.subscription.cancellationDate = new Date(\n cached.data.subscription.cancellationDate\n );\n }\n if (cached.data.subscription?.gracePeriodExpiresAt) {\n cached.data.subscription.gracePeriodExpiresAt = new Date(\n cached.data.subscription.gracePeriodExpiresAt\n );\n }\n\n cached.isStale = this.isExpired(cached);\n // Only warm in-memory cache for fresh entries; stale entries are returned\n // to the caller but not cached in memory, so the next call re-reads from\n // disk and gets a fresh value if the caller has since refreshed storage.\n if (!cached.isStale) {\n this.memoryCache = cached;\n }\n\n return cached;\n } catch {\n return null;\n }\n }\n\n async set(data: SubscriptionStatusResponse): Promise<void> {\n const cached: CachedSubscription = {\n data,\n cachedAt: Date.now(),\n isStale: false,\n };\n\n this.memoryCache = cached;\n\n try {\n await this.storage.set(CACHE_KEY, JSON.stringify(cached));\n } catch (error) {\n if (__DEV__) console.warn(\"[SubscriptionCache] set() failed:\", error instanceof Error ? error.message : String(error));\n }\n }\n\n async invalidate(): Promise<void> {\n this.memoryCache = null;\n\n try {\n await this.storage.remove(CACHE_KEY);\n } catch (error) {\n if (__DEV__) console.warn(\"[SubscriptionCache] invalidate() failed:\", error instanceof Error ? error.message : String(error));\n }\n }\n\n private isExpired(cached: CachedSubscription): boolean {\n return Date.now() - cached.cachedAt > this.ttl;\n }\n\n setTTL(ttl: number): void {\n this.ttl = ttl;\n }\n}\n\nexport const subscriptionCache = new SubscriptionCache();\n","import { Platform } from \"react-native\";\n\nconst SDK_VERSION = \"1.0.0\";\n\nimport type {\n ApiClientConfig,\n CampaignResponse,\n ConditionalFlagContext,\n ConditionalFlagResult,\n EmergencyPaywallResponse,\n Environment,\n FlagVariant,\n PaywallConfig,\n SubscriptionStatusResponse,\n UserProperties,\n ValidatePurchaseResponse,\n} from \"../types\";\n\nimport { buildConditionalFlagUrl, deriveWebUrl } from \"./apiUrlUtils\";\nimport {\n getCampaignData,\n getEmergencyPaywall,\n getSubscriptionStatus,\n validatePurchase,\n} from \"../domains/iap/apiPurchaseMethods\";\nimport { HttpClient, type HttpResponse } from \"./http\";\nimport { networkMonitor } from \"./network\";\nimport { offlineQueue } from \"./queue\";\nimport { ApiCache } from \"./ApiCache\";\nimport { secureStorage } from \"./storage/SecureStorage\";\n\nconst DEFAULT_BASE_URL = \"https://panel.lucasqueiroga.shop\";\n\nexport type { ApiClientConfig };\n\nexport class ApiClient {\n private baseUrl: string;\n private webUrl: string;\n private appKey: string;\n private debug: boolean;\n private environment: Environment;\n private offlineQueueEnabled: boolean;\n private httpClient: HttpClient;\n private readonly cache = new ApiCache();\n\n constructor(\n appKey: string,\n debug = false,\n environment: Environment = \"Production\",\n offlineQueueEnabled = true,\n timeout = 30000\n ) {\n this.appKey = appKey;\n this.baseUrl = DEFAULT_BASE_URL;\n this.webUrl = deriveWebUrl(this.baseUrl);\n this.debug = debug;\n this.environment = environment;\n this.offlineQueueEnabled = offlineQueueEnabled;\n this.httpClient = new HttpClient(this.baseUrl, { timeout, debug });\n }\n\n // ─── Infrastructure ──────────────────────────────────────────────────────────\n\n /** Exposed only for QueueProcessor initialization. Prefer get()/post() for requests. */\n getHttpClient(): HttpClient { return this.httpClient; }\n getWebUrl(): string { return this.webUrl; }\n getEnvironment(): Environment { return this.environment; }\n getQueueSize(): number { return offlineQueue.getSize(); }\n setofflineQueueEnabled(enabled: boolean): void { this.offlineQueueEnabled = enabled; }\n isofflineQueueEnabled(): boolean { return this.offlineQueueEnabled; }\n\n setEnvironment(environment: Environment): void {\n this.environment = environment;\n }\n\n setDebug(debug: boolean): void {\n this.debug = debug;\n this.httpClient.setDebug(debug);\n }\n\n async clearQueue(): Promise<void> { await offlineQueue.clear(); }\n\n // ─── Public HTTP facade (headers injected automatically) ─────────────────────\n\n async get<T>(path: string): Promise<HttpResponse<T>> {\n return this.httpClient.get<T>(path, { headers: { \"X-App-Key\": this.appKey } });\n }\n\n async post<T>(path: string, body: unknown, skipRetry = false): Promise<HttpResponse<T>> {\n return this.httpClient.post<T>(path, body, { headers: { \"X-App-Key\": this.appKey }, skipRetry });\n }\n\n async reportError(errorType: string, message: string, context?: Record<string, unknown>): Promise<void> {\n try {\n await this.post(\"/api/v1/sdk/errors\", {\n errorType, message, context,\n sdkVersion: SDK_VERSION,\n platform: Platform.OS,\n }, true);\n } catch {\n // Error reporting failure is non-critical — never block the caller\n }\n }\n\n // ─── Business methods ────────────────────────────────────────────────────────\n\n async trackEvent(eventName: string, distinctId: string, properties?: UserProperties, timestamp?: number): Promise<void> {\n await this.postWithQueue(\"/api/v1/events\", {\n eventName, distinctId,\n properties: { ...properties, platform: Platform.OS },\n timestamp: timestamp ?? Date.now(),\n environment: this.environment.toLowerCase(),\n }, `event:${eventName}`);\n }\n\n async identify(distinctId: string, properties?: UserProperties, email?: string): Promise<void> {\n await this.postWithQueue(\"/api/v1/identify\", { distinctId, properties: properties ?? {}, email, platform: Platform.OS }, \"identify\");\n }\n\n async startSession(distinctId: string, sessionId: string, platform?: string): Promise<{ success: boolean }> {\n await this.postWithQueue(\"/api/v1/sessions/start\", {\n distinctId, sessionId, platform: platform ?? Platform.OS, environment: this.environment.toLowerCase(),\n }, `session.start:${sessionId}`);\n return { success: true };\n }\n\n async endSession(sessionId: string, durationSeconds: number): Promise<{ success: boolean }> {\n await this.postWithQueue(\"/api/v1/sessions/end\", { sessionId, durationSeconds }, `session.end:${sessionId}`);\n return { success: true };\n }\n\n async getVariant(flagKey: string, distinctId: string): Promise<FlagVariant> {\n const key = `${flagKey}:${distinctId}`;\n const hit = this.cache.getVariant(key);\n if (hit !== undefined) return hit;\n\n const persisted = await this.readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) {\n this.cache.setVariant(key, persisted);\n return persisted;\n }\n\n try {\n const res = await this.get<FlagVariant>(`/api/v1/flags/${flagKey}?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) {\n const v: FlagVariant = { variant: null };\n this.cache.setVariant(key, v, this.cache.nullTTL);\n return v;\n }\n if (!res.ok) {\n this.log(\"Non-OK response for variant:\", flagKey, res.status);\n const stale = this.cache.getStaleVariant(key);\n if (stale !== undefined) return stale;\n return { variant: null };\n }\n this.cache.setVariant(key, res.data);\n await this.writeFlagToStorage(flagKey, distinctId, res.data);\n return res.data;\n } catch (error) {\n this.log(\"Failed to get variant:\", flagKey, error);\n const stale = this.cache.getStaleVariant(key);\n if (stale !== undefined) return stale;\n return { variant: null };\n }\n }\n\n async getPaywall(placement: string): Promise<PaywallConfig | null> {\n const hit = this.cache.getPaywall(placement);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<PaywallConfig>(`/api/v1/paywalls/${placement}`);\n if (res.status === 404) { this.cache.setPaywall(placement, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n this.log(\"Non-OK response for paywall:\", placement, res.status);\n const stale = this.cache.getStalePaywall(placement);\n if (stale !== undefined) return stale;\n return null;\n }\n this.cache.setPaywall(placement, res.data);\n return res.data;\n } catch (error) {\n this.log(\"Failed to get paywall:\", placement, error);\n const stale = this.cache.getStalePaywall(placement);\n if (stale !== undefined) return stale;\n return null;\n }\n }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n const result = await getEmergencyPaywall(this);\n this.log(\"Got emergency paywall:\", result.enabled);\n return result;\n }\n\n async getCampaign(\n placement: string,\n distinctId: string,\n context?: Record<string, unknown>\n ): Promise<CampaignResponse | null> {\n const key = `${placement}:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const result = await getCampaignData(this, this.baseUrl, placement, distinctId, context);\n if (!result) {\n this.log(\"No campaign found for placement:\", placement);\n this.cache.setCampaign(key, null);\n return null;\n }\n this.log(\"Got campaign:\", placement, result.variantKey);\n this.cache.setCampaign(key, result);\n return result;\n } catch (error) {\n this.log(\"Failed to get campaign:\", placement, error);\n const stale = this.cache.getStaleCampaign(key);\n if (stale !== undefined) return stale;\n return null;\n }\n }\n\n async validatePurchase(\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string\n ): Promise<ValidatePurchaseResponse> {\n const result = await validatePurchase(\n this, this.appKey, platform, receipt, productId, transactionId,\n priceLocal, currency, country, distinctId, paywallPlacement, variantKey\n );\n this.log(\"Purchase validated:\", result.success);\n return result;\n }\n\n async getSubscriptionStatus(distinctId: string): Promise<SubscriptionStatusResponse> {\n const result = await getSubscriptionStatus(this, this.baseUrl, this.appKey, distinctId);\n this.log(\"Subscription status:\", result.hasActiveSubscription);\n return result;\n }\n\n async evaluateFlags(keys: string[], distinctId: string): Promise<Record<string, string | null>> {\n const query = keys.map(encodeURIComponent).join(\",\");\n const path = `/api/v1/flags/evaluate?keys=${query}`;\n try {\n const res = await this.httpClient.get<unknown>(path, {\n headers: { \"X-App-Key\": this.appKey, \"x-distinct-id\": distinctId },\n });\n if (!res.ok) {\n this.log(\"Non-OK response for evaluateFlags:\", res.status);\n return {};\n }\n const raw = res.data;\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) return {};\n const record = raw as Record<string, unknown>;\n const result: Record<string, string | null> = {};\n for (const key of Object.keys(record)) {\n const value = record[key];\n const variant: string | null = typeof value === \"boolean\" ? String(value) : typeof value === \"string\" ? value : null;\n result[key] = variant;\n const flagVariant: FlagVariant = { variant };\n this.cache.setVariant(`${key}:${distinctId}`, flagVariant);\n await this.writeFlagToStorage(key, distinctId, flagVariant);\n }\n return result;\n } catch (error) {\n this.log(\"Failed to evaluateFlags:\", error);\n return {};\n }\n }\n\n async getConditionalFlag(\n flagKey: string,\n context: ConditionalFlagContext\n ): Promise<ConditionalFlagResult> {\n try {\n const url = buildConditionalFlagUrl(this.baseUrl, flagKey, context);\n const response = await this.get<{ value: boolean }>(url);\n if (response.status === 404) return { value: false, flagKey };\n if (!response.ok) {\n this.log(\"Non-OK response for conditional flag:\", flagKey, response.status);\n return { value: false, flagKey };\n }\n this.log(\"Got conditional flag:\", flagKey, response.data.value);\n return { value: response.data.value, flagKey };\n } catch {\n this.log(\"Failed to get conditional flag:\", flagKey);\n return { value: false, flagKey };\n }\n }\n\n // ─── Cache-only reads ────────────────────────────────────────────────────────\n\n /**\n * Reads a flag variant from cache layers only — no network call.\n * Checks in-memory cache first, then SecureStorage.\n * Returns null when both layers miss.\n */\n async getVariantFromCache(flagKey: string, distinctId: string): Promise<FlagVariant | null> {\n const key = `${flagKey}:${distinctId}`;\n const hit = this.cache.getVariant(key);\n if (hit !== undefined) return hit;\n const persisted = await this.readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) {\n this.cache.setVariant(key, persisted);\n return persisted;\n }\n return null;\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n private static readonly FLAG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n private async readFlagFromStorage(flagKey: string, distinctId: string): Promise<FlagVariant | null> {\n try {\n const raw = await secureStorage.get(`flag:${flagKey}:${distinctId}`);\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" || parsed === null ||\n !(\"variant\" in parsed) || !(\"cachedAt\" in parsed) ||\n typeof (parsed as Record<string, unknown>).cachedAt !== \"number\"\n ) return null;\n const { variant, payload, cachedAt } = parsed as { variant: string | null; payload?: Record<string, unknown>; cachedAt: number };\n if (Date.now() - cachedAt > ApiClient.FLAG_MAX_AGE_MS) return null;\n return { variant, payload };\n } catch {\n return null;\n }\n }\n\n private async writeFlagToStorage(flagKey: string, distinctId: string, flag: FlagVariant): Promise<void> {\n try {\n const value = JSON.stringify({ variant: flag.variant, payload: flag.payload, cachedAt: Date.now() });\n await secureStorage.set(`flag:${flagKey}:${distinctId}`, value);\n } catch {\n // Storage write failure is non-critical — never block the caller\n }\n }\n\n /**\n * POST with offline queue fallback. Enqueues when offline or on network failure.\n * Throws only when offlineQueueEnabled is false and the request fails.\n */\n private async postWithQueue(\n url: string,\n payload: Record<string, unknown>,\n label: string\n ): Promise<void> {\n if (this.offlineQueueEnabled && !networkMonitor.isOnline()) {\n await offlineQueue.enqueue(\"POST\", url, payload, { \"X-App-Key\": this.appKey });\n this.log(\"Queued for offline:\", label);\n return;\n }\n try {\n await this.post(url, payload);\n } catch (error) {\n this.log(\"Request failed:\", label, error);\n if (this.offlineQueueEnabled) {\n await offlineQueue.enqueue(\"POST\", url, payload, { \"X-App-Key\": this.appKey });\n this.log(\"Queued after failure:\", label);\n return;\n }\n throw error;\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.warn(\"[Paywallo API]\", ...args);\n }\n}\n","import type { ConditionalFlagContext } from \"../types\";\n\nconst DEFAULT_WEB_URL = \"https://paywallo.com.br\";\n\n/**\n * Derives the web (dashboard) URL from the API base URL.\n * - Local dev (192.168.x or localhost): same host, port 3000\n * - Production: uses DEFAULT_WEB_URL (paywallo.com.br)\n * - api.* → app.*\n */\nexport function deriveWebUrl(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n if (url.hostname.startsWith(\"192.168\") || url.hostname === \"localhost\") {\n url.port = \"3000\";\n return url.toString().replace(/\\/$/, \"\");\n }\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = url.hostname.replace(\"api.\", \"app.\");\n return url.toString().replace(/\\/$/, \"\");\n }\n return DEFAULT_WEB_URL;\n } catch {\n return DEFAULT_WEB_URL;\n }\n}\n\n/** Builds a URL with optional query params appended. */\nexport function buildUrl(base: string, params?: Record<string, unknown>): string {\n if (!params) return base;\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== null);\n if (entries.length === 0) return base;\n const query = entries\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join(\"&\");\n return `${base}?${query}`;\n}\n\n/** Builds the URL for the conditional-flags endpoint including context query params. */\nexport function buildConditionalFlagUrl(\n baseUrl: string,\n flagKey: string,\n context: ConditionalFlagContext\n): string {\n const url = new URL(`${baseUrl}/api/v1/conditional-flags/${flagKey}`);\n if (context.platform) url.searchParams.set(\"platform\", context.platform);\n if (context.appVersion) url.searchParams.set(\"appVersion\", context.appVersion);\n if (context.country) url.searchParams.set(\"country\", context.country);\n if (context.distinctId) url.searchParams.set(\"distinctId\", context.distinctId);\n return url.toString();\n}\n","import type {\n CampaignResponse,\n EmergencyPaywallResponse,\n SubscriptionStatusResponse,\n ValidatePurchaseResponse,\n} from \"../../types\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\n\nexport async function validatePurchase(\n client: ApiClient,\n appKey: string,\n platform: \"ios\" | \"android\",\n receipt: string,\n productId: string,\n transactionId: string,\n priceLocal: number,\n currency: string,\n country: string,\n distinctId?: string,\n paywallPlacement?: string,\n variantKey?: string\n): Promise<ValidatePurchaseResponse> {\n const response = await client.post<ValidatePurchaseResponse>(\n `/purchases/validate/${appKey}`,\n {\n platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId,\n ...(paywallPlacement !== undefined && { paywallPlacement }),\n ...(variantKey !== undefined && { variantKey }),\n },\n false\n );\n return response.data;\n}\n\nexport async function getSubscriptionStatus(\n client: ApiClient,\n baseUrl: string,\n appKey: string,\n distinctId: string\n): Promise<SubscriptionStatusResponse> {\n const url = new URL(`${baseUrl}/purchases/status/${appKey}`);\n url.searchParams.set(\"distinctId\", distinctId);\n const response = await client.get<SubscriptionStatusResponse>(url.toString());\n return response.data;\n}\n\nexport async function getEmergencyPaywall(\n client: ApiClient\n): Promise<EmergencyPaywallResponse> {\n try {\n const response = await client.get<EmergencyPaywallResponse>(\"/api/v1/emergency-paywall\");\n if (response.status === 404) return { enabled: false };\n return response.data;\n } catch {\n return { enabled: false };\n }\n}\n\nexport async function getCampaignData(\n client: ApiClient,\n baseUrl: string,\n placement: string,\n distinctId: string,\n context?: Record<string, unknown>\n): Promise<CampaignResponse | null> {\n const url = new URL(`${baseUrl}/api/v1/campaigns/${placement}`);\n url.searchParams.set(\"distinctId\", distinctId);\n if (context) url.searchParams.set(\"context\", JSON.stringify(context));\n\n const response = await client.get<CampaignResponse | { paywall: null }>(url.toString());\n if (response.status === 404) return null;\n\n const data = response.data;\n if (\"paywall\" in data && data.paywall === null && !(\"campaignId\" in data)) return null;\n return data as CampaignResponse;\n}\n","export interface RetryConfig {\n maxRetries: number;\n baseDelay: number;\n maxDelay: number;\n retryableStatusCodes: number[];\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeout: number;\n retry: RetryConfig;\n debug: boolean;\n}\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n headers?: Record<string, string>;\n body?: unknown;\n skipRetry?: boolean;\n timeout?: number;\n}\n\nexport interface HttpResponse<T = unknown> {\n ok: boolean;\n status: number;\n data: T;\n headers: Record<string, string>;\n}\n\nexport interface RetryState {\n attempt: number;\n lastError: Error | null;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 2,\n baseDelay: 500,\n maxDelay: 4000,\n retryableStatusCodes: [408, 429, 500, 502, 503, 504],\n};\n\nexport const DEFAULT_HTTP_CONFIG: Partial<HttpClientConfig> = {\n timeout: 10000,\n retry: DEFAULT_RETRY_CONFIG,\n debug: false,\n};\n","import { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nimport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\n\nexport class HttpClient {\n private config: HttpClientConfig;\n\n constructor(baseUrl: string, config?: Partial<Omit<HttpClientConfig, \"baseUrl\">>) {\n this.config = {\n baseUrl,\n timeout: config?.timeout ?? (DEFAULT_HTTP_CONFIG.timeout as number),\n retry: { ...DEFAULT_RETRY_CONFIG, ...config?.retry },\n debug: config?.debug ?? false,\n };\n }\n\n async get<T>(path: string, options?: Partial<RequestOptions>): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"GET\" });\n }\n\n async post<T>(\n path: string,\n body?: unknown,\n options?: Partial<RequestOptions>\n ): Promise<HttpResponse<T>> {\n return this.request<T>(path, { ...options, method: \"POST\", body });\n }\n\n async request<T>(path: string, options: RequestOptions): Promise<HttpResponse<T>> {\n const url = this.buildUrl(path);\n const fetchOptions = this.buildFetchOptions(options);\n const timeout = options.timeout ?? this.config.timeout;\n\n if (options.skipRetry) {\n return this.executeRequest<T>(url, fetchOptions, timeout);\n }\n\n return this.executeWithRetry<T>(url, fetchOptions, options);\n }\n\n private async executeWithRetry<T>(\n url: string,\n fetchOptions: RequestInit,\n options: RequestOptions\n ): Promise<HttpResponse<T>> {\n const retryConfig = this.config.retry;\n const timeout = options.timeout ?? this.config.timeout;\n const state: RetryState = { attempt: 0, lastError: null };\n\n // maxRetries = number of retries after initial attempt\n // Total attempts = 1 (initial) + maxRetries\n while (state.attempt <= retryConfig.maxRetries) {\n try {\n const response = await this.executeRequest<T>(url, fetchOptions, timeout);\n\n if (this.shouldRetry(response.status, retryConfig)) {\n if (state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelay(state.attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n }\n\n return response;\n } catch (error) {\n state.lastError = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n\n if (this.isNetworkError(state.lastError) && state.attempt < retryConfig.maxRetries) {\n state.attempt++;\n const delay = this.calculateDelay(state.attempt, retryConfig);\n await this.sleep(delay);\n continue;\n }\n\n throw state.lastError;\n }\n }\n\n throw state.lastError ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, \"Max retries exceeded\");\n }\n\n private async executeRequest<T>(\n url: string,\n options: RequestInit,\n timeout: number\n ): Promise<HttpResponse<T>> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isCompleted = false;\n\n timeoutId = setTimeout(() => {\n if (!isCompleted) {\n controller.abort();\n }\n }, timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n isCompleted = true;\n\n let data: T;\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n data = (await response.json()) as T;\n } else {\n const textData = await response.text();\n data = textData as unknown as T;\n }\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n headers,\n };\n } catch (error) {\n this.log(\"Request failed\", {\n url,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n isCompleted = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n private buildUrl(path: string): string {\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n return `${this.config.baseUrl}${path}`;\n }\n\n private buildFetchOptions(options: RequestOptions): RequestInit {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n return fetchOptions;\n }\n\n private shouldRetry(status: number, config: RetryConfig): boolean {\n return config.retryableStatusCodes.includes(status);\n }\n\n private isNetworkError(error: Error): boolean {\n const networkErrorPatterns = [\n \"network\",\n \"fetch\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"ENOTFOUND\",\n \"aborted\",\n \"timeout\",\n ];\n\n const message = error.message.toLowerCase();\n return networkErrorPatterns.some((pattern) => message.includes(pattern.toLowerCase()));\n }\n\n private calculateDelay(attempt: number, config: RetryConfig): number {\n const exponentialDelay = config.baseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay;\n return Math.min(exponentialDelay + jitter, config.maxDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[HttpClient]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n\n getConfig(): Readonly<HttpClientConfig> {\n return { ...this.config };\n }\n}\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nimport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n\ntype NetInfoState = {\n isConnected: boolean | null;\n isInternetReachable: boolean | null;\n};\n\ntype NetInfoSubscription = () => void;\n\ntype NetInfoModule = {\n addEventListener: (listener: (state: NetInfoState) => void) => NetInfoSubscription;\n fetch: () => Promise<NetInfoState>;\n};\n\nclass NetworkMonitorClass {\n private config: NetworkMonitorConfig = DEFAULT_NETWORK_CONFIG;\n private listeners: Set<NetworkListener> = new Set();\n private currentState: NetworkState = \"unknown\";\n private netInfoModule: NetInfoModule | null = null;\n private netInfoSubscription: NetInfoSubscription | null = null;\n private appStateSubscription: ReturnType<typeof AppState.addEventListener> | null = null;\n private initialized = false;\n private checkIntervalId: ReturnType<typeof setInterval> | null = null;\n\n async initialize(config?: Partial<NetworkMonitorConfig>): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.config = { ...DEFAULT_NETWORK_CONFIG, ...config };\n\n // Start as unknown — setupFallbackDetection will resolve to online/offline\n this.currentState = \"unknown\";\n this.initialized = true;\n\n this.log(\"Initialized (state: unknown, awaiting first connectivity check)\");\n\n // Skip NetInfo — it can freeze the JS thread on some devices/simulators\n // Use simple HTTP-based fallback detection instead\n void this.setupFallbackDetection();\n this.setupAppStateListener();\n }\n\n private setupNetInfoListener(): void {\n if (!this.netInfoModule) return;\n\n this.netInfoSubscription = this.netInfoModule.addEventListener((state) => {\n const newState = this.netInfoStateToNetworkState(state);\n this.updateState(newState);\n });\n }\n\n private async setupFallbackDetection(): Promise<void> {\n // Don't assume online - check connectivity first\n await this.checkConnectivity();\n\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n\n private setupAppStateListener(): void {\n this.appStateSubscription = AppState.addEventListener(\"change\", (state: AppStateStatus) => {\n if (state === \"active\") {\n void this.checkConnectivity();\n }\n });\n }\n\n private async checkConnectivity(): Promise<void> {\n // Don't use netInfoModule.fetch() — it can hang on some devices/simulators\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(this.config.checkUrl, {\n method: \"HEAD\",\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n this.updateState(response.ok ? \"online\" : \"offline\");\n } catch {\n this.updateState(\"offline\");\n }\n }\n\n private netInfoStateToNetworkState(state: NetInfoState): NetworkState {\n if (state.isConnected === null) {\n return \"unknown\";\n }\n if (!state.isConnected) {\n return \"offline\";\n }\n return \"online\";\n }\n\n private updateState(newState: NetworkState): void {\n const previousState = this.currentState;\n if (previousState === newState) {\n return;\n }\n\n this.currentState = newState;\n this.log(\"Network state changed\", { from: previousState, to: newState });\n this.notifyListeners(newState);\n }\n\n private notifyListeners(state: NetworkState): void {\n for (const listener of this.listeners) {\n try {\n listener(state);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n isOnline(): boolean {\n // If not initialized or unknown, assume online to not block operations\n if (!this.initialized || this.currentState === \"unknown\") {\n return true;\n }\n return this.currentState === \"online\";\n }\n\n getState(): NetworkState {\n return this.currentState;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n addListener(listener: NetworkListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: NetworkListener): void {\n this.listeners.delete(listener);\n }\n\n async forceCheck(): Promise<NetworkState> {\n await this.checkConnectivity();\n return this.currentState;\n }\n\n dispose(): void {\n if (this.netInfoSubscription) {\n this.netInfoSubscription();\n this.netInfoSubscription = null;\n }\n\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n\n this.listeners.clear();\n this.initialized = false;\n this.currentState = \"unknown\";\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[NetworkMonitor]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const networkMonitor = new NetworkMonitorClass();\n/** @deprecated Use `networkMonitor` (camelCase) */\nexport const NetworkMonitor = networkMonitor;\n","export type NetworkState = \"online\" | \"offline\" | \"unknown\";\n\nexport type NetworkListener = (state: NetworkState) => void;\n\nexport interface NetworkMonitorConfig {\n debug: boolean;\n checkInterval: number;\n checkUrl: string;\n}\n\nexport const DEFAULT_NETWORK_CONFIG: NetworkMonitorConfig = {\n debug: false,\n checkInterval: 30000,\n checkUrl: \"https://clients3.google.com/generate_204\",\n};\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\n\nimport { CLIENT_ERROR_CODES, ClientError } from \"../../errors/ClientError\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { findDuplicateIndex } from \"./deduplication\";\nimport type { OfflineQueueConfig, QueueEvent, QueueItem, QueueListener } from \"./types\";\nimport { DEFAULT_QUEUE_CONFIG } from \"./types\";\n\nclass OfflineQueueClass {\n private config: OfflineQueueConfig = DEFAULT_QUEUE_CONFIG;\n private queue: QueueItem[] = [];\n private listeners: Set<QueueListener> = new Set();\n private initialized = false;\n private processing = false;\n private processingLock = false;\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n async initialize(config?: Partial<OfflineQueueConfig>): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.config = { ...DEFAULT_QUEUE_CONFIG, ...config };\n await this.loadFromStorage();\n this.cleanupExpired();\n\n this.cleanupTimer = setInterval(() => this.cleanupExpired(), 60 * 60 * 1000);\n\n this.initialized = true;\n }\n\n private async loadFromStorage(): Promise<void> {\n try {\n const stored = await AsyncStorage.getItem(this.config.storageKey);\n if (stored) {\n this.queue = JSON.parse(stored) as QueueItem[];\n }\n } catch {\n this.queue = [];\n }\n }\n\n private async saveToStorage(): Promise<boolean> {\n try {\n await AsyncStorage.setItem(this.config.storageKey, JSON.stringify(this.queue));\n return true;\n } catch (error) {\n this.log(\"Failed to save queue to storage\", error);\n this.emit({\n type: \"item:failed\",\n error: new ClientError(CLIENT_ERROR_CODES.UNKNOWN, \"Storage save failed - items may be lost on restart\"),\n queueSize: this.queue.length,\n });\n return false;\n }\n }\n\n private cleanupExpired(): void {\n const now = Date.now();\n const before = this.queue.length;\n\n this.queue = this.queue.filter((item) => Date.now() - item.timestamp < this.config.maxAge);\n\n if (before !== this.queue.length) {\n void this.saveToStorage();\n }\n }\n\n async enqueue(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<QueueItem> {\n const item: QueueItem = {\n id: generateUUID(),\n method,\n url,\n body,\n headers,\n timestamp: Date.now(),\n attempts: 0,\n maxAttempts: this.config.maxAttempts,\n };\n\n const existingIndex = this.findDuplicateIndex(item);\n if (existingIndex !== -1) {\n this.queue[existingIndex].timestamp = Date.now();\n await this.saveToStorage();\n return this.queue[existingIndex];\n }\n\n if (this.queue.length >= this.config.maxItems) {\n const removed = this.queue.shift();\n if (removed) {\n this.emit({ type: \"item:evicted\", item: removed, queueSize: this.queue.length });\n }\n }\n\n this.queue.push(item);\n await this.saveToStorage();\n\n this.emit({ type: \"item:added\", item, queueSize: this.queue.length });\n\n return item;\n }\n\n private findDuplicateIndex(item: QueueItem): number {\n return findDuplicateIndex(this.queue, item);\n }\n\n async dequeue(): Promise<QueueItem | null> {\n const item = this.queue.shift() ?? null;\n if (item) {\n await this.saveToStorage();\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n }\n return item;\n }\n\n async removeItem(id: string): Promise<boolean> {\n const index = this.queue.findIndex((item) => item.id === id);\n if (index === -1) return false;\n const [item] = this.queue.splice(index, 1);\n await this.saveToStorage();\n this.emit({ type: \"item:removed\", item, queueSize: this.queue.length });\n return true;\n }\n\n async processQueue(\n processor: (item: QueueItem) => Promise<boolean | { success: boolean; permanent?: boolean }>,\n options?: { delayBetweenItems?: number }\n ): Promise<{ processed: number; failed: number }> {\n if (this.processingLock || this.queue.length === 0) {\n return { processed: 0, failed: 0 };\n }\n\n this.processingLock = true;\n this.processing = true;\n this.emit({ type: \"processing:start\", queueSize: this.queue.length });\n\n let processed = 0;\n let failed = 0;\n const delayMs = options?.delayBetweenItems ?? 100;\n\n // Snapshot item IDs so removals during iteration don't affect the loop\n const itemIds = this.queue.map((item) => item.id);\n\n for (let i = 0; i < itemIds.length; i++) {\n const item = this.queue.find((q) => q.id === itemIds[i]);\n if (!item) continue;\n\n item.attempts++;\n\n try {\n const result = await processor(item);\n const success = typeof result === \"boolean\" ? result : result.success;\n const permanent = typeof result === \"object\" ? (result.permanent ?? false) : false;\n\n if (success) {\n await this.removeItem(item.id);\n processed++;\n this.emit({ type: \"item:success\", item, queueSize: this.queue.length });\n } else {\n const didFail = await this.handleItemFailure(item, undefined, permanent);\n if (didFail) failed++;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new ClientError(CLIENT_ERROR_CODES.UNKNOWN, String(error));\n const didFail = await this.handleItemFailure(item, err, false);\n if (didFail) failed++;\n }\n\n if (i < itemIds.length - 1 && delayMs > 0) await this.sleep(delayMs);\n }\n\n this.processing = false;\n this.processingLock = false;\n this.emit({ type: \"processing:end\", queueSize: this.queue.length });\n\n return { processed, failed };\n }\n\n /** Returns true if the item was permanently removed (counted as failed). */\n private async handleItemFailure(item: QueueItem, error?: Error, permanent = false): Promise<boolean> {\n if (permanent || item.attempts >= item.maxAttempts) {\n await this.removeItem(item.id);\n this.emit({\n type: \"item:failed\",\n item,\n error: error ?? new ClientError(CLIENT_ERROR_CODES.UNKNOWN, permanent ? \"Permanent failure\" : \"Max attempts reached\"),\n queueSize: this.queue.length,\n });\n return true;\n }\n await this.saveToStorage();\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n getQueue(): ReadonlyArray<QueueItem> {\n return [...this.queue];\n }\n\n getSize(): number {\n return this.queue.length;\n }\n\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n isProcessing(): boolean {\n return this.processing;\n }\n\n async clear(): Promise<void> {\n this.queue = [];\n await this.saveToStorage();\n }\n\n async clearItemsWithInvalidAppKey(validAppKey: string): Promise<number> {\n const before = this.queue.length;\n this.queue = this.queue.filter((item) => {\n const itemAppKey = item.headers?.[\"X-App-Key\"];\n return itemAppKey === validAppKey || !itemAppKey;\n });\n const removed = before - this.queue.length;\n if (removed > 0) {\n await this.saveToStorage();\n }\n return removed;\n }\n\n addListener(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n removeListener(listener: QueueListener): void {\n this.listeners.delete(listener);\n }\n\n private emit(event: QueueEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n this.log(\"Listener error\", error);\n }\n }\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[OfflineQueue]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n\n dispose(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.listeners.clear();\n this.queue = [];\n this.initialized = false;\n this.processing = false;\n this.processingLock = false;\n }\n}\n\nexport const offlineQueue = new OfflineQueueClass();\n/** @deprecated Use `offlineQueue` (camelCase) */\nexport const OfflineQueue = offlineQueue;\n","import type { QueueItem } from \"./types\";\n\n/**\n * Deterministic comparison for deduplication.\n * Normalizes objects by sorting keys recursively before comparison.\n */\nexport function normalizeForComparison(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return String(obj);\n }\n\n if (typeof obj !== \"object\") {\n return JSON.stringify(obj);\n }\n\n if (Array.isArray(obj)) {\n return \"[\" + obj.map((item) => normalizeForComparison(item)).join(\",\") + \"]\";\n }\n\n const sortedKeys = Object.keys(obj as Record<string, unknown>).sort();\n const pairs = sortedKeys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n return `${JSON.stringify(key)}:${normalizeForComparison(value)}`;\n });\n return \"{\" + pairs.join(\",\") + \"}\";\n}\n\nexport function findDuplicateIndex(queue: QueueItem[], item: QueueItem): number {\n const normalizedBody = normalizeForComparison(item.body);\n return queue.findIndex(\n (existing) =>\n existing.url === item.url && normalizeForComparison(existing.body) === normalizedBody\n );\n}\n","export interface QueueItem {\n id: string;\n method: \"POST\" | \"PUT\";\n url: string;\n body: unknown;\n headers?: Record<string, string>;\n timestamp: number;\n attempts: number;\n maxAttempts: number;\n}\n\nexport interface OfflineQueueConfig {\n maxItems: number;\n maxAge: number;\n maxAttempts: number;\n storageKey: string;\n debug: boolean;\n}\n\nexport type QueueEventType =\n | \"item:added\"\n | \"item:removed\"\n | \"item:success\"\n | \"item:failed\"\n | \"item:evicted\"\n | \"processing:start\"\n | \"processing:end\";\n\nexport interface QueueEvent {\n type: QueueEventType;\n item?: QueueItem;\n error?: Error;\n queueSize: number;\n}\n\nexport type QueueListener = (event: QueueEvent) => void;\n\nexport const DEFAULT_QUEUE_CONFIG: OfflineQueueConfig = {\n maxItems: 100,\n maxAge: 24 * 60 * 60 * 1000,\n maxAttempts: 3,\n storageKey: \"@paywallo:offline_queue\",\n debug: false,\n};\n","import { HttpClient } from \"../http\";\nimport { networkMonitor, type NetworkState } from \"../network\";\n\nimport { offlineQueue } from \"./OfflineQueue\";\nimport type { QueueItem } from \"./types\";\n\ninterface QueueItemResult {\n success: boolean;\n permanent?: boolean;\n status?: number;\n}\n\nexport interface QueueProcessorConfig {\n debounceMs: number;\n debug: boolean;\n}\n\nconst DEFAULT_PROCESSOR_CONFIG: QueueProcessorConfig = {\n debounceMs: 2000,\n debug: false,\n};\n\nclass QueueProcessorClass {\n private config: QueueProcessorConfig = DEFAULT_PROCESSOR_CONFIG;\n private httpClient: HttpClient | null = null;\n private networkUnsubscribe: (() => void) | null = null;\n private debounceTimeout: ReturnType<typeof setTimeout> | null = null;\n private retryIntervalId: ReturnType<typeof setInterval> | null = null;\n private initialized = false;\n\n initialize(httpClient: HttpClient, config?: Partial<QueueProcessorConfig>): void {\n if (this.initialized) {\n return;\n }\n\n this.httpClient = httpClient;\n this.config = { ...DEFAULT_PROCESSOR_CONFIG, ...config };\n\n this.networkUnsubscribe = networkMonitor.addListener((state: NetworkState) => {\n if (state === \"online\") {\n this.scheduleProcessing();\n }\n });\n\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n\n this.retryIntervalId = setInterval(() => {\n if (networkMonitor.isOnline() && !offlineQueue.isEmpty()) {\n this.scheduleProcessing();\n }\n }, 60000);\n\n this.initialized = true;\n this.log(\"QueueProcessor initialized\");\n }\n\n private scheduleProcessing(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n this.debounceTimeout = setTimeout(() => {\n void this.processQueue();\n }, this.config.debounceMs);\n }\n\n async processQueue(): Promise<{ processed: number; failed: number }> {\n if (!this.httpClient) {\n this.log(\"HttpClient not initialized\");\n return { processed: 0, failed: 0 };\n }\n\n if (!networkMonitor.isOnline()) {\n this.log(\"Offline, skipping queue processing\");\n return { processed: 0, failed: 0 };\n }\n\n return offlineQueue.processQueue(async (item: QueueItem) => {\n return this.processItem(item);\n });\n }\n\n private async processItem(item: QueueItem): Promise<QueueItemResult> {\n if (!this.httpClient) {\n return { success: false, permanent: false };\n }\n\n this.log(\"Processing queue item\", {\n id: item.id,\n url: item.url,\n method: item.method,\n headers: item.headers,\n attempts: item.attempts,\n });\n\n const response = await this.httpClient.request(item.url, {\n method: item.method,\n body: item.body,\n headers: item.headers,\n skipRetry: false,\n });\n\n // Only 2xx status codes count as success\n if (response.ok) {\n this.log(\"Queue item processed successfully\", { id: item.id });\n return { success: true, permanent: false };\n }\n\n // 4xx errors are PERMANENT failures - they will NEVER succeed on retry\n // Examples: 401 (invalid app key), 400 (bad request), 403 (forbidden)\n if (response.status >= 400 && response.status < 500) {\n this.log(\"Request failed with permanent client error - removing from queue\", {\n id: item.id,\n url: item.url,\n status: response.status,\n appKeyInHeaders: item.headers?.[\"X-App-Key\"],\n });\n // Return permanent failure to remove item immediately without retry\n return { success: false, permanent: true, status: response.status };\n }\n\n // 5xx errors might succeed on retry, return false to allow retry\n this.log(\"Request failed with server error - will retry\", {\n id: item.id,\n status: response.status,\n });\n return { success: false, permanent: false, status: response.status };\n }\n\n async enqueueIfOffline(\n method: \"POST\" | \"PUT\",\n url: string,\n body: unknown,\n headers?: Record<string, string>\n ): Promise<{ queued: boolean; item?: QueueItem }> {\n if (networkMonitor.isOnline()) {\n return { queued: false };\n }\n\n const item = await offlineQueue.enqueue(method, url, body, headers);\n this.log(\"Request queued for offline\", { id: item.id, url });\n return { queued: true, item };\n }\n\n getQueueSize(): number {\n return offlineQueue.getSize();\n }\n\n async clearQueue(): Promise<void> {\n await offlineQueue.clear();\n }\n\n dispose(): void {\n // Clear debounce timeout FIRST to prevent any pending processing\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n this.debounceTimeout = null;\n }\n\n if (this.retryIntervalId) {\n clearInterval(this.retryIntervalId);\n this.retryIntervalId = null;\n }\n\n // Then unsubscribe from network changes\n if (this.networkUnsubscribe) {\n this.networkUnsubscribe();\n this.networkUnsubscribe = null;\n }\n\n this.httpClient = null;\n this.initialized = false;\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.warn(\"[QueueProcessor]\", message, data ?? \"\");\n }\n }\n\n setDebug(debug: boolean): void {\n this.config.debug = debug;\n }\n}\n\nexport const queueProcessor = new QueueProcessorClass();\n/** @deprecated Use `queueProcessor` (camelCase) */\nexport const QueueProcessor = queueProcessor;\n","import type { CampaignResponse, FlagVariant, PaywallConfig } from \"../types\";\n\ntype CacheEntry<T> = { value: T; ts: number; ttl?: number };\n\nexport class ApiCache {\n private readonly CACHE_TTL = 300_000; // 5 minutes\n private readonly CACHE_NULL_TTL = 30_000; // 30 seconds — for null/404 variants\n private readonly MAX_SIZE = 200;\n\n private variantCache = new Map<string, CacheEntry<FlagVariant>>();\n private paywallCache = new Map<string, CacheEntry<PaywallConfig | null>>();\n private campaignCache = new Map<string, CacheEntry<CampaignResponse | null>>();\n\n getCached<T>(cache: Map<string, CacheEntry<T>>, key: string): T | undefined {\n const entry = cache.get(key);\n if (!entry) return undefined;\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (Date.now() - entry.ts < ttl) return entry.value;\n // Eagerly evict expired entry on read to free memory without waiting for size overflow\n cache.delete(key);\n return undefined;\n }\n\n setCached<T>(\n cache: Map<string, CacheEntry<T>>,\n key: string,\n value: T,\n ttlOverride?: number\n ): void {\n const entry: CacheEntry<T> = { value, ts: Date.now() };\n if (ttlOverride !== undefined) entry.ttl = ttlOverride;\n cache.set(key, entry);\n }\n\n evictExpiredEntries<T>(cache: Map<string, CacheEntry<T>>): void {\n if (cache.size <= this.MAX_SIZE) return;\n const now = Date.now();\n for (const [key, entry] of cache) {\n const ttl = entry.ttl ?? this.CACHE_TTL;\n if (now - entry.ts > ttl) cache.delete(key);\n }\n }\n\n getVariant(key: string): FlagVariant | undefined {\n return this.getCached(this.variantCache, key);\n }\n\n setVariant(key: string, value: FlagVariant, ttlOverride?: number): void {\n this.setCached(this.variantCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.variantCache);\n }\n\n get nullTTL(): number {\n return this.CACHE_NULL_TTL;\n }\n\n getStaleVariant(key: string): FlagVariant | undefined {\n const entry = this.variantCache.get(key);\n if (entry && Date.now() - entry.ts < 86400000) return entry.value;\n return undefined;\n }\n\n getPaywall(key: string): PaywallConfig | null | undefined {\n return this.getCached(this.paywallCache, key);\n }\n\n setPaywall(key: string, value: PaywallConfig | null, ttlOverride?: number): void {\n this.setCached(this.paywallCache, key, value, ttlOverride);\n this.evictExpiredEntries(this.paywallCache);\n }\n\n getStalePaywall(key: string): PaywallConfig | null | undefined {\n const entry = this.paywallCache.get(key);\n if (entry && Date.now() - entry.ts < 86400000) return entry.value;\n return undefined;\n }\n\n getCampaign(key: string): CampaignResponse | null | undefined {\n return this.getCached(this.campaignCache, key);\n }\n\n setCampaign(key: string, value: CampaignResponse | null): void {\n this.setCached(this.campaignCache, key, value);\n this.evictExpiredEntries(this.campaignCache);\n }\n\n getStaleCampaign(key: string): CampaignResponse | null | undefined {\n const entry = this.campaignCache.get(key);\n if (entry && Date.now() - entry.ts < 86400000) return entry.value;\n return undefined;\n }\n}\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class CampaignError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"campaign\", code, message);\n this.name = \"CampaignError\";\n }\n}\n\nexport const CAMPAIGN_ERROR_CODES = {\n NOT_INITIALIZED: \"CAMPAIGN_NOT_INITIALIZED\",\n FETCH_FAILED: \"CAMPAIGN_FETCH_FAILED\",\n PRELOAD_FAILED: \"CAMPAIGN_PRELOAD_FAILED\",\n NOT_FOUND: \"CAMPAIGN_NOT_FOUND\",\n PRESENT_FAILED: \"CAMPAIGN_PRESENT_FAILED\",\n} as const;\n","import { CAMPAIGN_ERROR_CODES, CampaignError } from \"./CampaignError\";\nimport { PaywalloError } from \"../../errors/PaywalloError\";\nimport { PAYWALL_ERROR_CODES, PaywallError } from \"../paywall/PaywallError\";\nimport type { CampaignResponse, CampaignResult, PaywallResult } from \"../../types\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport type { PreloadCampaignResult } from \"../../core/types\";\n\ntype PaywallPresenter = (placement: string) => Promise<PaywallResult>;\ntype CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\n\nconst PRELOAD_CACHE_TTL_MS = 5 * 60 * 1000;\ninterface PreloadedCampaignCache { campaign: CampaignResponse; preloadedAt: number }\n\nexport class CampaignGateService {\n private readonly preloadedCampaigns: Map<string, PreloadedCampaignCache> = new Map();\n\n async getCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return null;\n return apiClient.getCampaign(placement, distinctId, context);\n }\n\n async presentCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<CampaignResult> {\n const campaign = await this.getCampaign(apiClient, placement, context);\n if (!campaign) {\n return { presented: false, purchased: false, cancelled: false, restored: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, \"No campaign found\") };\n }\n if (!context?.forceShow && await hasActive()) {\n return { presented: false, purchased: false, cancelled: false, restored: false, skippedReason: \"subscriber\" };\n }\n if (campaignPresenter) return campaignPresenter(campaign);\n if (!paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return { ...(await paywallPresenter(campaign.paywall.placement)), campaignId: campaign.campaignId, variantKey: campaign.variantKey };\n }\n\n async requireSubscriptionWithCampaign(\n apiClient: ApiClient,\n placement: string,\n hasActive: () => Promise<boolean>,\n paywallPresenter: PaywallPresenter | null,\n campaignPresenter: CampaignPresenter | null,\n context?: Record<string, unknown>,\n ): Promise<boolean> {\n if (await hasActive()) return true;\n const r = await this.presentCampaign(apiClient, placement, hasActive, paywallPresenter, campaignPresenter, context);\n return r.purchased || r.restored;\n }\n\n async preloadCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n try {\n const campaign = await this.getCampaign(apiClient, placement, context);\n if (!campaign?.paywall) {\n return { success: false, error: new CampaignError(CAMPAIGN_ERROR_CODES.NOT_FOUND, `Campaign or paywall not found: ${placement}`) };\n }\n this.preloadedCampaigns.set(placement, { campaign, preloadedAt: Date.now() });\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error : new PaywalloError(\"panel\", \"PANEL_UNKNOWN\", String(error)) };\n }\n }\n\n getPreloadedCampaign(placement: string): CampaignResponse | null {\n const cached = this.preloadedCampaigns.get(placement);\n if (!cached) return null;\n if (Date.now() - cached.preloadedAt >= PRELOAD_CACHE_TTL_MS) { this.preloadedCampaigns.delete(placement); return null; }\n return cached.campaign;\n }\n\n clearPreloaded(): void { this.preloadedCampaigns.clear(); }\n}\n\nexport const campaignGateService = new CampaignGateService();\n","import { Platform } from \"react-native\";\n\nconst ZERO_IDFA = \"00000000-0000-0000-0000-000000000000\";\n\nexport type AttStatus = \"granted\" | \"denied\" | \"restricted\" | \"undetermined\" | \"unavailable\";\n\nexport interface AdvertisingIdResult {\n idfv: string | null;\n idfa: string | null;\n gaid: string | null;\n attStatus: AttStatus;\n}\n\nexport class AdvertisingIdManager {\n private cached: AdvertisingIdResult | null = null;\n\n async collect(requestATT = false): Promise<AdvertisingIdResult> {\n if (this.cached) return this.cached;\n\n const fallback: AdvertisingIdResult = { idfv: null, idfa: null, gaid: null, attStatus: \"unavailable\" };\n\n try {\n const tracking = await import(\"expo-tracking-transparency\");\n\n if (Platform.OS === \"ios\") {\n if (!tracking.isAvailable()) {\n // Still attempt IDFV collection — it does not require ATT\n const idfv = await this.collectIdfv();\n this.cached = { ...fallback, idfv };\n return this.cached;\n }\n\n const current = await tracking.getTrackingPermissionsAsync();\n let status = current.status as AttStatus;\n let granted = current.granted;\n\n if (status === \"undetermined\" && requestATT) {\n const result = await tracking.requestTrackingPermissionsAsync();\n status = result.status as AttStatus;\n granted = result.granted;\n }\n\n const idfv = await this.collectIdfv();\n const idfa = granted ? this.sanitizeId(tracking.getAdvertisingId()) : null;\n this.cached = { idfv, idfa, gaid: null, attStatus: status };\n return this.cached;\n }\n\n if (Platform.OS === \"android\") {\n // On Android, getTrackingPermissionsAsync reflects the user's \"Opt out of Ads Personalization\" setting.\n // Only include GAID when the user has not opted out.\n const androidStatus = await tracking.getTrackingPermissionsAsync();\n const optedIn = androidStatus.granted;\n const rawGaid = optedIn ? tracking.getAdvertisingId() : null;\n const gaid = this.sanitizeId(rawGaid);\n // attStatus is an iOS-specific concept; use \"unavailable\" on Android (no ATT dialog).\n // IDFV is also iOS-specific; Android has no vendor identifier equivalent.\n this.cached = { idfv: null, idfa: null, gaid, attStatus: \"unavailable\" };\n return this.cached;\n }\n\n this.cached = fallback;\n return this.cached;\n } catch {\n // expo-tracking-transparency not installed or any other error — never crash the SDK\n this.cached = fallback;\n return this.cached;\n }\n }\n\n private async collectIdfv(): Promise<string | null> {\n try {\n const app = await import(\"expo-application\");\n const idfv = await app.getIosIdForVendorAsync();\n return this.sanitizeId(idfv);\n } catch {\n return null;\n }\n }\n\n private sanitizeId(id: string | null | undefined): string | null {\n if (!id || id === ZERO_IDFA) return null;\n return id;\n }\n}\n","const TIMEOUT_MS = 2000;\n\nexport class FacebookIdManager {\n async getAnonId(): Promise<string | null> {\n try {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<null>((resolve) => {\n timerId = setTimeout(() => resolve(null), TIMEOUT_MS);\n });\n const result = await Promise.race([this.fetchAnonId(), timeoutPromise]);\n clearTimeout(timerId);\n return result;\n } catch {\n return null;\n }\n }\n\n private async fetchAnonId(): Promise<string | null> {\n try {\n const fbsdk = await import(\"react-native-fbsdk-next\");\n const anonId = await fbsdk.AppEventsLogger.getAnonymousID();\n return anonId || null;\n } catch {\n return null;\n }\n }\n}\n\nexport const facebookIdManager = new FacebookIdManager();\n","import { Dimensions, Platform } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { AdvertisingIdManager } from \"./AdvertisingIdManager\";\nimport { facebookIdManager } from \"./FacebookIdManager\";\nimport { identityManager } from \"./IdentityManager\";\nimport { installReferrerManager } from \"./InstallReferrerManager\";\nimport { sessionManager } from \"../session/SessionManager\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nexport class InstallTracker {\n private readonly debug: boolean;\n private readonly advertisingIdManager: AdvertisingIdManager;\n\n constructor(debug = false, advertisingIdManager?: AdvertisingIdManager) {\n this.debug = debug;\n this.advertisingIdManager = advertisingIdManager ?? new AdvertisingIdManager();\n }\n\n async trackIfNeeded(apiClient: ApiClient, requestATT = false): Promise<void> {\n const storage = new SecureStorage(this.debug);\n // Check both SecureStorage and AsyncStorage fallback to avoid duplicate $app_installed\n const alreadyTracked = await storage.get(\"install_tracked\");\n if (alreadyTracked) return;\n let fallbackTracked: string | null = null;\n try {\n const AsyncStorage = (await import(\"@react-native-async-storage/async-storage\")).default;\n fallbackTracked = await AsyncStorage.getItem(\"@paywallo:install_tracked\");\n } catch { /* AsyncStorage not available */ }\n if (fallbackTracked) return;\n\n const distinctId = identityManager.getDistinctId();\n const sessionId = sessionManager.getSessionId();\n const installedAt = Date.now();\n\n if (!distinctId) return;\n\n type DeviceInfoType = { getModel: () => string; getSystemVersion: () => string; getVersion: () => string; getBuildNumber: () => string };\n let deviceInfo: DeviceInfoType | null = null;\n try {\n const mod = await import(\"react-native-device-info\");\n deviceInfo = mod.default as DeviceInfoType;\n } catch {\n deviceInfo = null;\n }\n\n let deviceData: Record<string, string | number> = {};\n try {\n const screen = Dimensions.get(\"screen\");\n const screenWidth = Math.round(screen.width ?? 0);\n const screenHeight = Math.round(screen.height ?? 0);\n const locale = Intl.DateTimeFormat().resolvedOptions().locale ?? \"unknown\";\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"unknown\";\n const deviceModel = deviceInfo?.getModel() || \"unknown\";\n const osVersion = deviceInfo?.getSystemVersion() || \"unknown\";\n const appVersion = deviceInfo?.getVersion() || \"unknown\";\n const buildNumber = deviceInfo?.getBuildNumber() || \"0\";\n deviceData = {\n deviceModel,\n osVersion,\n appVersion,\n buildNumber,\n ...(screenWidth > 0 && { screenWidth }),\n ...(screenHeight > 0 && { screenHeight }),\n timezone,\n locale,\n };\n } catch {\n if (this.debug) {\n console.warn(\"[Paywallo] Failed to collect device data for install event\");\n }\n }\n\n const [fbAnonId, referrer, adIds] = await Promise.all([\n facebookIdManager.getAnonId(),\n installReferrerManager.getReferrer(),\n this.advertisingIdManager.collect(requestATT),\n ]);\n\n try {\n await apiClient.trackEvent(\"$app_installed\", distinctId, {\n installedAt,\n platform: Platform.OS,\n ...(sessionId && { sessionId }),\n ...deviceData,\n ...(fbAnonId && { fbAnonId }),\n ...(referrer.rawReferrer && { installReferrer: referrer.rawReferrer }),\n ...(referrer.trackingId && { referrerTrackingId: referrer.trackingId }),\n ...(referrer.fbclid && { referrerFbclid: referrer.fbclid }),\n ...(referrer.utmSource && { referrerUtmSource: referrer.utmSource }),\n ...(referrer.utmMedium && { referrerUtmMedium: referrer.utmMedium }),\n ...(referrer.utmCampaign && { referrerUtmCampaign: referrer.utmCampaign }),\n ...(adIds.idfa && { idfa: adIds.idfa }),\n ...(adIds.idfv && { idfv: adIds.idfv }),\n ...(adIds.gaid && { gaid: adIds.gaid }),\n attStatus: adIds.attStatus,\n });\n const stored = await storage.set(\"install_tracked\", String(installedAt));\n // Also persist to AsyncStorage as fallback to prevent duplicate tracking\n try {\n const AsyncStorage = (await import(\"@react-native-async-storage/async-storage\")).default;\n await AsyncStorage.setItem(\"@paywallo:install_tracked\", String(installedAt));\n } catch { /* non-critical */ }\n if (this.debug && !stored) {\n console.warn(\"[Paywallo] Install event tracked but flag storage failed — may re-track on next launch\");\n }\n } catch (error) {\n if (this.debug) {\n console.warn(\"[Paywallo] Failed to track install:\", error);\n }\n }\n }\n}\n","import { Platform } from \"react-native\";\n\nconst REFERRER_TIMEOUT_MS = 5000;\n\ninterface ReferrerResult {\n rawReferrer: string | null;\n trackingId: string | null;\n fbclid: string | null;\n utmSource: string | null;\n utmMedium: string | null;\n utmCampaign: string | null;\n}\n\nexport class InstallReferrerManager {\n async getReferrer(): Promise<ReferrerResult> {\n if (Platform.OS !== \"android\") {\n return this.emptyResult();\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<ReferrerResult>((resolve) => {\n timerId = setTimeout(() => resolve(this.emptyResult()), REFERRER_TIMEOUT_MS);\n });\n\n const fetchPromise = this.fetchReferrer();\n\n const result = await Promise.race([fetchPromise, timeoutPromise]);\n clearTimeout(timerId);\n return result;\n }\n\n private async fetchReferrer(): Promise<ReferrerResult> {\n try {\n const Application = await import(\"expo-application\");\n const referrer = await Application.getInstallReferrerAsync();\n\n if (!referrer) return this.emptyResult();\n\n const capped = referrer.slice(0, 2048);\n const params = this.parseReferrer(capped);\n return {\n rawReferrer: capped,\n trackingId: params[\"tracking_id\"] || null,\n fbclid: params[\"fbclid\"] || null,\n utmSource: params[\"utm_source\"] || null,\n utmMedium: params[\"utm_medium\"] || null,\n utmCampaign: params[\"utm_campaign\"] || null,\n };\n } catch {\n return this.emptyResult();\n }\n }\n\n private parseReferrer(referrer: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const pair of referrer.split(\"&\")) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) continue;\n try {\n const key = decodeURIComponent(pair.slice(0, eqIndex).replace(/\\+/g, \" \"));\n const raw = pair.slice(eqIndex + 1).replace(/\\+/g, \" \");\n const value = decodeURIComponent(raw);\n if (key) result[key] = value;\n } catch {\n // malformed percent-encoding — skip this pair\n }\n }\n return result;\n }\n\n private emptyResult(): ReferrerResult {\n return {\n rawReferrer: null,\n trackingId: null,\n fbclid: null,\n utmSource: null,\n utmMedium: null,\n utmCampaign: null,\n };\n }\n}\n\nexport const installReferrerManager = new InstallReferrerManager();\n","import { AppState, AppStateStatus } from \"react-native\";\n\nimport { SESSION_ERROR_CODES, SessionError } from \"./SessionError\";\nimport { EmergencyPaywallHandler, SessionConfig, SessionState } from \"./types\";\nimport { generateUUID } from \"../../utils/uuid\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport {\n trackAppBackground,\n trackAppOpen,\n trackSessionEnd,\n trackSessionStart,\n} from \"./sessionTracking\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nconst SESSION_ID_KEY = \"current_session_id\";\nconst SESSION_START_KEY = \"session_start\";\nconst EMERGENCY_PAYWALL_SHOWN_KEY = \"emergency_paywall_shown\";\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport class SessionManager {\n private sessionId: string | null = null;\n private sessionStartedAt: Date | null = null;\n private appState: AppStateStatus = \"active\";\n private apiClient: ApiClient | null = null;\n private debug = false;\n private initialized = false;\n private config: SessionConfig = {};\n private backgroundTimestamp: number | null = null;\n private appStateSubscription: { remove: () => void } | null = null;\n private emergencyPaywallHandler: EmergencyPaywallHandler | null = null;\n private emergencyPaywallShownInSession = false;\n private secureStorage: SecureStorage | null = null;\n\n async initialize(apiClient: ApiClient, config: SessionConfig = {}, debug = false): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n this.config = {\n sessionTimeoutMs: config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS,\n trackAppState: config.trackAppState ?? true,\n };\n\n await this.restoreSession();\n\n if (this.config.trackAppState) {\n this.setupAppStateListener();\n }\n\n this.initialized = true;\n }\n\n async startSession(): Promise<string> {\n this.ensureInitialized();\n\n if (this.sessionId) {\n await this.endSession();\n }\n\n this.sessionId = generateUUID();\n this.sessionStartedAt = new Date();\n this.emergencyPaywallShownInSession = false;\n\n await Promise.all([\n this.secureStorage!.set(SESSION_ID_KEY, this.sessionId),\n this.secureStorage!.set(SESSION_START_KEY, this.sessionStartedAt.toISOString()),\n this.secureStorage!.remove(EMERGENCY_PAYWALL_SHOWN_KEY),\n ]);\n\n await this.trackSessionStart();\n\n return this.sessionId;\n }\n\n async endSession(): Promise<void> {\n this.ensureInitialized();\n\n if (!this.sessionId || !this.sessionStartedAt) {\n return;\n }\n\n await this.trackSessionEnd();\n\n this.sessionId = null;\n this.sessionStartedAt = null;\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]);\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n getSessionDuration(): number {\n if (!this.sessionStartedAt) {\n return 0;\n }\n return Math.floor((Date.now() - this.sessionStartedAt.getTime()) / 1000);\n }\n\n isSessionActive(): boolean {\n return this.sessionId !== null;\n }\n\n getState(): SessionState {\n return {\n sessionId: this.sessionId,\n startedAt: this.sessionStartedAt,\n isActive: this.isSessionActive(),\n duration: this.getSessionDuration(),\n };\n }\n\n destroy(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n this.appStateSubscription = null;\n }\n this.initialized = false;\n }\n\n registerEmergencyPaywallHandler(handler: EmergencyPaywallHandler): void {\n this.emergencyPaywallHandler = handler;\n }\n\n private async restoreSession(): Promise<void> {\n const [sessionId, sessionStart] = await Promise.all([\n this.secureStorage!.get(SESSION_ID_KEY),\n this.secureStorage!.get(SESSION_START_KEY),\n ]).catch(() => [null, null]);\n\n if (sessionId && sessionStart) {\n const startedAt = new Date(sessionStart);\n const elapsed = Date.now() - startedAt.getTime();\n\n if (elapsed < (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS)) {\n this.sessionId = sessionId;\n this.sessionStartedAt = startedAt;\n return;\n }\n\n await Promise.all([\n this.secureStorage!.remove(SESSION_ID_KEY),\n this.secureStorage!.remove(SESSION_START_KEY),\n ]).catch(() => {});\n }\n }\n\n private setupAppStateListener(): void {\n if (this.appStateSubscription) {\n this.appStateSubscription.remove();\n }\n\n this.appStateSubscription = AppState.addEventListener(\"change\", this.handleAppStateChange);\n }\n\n private handleAppStateChange = async (nextAppState: AppStateStatus): Promise<void> => {\n const previousState = this.appState;\n this.appState = nextAppState;\n\n if (nextAppState === \"active\" && previousState !== \"active\") {\n await this.handleForeground();\n } else if (nextAppState === \"background\" && previousState === \"active\") {\n await this.handleBackground();\n }\n };\n\n private async handleForeground(): Promise<void> {\n if (this.backgroundTimestamp) {\n const elapsed = Date.now() - this.backgroundTimestamp;\n this.backgroundTimestamp = null;\n\n if (elapsed > (this.config.sessionTimeoutMs ?? SESSION_TIMEOUT_MS)) {\n await this.startSession();\n await this.trackAppOpen();\n await this.checkEmergencyPaywall();\n return;\n }\n }\n\n if (!this.sessionId) {\n await this.startSession();\n }\n\n await this.trackAppOpen();\n await this.checkEmergencyPaywall();\n }\n\n private async handleBackground(): Promise<void> {\n this.backgroundTimestamp = Date.now();\n await this.trackAppBackground();\n }\n\n private async checkEmergencyPaywall(): Promise<void> {\n if (!this.apiClient || !this.emergencyPaywallHandler) {\n return;\n }\n\n if (this.emergencyPaywallShownInSession) {\n return;\n }\n\n const response = await this.apiClient.getEmergencyPaywall().catch(() => null);\n\n if (response?.enabled && response.paywallId) {\n this.emergencyPaywallShownInSession = true;\n await this.secureStorage!.set(EMERGENCY_PAYWALL_SHOWN_KEY, \"true\");\n await this.emergencyPaywallHandler(response.paywallId);\n }\n }\n\n private async trackSessionStart(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionStart(this.apiClient, this.sessionId, this.sessionStartedAt);\n }\n\n private async trackSessionEnd(): Promise<void> {\n if (!this.apiClient || !this.sessionId) return;\n await trackSessionEnd(this.apiClient, this.sessionId, this.getSessionDuration(), this.sessionStartedAt);\n }\n\n private async trackAppOpen(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppOpen(this.apiClient, this.sessionId);\n }\n\n private async trackAppBackground(): Promise<void> {\n if (!this.apiClient) return;\n await trackAppBackground(this.apiClient, this.sessionId, this.getSessionDuration());\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SessionManager not initialized. Call initialize() first\"\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.warn(\"[Paywallo Session]\", ...args);\n }\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { PaywalloError } from \"../../errors/PaywalloError\";\n\nexport class SessionError extends PaywalloError {\n constructor(code: string, message: string) {\n super(\"session\", code, message);\n this.name = \"SessionError\";\n }\n}\n\nexport const SESSION_ERROR_CODES = {\n NOT_INITIALIZED: \"SESSION_NOT_INITIALIZED\",\n START_FAILED: \"SESSION_START_FAILED\",\n END_FAILED: \"SESSION_END_FAILED\",\n RESTORE_FAILED: \"SESSION_RESTORE_FAILED\",\n} as const;\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\n\nexport async function trackSessionStart(\n apiClient: ApiClient,\n sessionId: string,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$session_start\", distinctId, {\n sessionId,\n timestamp: sessionStartedAt?.toISOString() ?? null,\n })\n .catch(() => {});\n}\n\nexport async function trackSessionEnd(\n apiClient: ApiClient,\n sessionId: string,\n durationSeconds: number,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$session_end\", distinctId, {\n sessionId,\n durationSeconds,\n startedAt: sessionStartedAt?.toISOString() ?? null,\n endedAt: new Date().toISOString(),\n })\n .catch(() => {});\n}\n\nexport async function trackAppOpen(\n apiClient: ApiClient,\n sessionId: string | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$app_open\", distinctId, {\n sessionId,\n timestamp: new Date().toISOString(),\n })\n .catch(() => {});\n}\n\nexport async function trackAppBackground(\n apiClient: ApiClient,\n sessionId: string | null,\n durationSeconds: number\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n await apiClient\n .trackEvent(\"$app_background\", distinctId, {\n sessionId,\n durationSeconds,\n timestamp: new Date().toISOString(),\n })\n .catch(() => {});\n}\n","import { ANALYTICS_ERROR_CODES,AnalyticsError } from \"../domains/analytics\";\nimport { CLIENT_ERROR_CODES,ClientError } from \"../errors/ClientError\";\nimport { PAYWALL_ERROR_CODES,PaywallError } from \"../domains/paywall\";\nimport type {\n CampaignResponse,\n CampaignResult,\n ConditionalFlagContext,\n IdentifyOptions,\n PaywallResult,\n RestoreResult,\n Subscription,\n TrackEventOptions,\n UserProperties,\n} from \"../types\";\n\nimport { affiliateManager } from \"../domains/affiliate\";\nimport { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport { ApiClient } from \"./ApiClient\";\nimport { campaignGateService } from \"../domains/campaign\";\nimport { identityManager } from \"../domains/identity\";\nimport { InstallTracker } from \"../domains/identity\";\nimport { networkMonitor } from \"./network\";\nimport { offlineQueue, queueProcessor } from \"./queue\";\nimport type { EmergencyPaywallHandler } from \"../domains/session/types\";\nimport { sessionManager } from \"../domains/session\";\nimport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\nexport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\n\ntype PaywallPresenter = (placement: string) => Promise<PaywallResult>;\ntype CampaignPresenter = (campaign: CampaignResponse) => Promise<CampaignResult>;\ntype SubscriptionGetter = () => Promise<Subscription | null>;\ntype ActiveChecker = () => Promise<boolean>;\ntype RestoreHandler = () => Promise<RestoreResult>;\n\nfunction isValidEventName(name: string): boolean {\n if (name.startsWith(\"$\")) return /^\\$[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name);\n}\n\nconst OFFLINE_ACTIVE_STATUSES = [\"active\", \"grace_period\"];\n\n\nasync function resolveClientOfflineFromCache(): Promise<boolean> {\n try {\n const cached = await subscriptionCache.get();\n if (!cached) return false;\n const sub = cached.data.subscription;\n if (!sub) return false;\n if (!OFFLINE_ACTIVE_STATUSES.includes(sub.status)) return false;\n if (!sub.expiresAt) return true;\n return sub.expiresAt > new Date();\n } catch {\n return false;\n }\n}\n\nclass PaywalloClientClass {\n private config: import(\"../types\").PaywalloConfig | null = null;\n private apiClient: ApiClient | null = null;\n private initPromise: Promise<void> | null = null;\n private paywallPresenter: PaywallPresenter | null = null;\n private campaignPresenter: CampaignPresenter | null = null;\n private subscriptionGetter: SubscriptionGetter | null = null;\n private activeChecker: ActiveChecker | null = null;\n private restoreHandler: RestoreHandler | null = null;\n private lastOnboardingStepTimestamp: number | null = null;\n private pendingConfig: PaywalloInitConfig | null = null;\n private networkCleanup: (() => void) | null = null;\n private initAttempts = 0;\n\n private static readonly MAX_INIT_RETRIES = 3;\n private static readonly RETRY_DELAYS = [2000, 5000, 10000];\n\n async init(config: PaywalloInitConfig): Promise<void> {\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"init() called — appKey:\", config.appKey ? config.appKey.substring(0, 8) + \"...\" : \"MISSING\");\n if (this.config && this.apiClient) {\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Already initialized — skipping\");\n return;\n }\n if (this.initPromise) {\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Init already in progress — awaiting...\");\n await this.initPromise;\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Awaited existing init — done\");\n return;\n }\n if (!config.appKey) throw new ClientError(CLIENT_ERROR_CODES.MISSING_APP_KEY, \"appKey is required\");\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Starting fresh init...\");\n this.pendingConfig = config;\n this.initAttempts = 0;\n this.initPromise = this.initWithRetry(config);\n try {\n await this.initPromise;\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"init() SUCCESS\");\n } catch (error) {\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"init() FAILED:\", error instanceof Error ? error.message : String(error));\n this.initPromise = null;\n this.config = null;\n this.apiClient = null;\n this.reportInitFailure(config, error, \"ALL_RETRIES_EXHAUSTED\");\n this.setupNetworkRecovery(config);\n throw error;\n }\n }\n\n private async initWithRetry(config: PaywalloInitConfig): Promise<void> {\n while (this.initAttempts <= PaywalloClientClass.MAX_INIT_RETRIES) {\n try {\n await this.doInit(config);\n if (this.initAttempts > 0) {\n this.reportInitSuccess(config, this.initAttempts);\n }\n this.cleanupNetworkRecovery();\n this.pendingConfig = null;\n return;\n } catch (error) {\n this.initAttempts++;\n if (this.initAttempts > PaywalloClientClass.MAX_INIT_RETRIES) throw error;\n const delay = PaywalloClientClass.RETRY_DELAYS[this.initAttempts - 1] ?? 10000;\n if (config.debug) console.warn(\"[Paywallo]\", `Init attempt ${this.initAttempts} failed, retrying in ${delay}ms`, error);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n private setupNetworkRecovery(config: PaywalloInitConfig): void {\n if (this.networkCleanup) return;\n if (!networkMonitor.isInitialized()) return;\n this.networkCleanup = networkMonitor.addListener((state) => {\n if (state !== \"online\") return;\n if (this.config && this.apiClient) return; // already init'd\n if (config.debug) console.warn(\"[Paywallo]\", \"Network recovered — retrying init\");\n this.initPromise = this.initWithRetry(config);\n this.initPromise\n .then(() => { if (config.debug) console.warn(\"[Paywallo]\", \"Init succeeded after network recovery\"); })\n .catch(() => { this.reportInitFailure(config, null, \"NETWORK_RECOVERY_FAILED\"); });\n });\n }\n\n private cleanupNetworkRecovery(): void {\n if (this.networkCleanup) { this.networkCleanup(); this.networkCleanup = null; }\n }\n\n private reportInitFailure(config: PaywalloInitConfig, error: unknown, reason: string): void {\n try {\n const tempClient = new ApiClient(config.appKey, config.debug);\n void tempClient.reportError(\"INIT_FAILED\", reason, {\n attempts: this.initAttempts,\n error: error instanceof Error ? error.message : String(error),\n });\n } catch { /* non-critical */ }\n }\n\n private reportInitSuccess(config: PaywalloInitConfig, attempts: number): void {\n try {\n if (this.apiClient) {\n void this.apiClient.reportError(\"INIT_RECOVERED\", `Succeeded after ${attempts} retries`, { attempts });\n }\n } catch { /* non-critical */ }\n }\n\n private async doInit(config: PaywalloInitConfig): Promise<void> {\n const environment = config.environment ?? (typeof __DEV__ !== \"undefined\" && __DEV__ ? \"Sandbox\" : \"Production\");\n const offlineQueueEnabled = config.offlineQueueEnabled !== false;\n\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Step 1: networkMonitor + offlineQueue...\");\n // Group 1 — IO that doesn't depend on each other\n await Promise.all([\n networkMonitor.initialize({ debug: config.debug }),\n offlineQueue.initialize({ debug: config.debug }).then(() =>\n offlineQueue.clearItemsWithInvalidAppKey(config.appKey)\n ),\n ]);\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Step 1 DONE\");\n\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Step 2: ApiClient + queueProcessor + affiliate...\");\n this.apiClient = new ApiClient(config.appKey, config.debug, environment, offlineQueueEnabled, config.timeout);\n queueProcessor.initialize(this.apiClient.getHttpClient(), { debug: config.debug });\n affiliateManager.initialize(this.apiClient, config.debug);\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Step 2 DONE\");\n\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Step 3: identityManager + sessionManager...\");\n // Group 2 — both read SecureStorage independently\n await Promise.all([\n identityManager.initialize(this.apiClient, config.debug),\n sessionManager.initialize(this.apiClient, config.sessionConfig, config.debug),\n ]);\n const distinctId = identityManager.getDistinctId();\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"Step 3 DONE — distinctId:\", distinctId ? distinctId.substring(0, 8) + \"...\" : \"EMPTY\");\n\n // Fire-and-forget — don't block SDK ready\n if (config.autoStartSession !== false) {\n sessionManager.startSession().catch(() => {\n if (config.debug) console.warn(\"[Paywallo]\", \"Session start failed during init — continuing\");\n });\n }\n new InstallTracker(config.debug).trackIfNeeded(this.apiClient, config.requestATT === true).catch(() => {});\n this.config = config;\n if (config.debug) console.warn(\"[Paywallo INIT]\", \"COMPLETE — SDK ready, environment:\", environment);\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n await identityManager.identify(options);\n }\n async track(eventName: string, options?: TrackEventOptions): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (this.config?.debug) console.warn(\"[Paywallo TRACK]\", \"SKIPPED — no distinctId\", eventName);\n return;\n }\n if (!isValidEventName(eventName)) {\n const msg = `Invalid event name: \"${eventName}\". Use snake_case or $reserved_name.`;\n throw new ClientError(CLIENT_ERROR_CODES.INVALID_EVENT_NAME, msg);\n }\n const sessionId = sessionManager.getSessionId();\n if (eventName === \"$purchase_completed\") {\n if (this.config?.debug) console.warn(\"[Paywallo PURCHASE]\", \"tracking purchase:\", JSON.stringify({\n distinctId: distinctId.substring(0, 8) + \"...\",\n productId: options?.properties?.productId,\n priceUsd: options?.properties?.priceUsd,\n price: options?.properties?.price,\n currency: options?.properties?.currency,\n placement: options?.properties?.placement,\n }));\n } else if (eventName === \"$paywall_viewed\" || eventName === \"$paywall_closed\") {\n if (this.config?.debug) console.warn(\"[Paywallo PAYWALL]\", eventName, JSON.stringify({\n distinctId: distinctId.substring(0, 8) + \"...\",\n placement: options?.properties?.placement,\n variantKey: options?.properties?.variantKey,\n timeOnPaywall: options?.properties?.timeOnPaywall,\n }));\n } else {\n if (this.config?.debug) console.warn(\"[Paywallo TRACK]\", eventName, \"distinctId:\", distinctId.substring(0, 8) + \"...\");\n }\n await apiClient.trackEvent(eventName, distinctId, {\n ...identityManager.getProperties(), ...options?.properties, ...(sessionId && { sessionId }),\n }, options?.timestamp);\n }\n\n async onboardingStep(index: number, name: string): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (this.config?.debug) console.warn(\"[Paywallo] Skipping event — no distinctId available\");\n return;\n }\n if (!Number.isInteger(index) || index < 0) {\n const msg = `Invalid stepIndex: \"${index}\". Must be a non-negative integer.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_STEP_INDEX, msg);\n }\n const now = Date.now();\n const timeOnPreviousStep = this.lastOnboardingStepTimestamp !== null\n ? Math.round((now - this.lastOnboardingStepTimestamp) / 1000)\n : 0;\n this.lastOnboardingStepTimestamp = now;\n const sessionId = sessionManager.getSessionId();\n await apiClient.trackEvent(\"$onboarding_step\", distinctId, {\n ...identityManager.getProperties(),\n stepIndex: index, stepName: name, timestamp: now, timeOnPreviousStep,\n ...(sessionId && { sessionId }),\n });\n }\n\n async coreAction(actionName: string): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (this.config?.debug) console.warn(\"[Paywallo] Skipping event — no distinctId available\");\n return;\n }\n if (!actionName || typeof actionName !== \"string\") {\n const msg = `Invalid actionName: \"${actionName}\". Must be a non-empty string.`;\n throw new AnalyticsError(ANALYTICS_ERROR_CODES.INVALID_ACTION_NAME, msg);\n }\n const sessionId = sessionManager.getSessionId();\n await apiClient.trackEvent(\"$core_action\", distinctId, {\n ...identityManager.getProperties(), actionName, timestamp: Date.now(), ...(sessionId && { sessionId }),\n });\n }\n\n async getVariantCached(flagKey: string, defaultValue?: string): Promise<import(\"../types\").FlagVariant> {\n this.ensureInitialized();\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n const result = await apiClient.getVariantFromCache(flagKey, distinctId);\n if (result) return result;\n // Background refresh for next call — fire and forget\n void apiClient.getVariant(flagKey, distinctId).catch(() => {});\n return { variant: defaultValue ?? null, payload: undefined };\n }\n\n async getVariant(flagKey: string): Promise<import(\"../types\").FlagVariant> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\n if (this.config?.debug) console.warn(\"[Paywallo AB]\", \"getVariant SKIPPED — no distinctId\", flagKey);\n return { variant: null };\n }\n const result = await this.getApiClientOrThrow().getVariant(flagKey, distinctId);\n if (this.config?.debug) console.warn(\"[Paywallo AB]\", `getVariant(\"${flagKey}\") =`, result.variant);\n return result;\n } catch (error) {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"getVariant failed — returning null\", error);\n if (this.apiClient) void this.apiClient.reportError(\"GET_VARIANT_FAILED\", error instanceof Error ? error.message : String(error));\n return { variant: null };\n }\n }\n async evaluateFlags(keys: string[]): Promise<Record<string, string | null>> {\n this.ensureInitialized();\n return this.getApiClientOrThrow().evaluateFlags(keys, identityManager.getDistinctId());\n }\n async getConditionalFlag(flagKey: string, context?: Partial<ConditionalFlagContext>): Promise<boolean> {\n try {\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) return false;\n const result = await this.getApiClientOrThrow().getConditionalFlag(flagKey, { distinctId, ...context });\n return result.value;\n } catch (error) {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"getConditionalFlag failed — returning false\", error);\n if (this.apiClient) void this.apiClient.reportError(\"GET_CONDITIONAL_FLAG_FAILED\", error instanceof Error ? error.message : String(error));\n return false;\n }\n }\n async getPaywall(placement: string): Promise<import(\"../types\").PaywallConfig | null> {\n return this.getApiClientOrThrow().getPaywall(placement);\n }\n async presentPaywall(placement: string): Promise<PaywallResult> {\n this.ensureInitialized();\n if (!this.paywallPresenter) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return this.paywallPresenter(placement);\n }\n async getCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResponse | null> {\n return campaignGateService.getCampaign(this.getApiClientOrThrow(), placement, context);\n }\n async presentCampaign(placement: string, context?: Record<string, unknown>): Promise<CampaignResult> {\n this.ensureInitialized();\n return campaignGateService.presentCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.paywallPresenter, this.campaignPresenter, context);\n }\n async hasActiveSubscription(): Promise<boolean> {\n this.ensureInitialized();\n try {\n if (this.activeChecker) return await this.activeChecker();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !this.apiClient) return false;\n const status = await this.apiClient.getSubscriptionStatus(distinctId);\n return status.hasActiveSubscription;\n } catch {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"hasActiveSubscription failed — using persistent cache\");\n if (this.apiClient) void this.apiClient.reportError(\"SUBSCRIPTION_CHECK_FAILED\", \"hasActiveSubscription failed\");\n return resolveClientOfflineFromCache();\n }\n }\n\n async getSubscription(): Promise<Subscription | null> {\n this.ensureInitialized();\n try {\n if (this.subscriptionGetter) return await this.subscriptionGetter();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !this.apiClient) return null;\n const status = await this.apiClient.getSubscriptionStatus(distinctId);\n if (!status.subscription) return null;\n return { ...status.subscription, expiresAt: status.subscription.expiresAt ? new Date(status.subscription.expiresAt) : null };\n } catch {\n if (this.config?.debug) console.warn(\"[Paywallo]\", \"getSubscription failed — returning null\");\n return null;\n }\n }\n\n async restorePurchases(): Promise<RestoreResult> {\n this.ensureInitialized();\n if (!this.restoreHandler) throw new PaywallError(PAYWALL_ERROR_CODES.NOT_INITIALIZED, \"PaywalloProvider not mounted. Wrap your app with <PaywalloProvider>\");\n return this.restoreHandler();\n }\n async reset(): Promise<void> { await identityManager.reset(); }\n async fullReset(): Promise<void> {\n const wasDebug = this.config?.debug ?? false;\n await sessionManager.endSession();\n await identityManager.reset();\n await subscriptionCache.invalidate();\n queueProcessor.dispose(); offlineQueue.dispose(); networkMonitor.dispose();\n campaignGateService.clearPreloaded();\n this.cleanupNetworkRecovery();\n this.apiClient = null; this.config = null; this.initPromise = null;\n this.pendingConfig = null; this.initAttempts = 0;\n this.paywallPresenter = null; this.campaignPresenter = null;\n this.subscriptionGetter = null; this.activeChecker = null; this.restoreHandler = null;\n this.lastOnboardingStepTimestamp = null;\n if (wasDebug) console.warn(\"[Paywallo]\", \"Full reset complete\");\n }\n\n getConfig(): import(\"../types\").PaywalloConfig | null { return this.config; }\n getDistinctId(): string { return identityManager.getDistinctId(); }\n getDeviceId(): string | null { return identityManager.getDeviceId(); }\n getEmail(): string | null { return identityManager.getEmail(); }\n getEnvironment(): import(\"../types\").Environment { return this.apiClient?.getEnvironment() ?? \"Production\"; }\n setEnvironment(environment: import(\"../types\").Environment): void { this.apiClient?.setEnvironment(environment); }\n getApiClient(): ApiClient | null { return this.apiClient; }\n getWebUrl(): string | null { return this.apiClient?.getWebUrl() ?? null; }\n getIdentityState(): import(\"../domains/identity/IdentityManager\").IdentityState { return identityManager.getState(); }\n getSessionState(): import(\"../domains/session/types\").SessionState { return sessionManager.getState(); }\n getSessionId(): string | null { return sessionManager.getSessionId(); }\n async startSession(): Promise<string> { return sessionManager.startSession(); }\n async endSession(): Promise<void> { return sessionManager.endSession(); }\n registerPaywallPresenter(p: PaywallPresenter): void { this.paywallPresenter = p; }\n registerCampaignPresenter(p: CampaignPresenter): void { this.campaignPresenter = p; }\n registerSubscriptionGetter(g: SubscriptionGetter): void { this.subscriptionGetter = g; }\n registerActiveChecker(c: ActiveChecker): void { this.activeChecker = c; }\n registerRestoreHandler(h: RestoreHandler): void { this.restoreHandler = h; }\n registerEmergencyPaywallHandler(h: EmergencyPaywallHandler): void { sessionManager.registerEmergencyPaywallHandler(h); }\n\n async requireSubscription(paywallPlacement?: string): Promise<boolean> {\n this.ensureInitialized();\n if (await this.hasActiveSubscription()) return true;\n if (!paywallPlacement) return false;\n const r = await this.presentPaywall(paywallPlacement);\n return r.purchased || r.restored;\n }\n async requireSubscriptionWithCampaign(placement: string, context?: Record<string, unknown>): Promise<boolean> {\n this.ensureInitialized();\n return campaignGateService.requireSubscriptionWithCampaign(\n this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(),\n this.paywallPresenter, this.campaignPresenter, context,\n );\n }\n async gateContent<T>(content: () => T | Promise<T>, paywallPlacement?: string): Promise<T | null> {\n return (await this.requireSubscription(paywallPlacement)) ? content() : null;\n }\n async gateContentWithCampaign<T>(content: () => T | Promise<T>, placement: string, context?: Record<string, unknown>): Promise<T | null> {\n return (await this.requireSubscriptionWithCampaign(placement, context)) ? content() : null;\n }\n async preloadCampaign(placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n return campaignGateService.preloadCampaign(this.getApiClientOrThrow(), placement, context);\n }\n getPreloadedCampaign(placement: string): CampaignResponse | null { return campaignGateService.getPreloadedCampaign(placement); }\n isOnline(): boolean { return networkMonitor.isOnline(); }\n getOfflineQueueSize(): number { return offlineQueue.getSize(); }\n async clearOfflineQueue(): Promise<void> { await offlineQueue.clear(); }\n async processOfflineQueue(): Promise<{ processed: number; failed: number }> { return queueProcessor.processQueue(); }\n\n private getApiClientOrThrow(): ApiClient {\n if (!this.config || !this.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n return this.apiClient;\n }\n\n private ensureInitialized(): void {\n if (!this.config || !this.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized. Call Paywallo.init() first\");\n }\n}\n\nexport const PaywalloClient: IPaywalloClient = new PaywalloClientClass();\n\nexport { PaywalloAffiliate } from \"../domains/affiliate\";\n","import { createContext } from \"react\";\n\nimport type {\n CampaignResult,\n PaywalloConfig,\n PaywallConfig,\n PaywallResult,\n Subscription,\n} from \"../types\";\nimport type { Product } from \"../types/purchase\";\n\nexport interface PreloadResult {\n success: boolean;\n error?: Error;\n}\n\nexport interface PaywalloContextValue {\n config: PaywalloConfig | null;\n isInitialized: boolean;\n initError: Error | null;\n distinctId: string | null;\n subscription: Subscription | null;\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n presentPaywall: (placement: string) => Promise<PaywallResult>;\n presentCampaign: (\n placement: string,\n context?: Record<string, unknown>\n ) => Promise<CampaignResult>;\n preloadCampaign: (placement: string, context?: Record<string, unknown>) => Promise<PreloadResult>;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n restorePurchases: () => Promise<{ success: boolean; error?: Error }>;\n getPaywallConfig: (placement: string) => Promise<PaywallConfig | null>;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport const PaywalloContext = createContext<PaywalloContextValue | null>(null);\n","import { NativeModules, Platform } from \"react-native\";\n\nimport type { LocalizedText } from \"../types/blocks\";\n\nlet currentLanguage = \"pt-BR\";\nlet defaultLanguage = \"pt-BR\";\n\nexport function setCurrentLanguage(language: string): void {\n currentLanguage = language;\n}\n\nexport function setDefaultLanguage(language: string): void {\n defaultLanguage = language;\n}\n\nexport function getCurrentLanguage(): string {\n return currentLanguage;\n}\n\nexport function getDefaultLanguage(): string {\n return defaultLanguage;\n}\n\nexport function getLocalizedString(text: string | LocalizedText | undefined): string {\n if (!text) return \"\";\n if (typeof text === \"string\") return text;\n\n return text[currentLanguage] ?? text[defaultLanguage] ?? Object.values(text)[0] ?? \"\";\n}\n\nexport function detectDeviceLanguage(): string {\n try {\n if (Platform.OS === \"ios\") {\n const settings = (\n NativeModules as {\n SettingsManager?: { settings?: { AppleLocale?: string; AppleLanguages?: string[] } };\n }\n ).SettingsManager?.settings;\n return settings?.AppleLocale ?? settings?.AppleLanguages?.[0] ?? \"en-US\";\n }\n\n return (\n (NativeModules as { I18nManager?: { localeIdentifier?: string } }).I18nManager\n ?.localeIdentifier ?? \"en-US\"\n );\n } catch {\n return \"en-US\";\n }\n}\n\nexport function initLocalization(options?: {\n defaultLanguage?: string;\n detectDevice?: boolean;\n}): void {\n if (options?.defaultLanguage) {\n defaultLanguage = options.defaultLanguage;\n }\n\n if (options?.detectDevice !== false) {\n const deviceLanguage = detectDeviceLanguage();\n currentLanguage = deviceLanguage;\n }\n}\n","import { useContext } from \"react\";\n\nimport { PaywalloContext, PaywalloContextValue } from \"../context/PaywalloContext\";\nimport { CLIENT_ERROR_CODES,ClientError } from \"../errors/ClientError\";\n\nexport function usePaywallo(): PaywalloContextValue {\n const context = useContext(PaywalloContext);\n\n if (!context) {\n throw new ClientError(CLIENT_ERROR_CODES.PROVIDER_MISSING, \"usePaywallo must be used within a PaywalloProvider\");\n }\n\n return context;\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { getIAPService } from \"../domains/iap\";\nimport type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\nimport { mapToFormattedProduct, mapToIAPProduct } from \"../utils/productMappers\";\nimport type { FormattedProduct } from \"../utils/productMappers\";\n\ninterface UseProductsResult {\n products: IAPProduct[];\n formattedProducts: FormattedProduct[];\n isLoading: boolean;\n error: Error | null;\n loadProducts: (productIds: string[]) => Promise<void>;\n getProduct: (productId: string) => IAPProduct | undefined;\n getFormattedProduct: (productId: string) => FormattedProduct | undefined;\n getPriceInfo: (productId: string) => ProductPriceInfo | undefined;\n}\n\nexport function useProducts(initialProductIds?: string[]): UseProductsResult {\n const [products, setProducts] = useState<IAPProduct[]>([]);\n const [formattedProducts, setFormattedProducts] = useState<FormattedProduct[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const loadProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n const iapService = getIAPService();\n const storeProducts = await iapService.loadProducts(productIds);\n\n setProducts(storeProducts.map(mapToIAPProduct));\n setFormattedProducts(storeProducts.map(mapToFormattedProduct));\n } catch (err) {\n setError(err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err)));\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (initialProductIds && initialProductIds.length > 0) {\n void loadProducts(initialProductIds);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getProduct = useCallback(\n (productId: string): IAPProduct | undefined => {\n return products.find((p) => p.productId === productId);\n },\n [products]\n );\n\n const getFormattedProduct = useCallback(\n (productId: string): FormattedProduct | undefined => {\n return formattedProducts.find((p) => p.productId === productId);\n },\n [formattedProducts]\n );\n\n const getPriceInfo = useCallback(\n (productId: string): ProductPriceInfo | undefined => {\n const p = formattedProducts.find((fp) => fp.productId === productId);\n if (!p) return undefined;\n return {\n price: p.price,\n priceValue: p.priceValue,\n currency: p.currency,\n localizedPrice: p.localizedPrice,\n pricePerMonth: p.pricePerMonth,\n pricePerWeek: p.pricePerWeek,\n pricePerDay: p.pricePerDay,\n };\n },\n [formattedProducts]\n );\n\n return {\n products,\n formattedProducts,\n isLoading,\n error,\n loadProducts,\n getProduct,\n getFormattedProduct,\n getPriceInfo,\n };\n}\n","import type { IAPProduct, ProductPriceInfo } from \"../domains/iap/types\";\n\ntype RawStoreProduct = {\n productId: string;\n title: string;\n description: string;\n price: string;\n priceValue: number;\n currency: string;\n localizedPrice: string;\n type: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n pricePerMonth?: string;\n pricePerWeek?: string;\n pricePerDay?: string;\n};\n\nexport interface FormattedProduct extends ProductPriceInfo {\n productId: string;\n title: string;\n description: string;\n subscriptionPeriod?: string;\n introductoryPrice?: string;\n freeTrialPeriod?: string;\n}\n\nexport function mapToIAPProduct(product: RawStoreProduct): IAPProduct {\n return {\n productId: product.productId,\n price: product.price,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n title: product.title,\n description: product.description,\n type: product.type === \"subscription\" ? \"subs\" : \"inapp\",\n subscriptionPeriodAndroid: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriodAndroid: product.freeTrialPeriod,\n };\n}\n\nexport function mapToFormattedProduct(product: RawStoreProduct): FormattedProduct {\n return {\n productId: product.productId,\n title: product.title,\n description: product.description,\n price: product.price,\n priceValue: product.priceValue,\n currency: product.currency,\n localizedPrice: product.localizedPrice,\n subscriptionPeriod: product.subscriptionPeriod,\n introductoryPrice: product.introductoryPrice,\n freeTrialPeriod: product.freeTrialPeriod,\n pricePerMonth: product.pricePerMonth,\n pricePerWeek: product.pricePerWeek,\n pricePerDay: product.pricePerDay,\n };\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { createPurchaseError, PURCHASE_ERROR_CODES,PurchaseError } from \"../domains/iap\";\nimport type { IAPPurchase, PurchaseState } from \"../domains/iap/types\";\n\ninterface UsePurchaseResult {\n state: PurchaseState;\n purchase: (productId: string) => Promise<IAPPurchase>;\n restore: () => Promise<IAPPurchase[]>;\n error: PurchaseError | null;\n isLoading: boolean;\n isPurchasing: boolean;\n isRestoring: boolean;\n}\n\nexport function usePurchase(): UsePurchaseResult {\n const [state, setState] = useState<PurchaseState>(\"idle\");\n const [error, setError] = useState<PurchaseError | null>(null);\n\n const purchase = useCallback(async (productId: string): Promise<IAPPurchase> => {\n setState(\"purchasing\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const result = await iapService.purchase(productId);\n\n if (result.success && result.purchase) {\n setState(\"idle\");\n return {\n productId: result.purchase.productId,\n transactionId: result.purchase.transactionId,\n transactionDate: result.purchase.transactionDate,\n transactionReceipt: result.purchase.receipt,\n };\n }\n\n if (result.error) {\n const purchaseError = createPurchaseError(\"PURCHASE_FAILED\", result.error.message);\n setError(purchaseError);\n setState(\"error\");\n throw result.error;\n }\n\n // User cancelled\n setState(\"idle\");\n throw new PurchaseError(PURCHASE_ERROR_CODES.USER_CANCELLED, \"Purchase cancelled by user\", true);\n } catch (err) {\n setState(\"error\");\n throw err;\n }\n }, []);\n\n const restore = useCallback(async (): Promise<IAPPurchase[]> => {\n setState(\"restoring\");\n setError(null);\n\n try {\n const iapService = getIAPService();\n const transactions = await iapService.restore();\n\n setState(\"idle\");\n return transactions.map((tx) => ({\n productId: tx.productId,\n transactionId: tx.transactionId,\n transactionDate: tx.transactionDate,\n transactionReceipt: tx.receipt,\n }));\n } catch (err) {\n const e = err instanceof PurchaseError ? err : createPurchaseError(\"RESTORE_FAILED\", String(err));\n setError(e);\n setState(\"error\");\n throw e;\n }\n }, []);\n\n return {\n state,\n purchase,\n restore,\n error,\n isLoading: state === \"loading\",\n isPurchasing: state === \"purchasing\",\n isRestoring: state === \"restoring\",\n };\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\nimport type { SubscriptionInfo, SubscriptionStatusResponse } from \"../domains/subscription/types\";\n\ninterface UseSubscriptionResult {\n subscription: SubscriptionInfo | null;\n isActive: boolean;\n isLoading: boolean;\n error: Error | null;\n entitlements: string[];\n refresh: () => Promise<void>;\n restore: () => Promise<void>;\n}\n\nexport function useSubscription(): UseSubscriptionResult {\n const [status, setStatus] = useState<SubscriptionStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.getSubscriptionStatus(true);\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const restore = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const newStatus = await subscriptionManager.restorePurchases();\n setStatus(newStatus);\n } catch (err) {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(err));\n setError(e);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n useEffect(() => {\n void subscriptionManager.getSubscriptionStatus().then((s) => {\n setStatus(s);\n setIsLoading(false);\n });\n\n const removeListener = subscriptionManager.addListener((newStatus) => {\n setStatus(newStatus);\n });\n\n return () => {\n removeListener();\n };\n }, []);\n\n return {\n subscription: status?.subscription ?? null,\n isActive: status?.hasActiveSubscription ?? false,\n isLoading,\n error,\n entitlements: status?.entitlements ?? [],\n refresh,\n restore,\n };\n}\n","import { Platform } from \"react-native\";\n\nimport { SESSION_ERROR_CODES, SessionError } from \"../session/SessionError\";\n\nimport { SubscriptionCache } from \"./SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionManagerConfig,\n SubscriptionStatusResponse,\n} from \"./types\";\n\ntype SubscriptionListener = (subscription: SubscriptionStatusResponse) => void;\n\nclass SubscriptionManagerClass {\n private config: SubscriptionManagerConfig | null = null;\n private cache: SubscriptionCache;\n private listeners: Set<SubscriptionListener> = new Set();\n private userId: string | null = null;\n\n constructor() {\n this.cache = new SubscriptionCache();\n }\n\n init(config: SubscriptionManagerConfig): void {\n this.config = config;\n if (config.cacheTTL) {\n this.cache.setTTL(config.cacheTTL);\n }\n }\n\n setUserId(userId: string | null): void {\n if (this.userId !== userId) {\n this.userId = userId;\n void this.cache.invalidate();\n }\n }\n\n async hasActiveSubscription(forceRefresh = false): Promise<boolean> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.hasActiveSubscription;\n }\n\n async getSubscription(forceRefresh = false): Promise<SubscriptionInfo | null> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.subscription;\n }\n\n async getEntitlements(forceRefresh = false): Promise<string[]> {\n const status = await this.getSubscriptionStatus(forceRefresh);\n return status.entitlements;\n }\n\n async getSubscriptionStatus(forceRefresh = false): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n if (!forceRefresh) {\n const cached = await this.cache.get();\n if (cached && !cached.isStale) {\n return cached.data;\n }\n }\n\n try {\n const status = await this.fetchSubscriptionStatus();\n await this.cache.set(status);\n this.notifyListeners(status);\n return status;\n } catch (error) {\n this.log(\"Failed to fetch subscription status\", error);\n\n const cached = await this.cache.get();\n if (cached) {\n return cached.data;\n }\n\n return this.getEmptyStatus();\n }\n }\n\n async restorePurchases(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n throw new SessionError(\n SESSION_ERROR_CODES.NOT_INITIALIZED,\n \"SubscriptionManager not initialized\"\n );\n }\n\n await this.cache.invalidate();\n return this.getSubscriptionStatus(true);\n }\n\n private async fetchSubscriptionStatus(): Promise<SubscriptionStatusResponse> {\n if (!this.config) {\n return this.getEmptyStatus();\n }\n\n const url = new URL(`${this.config.serverUrl}/subscriptions/status`);\n if (this.userId) {\n url.searchParams.set(\"userId\", this.userId);\n }\n url.searchParams.set(\"platform\", Platform.OS);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-App-Key\": this.config.appKey,\n },\n });\n\n if (!response.ok) {\n throw new SessionError(\n SESSION_ERROR_CODES.RESTORE_FAILED,\n `Failed to fetch subscription status: ${response.status}`\n );\n }\n\n const data = (await response.json()) as SubscriptionStatusResponse;\n\n if (data.subscription) {\n data.subscription.expiresAt = new Date(data.subscription.expiresAt);\n data.subscription.originalPurchaseDate = new Date(data.subscription.originalPurchaseDate);\n data.subscription.latestPurchaseDate = new Date(data.subscription.latestPurchaseDate);\n if (data.subscription.cancellationDate) {\n data.subscription.cancellationDate = new Date(data.subscription.cancellationDate);\n }\n if (data.subscription.gracePeriodExpiresAt) {\n data.subscription.gracePeriodExpiresAt = new Date(data.subscription.gracePeriodExpiresAt);\n }\n }\n\n return data;\n }\n\n private getEmptyStatus(): SubscriptionStatusResponse {\n return {\n hasActiveSubscription: false,\n subscription: null,\n entitlements: [],\n };\n }\n\n addListener(listener: SubscriptionListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(status: SubscriptionStatusResponse): void {\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n\n async onPurchaseComplete(): Promise<void> {\n await this.cache.invalidate();\n await this.getSubscriptionStatus(true);\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config?.debug) {\n console.warn(`[SubscriptionManager] ${message}`, data ?? \"\");\n }\n }\n}\n\nexport const subscriptionManager = new SubscriptionManagerClass();\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Dimensions, Easing, StyleSheet } from \"react-native\";\nimport { PaywallErrorBoundary } from \"./domains/paywall\";\nimport { PaywallModal } from \"./domains/paywall\";\nimport { PaywallWebView } from \"./domains/paywall\";\nimport { PaywalloContext, PaywalloContextValue } from \"./context/PaywalloContext\";\nimport { getIAPService } from \"./domains/iap\";\nimport { PaywalloClient } from \"./core/PaywalloClient\";\nimport { useCampaignPreload } from \"./hooks/useCampaignPreload\";\nimport { usePaywallPresenter } from \"./domains/paywall\";\nimport { useProductLoader } from \"./hooks/useProductLoader\";\nimport { usePurchaseOrchestrator } from \"./hooks/usePurchaseOrchestrator\";\nimport { useSubscriptionSync } from \"./hooks/useSubscriptionSync\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"./domains/campaign\";\nimport { CLIENT_ERROR_CODES, ClientError } from \"./errors/ClientError\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./domains/iap\";\nimport type { CampaignResult, PaywalloConfig, PaywallConfig, PaywallResult, RestoreResult } from \"./types\";\nimport type { Product } from \"./types/purchase\";\nimport { initLocalization } from \"./utils/localization\";\n\ninterface PaywalloProviderProps { children: React.ReactNode; config: PaywalloConfig; }\ninterface ActivePaywall {\n placement: string;\n resolver: (result: PaywallResult) => void;\n paywallConfig?: { id: string; placement: string; config: Record<string, unknown>; primaryProductId?: string; secondaryProductId?: string };\n preloadedProducts?: Map<string, Product>;\n variantKey?: string;\n campaignId?: string;\n}\nexport function PaywalloProvider({ children, config }: PaywalloProviderProps): React.ReactElement {\n const [isInitialized, setIsInitialized] = useState(false);\n const [initError, setInitError] = useState<Error | null>(null);\n const [distinctId, setDistinctId] = useState<string | null>(null);\n const [activePaywall, setActivePaywall] = useState<ActivePaywall | null>(null);\n\n const { products, isLoadingProducts, refreshProducts } = useProductLoader();\n const { subscription, hasActiveSubscription, getSubscription, invalidateCache } = useSubscriptionSync();\n const { preloadedWebView, setPreloadedWebView, preloadCampaign, consumePreloadedCampaign, isPreloadValid } = useCampaignPreload();\n const clearPreloadedWebView = useCallback((): void => setPreloadedWebView(null), [setPreloadedWebView]);\n\n const { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef } =\n usePaywallPresenter(preloadedWebView, clearPreloadedWebView, setPreloadedWebView);\n\n const { handlePreloadedPurchase: rawPreloadedPurchase, handlePreloadedRestore } = usePurchaseOrchestrator(\n preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef\n );\n const [isPreloadPurchasing, setIsPreloadPurchasing] = useState(false);\n const handlePreloadedPurchase = useCallback(async (productId: string) => {\n setIsPreloadPurchasing(true);\n try { await rawPreloadedPurchase(productId); } finally { setIsPreloadPurchasing(false); }\n }, [rawPreloadedPurchase]);\n\n useEffect(() => {\n initLocalization({ detectDevice: true });\n PaywalloClient.init(config)\n .then(() => { setDistinctId(PaywalloClient.getDistinctId()); setIsInitialized(true); })\n .catch((err: unknown) => { setInitError(err instanceof Error ? err : new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, String(err))); });\n }, [config]);\n\n const getPaywallConfig = useCallback(async (p: string): Promise<PaywallConfig | null> => {\n const api = PaywalloClient.getApiClient(); return api ? api.getPaywall(p) : null;\n }, []);\n\n const presentPaywall = useCallback((placement: string): Promise<PaywallResult> => {\n return new Promise<PaywallResult>((resolve) => setActivePaywall({ placement, resolver: resolve }));\n }, []);\n\n const trackCampaignImpression = useCallback((placement: string, variantKey: string, campaignId: string): void => {\n const api = PaywalloClient.getApiClient();\n if (!api) return;\n const sessionId = PaywalloClient.getSessionId();\n void api.trackEvent(\"$campaign_impression\", PaywalloClient.getDistinctId(), { placement, variantKey, campaignId, ...(sessionId && { sessionId }) }).catch(() => {});\n }, []);\n\n const presentCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<CampaignResult> => {\n try {\n if (preloadedWebView?.placement === placement && preloadedWebView.loaded && isPreloadValid(placement)) {\n consumePreloadedCampaign(placement);\n const apiClient = PaywalloClient.getApiClient();\n if (apiClient) {\n const sessionId = PaywalloClient.getSessionId();\n void apiClient.trackEvent(\"$paywall_viewed\", PaywalloClient.getDistinctId(), {\n placement, paywallId: preloadedWebView.paywallId, preloaded: true,\n variantKey: preloadedWebView.variantKey ?? \"\", campaignId: preloadedWebView.campaignId ?? \"\",\n ...(sessionId && { sessionId }),\n });\n }\n trackCampaignImpression(placement, preloadedWebView.variantKey ?? \"\", preloadedWebView.campaignId ?? \"\");\n const r = await presentPreloadedWebView();\n return { ...r, campaignId: preloadedWebView.campaignId ?? \"\", variantKey: preloadedWebView.variantKey ?? \"\" };\n }\n const preloaded = consumePreloadedCampaign(placement);\n if (preloaded) {\n trackCampaignImpression(placement, preloaded.variantKey, preloaded.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: preloaded.paywall.placement, resolver: resolve,\n paywallConfig: preloaded.paywall, preloadedProducts: preloaded.products,\n variantKey: preloaded.variantKey, campaignId: preloaded.campaignId,\n }));\n return { ...r, campaignId: preloaded.campaignId, variantKey: preloaded.variantKey };\n }\n const campaign = PaywalloClient.getPreloadedCampaign(placement) ?? await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) return { presented: false, purchased: false, cancelled: false, restored: false,\n error: new CampaignError(campaign ? CAMPAIGN_ERROR_CODES.PRELOAD_FAILED : CAMPAIGN_ERROR_CODES.NOT_FOUND, campaign ? `No paywall: ${placement}` : `Campaign not found: ${placement}`) };\n trackCampaignImpression(placement, campaign.variantKey, campaign.campaignId);\n const r = await new Promise<PaywallResult>((resolve) => setActivePaywall({\n placement: campaign.paywall.placement, resolver: resolve,\n paywallConfig: { id: campaign.paywall.id, placement: campaign.paywall.placement, config: campaign.paywall.config,\n primaryProductId: campaign.paywall.primaryProductId, secondaryProductId: campaign.paywall.secondaryProductId },\n variantKey: campaign.variantKey, campaignId: campaign.campaignId,\n }));\n return { ...r, campaignId: campaign.campaignId, variantKey: campaign.variantKey };\n } catch (error) {\n return { presented: false, purchased: false, cancelled: false, restored: false,\n error: error instanceof Error ? error : new CampaignError(CAMPAIGN_ERROR_CODES.PRESENT_FAILED, String(error)) };\n }\n },\n [preloadedWebView, isPreloadValid, consumePreloadedCampaign, presentPreloadedWebView, trackCampaignImpression]\n );\n\n const restorePurchases = useCallback(async (): Promise<RestoreResult> => {\n invalidateCache();\n try {\n const txs = await getIAPService().restore();\n return txs.length > 0 ? { success: true, restoredProducts: txs.map((tx) => tx.productId) } : { success: false, restoredProducts: [] };\n } catch (error) {\n return { success: false, restoredProducts: [], error: error instanceof Error ? error : new PurchaseError(PURCHASE_ERROR_CODES.RESTORE_FAILED, String(error)) };\n }\n }, [invalidateCache]);\n\n const handlePaywallResult = useCallback((result: PaywallResult): void => {\n if (activePaywall) { activePaywall.resolver(result); setActivePaywall(null); }\n }, [activePaywall]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const onEmergency = async (id: string): Promise<void> => { try { await presentPaywall(id); } catch { /* non-critical */ } };\n PaywalloClient.registerPaywallPresenter(presentPaywall);\n PaywalloClient.registerSubscriptionGetter(getSubscription);\n PaywalloClient.registerActiveChecker(hasActiveSubscription);\n PaywalloClient.registerRestoreHandler(restorePurchases);\n PaywalloClient.registerEmergencyPaywallHandler(onEmergency);\n }, [isInitialized, presentPaywall, getSubscription, hasActiveSubscription, restorePurchases]);\n\n useEffect(() => { if (activePaywall) setPreloadedWebView(null); }, [activePaywall, setPreloadedWebView]);\n\n const noOp = useCallback(() => {}, []);\n const contextValue: PaywalloContextValue = useMemo(() => ({\n config: PaywalloClient.getConfig(), isInitialized, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts,\n }), [isInitialized, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts]);\n\n const SCREEN_HEIGHT = useMemo(() => Dimensions.get(\"window\").height, []);\n const slideAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n useEffect(() => {\n if (showingPreloadedWebView) {\n slideAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(slideAnim, { toValue: 0, duration: 320, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n } else { slideAnim.setValue(SCREEN_HEIGHT); }\n }, [showingPreloadedWebView, slideAnim, SCREEN_HEIGHT]);\n\n const preloadStyle = [styles.preloadOverlay, showingPreloadedWebView ? styles.visible : styles.hidden,\n { transform: [{ translateY: showingPreloadedWebView ? slideAnim : SCREEN_HEIGHT }] }];\n\n return (\n <PaywalloContext.Provider value={contextValue}>\n {children}\n <PaywallErrorBoundary>\n {!!preloadedWebView?.craftData && (\n <Animated.View style={preloadStyle} pointerEvents={showingPreloadedWebView ? \"auto\" : \"none\"}>\n <PaywallWebView\n paywallId={preloadedWebView.paywallId} craftData={preloadedWebView.craftData}\n products={preloadedWebView.products} primaryProductId={preloadedWebView.primaryProductId}\n secondaryProductId={preloadedWebView.secondaryProductId} isPurchasing={isPreloadPurchasing}\n onReady={handlePreloadedWebViewReady} onClose={showingPreloadedWebView ? handlePreloadedClose : noOp}\n onPurchase={showingPreloadedWebView ? handlePreloadedPurchase : noOp}\n onRestore={showingPreloadedWebView ? handlePreloadedRestore : noOp}\n />\n </Animated.View>\n )}\n </PaywallErrorBoundary>\n <PaywallErrorBoundary>\n {activePaywall && (\n <PaywallModal placement={activePaywall.placement} visible={true} onResult={handlePaywallResult}\n paywallConfig={activePaywall.paywallConfig} preloadedProducts={activePaywall.preloadedProducts}\n variantKey={activePaywall.variantKey} campaignId={activePaywall.campaignId} />\n )}\n </PaywallErrorBoundary>\n </PaywalloContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n preloadOverlay: { position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: \"#ffffff\" },\n hidden: { zIndex: -1 },\n visible: { zIndex: 9999 },\n});\n","import { useCallback, useRef, useState } from \"react\";\n\nimport type { PreloadResult } from \"../context/PaywalloContext\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign/CampaignError\";\nimport { loadCampaignProducts } from \"../utils/loadCampaignProducts\";\nimport {\n consumeCacheEntry,\n isCacheEntryValid,\n type PreloadedCampaign,\n type PreloadedWebView,\n} from \"../utils/preloadCache\";\n\nexport type { PreloadedCampaign, PreloadedWebView };\n\nexport function useCampaignPreload() {\n const [preloadedWebView, setPreloadedWebView] = useState<PreloadedWebView | null>(null);\n const preloadedCampaignsRef = useRef<Map<string, PreloadedCampaign>>(new Map());\n\n const isPreloadValid = useCallback(\n (placement: string): boolean => isCacheEntryValid(preloadedCampaignsRef.current.get(placement)),\n []\n );\n\n const consumePreloadedCampaign = useCallback(\n (placement: string): PreloadedCampaign | null =>\n consumeCacheEntry(preloadedCampaignsRef.current, placement),\n []\n );\n\n const preloadCampaign = useCallback(\n async (placement: string, context?: Record<string, unknown>): Promise<PreloadResult> => {\n try {\n const campaign = await PaywalloClient.getCampaign(placement, context);\n if (!campaign?.paywall) {\n return {\n success: false,\n error: new CampaignError(\n CAMPAIGN_ERROR_CODES.NOT_FOUND,\n `Campaign or paywall not found: ${placement}`\n ),\n };\n }\n\n const { paywall } = campaign;\n const serverProducts = [paywall.primaryProduct, paywall.secondaryProduct].filter(Boolean);\n const storeProductIds = serverProducts.map((p) => p!.storeProductId).filter(Boolean);\n const productsMap = await loadCampaignProducts(\n serverProducts.map((p) => p!),\n storeProductIds\n );\n\n preloadedCampaignsRef.current.set(placement, {\n campaignId: campaign.campaignId,\n variantKey: campaign.variantKey,\n paywall: {\n id: paywall.id,\n placement: paywall.placement,\n config: paywall.config,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n },\n products: productsMap,\n preloadedAt: Date.now(),\n });\n\n const craftData = (paywall.config as { craftData?: string })?.craftData ?? \"\";\n setPreloadedWebView({\n placement, paywallId: paywall.id, craftData, products: productsMap,\n primaryProductId: paywall.primaryProductId,\n secondaryProductId: paywall.secondaryProductId,\n loaded: false, campaignId: campaign.campaignId, variantKey: campaign.variantKey,\n });\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error\n ? error\n : new CampaignError(CAMPAIGN_ERROR_CODES.FETCH_FAILED, String(error)),\n };\n }\n },\n []\n );\n\n return {\n preloadedCampaignsRef,\n preloadedWebView,\n setPreloadedWebView,\n preloadCampaign,\n consumePreloadedCampaign,\n isPreloadValid,\n };\n}\n","import type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nconst PERIOD_MAP: Record<string, string> = {\n P1Y: \"ano\",\n P1M: \"mês\",\n P1W: \"semana\",\n P3M: \"trimestre\",\n P6M: \"semestre\",\n};\n\nexport function buildProductFromServerInfo(info: ServerProductInfo): Product {\n const period = PERIOD_MAP[info.billingPeriod ?? \"\"] ?? \"\";\n const priceStr = info.price != null ? `R$ ${info.price.toFixed(2).replace(\".\", \",\")}` : \"\";\n return {\n productId: info.storeProductId,\n title: info.name,\n description: \"\",\n price: priceStr,\n priceValue: info.price ?? 0,\n currency: \"BRL\",\n localizedPrice: priceStr,\n type: \"subscription\",\n subscriptionPeriod: period,\n freeTrialPeriod: info.trialDays ? `${info.trialDays} dias` : undefined,\n };\n}\n","import { getIAPService } from \"../domains/iap/IAPService\";\nimport { buildProductFromServerInfo } from \"./serverProduct\";\nimport type { ServerProductInfo } from \"../types/campaign\";\nimport type { Product } from \"../types/purchase\";\n\nexport async function loadCampaignProducts(\n serverProducts: ServerProductInfo[],\n storeProductIds: string[]\n): Promise<Map<string, Product>> {\n const productsMap = new Map<string, Product>();\n\n if (storeProductIds.length > 0) {\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const storeProducts = await getIAPService().loadProducts(storeProductIds);\n if (storeProducts.length > 0) {\n for (const p of storeProducts) productsMap.set(p.productId, p as never);\n }\n if (productsMap.size >= storeProductIds.length) break;\n if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt)));\n } catch { if (attempt < 3) await new Promise(r => setTimeout(r, 250 * Math.pow(2, attempt))); }\n }\n }\n\n for (const sp of serverProducts) {\n if (!productsMap.has(sp.storeProductId)) {\n const prod = buildProductFromServerInfo(sp);\n productsMap.set(prod.productId, prod as never);\n }\n }\n\n return productsMap;\n}\n","import type { Product } from \"../types/purchase\";\n\nexport interface PreloadedCampaign {\n campaignId: string;\n variantKey: string;\n paywall: {\n id: string;\n placement: string;\n config: Record<string, unknown>;\n primaryProductId?: string;\n secondaryProductId?: string;\n };\n products: Map<string, Product>;\n preloadedAt: number;\n}\n\nexport interface PreloadedWebView {\n placement: string;\n paywallId: string;\n craftData: string;\n products: Map<string, Product>;\n primaryProductId?: string;\n secondaryProductId?: string;\n loaded: boolean;\n campaignId?: string;\n variantKey?: string;\n}\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport function isCacheEntryValid(entry: PreloadedCampaign | undefined): boolean {\n return !!entry && Date.now() - entry.preloadedAt < CACHE_TTL_MS;\n}\n\nexport function consumeCacheEntry(\n cache: Map<string, PreloadedCampaign>,\n placement: string\n): PreloadedCampaign | null {\n const entry = cache.get(placement);\n if (!isCacheEntryValid(entry)) return null;\n cache.delete(placement);\n return entry ?? null;\n}\n","import { useCallback, useState } from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { Product } from \"../types/purchase\";\n\ninterface UseProductLoaderReturn {\n products: Map<string, Product>;\n isLoadingProducts: boolean;\n refreshProducts: (productIds: string[]) => Promise<void>;\n}\n\nexport function useProductLoader(): UseProductLoaderReturn {\n const [products, setProducts] = useState<Map<string, Product>>(new Map());\n const [isLoadingProducts, setIsLoadingProducts] = useState(false);\n\n const refreshProducts = useCallback(async (productIds: string[]): Promise<void> => {\n setIsLoadingProducts(true);\n try {\n const iapService = getIAPService();\n const loaded = await iapService.loadProducts(productIds);\n const map = new Map<string, Product>();\n for (const p of loaded) map.set(p.productId, p);\n setProducts(map);\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Product load failed:\", error);\n } finally {\n setIsLoadingProducts(false);\n }\n }, []);\n\n return { products, isLoadingProducts, refreshProducts };\n}\n","import { useCallback } from \"react\";\nimport type React from \"react\";\n\nimport { getIAPService } from \"../domains/iap\";\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport type { PaywallResult } from \"../types\";\n\nimport type { PreloadedWebView } from \"./useCampaignPreload\";\nimport { usePaywallTracking } from \"../domains/paywall\";\n\ninterface UsePurchaseOrchestratorReturn {\n handlePreloadedPurchase: (productId: string) => Promise<void>;\n handlePreloadedRestore: () => Promise<void>;\n}\n\nexport function usePurchaseOrchestrator(\n preloadedWebView: PreloadedWebView | null,\n resolvePreloadedPaywall: (result: PaywallResult) => void,\n clearPreloadedWebView: () => void,\n setShowingPreloadedWebView: React.Dispatch<React.SetStateAction<boolean>>,\n presentedAtRef: React.MutableRefObject<number>\n): UsePurchaseOrchestratorReturn {\n const { trackDismissed, trackProductSelected, trackPurchased } = usePaywallTracking();\n\n const handlePreloadedPurchase = useCallback(\n async (productId: string): Promise<void> => {\n try {\n if (preloadedWebView) {\n trackProductSelected({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n const result = await getIAPService().purchase(productId, {\n paywallPlacement: preloadedWebView?.placement,\n variantKey: preloadedWebView?.variantKey,\n });\n if (!result.success) {\n if (result.error) {\n // Real error (validation failed, network error) — close and resolve\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n // No error = user cancelled — stay open to retry\n return;\n }\n\n if (preloadedWebView) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, durationSeconds, action: \"purchase\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n await trackPurchased({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, productId, variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: true, cancelled: false, restored: false });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Preloaded purchase error:\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n },\n [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, trackProductSelected, trackPurchased]\n );\n\n const handlePreloadedRestore = useCallback(async (): Promise<void> => {\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length === 0) return; // Nothing found — stay open\n\n if (preloadedWebView) {\n const durationSeconds = Math.round((Date.now() - presentedAtRef.current) / 1000);\n await trackDismissed({ placement: preloadedWebView.placement, paywallId: preloadedWebView.paywallId, durationSeconds, action: \"restore\", variantKey: preloadedWebView.variantKey, campaignId: preloadedWebView.campaignId });\n }\n\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: true });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] Preloaded restore error:\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n }, [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed]);\n\n return { handlePreloadedPurchase, handlePreloadedRestore };\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nimport { PaywalloClient } from \"../core/PaywalloClient\";\nimport { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport type {\n SubscriptionInfo,\n SubscriptionStatusResponse as DomainStatusResponse,\n} from \"../domains/subscription/types\";\nimport type { Subscription, SubscriptionStatusResponse } from \"../types\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\ninterface CacheEntry {\n data: Subscription | null;\n expiresAt: number;\n}\n\nconst ACTIVE_STATUSES = [\"active\", \"grace_period\"];\n\ninterface UseSubscriptionSyncReturn {\n subscription: Subscription | null;\n hasActiveSubscription: () => Promise<boolean>;\n getSubscription: () => Promise<Subscription | null>;\n invalidateCache: () => void;\n}\n\nfunction toDomainSubscriptionInfo(sub: Subscription): SubscriptionInfo {\n return {\n id: \"\",\n productId: sub.productId,\n // The hook's SubscriptionStatus is a subset of the domain's — cast is safe\n status: sub.status as SubscriptionInfo[\"status\"],\n expiresAt: sub.expiresAt ?? new Date(0),\n originalPurchaseDate: new Date(0),\n latestPurchaseDate: new Date(0),\n willRenew: sub.autoRenewEnabled,\n isTrial: false,\n isIntroductoryPeriod: false,\n platform: sub.platform,\n };\n}\n\nfunction toDomainResponse(status: SubscriptionStatusResponse): DomainStatusResponse {\n return {\n hasActiveSubscription: status.hasActiveSubscription,\n subscription: status.subscription\n ? toDomainSubscriptionInfo(status.subscription)\n : null,\n entitlements: [],\n };\n}\n\nasync function resolveOfflineFromCache(): Promise<boolean> {\n try {\n const cached = await subscriptionCache.get();\n if (!cached) return false;\n const sub = cached.data.subscription;\n if (!sub) return false;\n if (!ACTIVE_STATUSES.includes(sub.status)) return false;\n // expiresAt is required by the type — treat epoch (new Date(0)) as \"no expiry\" sentinel\n const hasValidExpiry = sub.expiresAt.getTime() === 0 || sub.expiresAt > new Date();\n return hasValidExpiry;\n } catch {\n return false;\n }\n}\n\nfunction isActiveCacheEntry(entry: CacheEntry): boolean {\n if (!entry.data) return false;\n if (!ACTIVE_STATUSES.includes(entry.data.status)) return false;\n if (entry.data.expiresAt && entry.data.expiresAt < new Date()) return false;\n return true;\n}\n\nexport function useSubscriptionSync(): UseSubscriptionSyncReturn {\n const [subscription, setSubscription] = useState<Subscription | null>(null);\n const cacheRef = useRef<CacheEntry | null>(null);\n\n const invalidateCache = useCallback((): void => {\n cacheRef.current = null;\n void subscriptionCache.invalidate();\n }, []);\n\n const fetchAndCache = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const status = await apiClient.getSubscriptionStatus(distinctId);\n const sub = status.subscription\n ? {\n ...status.subscription,\n expiresAt: status.subscription.expiresAt\n ? new Date(status.subscription.expiresAt)\n : null,\n }\n : null;\n\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n void subscriptionCache.set(toDomainResponse(status));\n return sub;\n }, []);\n\n const hasActiveSubscription = useCallback(async (): Promise<boolean> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return false;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) {\n return isActiveCacheEntry(cached);\n }\n\n // Cold start: try persistent cache before hitting the network\n try {\n const persisted = await subscriptionCache.get();\n if (persisted) {\n if (!persisted.isStale) {\n const sub = persisted.data.subscription\n ? {\n productId: persisted.data.subscription.productId,\n status: persisted.data.subscription.status as Subscription[\"status\"],\n expiresAt: persisted.data.subscription.expiresAt ?? null,\n platform: persisted.data.subscription.platform,\n autoRenewEnabled: persisted.data.subscription.willRenew,\n inGracePeriod: persisted.data.subscription.status === \"grace_period\",\n }\n : null;\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n return persisted.data.hasActiveSubscription;\n }\n // Stale: do NOT write to cacheRef — let fetchAndCache() own the write\n void fetchAndCache();\n return persisted.data.hasActiveSubscription;\n }\n } catch {\n // Fall through to network fetch\n }\n\n try {\n const status = await apiClient.getSubscriptionStatus(distinctId);\n const sub = status.subscription\n ? {\n ...status.subscription,\n expiresAt: status.subscription.expiresAt\n ? new Date(status.subscription.expiresAt)\n : null,\n }\n : null;\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n void subscriptionCache.set(toDomainResponse(status));\n return status.hasActiveSubscription;\n } catch {\n return await resolveOfflineFromCache();\n }\n }, [fetchAndCache]);\n\n const getSubscription = useCallback(async (): Promise<Subscription | null> => {\n const apiClient = PaywalloClient.getApiClient();\n const distinctId = PaywalloClient.getDistinctId();\n if (!apiClient || !distinctId) return null;\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return cached.data;\n\n try {\n return await fetchAndCache();\n } catch {\n // Network failure — fall back to persistent cache so offline cold-start\n // returns the last known subscription rather than null.\n try {\n const persisted = await subscriptionCache.get();\n if (!persisted?.data.subscription) return null;\n const s = persisted.data.subscription;\n const normalisedStatus = (s.status as string) === \"grace_period\"\n ? \"in_grace_period\" as Subscription[\"status\"]\n : s.status as Subscription[\"status\"];\n return {\n productId: s.productId,\n status: normalisedStatus,\n expiresAt: s.expiresAt ?? null,\n platform: s.platform,\n autoRenewEnabled: s.willRenew,\n inGracePeriod: normalisedStatus === \"in_grace_period\",\n };\n } catch {\n return null;\n }\n }\n }, [fetchAndCache]);\n\n return { subscription, hasActiveSubscription, getSubscription, invalidateCache };\n}\n","import type { Product } from \"../types/purchase\";\nimport type { VariableContext } from \"./variableResolver\";\n\nexport function getProductVariable(product: Product | undefined, property: string): string {\n if (!product) return \"\";\n\n switch (property) {\n case \"id\": return product.productId;\n case \"name\": return product.title;\n case \"price\": return product.localizedPrice;\n case \"pricePerMonth\": return product.pricePerMonth ?? product.localizedPrice;\n case \"pricePerWeek\": return product.pricePerWeek ?? \"\";\n case \"pricePerDay\": return product.pricePerDay ?? \"\";\n case \"period\": return product.subscriptionPeriod ?? \"\";\n case \"trialPeriod\": return product.freeTrialPeriod ?? \"\";\n case \"introPrice\": return product.introductoryPrice ?? \"\";\n case \"savings\": return product.savings ?? \"\";\n case \"savingsPercent\": return product.savingsPercent ?? \"\";\n case \"hasFreeTrial\": return product.freeTrialPeriod ? \"true\" : \"false\";\n case \"hasIntroOffer\": return product.introductoryPrice ? \"true\" : \"false\";\n case \"renewalPeriod\": return product.subscriptionPeriod ?? \"\";\n default: return \"\";\n }\n}\n\nexport function resolveProductsVariable(parts: string[], context: VariableContext): string | null {\n if (parts[0] !== \"products\") return null;\n\n if (parts[1] === \"selected\" && context.selectedProductId) {\n return getProductVariable(context.products.get(context.selectedProductId), parts[2]);\n }\n if (parts[1] === \"primary\" && context.primaryProductId) {\n return getProductVariable(context.products.get(context.primaryProductId), parts[2]);\n }\n if (parts[1] === \"secondary\" && context.secondaryProductId) {\n return getProductVariable(context.products.get(context.secondaryProductId), parts[2]);\n }\n if (parts[1] === \"hasIntroductoryOffer\") {\n return Array.from(context.products.values()).some((p) => p.introductoryPrice) ? \"true\" : \"false\";\n }\n\n return null;\n}\n\nexport function resolveLegacyVariable(variableName: string, context: VariableContext): string | null {\n if (variableName === \"device_name\") return context.deviceInfo?.name ?? \"\";\n if (variableName === \"product_price\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.localizedPrice ?? \"\";\n }\n if (variableName === \"trial_period\" && context.selectedProductId) {\n return context.products.get(context.selectedProductId)?.freeTrialPeriod ?? \"\";\n }\n return null;\n}\n","import type { Product } from \"../types/purchase\";\nimport { resolveProductsVariable, resolveLegacyVariable } from \"./productVariableResolver\";\n\nexport interface VariableContext {\n selectedProductId?: string;\n primaryProductId?: string;\n secondaryProductId?: string;\n products: Map<string, Product>;\n customVariables?: Record<string, string>;\n deviceInfo?: {\n name?: string;\n model?: string;\n os?: string;\n osVersion?: string;\n locale?: string;\n };\n userInfo?: {\n id?: string;\n name?: string;\n email?: string;\n };\n}\n\nfunction resolveVariable(variableName: string, context: VariableContext): string {\n const parts = variableName.split(\".\");\n\n if (parts[0] === \"device\" && context.deviceInfo) {\n switch (parts[1]) {\n case \"name\": return context.deviceInfo.name ?? \"\";\n case \"model\": return context.deviceInfo.model ?? \"\";\n case \"os\": return context.deviceInfo.os ?? \"\";\n case \"osVersion\": return context.deviceInfo.osVersion ?? \"\";\n case \"locale\": return context.deviceInfo.locale ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"user\" && context.userInfo) {\n switch (parts[1]) {\n case \"id\": return context.userInfo.id ?? \"\";\n case \"name\": return context.userInfo.name ?? \"\";\n case \"email\": return context.userInfo.email ?? \"\";\n default: return \"\";\n }\n }\n\n if (parts[0] === \"products\") {\n return resolveProductsVariable(parts, context) ?? \"\";\n }\n\n return resolveLegacyVariable(variableName, context) ?? context.customVariables?.[variableName] ?? \"\";\n}\n\nexport function resolveText(text: string, context: VariableContext): string {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n return text.replace(regex, (_, variableName: string) => {\n return resolveVariable(variableName.trim(), context);\n });\n}\n\nexport function parseVariables(text: string): string[] {\n const regex = /\\{\\{([^}]+)\\}\\}/g;\n const variables: string[] = [];\n let match;\n while ((match = regex.exec(text)) !== null) {\n variables.push(match[1].trim());\n }\n return variables;\n}\n\nexport function hasVariables(text: string): boolean {\n return /\\{\\{[^}]+\\}\\}/.test(text);\n}\n","import { PaywalloClient } from \"./core/PaywalloClient\";\n\nexport { PaywallModal } from \"./domains/paywall\";\nexport { PaywalloContext, type PreloadResult } from \"./context/PaywalloContext\";\nexport { PaywallContext, usePaywallContext } from \"./domains/paywall\";\nexport { AffiliateManager, affiliateManager } from \"./domains/affiliate\";\nexport { ApiClient, type ApiClientConfig } from \"./core/ApiClient\";\nexport {\n HttpClient,\n type HttpClientConfig,\n type HttpResponse,\n type RequestOptions,\n type RetryConfig,\n} from \"./core/http\";\nexport { getIAPService, IAPService } from \"./domains/iap\";\nexport { IdentityManager, identityManager, type IdentityState } from \"./domains/identity\";\nexport { nativeStoreKit } from \"./domains/iap\";\nexport {\n type NetworkListener,\n networkMonitor,\n type NetworkMonitorConfig,\n type NetworkState,\n} from \"./core/network\";\nexport {\n type IPaywalloClient,\n PaywalloClient,\n type PaywalloInitConfig,\n type PreloadCampaignResult,\n} from \"./core/PaywalloClient\";\nexport { PaywalloAffiliate } from \"./domains/affiliate\";\nexport {\n offlineQueue,\n type OfflineQueueConfig,\n type QueueEvent,\n type QueueItem,\n type QueueListener,\n queueProcessor,\n type QueueProcessorConfig,\n} from \"./core/queue\";\nexport {\n type SessionConfig,\n SessionManager,\n sessionManager,\n type SessionState,\n} from \"./domains/session\";\nexport {\n AFFILIATE_ERROR_CODES,\n AffiliateError,\n ANALYTICS_ERROR_CODES,\n AnalyticsError,\n CAMPAIGN_ERROR_CODES,\n CampaignError,\n createPurchaseError,\n IDENTITY_ERROR_CODES,\n IdentityError,\n PaywalloError,\n PAYWALL_ERROR_CODES,\n PaywallError,\n PURCHASE_ERROR_CODES,\n PurchaseError,\n SESSION_ERROR_CODES,\n SessionError,\n} from \"./errors\";\nexport { usePaywallo } from \"./hooks/usePaywallo\";\nexport { useProducts } from \"./hooks/useProducts\";\nexport { usePurchase } from \"./hooks/usePurchase\";\nexport { useSubscription } from \"./hooks/useSubscription\";\nexport { PaywalloProvider } from \"./PaywalloProvider\";\nexport type {\n IAPProduct,\n IAPPurchase,\n ProductPriceInfo,\n PurchaseControllerConfig,\n PurchaseState,\n} from \"./domains/iap\";\nexport { ERROR_CODES } from \"./domains/iap\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./domains/subscription\";\nexport { SubscriptionCache, subscriptionManager } from \"./domains/subscription\";\nexport type {\n AffiliateBalance,\n AffiliateCommission,\n AffiliateCoupon,\n BlockType,\n BoxSpacing,\n CampaignPresentOptions,\n CampaignResponse,\n CampaignResult,\n ConditionalFlagContext,\n ConditionalFlagResult,\n Environment,\n FlagVariant,\n IdentifyOptions,\n LocalizedText,\n PaywalloConfig,\n PaywallBlockConfig,\n PaywallConfig,\n PaywallNode,\n PaywallPresentOptions,\n PaywallResult,\n PaywallState,\n Product,\n Purchase,\n PurchaseResult,\n RestoreResult,\n Subscription,\n SubscriptionPlatform,\n SubscriptionStatus,\n SubscriptionStatusResponse,\n TapBehavior,\n TrackEventOptions,\n UserProperties,\n ValidatePurchaseResponse,\n WithdrawalRequest,\n} from \"./types\";\nexport {\n detectDeviceLanguage,\n getCurrentLanguage,\n getDefaultLanguage,\n getLocalizedString,\n initLocalization,\n setCurrentLanguage,\n setDefaultLanguage,\n} from \"./utils/localization\";\nexport type { VariableContext } from \"./utils/variableResolver\";\nexport { hasVariables, parseVariables, resolveText } from \"./utils/variableResolver\";\n\nexport const Paywallo = PaywalloClient;\nexport default Paywallo;\n"],"mappings":"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","names":["useCallback","useEffect","useRef","useState","Animated","Dimensions","StyleSheet","View","useCallback","Platform","Platform","useCallback","useRef","useState","useState","useRef","useCallback","useEffect","useRef","useState","NativeModules","NativeModules","useRef","useState","useCallback","useEffect","jsx","SCREEN_HEIGHT","Dimensions","useState","useRef","useCallback","Animated","useEffect","View","styles","StyleSheet","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","Platform","AsyncStorage","AsyncStorage","item","Platform","Platform","idfv","Dimensions","Platform","Platform","AppState","AppState","AsyncStorage","Dimensions","Platform","createContext","NativeModules","Platform","useContext","useContext","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useState","useState","useCallback","useCallback","useEffect","useState","Platform","Platform","useState","useCallback","useEffect","useCallback","useEffect","useMemo","useRef","useState","Animated","Dimensions","Easing","StyleSheet","useCallback","useRef","useState","useState","useRef","useCallback","useCallback","useState","useState","useCallback","useCallback","useCallback","useCallback","useRef","useState","CACHE_TTL_MS","useState","useRef","useCallback","jsx","jsxs","useState","useCallback","useEffect","r","useMemo","SCREEN_HEIGHT","Dimensions","useRef","Animated","Easing","styles","StyleSheet"]}