@virex-tech/paywallo-sdk 1.5.2 → 1.5.4

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/utils/uuid.ts","../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/domains/identity/IdentityManager.ts","../src/utils/NativeDeviceInfo.ts","../src/core/storage/NativeStorage.ts","../src/core/storage/SecureStorage.ts","../src/core/storage/StorageMigration.ts","../src/domains/paywall/usePaywallTracking.ts","../src/domains/paywall/usePaywallLoader.ts","../src/domains/paywall/PaywallError.ts","../src/utils/localization.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/subscription/SubscriptionCache.ts","../src/domains/session/SessionError.ts","../src/domains/subscription/SubscriptionManager.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/core/EventBatcher.ts","../src/core/FlagStorage.ts","../src/domains/campaign/CampaignError.ts","../src/domains/campaign/CampaignGateService.ts","../src/domains/identity/AdvertisingIdManager.ts","../src/domains/identity/InstallTracker.ts","../src/domains/identity/MetaBridge.ts","../src/domains/identity/InstallReferrerManager.ts","../src/domains/session/SessionManager.ts","../src/utils/deviceInfo.ts","../src/domains/session/sessionTracking.ts","../src/core/PaywalloClient.ts","../src/context/PaywalloContext.ts","../src/hooks/usePaywallo.ts","../src/hooks/useProducts.ts","../src/utils/productMappers.ts","../src/hooks/usePurchase.ts","../src/hooks/useSubscription.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 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","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 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 INSECURE_REQUEST: \"CLIENT_INSECURE_REQUEST\",\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\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getSdkString } from \"../../utils/localization\";\n\nimport { PaywallWebView } from \"./PaywallWebView\";\n\ninterface ErrorFallbackProps {\n description: string;\n onRetry: () => void;\n onClose: () => void;\n}\n\nfunction ErrorFallback({ description, onRetry, onClose }: ErrorFallbackProps): React.ReactElement {\n const overrides = PaywalloClient.getConfig()?.errorStrings;\n const title = overrides?.title ?? getSdkString(\"paywallErrorTitle\");\n const retryLabel = overrides?.retry ?? getSdkString(\"paywallRetryButton\");\n const closeLabel = overrides?.close ?? getSdkString(\"paywallCloseButton\");\n\n return (\n <View style={styles.fallbackContainer}>\n <View style={styles.fallbackCard}>\n <Text style={styles.fallbackTitle}>{title}</Text>\n <Text style={styles.fallbackDescription}>{description}</Text>\n <Pressable style={styles.retryButton} onPress={onRetry}>\n <Text style={styles.retryButtonText}>{retryLabel}</Text>\n </Pressable>\n <Pressable style={styles.closeButton} onPress={onClose}>\n <Text style={styles.closeButtonText}>{closeLabel}</Text>\n </Pressable>\n </View>\n </View>\n );\n}\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 screenHeight = Dimensions.get(\"window\").height;\n const openAnim = useRef(new Animated.Value(screenHeight)).current;\n const [modalVisible, setModalVisible] = useState(false);\n\n const handleResult = useCallback((result: PaywallResult) => {\n setModalVisible(false);\n onResult(result);\n }, [onResult]);\n\n const { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore } =\n usePaywallActions(placement, paywallConfig, handleResult, variantKey, campaignId, openAnim);\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 useEffect(() => {\n if (visible) {\n setModalVisible(true);\n openAnim.setValue(Dimensions.get(\"window\").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 (!modalVisible && !visible) return null;\n\n return (\n <Modal\n visible={modalVisible}\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 <ErrorFallback\n description={webViewError.description}\n onRetry={handleRetry}\n onClose={handleClose}\n />\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\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 openAnim?: Animated.Value\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 const animTarget = openAnim ?? slideAnim;\n Animated.timing(animTarget, { toValue: Dimensions.get(\"window\").height, duration: 350, 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, openAnim, 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 onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (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 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 private purchaseInFlight: string | 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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] loadProducts failed', err);\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 validateWithRetry(\n attempt: () => Promise<ValidatePurchaseResponse>,\n maxRetries = 2,\n delayMs = 3000\n ): Promise<ValidatePurchaseResponse> {\n let lastError: unknown;\n for (let i = 0; i <= maxRetries; i++) {\n try {\n return await attempt();\n } catch (error) {\n lastError = error;\n if (i < maxRetries) await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw lastError;\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 return this.validateWithRetry(\n () => 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 }\n\n private async finishTransaction(transactionId: string): Promise<void> {\n try {\n await NativeStoreKit.finishTransaction(transactionId);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] finishTransaction failed', err);\n }\n }\n\n async purchase(\n productId: string,\n options?: { paywallPlacement?: string; variantKey?: string }\n ): Promise<PurchaseResult> {\n if (!NativeStoreKit.isAvailable()) {\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 if (this.purchaseInFlight) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, \"A purchase is already in progress\"),\n };\n }\n this.purchaseInFlight = productId;\n\n const debug = PaywalloClient.getConfig()?.debug;\n if (debug) console.log(`[Paywallo PURCHASE] starting ${productId}`);\n try {\n const purchase = await NativeStoreKit.purchase(productId);\n\n if (!purchase) {\n if (debug) console.log(`[Paywallo PURCHASE] ${productId} cancelled`);\n return { success: false };\n }\n\n if (debug) console.log(`[Paywallo PURCHASE] ${productId} approved`, { transactionId: purchase.transactionId });\n\n await this.finishTransaction(purchase.transactionId);\n if (debug) console.log(`[Paywallo PURCHASE] ${productId} finished`);\n\n this.validateWithServer(purchase, productId, options)\n .then(() => { if (debug) console.log(`[Paywallo PURCHASE] ${productId} server validated`); })\n .catch((err) => { if (debug) console.error(\"[Paywallo PURCHASE] background validation failed\", err); });\n\n return { success: true, purchase };\n } catch (error) {\n if (debug) console.error(`[Paywallo PURCHASE] ${productId} failed`, error);\n const e = error instanceof PurchaseError ? error : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, error instanceof Error ? error.message : String(error));\n return { success: false, error: e };\n } finally {\n this.purchaseInFlight = null;\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] finishTransaction failed', err);\n }\n validated.push(tx);\n }\n }\n\n return validated;\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] restore failed', err);\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 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 uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (distinctId && !uuidRegex.test(distinctId)) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] distinctId is not a valid UUID for appAccountToken:\", distinctId);\n }\n try {\n const result = await PaywalloStoreKitNative.purchase(productId, distinctId ?? null);\n if (!result || result.pending) {\n return null;\n }\n return mapNativePurchase(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.toLowerCase().includes(\"cancel\")) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.USER_CANCELLED, message, true);\n }\n throw new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, message);\n }\n },\n\n async finishTransaction(transactionId: string): Promise<void> {\n if (!PaywalloStoreKitNative) return;\n try {\n await PaywalloStoreKitNative.finishTransaction(transactionId);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] finishTransaction native error\", err);\n }\n },\n\n async getActiveTransactions(): Promise<Purchase[]> {\n if (!PaywalloStoreKitNative) return [];\n try {\n const results = await PaywalloStoreKitNative.getActiveTransactions();\n return results.map(mapNativePurchase);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] getActiveTransactions failed\", err);\n return [];\n }\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","import { IDENTITY_ERROR_CODES, IdentityError } from \"./IdentityError\";\nimport type { IdentifyOptions, UserProperties } from \"../../types\";\nimport { generateUUID } from \"../../utils/uuid\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { runStorageMigrationIfNeeded } from \"../../core/storage/StorageMigration\";\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nconst DEVICE_ID_KEY = \"device_id\";\nconst ANON_ID_KEY = \"anon_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 anonId: 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 private initPromise: Promise<string> | null = null;\n\n async initialize(apiClient: ApiClient, debug = false): Promise<string> {\n if (this.initialized) {\n return this.deviceId ?? \"\";\n }\n // Concurrent calls: return the in-flight promise so only one execution runs\n if (this.initPromise) {\n return this.initPromise;\n }\n this.initPromise = this._doInitialize(apiClient, debug).finally(() => {\n this.initPromise = null;\n });\n return this.initPromise;\n }\n\n private async _doInitialize(apiClient: ApiClient, debug: boolean): Promise<string> {\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n\n // Migrate data from SDK ≤1.5.0 (AsyncStorage + react-native-keychain) to\n // NativeStorage (UserDefaults/SharedPreferences + native Keychain) before\n // reading persisted state so no device_id is lost on upgrade.\n await runStorageMigrationIfNeeded();\n\n await this.loadPersistedState();\n\n if (!this.deviceId) {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n const deviceId = info.deviceId;\n this.deviceId = (!deviceId || deviceId === \"unknown\") ? generateUUID() : deviceId;\n } catch {\n this.deviceId = generateUUID();\n }\n const stored = await this.secureStorage.set(DEVICE_ID_KEY, this.deviceId);\n if (!stored) {\n await this.secureStorage.set(\"device_id_fallback\", this.deviceId).catch(() => { /* non-critical */ });\n }\n }\n\n if (!this.anonId) {\n this.anonId = \"$paywallo_anon:\" + generateUUID();\n await this.secureStorage.set(ANON_ID_KEY, this.anonId).catch(() => { /* non-critical */ });\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 if (!EMAIL_REGEX.test(email)) {\n if (this.debug) console.warn('[Paywallo] Invalid email format, skipping email field');\n email = undefined;\n } else {\n this.email = email;\n await this.secureStorage!.set(USER_EMAIL_KEY, email);\n }\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.anonId) {\n try {\n await this.apiClient.identify(this.anonId, properties, email, this.deviceId ?? undefined);\n } catch { /* non-critical */ }\n }\n }\n\n getDistinctId(): string {\n if (!this.initialized || !this.anonId) {\n return \"\";\n }\n return this.anonId;\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.anonId) {\n try {\n await this.apiClient.identify(this.anonId, this.properties, this.email ?? undefined, this.deviceId ?? undefined);\n } catch { /* non-critical */ }\n }\n }\n\n async reset(): Promise<void> {\n const newAnonId = \"$paywallo_anon:\" + generateUUID();\n this.anonId = newAnonId;\n this.email = null;\n this.properties = {};\n\n await Promise.all([\n this.secureStorage?.set(ANON_ID_KEY, newAnonId) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_EMAIL_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PROPERTIES_KEY) ?? 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, storedAnonId, storedEmail, storedPropertiesJson] = await Promise.all([\n this.secureStorage.get(DEVICE_ID_KEY),\n this.secureStorage.get(ANON_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 } else {\n const fallbackDeviceId = await this.secureStorage.get(\"device_id_fallback\");\n if (fallbackDeviceId) {\n this.deviceId = fallbackDeviceId;\n }\n }\n\n if (storedAnonId) {\n this.anonId = storedAnonId;\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 { /* malformed JSON in storage — reset to empty */\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}\n\nexport const identityManager = new IdentityManager();\n","import { NativeModules } from \"react-native\";\n\nexport interface DeviceInfoResult {\n deviceId: string;\n model: string;\n modelId: string;\n systemVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n brand: string;\n systemName: string;\n totalDisk: number;\n freeDisk: number;\n totalRam: number;\n carrier: string;\n installerPackage: string | null;\n idfv: string | null;\n}\n\ninterface PaywalloDeviceModule {\n // Native modules return unknown at runtime; Promise<unknown> forces explicit validation.\n getDeviceInfo(): Promise<unknown>;\n getInstallReferrer(): Promise<string | null>;\n}\n\nconst FALLBACK: DeviceInfoResult = {\n deviceId: \"unknown\", model: \"unknown\", modelId: \"unknown\",\n systemVersion: \"0.0.0\", appVersion: \"0.0.0\", buildNumber: \"0\",\n bundleId: \"unknown\", brand: \"unknown\", systemName: \"unknown\",\n totalDisk: 0, freeDisk: 0, totalRam: 0, carrier: \"unknown\",\n installerPackage: null, idfv: null,\n};\n\nlet _debug = false;\nlet warnedOnce = false;\nlet cachedDeviceInfo: DeviceInfoResult | null = null;\n\nexport function setNativeDeviceInfoDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isDeviceInfoResult(value: unknown): value is DeviceInfoResult {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"deviceId\"] === \"string\" &&\n typeof v[\"model\"] === \"string\" &&\n typeof v[\"systemVersion\"] === \"string\" &&\n typeof v[\"appVersion\"] === \"string\" &&\n typeof v[\"bundleId\"] === \"string\"\n );\n}\n\nfunction getNativeModule(): PaywalloDeviceModule | null {\n const mod = NativeModules.PaywalloDevice as PaywalloDeviceModule | undefined;\n if (!mod) {\n if (!warnedOnce) {\n warnedOnce = true;\n console.warn(\"[Paywallo] NativeModules.PaywalloDevice not found — falling back to defaults\");\n }\n return null;\n }\n return mod;\n}\n\nasync function getDeviceInfo(): Promise<DeviceInfoResult> {\n if (cachedDeviceInfo !== null) return cachedDeviceInfo;\n const mod = getNativeModule();\n if (!mod) return FALLBACK;\n const raw = await mod.getDeviceInfo();\n if (!isDeviceInfoResult(raw)) return FALLBACK;\n cachedDeviceInfo = raw;\n return raw;\n}\n\nasync function getInstallReferrer(): Promise<string | null> {\n const mod = getNativeModule();\n if (!mod) return null;\n try {\n return await mod.getInstallReferrer();\n } catch {\n return null;\n }\n}\n\nfunction isAvailable(): boolean {\n return NativeModules.PaywalloDevice != null;\n}\n\n/** Clears the cached device info. Call after an OTA update if needed. */\nfunction clearCache(): void {\n cachedDeviceInfo = null;\n}\n\nexport const nativeDeviceInfo = {\n getDeviceInfo,\n getInstallReferrer,\n isAvailable,\n clearCache,\n};\n","import { NativeModules } from \"react-native\";\n\ninterface PaywalloStorageModule {\n // Secure (Keychain iOS / EncryptedSharedPreferences Android)\n secureGet(key: string): Promise<string | null>;\n secureSet(key: string, value: string): Promise<boolean>;\n secureRemove(key: string): Promise<boolean>;\n // Regular (UserDefaults iOS / SharedPreferences Android)\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<boolean>;\n remove(key: string): Promise<boolean>;\n // Migration helper — reads legacy react-native-keychain format (iOS only, SDK ≤1.5.0)\n // Optional: only available on native builds that include the method.\n legacySecureGet?(key: string): Promise<string | null>;\n}\n\nconst NativeModule = NativeModules.PaywalloStorage as PaywalloStorageModule | undefined;\n\nlet _debug = false;\nlet _warnedUnavailable = false;\n\nexport function setNativeStorageDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isAvailable(): boolean {\n return NativeModule != null;\n}\n\nfunction warnIfUnavailable(): boolean {\n if (NativeModule != null) return true;\n if (!_warnedUnavailable) {\n _warnedUnavailable = true;\n if (_debug) console.warn(\"[Paywallo] PaywalloStorage native module not available — storage will not persist\");\n }\n return false;\n}\n\nfunction getModule(): PaywalloStorageModule | null {\n if (!warnIfUnavailable()) return null;\n // NativeModule is captured once at module load — safe to assert here.\n return NativeModule as PaywalloStorageModule;\n}\n\nasync function get(key: string): Promise<string | null> {\n return getModule()?.get(key) ?? null;\n}\n\nasync function set(key: string, value: string): Promise<boolean> {\n return getModule()?.set(key, value) ?? false;\n}\n\nasync function remove(key: string): Promise<boolean> {\n return getModule()?.remove(key) ?? false;\n}\n\nasync function secureGet(key: string): Promise<string | null> {\n return getModule()?.secureGet(key) ?? null;\n}\n\nasync function secureSet(key: string, value: string): Promise<boolean> {\n return getModule()?.secureSet(key, value) ?? false;\n}\n\nasync function secureRemove(key: string): Promise<boolean> {\n return getModule()?.secureRemove(key) ?? false;\n}\n\n/**\n * Read a value stored by react-native-keychain (SDK ≤1.5.0) using the legacy\n * service-per-key layout: service=legacyService, account=\"panel\".\n * Only available on iOS builds that expose `legacySecureGet` on the native module.\n */\nasync function legacySecureGet(key: string): Promise<string | null> {\n const mod = getModule();\n if (!mod?.legacySecureGet) return null;\n return mod.legacySecureGet(key);\n}\n\nexport const nativeStorage = {\n isAvailable,\n get,\n set,\n remove,\n secureGet,\n secureSet,\n secureRemove,\n legacySecureGet,\n};\n","import { nativeStorage } from \"./NativeStorage\";\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\nconst REGULAR_KEY_PREFIX = \"@paywallo:\";\n\nexport class SecureStorage {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(_debug = false) {}\n\n async get(key: string): Promise<string | null> {\n const keychainValue = await this.getFromKeychain(key);\n if (keychainValue) {\n return keychainValue;\n }\n\n try {\n const value = await nativeStorage.get(`${REGULAR_KEY_PREFIX}${key}`);\n if (value) {\n await this.setToKeychain(key, value);\n // Remove the plaintext copy after promoting to keychain — prevents stale\n // reads if keychain is later cleared (e.g. Android reinstall, iOS biometric reset).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined);\n }\n return value;\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<boolean> {\n // Write only to Keychain — never to plaintext NativeStorage.\n // Sensitive values (email, properties, device IDs) must not land in UserDefaults/SharedPreferences.\n // The read() fallback below handles migration of pre-existing plaintext entries.\n return this.setToKeychain(key, value);\n }\n\n async remove(key: string): Promise<boolean> {\n try {\n await Promise.all([\n // Also remove the legacy plaintext copy if it exists (migration cleanup).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined),\n this.removeFromKeychain(key),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n hasKeychainSupport(): boolean {\n return nativeStorage.isAvailable();\n }\n\n private async getFromKeychain(key: string): Promise<string | null> {\n try {\n return await nativeStorage.secureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return null;\n }\n }\n\n private async setToKeychain(key: string, value: string): Promise<boolean> {\n try {\n return await nativeStorage.secureSet(`${KEYCHAIN_KEY_PREFIX}${key}`, value);\n } catch {\n return false;\n }\n }\n\n private async removeFromKeychain(key: string): Promise<boolean> {\n try {\n return await nativeStorage.secureRemove(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return false;\n }\n }\n\n}\n\nexport const secureStorage = new SecureStorage();\n","/**\n * StorageMigration — upgrades data from SDK ≤1.5.0 to ≥1.5.2 storage layout.\n *\n * SDK ≤1.5.0 used:\n * - AsyncStorage (SQLite) → regular data with key \"@paywallo:{key}\"\n * - react-native-keychain → secure data with service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n *\n * SDK ≥1.5.2 uses:\n * - UserDefaults / SharedPreferences → regular data with key \"@paywallo:{key}\"\n * - iOS Keychain / EncryptedSharedPreferences → secure data with\n * service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * Migration is run once at init and guarded by a flag stored in NativeStorage.\n */\n\nimport { nativeStorage } from \"./NativeStorage\";\n\nconst MIGRATION_FLAG_KEY = \"@paywallo:_migration_v152_done\";\n\n// Keys that were stored in secure storage in ≤1.5.0.\n// Regular storage keys are migrated wholesale from AsyncStorage.\nconst LEGACY_SECURE_KEYS = [\n \"device_id\",\n \"device_id_fallback\",\n \"anon_id\",\n \"user_email\",\n \"user_properties\",\n];\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\n\nexport async function runStorageMigrationIfNeeded(): Promise<void> {\n if (!nativeStorage.isAvailable()) return;\n\n const alreadyDone = await nativeStorage.get(MIGRATION_FLAG_KEY);\n if (alreadyDone === \"1\") return;\n\n // Sequential — avoid concurrent NativeStorage writes on Android.\n await migrateAsyncStorage();\n await migrateKeychainLegacy();\n\n await nativeStorage.set(MIGRATION_FLAG_KEY, \"1\");\n}\n\n/**\n * Migrate regular data from AsyncStorage → UserDefaults/SharedPreferences.\n * Only writes keys that don't already exist in NativeStorage (safe to re-run).\n */\nasync function migrateAsyncStorage(): Promise<void> {\n try {\n // Dynamic import — AsyncStorage may not be installed in 1.5.2+ projects.\n const mod = await import(\"@react-native-async-storage/async-storage\") as {\n default: {\n getAllKeys(): Promise<readonly string[]>;\n multiGet(keys: readonly string[]): Promise<readonly [string, string | null][]>;\n };\n };\n const AsyncStorage = mod.default;\n\n const allKeys = await AsyncStorage.getAllKeys();\n const paywallo = allKeys.filter((k) => k.startsWith(\"@paywallo:\"));\n if (paywallo.length === 0) return;\n\n const pairs = await AsyncStorage.multiGet(paywallo);\n // Sequential writes — avoids concurrent NativeStorage access on Android\n // (SharedPreferences writes are not guaranteed safe under parallel JS calls).\n for (const [key, value] of pairs) {\n if (!value) continue;\n const existing = await nativeStorage.get(key);\n if (!existing) {\n await nativeStorage.set(key, value);\n }\n }\n } catch {\n // AsyncStorage not installed or no data — nothing to migrate.\n }\n}\n\n/**\n * Migrate secure data from legacy react-native-keychain layout →\n * new Keychain layout (via NativeStorage.secureSet).\n *\n * Legacy: service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n * New: service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * iOS: uses legacySecureGet (reads old service/account combo).\n * Android: EncryptedSharedPreferences was introduced in 1.5.2, no prior data.\n */\nasync function migrateKeychainLegacy(): Promise<void> {\n // Sequential writes — avoids concurrent NativeStorage access on Android.\n for (const key of LEGACY_SECURE_KEYS) {\n try {\n // legacySecureGet reads legacy Keychain slot (service=\"{prefix}{key}\", account=\"panel\")\n const legacyValue = await nativeStorage.legacySecureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n if (!legacyValue) continue;\n\n // Only migrate if new slot is empty\n const newSlotKey = `${KEYCHAIN_KEY_PREFIX}${key}`;\n const existing = await nativeStorage.secureGet(newSlotKey);\n if (!existing) {\n await nativeStorage.secureSet(newSlotKey, legacyValue);\n }\n } catch {\n // Non-critical — skip this key.\n }\n }\n}\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] trackDismissed failed\", err);\n }\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((err) => { if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] trackProductSelected failed\", err); });\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] trackPurchased failed\", err);\n }\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 let cancelled = false;\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 if (cancelled) return;\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 if (!cancelled) setProducts(snapProducts);\n } else if (productIds.length > 0) {\n try {\n const storeProducts = await getIAPService().loadProducts(productIds);\n if (!cancelled) {\n const map = new Map<string, Product>();\n for (const p of storeProducts) map.set(p.productId, p);\n setProducts(map);\n }\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] loadProducts in paywall failed\", err);\n if (!cancelled) setProducts(new Map());\n }\n } else {\n if (!cancelled) setProducts(new Map());\n }\n\n if (!trackingDoneRef.current && !cancelled) {\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 if (cancelled) return;\n const e = err instanceof Error ? err : new PaywallError(PAYWALL_ERROR_CODES.LOAD_FAILED, String(err));\n setError(e);\n }\n };\n\n void load();\n return () => { cancelled = true; };\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 { 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\nconst SDK_STRINGS = {\n paywallErrorTitle: {\n \"pt-BR\": \"Algo deu errado\",\n \"pt\": \"Algo deu errado\",\n \"en\": \"Something went wrong\",\n \"en-US\": \"Something went wrong\",\n \"en-GB\": \"Something went wrong\",\n \"es\": \"Algo salió mal\",\n \"es-419\": \"Algo salió mal\",\n },\n paywallRetryButton: {\n \"pt-BR\": \"Tentar novamente\",\n \"pt\": \"Tentar novamente\",\n \"en\": \"Try again\",\n \"en-US\": \"Try again\",\n \"en-GB\": \"Try again\",\n \"es\": \"Reintentar\",\n \"es-419\": \"Reintentar\",\n },\n paywallCloseButton: {\n \"pt-BR\": \"Fechar\",\n \"pt\": \"Fechar\",\n \"en\": \"Close\",\n \"en-US\": \"Close\",\n \"en-GB\": \"Close\",\n \"es\": \"Cerrar\",\n \"es-419\": \"Cerrar\",\n },\n} as const;\n\ntype SdkStringKey = keyof typeof SDK_STRINGS;\n\nexport function getSdkString(key: SdkStringKey): string {\n const map: Record<string, string> = SDK_STRINGS[key];\n if (currentLanguage in map) return map[currentLanguage]!;\n const base = currentLanguage.split(\"-\")[0];\n if (base && base in map) return map[base]!;\n if (defaultLanguage in map) return map[defaultLanguage]!;\n return Object.values(map)[0];\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 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 { deriveMessageId, 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 webUrl?: string | null;\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 webUrl: webUrlProp,\n onPurchase,\n onClose,\n onRestore,\n onReady,\n onError,\n}: PaywallWebViewProps): React.ReactElement | null {\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 const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n\n const NativeWebView = useMemo(() => getNativeWebView(), []);\n\n const [resolvedWebUrl, setResolvedWebUrl] = useState<string | null>(\n () => webUrlProp ?? PaywalloClient.getWebUrl()\n );\n\n useEffect(() => {\n if (webUrlProp !== undefined) {\n setResolvedWebUrl(webUrlProp ?? null);\n return;\n }\n const url = PaywalloClient.getWebUrl();\n if (url) { setResolvedWebUrl(url); return; }\n const interval = setInterval(() => {\n const u = PaywalloClient.getWebUrl();\n if (u) { setResolvedWebUrl(u); clearInterval(interval); }\n }, 200);\n return () => clearInterval(interval);\n }, [webUrlProp]);\n\n useEffect(() => {\n if (!resolvedWebUrl) {\n onErrorRef.current?.({\n code: -1,\n description: \"Paywall URL not configured. SDK may not be initialized.\",\n });\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\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 }, [craftData, products, primaryProductId, secondaryProductId]);\n\n const processedIdsRef = useRef<Set<string>>(new Set());\n const dedupeTimersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(() => {\n return () => {\n for (const timerId of dedupeTimersRef.current.values()) clearTimeout(timerId);\n dedupeTimersRef.current.clear();\n processedIdsRef.current.clear();\n };\n }, []);\n\n const handleParsedMessage = useCallback(\n (message: WebViewMessage) => {\n const msgId = deriveMessageId(message);\n if (processedIdsRef.current.has(msgId)) return;\n processedIdsRef.current.add(msgId);\n const timerId = setTimeout(() => {\n processedIdsRef.current.delete(msgId);\n dedupeTimersRef.current.delete(msgId);\n }, 5_000);\n dedupeTimersRef.current.set(msgId, timerId);\n\n switch (message.type) {\n case \"ready\":\n if (!paywallDataSent.current) {\n buildAndSetInjectionScript();\n } else {\n onReadyRef.current?.();\n }\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 // Allow safe external schemes — https/http for web links, mailto for contact\n // links in paywall content, and platform store deep-links (itms-apps/\n // itms-services on iOS, market: on Android). Everything else is dropped.\n if (\n /^https?:\\/\\//i.test(url) ||\n /^mailto:/i.test(url) ||\n /^itms-apps:/i.test(url) ||\n /^itms-services:/i.test(url) ||\n /^market:/i.test(url)\n ) {\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 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 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 if (!resolvedWebUrl) return null;\n\n const paywallUrl = `${resolvedWebUrl}/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 id?: string;\n payload?: {\n productId?: string;\n url?: string;\n timestamp?: number;\n };\n}\n\nconst ALLOWED_MESSAGE_TYPES: ReadonlySet<string> = new Set([\n \"purchase\",\n \"close\",\n \"restore\",\n \"select-product\",\n \"open-url\",\n \"ready\",\n]);\n\nexport function deriveMessageId(message: WebViewMessage): string {\n if (message.id) return message.id;\n\n const payloadKey =\n message.payload?.productId ??\n message.payload?.url ??\n (message.payload?.timestamp != null ? String(message.payload.timestamp) : \"\");\n\n return `${message.type}:${payloadKey}`;\n}\n\nexport function parseWebViewMessage(raw: string): WebViewMessage | null {\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed?.type !== \"string\" || !ALLOWED_MESSAGE_TYPES.has(parsed.type)) {\n return null;\n }\n\n const payload = parsed.payload;\n const safePayload: WebViewMessage[\"payload\"] =\n payload !== null && typeof payload === \"object\"\n ? {\n productId: typeof (payload as Record<string, unknown>).productId === \"string\"\n ? String((payload as Record<string, unknown>).productId)\n : undefined,\n url: typeof (payload as Record<string, unknown>).url === \"string\"\n ? String((payload as Record<string, unknown>).url)\n : undefined,\n timestamp: typeof (payload as Record<string, unknown>).timestamp === \"number\"\n ? Number((payload as Record<string, unknown>).timestamp)\n : undefined,\n }\n : undefined;\n\n return {\n type: parsed.type as WebViewMessage[\"type\"],\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n payload: safePayload,\n };\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\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);}}t();})();true;`;\n}\n\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 {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] Paywall render error:\", error);\n try { PaywalloClient.getApiClient()?.reportError(\"PAYWALL_RENDER_ERROR\", error.message); } catch {}\n }\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 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 setShowingPreloadedWebView(false);\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 { /* non-critical — analytics event, dismiss flow must continue */ }\n };\n void track();\n setShowingPreloadedWebView(false);\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: true, restored: false });\n }, [preloadedWebView, resolvePreloadedPaywall]);\n\n return { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef };\n}\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedSubscription, SubscriptionStatusResponse } from \"./types\";\n\nconst LEGACY_CACHE_KEY = \"@panel:subscription_cache\";\nconst CACHE_KEY_PREFIX = \"subscription_cache:\";\nconst CACHE_INDEX_KEY = \"subscription_cache:__index__\";\nconst DEFAULT_TTL = 24 * 60 * 60 * 1000;\n\nfunction keyFor(distinctId: string): string {\n return `${CACHE_KEY_PREFIX}${distinctId}`;\n}\n\nexport class SubscriptionCache {\n private ttl: number;\n private memoryCache: Map<string, CachedSubscription> = new Map();\n private storage: SecureStorage;\n private legacyCleanupDone = false;\n\n constructor(ttl: number = DEFAULT_TTL) {\n this.ttl = ttl;\n this.storage = new SecureStorage();\n }\n\n private async cleanupLegacyCache(): Promise<void> {\n if (this.legacyCleanupDone) return;\n this.legacyCleanupDone = true;\n try {\n await this.storage.remove(LEGACY_CACHE_KEY);\n } catch {\n }\n }\n\n async get(distinctId: string): Promise<CachedSubscription | null> {\n await this.cleanupLegacyCache();\n if (!distinctId) return null;\n\n const memEntry = this.memoryCache.get(distinctId);\n if (memEntry && !this.isExpired(memEntry)) {\n return memEntry;\n }\n\n try {\n const stored = await this.storage.get(keyFor(distinctId));\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(keyFor(distinctId));\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 if (!cached.isStale) {\n this.memoryCache.set(distinctId, cached);\n }\n\n return cached;\n } catch {\n return null;\n }\n }\n\n async set(distinctId: string, data: SubscriptionStatusResponse): Promise<void> {\n if (!distinctId) return;\n const cached: CachedSubscription = {\n data,\n cachedAt: Date.now(),\n isStale: false,\n };\n\n this.memoryCache.set(distinctId, cached);\n\n try {\n await this.storage.set(keyFor(distinctId), JSON.stringify(cached));\n await this.addToIndex(distinctId);\n } catch {\n }\n }\n\n private async addToIndex(distinctId: string): Promise<void> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n const ids: string[] = raw ? (JSON.parse(raw) as string[]) : [];\n if (!ids.includes(distinctId)) {\n ids.push(distinctId);\n await this.storage.set(CACHE_INDEX_KEY, JSON.stringify(ids));\n }\n } catch {\n }\n }\n\n private async readIndex(): Promise<string[]> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n if (!raw) return [];\n return JSON.parse(raw) as string[];\n } catch {\n return [];\n }\n }\n\n async invalidate(distinctId: string): Promise<void> {\n if (!distinctId) return;\n this.memoryCache.delete(distinctId);\n\n try {\n await this.storage.remove(keyFor(distinctId));\n } catch {\n }\n }\n\n async invalidateAll(): Promise<void> {\n // Collect keys from memory AND from the persisted index (survives restarts)\n const memKeys = Array.from(this.memoryCache.keys());\n const indexKeys = await this.readIndex();\n const allKeys = Array.from(new Set([...memKeys, ...indexKeys]));\n\n this.memoryCache.clear();\n\n await Promise.allSettled([\n this.storage.remove(LEGACY_CACHE_KEY),\n this.storage.remove(CACHE_INDEX_KEY),\n ...allKeys.map((k) => this.storage.remove(keyFor(k))),\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 { 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 { 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 private cacheKey(): string {\n return this.userId ?? \"__anonymous__\";\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.invalidateAll();\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(this.cacheKey());\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(this.cacheKey(), 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(this.cacheKey());\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(this.cacheKey());\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}/purchases/status/${encodeURIComponent(this.config.appKey)}`);\n if (this.userId) {\n url.searchParams.set(\"distinctId\", this.userId);\n }\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(this.cacheKey());\n await this.getSubscriptionStatus(true);\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo:Subscription]\", ...args);\n }\n}\n\nexport const subscriptionManager = new SubscriptionManagerClass();\n","import { Platform } from \"react-native\";\n\nconst SDK_VERSION = \"1.5.2\";\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 { EventBatcher } from \"./EventBatcher\";\nimport { readFlagFromStorage, writeFlagToStorage } from \"./FlagStorage\";\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 private readonly batcher: EventBatcher;\n\n constructor(\n appKey: string,\n apiUrl: string,\n debug = false,\n environment: Environment = \"Production\",\n offlineQueueEnabled = true,\n timeout = 30000,\n ) {\n this.appKey = appKey;\n this.baseUrl = apiUrl;\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 this.batcher = new EventBatcher((url, payload, label) => this.postWithQueue(url, payload as Record<string, unknown>, label), debug);\n }\n\n getHttpClient(): HttpClient { return this.httpClient; }\n getBaseUrl(): string { return this.baseUrl; }\n getWebUrl(): string { return this.webUrl; }\n getAppKey(): string { return this.appKey; }\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 { this.environment = environment; }\n setDebug(debug: boolean): void { this.debug = debug; this.httpClient.setDebug(debug); }\n async clearQueue(): Promise<void> { await offlineQueue.clear(); }\n async get<T>(path: string): Promise<HttpResponse<T>> {\n return this.httpClient.get<T>(path, { headers: { \"X-App-Key\": this.appKey } });\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 (err) {\n if (this.debug) console.log(\"[Paywallo:ApiClient] reportError failed\", err);\n }\n }\n\n async trackEvent(eventName: string, distinctId: string, properties?: UserProperties, timestamp?: number): Promise<void> {\n await this.batcher.track(eventName, distinctId, this.environment, properties, timestamp);\n }\n async flushEventBatch(): Promise<void> { await this.batcher.flush(); }\n dispose(): void { this.batcher.dispose(); }\n\n async identify(distinctId: string, properties?: UserProperties, email?: string, deviceId?: string): Promise<void> {\n await this.postWithQueue(\"/api/v1/identify\", { distinctId, properties: properties ?? {}, email, platform: Platform.OS, ...(deviceId && { deviceId }) }, \"identify\");\n }\n\n async startSession(\n distinctId: string,\n sessionId: string,\n platform?: string,\n appVersion?: string,\n deviceModel?: string,\n osVersion?: string,\n ): Promise<{ success: boolean }> {\n await this.postWithQueue(\"/api/v1/sessions/start\", {\n distinctId, sessionId,\n platform: platform ?? Platform.OS,\n environment: this.environment.toLowerCase(),\n appVersion: appVersion ?? \"unknown\",\n deviceModel: deviceModel ?? \"unknown\",\n osVersion: osVersion ?? String(Platform.Version),\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 readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { this.cache.setVariant(key, persisted); return persisted; }\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 const stale = this.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { variant: null };\n }\n this.cache.setVariant(key, res.data);\n await writeFlagToStorage(flagKey, distinctId, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { 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 const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n this.cache.setPaywall(placement, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n return getEmergencyPaywall(this);\n }\n\n async getCampaign(placement: string, distinctId: string, context?: Record<string, unknown>): 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) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n this.cache.setCampaign(key, result);\n return result;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getPrimaryCampaign(distinctId: string): Promise<CampaignResponse | null> {\n const key = `primary:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<CampaignResponse>(`/campaigns/public/primary?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n this.cache.setCampaign(key, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : 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 return validatePurchase(this, this.appKey, platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId, paywallPlacement, variantKey);\n }\n\n async getSubscriptionStatus(distinctId: string): Promise<SubscriptionStatusResponse> {\n return getSubscriptionStatus(this, this.baseUrl, this.appKey, distinctId);\n }\n\n async evaluateFlags(keys: string[], distinctId: string): Promise<Record<string, string | null>> {\n const query = keys.map(encodeURIComponent).join(\",\");\n try {\n const res = await this.httpClient.get<unknown>(`/api/v1/flags/evaluate?keys=${query}`, {\n headers: { \"X-App-Key\": this.appKey, \"x-distinct-id\": distinctId },\n });\n if (!res.ok || typeof res.data !== \"object\" || res.data === null || Array.isArray(res.data)) return {};\n const record = res.data 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 writeFlagToStorage(key, distinctId, flagVariant);\n }\n return result;\n } catch {\n return {};\n }\n }\n\n async getConditionalFlag(flagKey: string, context: ConditionalFlagContext): 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 || !response.ok) return { value: false, flagKey };\n return { value: response.data.value, flagKey };\n } catch {\n return { value: false, flagKey };\n }\n }\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 readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { this.cache.setVariant(key, persisted); return persisted; }\n return null;\n }\n\n private async postWithQueue(url: string, payload: unknown, label: string): Promise<void> {\n if (this.offlineQueueEnabled && !networkMonitor.isOnline()) {\n await offlineQueue.enqueue(\"POST\", url, payload as Record<string, unknown>, { \"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 return;\n }\n throw error;\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.log(\"[Paywallo:ApiClient]\", ...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\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\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 if (!response.ok) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.VALIDATION_FAILED, `Server validation failed: HTTP ${response.status}`);\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 if (!response.ok) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.NETWORK_ERROR, `Subscription status check failed: HTTP ${response.status}`);\n }\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 ?? 10000,\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 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.calculateDelayForResponse(state.attempt, response.headers, 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 // Redact URL path segments that may contain the app key (e.g. /validate/{key}, /status/{key})\n // to avoid leaking credentials in debug logs.\n this.log(\"Request failed\", {\n url: this.redactUrl(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 // Warn and block plain-HTTP absolute URLs to prevent credential leakage.\n // Exception: localhost / 192.168.x dev servers are allowed for local dev.\n if (path.startsWith(\"http://\")) {\n const isLocalDev = /^http:\\/\\/(localhost|127\\.0\\.0\\.1|192\\.168\\.\\d{1,3}\\.\\d{1,3})/.test(path);\n if (!isLocalDev) {\n const sanitizedPath = path.split(\"?\")[0];\n this.log(\"Blocked http:// request — only HTTPS is allowed in production:\", sanitizedPath);\n throw new ClientError(CLIENT_ERROR_CODES.INSECURE_REQUEST, `Insecure HTTP request blocked: ${sanitizedPath}`);\n }\n }\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 calculateDelayForResponse(\n attempt: number,\n headers: Record<string, string>,\n config: RetryConfig\n ): number {\n // Honour Retry-After header (seconds or HTTP-date) to avoid 429 storms.\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (!Number.isNaN(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, config.maxDelay);\n }\n // HTTP-date format\n const date = new Date(retryAfter);\n if (!Number.isNaN(date.getTime())) {\n const ms = date.getTime() - Date.now();\n if (ms > 0) return Math.min(ms, config.maxDelay);\n }\n }\n return this.calculateDelay(attempt, config);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /** Strips path segments that look like app keys (alphanumeric, 20–64 chars) from URLs before logging. */\n private redactUrl(url: string): string {\n return url.replace(/\\/([a-zA-Z0-9_-]{20,64})(\\?|$|\\/)/g, \"/[REDACTED]$2\");\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Http]\", ...args);\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\nclass NetworkMonitorClass {\n private config: NetworkMonitorConfig = DEFAULT_NETWORK_CONFIG;\n private listeners: Set<NetworkListener> = new Set();\n private currentState: NetworkState = \"unknown\";\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 this.currentState = \"unknown\";\n this.initialized = true;\n\n this.log(\"Initialized (state: unknown, awaiting first connectivity check)\");\n\n void this.setupFallbackDetection();\n this.setupAppStateListener();\n }\n\n private async setupFallbackDetection(): Promise<void> {\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 // Resume polling and check immediately on foreground.\n if (!this.checkIntervalId) {\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n void this.checkConnectivity();\n } else if (state === \"background\" || state === \"inactive\") {\n // Pause polling to avoid background battery drain.\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n }\n });\n }\n\n private async checkConnectivity(): Promise<void> {\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 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 (!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.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(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Network]\", ...args);\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 { nativeStorage } from \"../storage/NativeStorage\";\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 nativeStorage.get(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 nativeStorage.set(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) => 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 id?: string\n ): Promise<QueueItem> {\n const item: QueueItem = {\n id: 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 // Evict the item closest to expiry: most attempts first, oldest timestamp as tiebreaker.\n let evictIndex = 0;\n for (let i = 1; i < this.queue.length; i++) {\n const candidate = this.queue[i];\n const current = this.queue[evictIndex];\n if (\n candidate.attempts > current.attempts ||\n (candidate.attempts === current.attempts && candidate.timestamp < current.timestamp)\n ) {\n evictIndex = i;\n }\n }\n const [removed] = this.queue.splice(evictIndex, 1);\n this.emit({ type: \"item:evicted\", item: removed, queueSize: this.queue.length });\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 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 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(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Queue]\", ...args);\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\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 byId = queue.findIndex((existing) => existing.id === item.id);\n if (byId !== -1) return byId;\n\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 const allItems = offlineQueue.getQueue();\n const eventItems = allItems.filter(\n (i) => i.url.includes(\"/api/v1/events\") && !i.url.includes(\"/batch\")\n );\n const eventItemIds = new Set(eventItems.map((i) => i.id));\n\n const { processed: batchProcessed, failed: batchFailed, retryIds } =\n await this.processEventBatches(eventItems);\n\n const batchResult = { processed: batchProcessed, failed: batchFailed };\n\n const individualResult = await offlineQueue.processQueue(async (item: QueueItem) => {\n if (eventItemIds.has(item.id)) {\n // This event item was handled by batch processing.\n // If it's in retryIds, it failed with 5xx and should stay in queue for next cycle.\n // Return success=false, permanent=false to keep it and increment attempts.\n // If it was already removed (success/4xx), processQueue won't see it — so this\n // branch only executes for 5xx items still in the queue.\n if (retryIds.has(item.id)) {\n return { success: false, permanent: false };\n }\n // Already removed externally (shouldn't reach here, but guard anyway)\n return { success: true, permanent: false };\n }\n return this.processItem(item);\n });\n\n this.log(\"Queue processing complete\", {\n batchProcessed: batchResult.processed,\n batchFailed: batchResult.failed,\n individualProcessed: individualResult.processed,\n individualFailed: individualResult.failed,\n });\n\n return {\n processed: batchResult.processed + individualResult.processed,\n failed: batchResult.failed + individualResult.failed,\n };\n }\n\n private async processEventBatches(\n eventItems: QueueItem[]\n ): Promise<{ processed: number; failed: number; retryIds: Set<string> }> {\n if (eventItems.length === 0 || !this.httpClient) {\n return { processed: 0, failed: 0, retryIds: new Set() };\n }\n\n const BATCH_SIZE = 50;\n let processed = 0;\n let failed = 0;\n const retryIds = new Set<string>();\n\n for (let i = 0; i < eventItems.length; i += BATCH_SIZE) {\n const batch = eventItems.slice(i, i + BATCH_SIZE);\n const bodies = batch.map((item) => item.body);\n const headers = batch[0].headers;\n\n this.log(\"Sending event batch\", { size: batch.length, batchIndex: Math.floor(i / BATCH_SIZE) });\n\n const response = await this.httpClient.request(\"/api/v1/events/batch\", {\n method: \"POST\",\n body: { events: bodies },\n headers,\n skipRetry: false,\n });\n\n if (response.ok) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n processed++;\n }\n this.log(\"Event batch processed successfully\", { size: batch.length });\n } else if (response.status >= 400 && response.status < 500) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n failed++;\n }\n this.log(\"Event batch failed permanently (4xx) - removing from queue\", {\n status: response.status,\n size: batch.length,\n });\n } else {\n for (const item of batch) {\n retryIds.add(item.id);\n }\n this.log(\"Event batch failed with server error - will retry\", {\n status: response.status,\n size: batch.length,\n });\n }\n }\n\n return { processed, failed, retryIds };\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 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 if (response.ok) {\n this.log(\"Queue item processed successfully\", { id: item.id });\n return { success: true, permanent: false };\n }\n\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 hasAppKey: item.headers?.[\"X-App-Key\"] != null,\n });\n return { success: false, permanent: true, status: response.status };\n }\n\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 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 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(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:QueueProcessor]\", ...args);\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;\n private readonly CACHE_NULL_TTL = 30_000;\n private readonly MAX_SIZE = 200;\n private readonly STALE_WINDOW_MS = 86_400_000;\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 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 < this.STALE_WINDOW_MS) 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 < this.STALE_WINDOW_MS) 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, ttlOverride?: number): void {\n this.setCached(this.campaignCache, key, value, ttlOverride);\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 < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n}\n","import { Platform } from \"react-native\";\nimport type { UserProperties } from \"../types\";\n\ninterface EventPayload {\n eventName: string;\n distinctId: string;\n properties: unknown;\n timestamp: number;\n environment: string;\n}\n\ntype PostFn = (url: string, payload: unknown, label: string) => Promise<void>;\n\nconst BATCH_MAX_SIZE = 10;\nconst BATCH_FLUSH_MS = 5000;\n\nexport class EventBatcher {\n private batch: EventPayload[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly post: PostFn;\n private readonly debug: boolean;\n\n constructor(post: PostFn, debug = false) {\n this.post = post;\n this.debug = debug;\n }\n\n async track(eventName: string, distinctId: string, environment: string, properties?: UserProperties, timestamp?: number): Promise<void> {\n const EVENT_NAME_REGEX = /^(\\$[a-zA-Z0-9_]+|[a-z][a-z0-9_]*)$/;\n if (!EVENT_NAME_REGEX.test(eventName)) {\n if (this.debug) console.warn(`[Paywallo] Invalid event name \"${eventName}\". Must be snake_case or start with $`);\n }\n\n const event: EventPayload = {\n eventName,\n distinctId,\n properties: { ...(properties as Record<string, unknown>), platform: Platform.OS },\n timestamp: timestamp ?? Date.now(),\n environment: environment.toLowerCase(),\n };\n\n this.batch.push(event);\n\n if (this.batch.length >= BATCH_MAX_SIZE) {\n if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; }\n await this.flush();\n return;\n }\n\n if (this.timer !== null) clearTimeout(this.timer);\n this.timer = setTimeout(() => { this.timer = null; void this.flush(); }, BATCH_FLUSH_MS);\n }\n\n async flush(): Promise<void> {\n if (this.batch.length === 0) return;\n const batch = this.batch.splice(0, this.batch.length);\n if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; }\n\n try {\n await this.post(\"/api/v1/events/batch\", { events: batch }, `event_batch:${batch.length}`);\n } catch {\n for (const event of batch) {\n await this.post(\"/api/v1/events\", event, `event:${event.eventName}`);\n }\n }\n }\n\n dispose(): void {\n if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; }\n this.batch = [];\n }\n}\n","import type { FlagVariant } from \"../types\";\nimport { secureStorage } from \"./storage/SecureStorage\";\n\nconst FLAG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport async function 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 > FLAG_MAX_AGE_MS) return null;\n return { variant, payload };\n } catch {\n return null;\n }\n}\n\nexport async function 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 failures are non-critical\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 { PaywalloClient } from \"../../core/PaywalloClient\";\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;\nconst PRELOAD_WAIT_MAX_MS = 2000;\nconst PRELOAD_WAIT_INTERVAL_MS = 100;\ninterface PreloadedCampaignCache { campaign: CampaignResponse; preloadedAt: number }\n\nexport class CampaignGateService {\n private readonly preloadedCampaigns: Map<string, PreloadedCampaignCache> = new Map();\n private readonly pendingPreloads: Set<string> = new Set();\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 private async waitForPreload(placement: string): Promise<void> {\n if (!this.pendingPreloads.has(placement)) return;\n const deadline = Date.now() + PRELOAD_WAIT_MAX_MS;\n await new Promise<void>((resolve) => {\n const check = () => {\n if (!this.pendingPreloads.has(placement) || Date.now() >= deadline) { resolve(); return; }\n setTimeout(check, PRELOAD_WAIT_INTERVAL_MS);\n };\n check();\n });\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 await this.waitForPreload(placement);\n const preloaded = this.getPreloadedCampaign(placement);\n const campaign = preloaded ?? 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) {\n const isActive = await hasActive();\n if (isActive) {\n return { presented: false, purchased: false, cancelled: false, restored: false, skippedReason: \"subscriber\" };\n }\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(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 const isActive = await hasActive();\n if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo] requireSubscription — hasActive: ${isActive}`);\n if (isActive) return true;\n const r = await this.presentCampaign(apiClient, placement, hasActive, paywallPresenter, campaignPresenter, { ...context, forceShow: true });\n return r.purchased || r.restored;\n }\n\n private readonly activePreloadPromises: Map<string, Promise<PreloadCampaignResult>> = new Map();\n\n async preloadCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n // Return the in-flight promise if a preload for this placement is already running\n const existing = this.activePreloadPromises.get(placement);\n if (existing) return existing;\n\n const promise = this._doPreload(apiClient, placement, context);\n this.activePreloadPromises.set(placement, promise);\n try {\n return await promise;\n } finally {\n this.activePreloadPromises.delete(placement);\n }\n }\n\n private async _doPreload(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n this.pendingPreloads.add(placement);\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 if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRELOAD] data cached — placement: ${placement}`); }\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error : new PaywalloError(\"panel\", \"PANEL_UNKNOWN\", String(error)) };\n } finally {\n this.pendingPreloads.delete(placement);\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(); this.pendingPreloads.clear(); }\n}\n\nexport const campaignGateService = new CampaignGateService();\n","import { Platform } from \"react-native\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\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 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() is a no-op shim — always granted.\n // Actual opt-out is signaled by getAdvertisingId() returning the all-zeros UUID,\n // which sanitizeId() correctly normalizes to null.\n const rawGaid = tracking.getAdvertisingId();\n const gaid = this.sanitizeId(rawGaid);\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 this.cached = fallback;\n return this.cached;\n }\n }\n\n private async collectIdfv(): Promise<string | null> {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n return this.sanitizeId(info.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","import { Dimensions, Platform } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { nativeStorage } from \"../../core/storage/NativeStorage\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\nimport { AdvertisingIdManager } from \"./AdvertisingIdManager\";\nimport { metaBridge } from \"./MetaBridge\";\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 private _trackingInProgress = false;\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 if (this._trackingInProgress) return;\n this._trackingInProgress = true;\n try {\n await this._doTrack(apiClient, requestATT);\n } finally {\n this._trackingInProgress = false;\n }\n }\n\n private async _doTrack(apiClient: ApiClient, requestATT: boolean): Promise<void> {\n const storage = new SecureStorage(this.debug);\n const alreadyTracked = await storage.get(\"@panel:install_tracked\");\n if (alreadyTracked) return;\n\n let fallbackTracked: string | null = null;\n try {\n fallbackTracked = await nativeStorage.get(\"@paywallo:install_tracked\");\n } catch { /* NativeStorage not available */ }\n if (fallbackTracked) return;\n\n const distinctId = identityManager.getDistinctId();\n const sessionId = sessionManager.getSessionId();\n const installedAt = Date.now();\n\n // distinctId may not be ready yet — allow retry on next call\n if (!distinctId) return;\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\n const info = await nativeDeviceInfo.getDeviceInfo();\n\n const deviceModel = info.modelId || info.model || \"unknown\";\n const osVersion = info.systemVersion || \"unknown\";\n const appVersion = info.appVersion || \"unknown\";\n const buildNumber = info.buildNumber || \"0\";\n\n let carrier = \"unknown\";\n try { carrier = info.carrier ?? \"unknown\"; } catch { /* non-critical */ }\n\n let totalDisk = 0;\n try { totalDisk = Number(info.totalDisk) || 0; } catch { /* non-critical */ }\n\n let freeDisk = 0;\n try { freeDisk = Number(info.freeDisk) || 0; } catch { /* non-critical */ }\n\n let totalRam = 0;\n try { totalRam = Number(info.totalRam) || 0; } catch { /* non-critical */ }\n\n let brand = \"unknown\";\n try { brand = info.brand ?? \"unknown\"; } catch { /* non-critical */ }\n\n let installerPackage: string | null = null;\n try {\n if (Platform.OS === \"android\") {\n installerPackage = info.installerPackage ?? null;\n }\n } catch { /* non-critical */ }\n\n deviceData = {\n deviceModel,\n osVersion,\n appVersion,\n buildNumber,\n ...(screenWidth > 0 && { screenWidth }),\n ...(screenHeight > 0 && { screenHeight }),\n timezone,\n locale,\n ...(carrier !== \"unknown\" && { carrier }),\n ...(totalDisk > 0 && { totalDisk }),\n ...(freeDisk > 0 && { freeDisk }),\n ...(totalRam > 0 && { totalRam }),\n ...(brand !== \"unknown\" && { brand }),\n ...(installerPackage && { installerPackage }),\n };\n } catch { /* non-critical */ }\n\n const [fbAnonId, referrer, adIds] = await Promise.all([\n metaBridge.getAnonymousID(),\n installReferrerManager.getReferrer(),\n this.advertisingIdManager.collect(requestATT),\n ]);\n\n let effectiveAnonId = fbAnonId;\n if (!effectiveAnonId) {\n const stored = await storage.get(\"@panel:anon_id\");\n if (stored) {\n effectiveAnonId = stored;\n } else {\n const { generateUUID } = await import(\"../../utils/uuid\");\n effectiveAnonId = `PW_${generateUUID()}`;\n await storage.set(\"@panel:anon_id\", effectiveAnonId).catch(() => {});\n }\n }\n\n // Allow retry on transient failures (network down, storage error) — throws propagate to finally\n await apiClient.trackEvent(\"$app_installed\", distinctId, {\n installedAt,\n platform: Platform.OS,\n ...(sessionId && { sessionId }),\n ...deviceData,\n ...(effectiveAnonId && { fbAnonId: effectiveAnonId }),\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\n if (Platform.OS === \"ios\") {\n void this.callDeferredMatch(apiClient, deviceData, adIds, effectiveAnonId, installedAt).catch(() => {});\n }\n\n await storage.set(\"@panel:install_tracked\", String(installedAt));\n try {\n await nativeStorage.set(\"@paywallo:install_tracked\", String(installedAt));\n } catch { /* non-critical */ }\n }\n\n private async callDeferredMatch(\n apiClient: ApiClient,\n deviceData: Record<string, string | number>,\n adIds: { idfv: string | null },\n anonId: string | null,\n installedAt: number,\n ): Promise<void> {\n const storage = new SecureStorage(this.debug);\n const alreadyMatched = await storage.get(\"@panel:deferred_match_done\");\n if (alreadyMatched) return;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5000);\n\n try {\n const baseUrl = apiClient.getBaseUrl();\n const appKey = apiClient.getAppKey();\n\n await fetch(`${baseUrl}/api/v1/attribution/deferred-match`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-App-Key\": appKey },\n body: JSON.stringify({\n idfv: adIds.idfv,\n deviceModel: deviceData.deviceModel,\n osVersion: deviceData.osVersion,\n screenWidth: deviceData.screenWidth,\n screenHeight: deviceData.screenHeight,\n timezone: deviceData.timezone,\n locale: deviceData.locale,\n fbAnonId: anonId,\n installTimestamp: new Date(installedAt).toISOString(),\n }),\n signal: controller.signal,\n });\n\n await storage.set(\"@panel:deferred_match_done\", \"1\").catch(() => {});\n } catch {\n // Non-critical — deferred match is best-effort\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","import { NativeModules } from \"react-native\";\n\nconst TIMEOUT_MS = 2000;\n\ninterface PaywalloFBBridgeModule {\n getAnonymousID(): Promise<string | null>;\n logEvent(name: string, params: Record<string, unknown>): Promise<void>;\n logPurchase(amount: number, currency: string, params: Record<string, unknown>): Promise<void>;\n setUserID(userId: string): void;\n flush(): void;\n}\n\nconst NativeBridge: PaywalloFBBridgeModule | null =\n NativeModules.PaywalloFBBridge ?? null;\n\nexport class MetaBridge {\n async getAnonymousID(): Promise<string | null> {\n if (!NativeBridge) return null;\n try {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<null>((resolve) => {\n timerId = setTimeout(() => resolve(null), TIMEOUT_MS);\n });\n const result = await Promise.race([NativeBridge.getAnonymousID(), timeout]);\n clearTimeout(timerId);\n return result;\n } catch {\n return null;\n }\n }\n\n async logEvent(name: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logEvent(name, params);\n } catch {\n // swallow silently\n }\n }\n\n async logPurchase(amount: number, currency: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logPurchase(amount, currency, params);\n } catch {\n // swallow silently\n }\n }\n\n setUserID(userId: string): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.setUserID(userId);\n } catch {\n // swallow silently\n }\n }\n\n flush(): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.flush();\n } catch {\n // swallow silently\n }\n }\n}\n\nexport const metaBridge = new MetaBridge();\n","import { Platform } from \"react-native\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\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 referrer = await nativeDeviceInfo.getInstallReferrer();\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 }\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 if (this.apiClient) {\n await this.apiClient.flushEventBatch();\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 | null): 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 if (this.apiClient) {\n await this.apiClient.flushEventBatch();\n }\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) console.log(\"[Paywallo:Session]\", ...args);\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { nativeDeviceInfo } from \"./NativeDeviceInfo\";\n\nexport interface DeviceInfo {\n appVersion: string;\n deviceModel: string;\n osVersion: string;\n}\n\nexport async function collectDeviceInfo(): Promise<DeviceInfo> {\n const result = await nativeDeviceInfo.getDeviceInfo();\n\n return {\n appVersion: result.appVersion,\n deviceModel: result.model,\n osVersion: result.systemVersion,\n };\n}\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { collectDeviceInfo } from \"../../utils/deviceInfo\";\n\nexport async function trackSessionStart(\n apiClient: ApiClient,\n sessionId: string,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n const deviceInfo = await collectDeviceInfo().catch(() => ({\n appVersion: \"unknown\",\n deviceModel: \"unknown\",\n osVersion: \"unknown\",\n }));\n\n await Promise.all([\n apiClient.startSession(\n distinctId,\n sessionId,\n undefined,\n deviceInfo.appVersion,\n deviceInfo.deviceModel,\n deviceInfo.osVersion,\n ),\n apiClient\n .trackEvent(\"$session_start\", distinctId, {\n sessionId,\n timestamp: sessionStartedAt?.toISOString() ?? null,\n appVersion: deviceInfo.appVersion,\n deviceModel: deviceInfo.deviceModel,\n osVersion: deviceInfo.osVersion,\n })\n .catch(() => {}),\n ]);\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 { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\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 type { EmergencyPaywallResponse } from \"../types/paywall\";\nimport { sessionManager } from \"../domains/session\";\nimport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\nimport { setNativeStorageDebug } from \"./storage/NativeStorage\";\nimport { setNativeDeviceInfoDebug } from \"../utils/NativeDeviceInfo\";\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 readyPromise: Promise<void> | null = null;\n private resolveReady: (() => 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 private autoPreloadedPlacement: string | null = null;\n private autoPreloadPlacementPromise: Promise<string | null> | null = null;\n private readonly sessionFlagsMap: Map<string, string | null> = new Map();\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 (!this.readyPromise) {\n this.readyPromise = new Promise<void>((resolve) => { this.resolveReady = resolve; });\n }\n if (this.config && this.apiClient) {\n return;\n }\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n if (!config.appKey) throw new ClientError(CLIENT_ERROR_CODES.MISSING_APP_KEY, \"appKey is required\");\n this.pendingConfig = config;\n this.initAttempts = 0;\n this.initPromise = this.initWithRetry(config);\n try {\n await this.initPromise;\n } catch (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 isReady(): boolean {\n return this.config !== null && this.apiClient !== null;\n }\n\n waitUntilReady(): Promise<void> {\n if (this.isReady()) return Promise.resolve();\n if (!this.readyPromise) {\n this.readyPromise = new Promise<void>((resolve) => { this.resolveReady = resolve; });\n }\n return this.readyPromise;\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 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;\n if (this.initPromise) return;\n this.initPromise = this.initWithRetry(config);\n this.initPromise\n .catch(() => { this.reportInitFailure(config, null, \"NETWORK_RECOVERY_FAILED\"); })\n .finally(() => { if (!this.isReady()) this.initPromise = null; });\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.apiUrl ?? \"https://paywallo.com.br\", 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 (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitFailure error\", err);\n }\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 (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitSuccess error\", err);\n }\n }\n\n private async resolveSessionFlags(keys: string[], apiClient: ApiClient, distinctId: string): Promise<void> {\n try {\n const results = await apiClient.evaluateFlags(keys, distinctId);\n this.sessionFlagsMap.clear();\n for (const key of keys) {\n this.sessionFlagsMap.set(key, key in results ? results[key] : null);\n }\n } catch (error) {\n for (const key of keys) {\n this.sessionFlagsMap.set(key, null);\n }\n }\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 await Promise.all([\n networkMonitor.initialize({ debug: config.debug }),\n offlineQueue.initialize({ debug: config.debug }).then(() =>\n offlineQueue.clearItemsWithInvalidAppKey(config.appKey)\n ),\n ]);\n\n this.apiClient = new ApiClient(config.appKey, config.apiUrl ?? \"https://paywallo.com.br\", config.debug, environment, offlineQueueEnabled, config.timeout);\n queueProcessor.initialize(this.apiClient.getHttpClient(), { debug: config.debug });\n subscriptionManager.init({\n serverUrl: this.apiClient.getBaseUrl(),\n appKey: config.appKey,\n cacheTTL: config.subscriptionCacheTTL,\n debug: config.debug,\n });\n\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\n if (config.autoStartSession !== false) {\n sessionManager.startSession().catch(() => {});\n }\n new InstallTracker(config.debug).trackIfNeeded(this.apiClient, config.requestATT === true).catch(() => {});\n\n if (config.sessionFlags && config.sessionFlags.length > 0) {\n await this.resolveSessionFlags(config.sessionFlags, this.apiClient, distinctId);\n }\n\n setNativeStorageDebug(config.debug ?? false);\n setNativeDeviceInfoDebug(config.debug ?? false);\n this.config = config;\n if (this.resolveReady) { this.resolveReady(); this.resolveReady = null; }\n if (config.debug) console.log(\"[Paywallo INIT] complete\");\n\n if (distinctId) {\n this.apiClient.getSubscriptionStatus(distinctId)\n .then(() => { if (config.debug) console.log(\"[Paywallo SUB] preloaded on boot\"); })\n .catch(() => {});\n }\n\n {\n const apiClientRef = this.apiClient;\n if (config.autoPreloadCampaign) {\n this.autoPreloadedPlacement = config.autoPreloadCampaign;\n this.autoPreloadPlacementPromise = Promise.resolve(config.autoPreloadCampaign);\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${config.autoPreloadCampaign}`);\n void campaignGateService.preloadCampaign(apiClientRef, config.autoPreloadCampaign).catch(() => {});\n } else {\n this.autoPreloadPlacementPromise = apiClientRef.getPrimaryCampaign(distinctId).then((primary) => {\n const placement = primary?.placement ?? primary?.paywall?.placement;\n if (placement) {\n this.autoPreloadedPlacement = placement;\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${placement}`);\n void campaignGateService.preloadCampaign(apiClientRef, placement).catch(() => {});\n return placement;\n }\n return null;\n }).catch(() => null);\n }\n }\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n if (this.config?.debug) console.log(\"[Paywallo IDENTIFY]\", options ? { hasEmail: \"email\" in options && !!(options as { email?: unknown }).email, hasProperties: \"properties\" in options } : undefined);\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.log(`[Paywallo TRACK] ${eventName} skipped (no distinctId)`);\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 if (this.config?.debug && eventName.startsWith(\"$purchase\")) console.log(`[Paywallo TRACK] ${eventName}`, options?.properties ?? {});\n const sessionId = sessionManager.getSessionId();\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 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 await apiClient.trackEvent(\"$onboarding_step\", distinctId, {\n stepIndex: index,\n stepName: name,\n timeOnPreviousStep,\n });\n }\n\n async coreAction(actionName: string): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\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 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.log(`[Paywallo FLAG] ${flagKey} → null (no distinctId)`);\n return { variant: null };\n }\n const result = await this.getApiClientOrThrow().getVariant(flagKey, distinctId);\n if (this.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} →`, result.variant);\n return result;\n } catch (error) {\n if (this.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} → error`, 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.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 if (this.config?.debug) console.log(`[Paywallo CAMPAIGN] presenting ${placement}`);\n const result = await campaignGateService.presentCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.paywallPresenter, this.campaignPresenter, context);\n if (this.config?.debug) {\n if (result.error) console.log(`[Paywallo CAMPAIGN] ${placement} error:`, result.error.message);\n else console.log(`[Paywallo CAMPAIGN] ${placement} result:`, { purchased: result.purchased, cancelled: result.cancelled, restored: result.restored, skippedReason: result.skippedReason });\n }\n return result;\n }\n async hasActiveSubscription(): Promise<boolean> {\n this.ensureInitialized();\n try {\n if (this.activeChecker) {\n const result = await this.activeChecker();\n const isActive = result === true;\n if (this.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (checker):\", isActive);\n return isActive;\n }\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !this.apiClient) {\n if (this.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription: false (no distinctId/apiClient)\");\n return false;\n }\n const status = await this.apiClient.getSubscriptionStatus(distinctId);\n const isActive = status.hasActiveSubscription === true;\n if (this.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (server):\", isActive);\n return isActive;\n } catch (error) {\n if (this.config?.debug) console.error(\"[Paywallo SUB] hasActiveSubscription error\", error);\n if (this.apiClient) void this.apiClient.reportError(\"SUBSCRIPTION_CHECK_FAILED\", error instanceof Error ? error.message : \"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 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 if (this.config?.debug) console.log(\"[Paywallo RESTORE] starting\");\n const result = await this.restoreHandler();\n if (this.config?.debug) console.log(\"[Paywallo RESTORE] result:\", { success: result.success, restoredProducts: result.restoredProducts?.length ?? 0 });\n return result;\n }\n async reset(): Promise<void> {\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n }\n async fullReset(): Promise<void> {\n const wasDebug = this.config?.debug ?? false;\n await sessionManager.endSession();\n sessionManager.destroy();\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n queueProcessor.dispose(); offlineQueue.dispose(); networkMonitor.dispose();\n campaignGateService.clearPreloaded();\n this.cleanupNetworkRecovery();\n this.sessionFlagsMap.clear();\n this.apiClient?.dispose();\n this.apiClient = null; this.config = null; this.initPromise = null;\n this.readyPromise = null; this.resolveReady = 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; this.autoPreloadedPlacement = null; this.autoPreloadPlacementPromise = null;\n }\n\n getSessionFlag(key: string): string | null {\n if (!this.config || !this.apiClient) return null;\n const value = this.sessionFlagsMap.get(key);\n return value !== undefined ? value : null;\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 | null): void { this.paywallPresenter = p; }\n registerCampaignPresenter(p: CampaignPresenter | null): void { this.campaignPresenter = p; }\n registerSubscriptionGetter(g: SubscriptionGetter | null): void { this.subscriptionGetter = g; }\n registerActiveChecker(c: ActiveChecker | null): void { this.activeChecker = c; }\n registerRestoreHandler(h: RestoreHandler | null): void { this.restoreHandler = h; }\n registerEmergencyPaywallHandler(h: EmergencyPaywallHandler | null): void { sessionManager.registerEmergencyPaywallHandler(h); }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n if (!this.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return this.apiClient.getEmergencyPaywall();\n }\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 isPreloaded(placement: string): boolean { return campaignGateService.getPreloadedCampaign(placement) !== null; }\n getAutoPreloadedPlacement(): string | null { return this.autoPreloadedPlacement; }\n waitForAutoPreloadedPlacement(): Promise<string | null> { return this.autoPreloadPlacementPromise ?? Promise.resolve(null); }\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\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 isReady: 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 { 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 // Intentionally runs once on mount — initialProductIds is a seed value, not a reactive dep.\n // Callers that need reactive reloads should call loadProducts() directly.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\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 trialDays?: number;\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 trialDays: number;\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 trialDays: product.trialDays ?? 0,\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 trialDays: product.trialDays ?? 0,\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\nexport interface PurchaseOutcome {\n status: \"success\" | \"cancelled\" | \"failed\";\n purchase?: IAPPurchase;\n error?: PurchaseError;\n}\n\ninterface UsePurchaseResult {\n state: PurchaseState;\n purchase: (productId: string) => Promise<PurchaseOutcome>;\n restore: () => Promise<IAPPurchase[]>;\n error: PurchaseError | null;\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<PurchaseOutcome> => {\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 status: \"success\",\n purchase: {\n productId: result.purchase.productId,\n transactionId: result.purchase.transactionId,\n transactionDate: result.purchase.transactionDate,\n transactionReceipt: result.purchase.receipt,\n },\n };\n }\n\n if (result.error) {\n setError(result.error);\n setState(\"error\");\n return { status: \"failed\", error: result.error };\n }\n\n setState(\"idle\");\n return { status: \"cancelled\" };\n } catch (err) {\n const purchaseError = err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return { status: \"cancelled\" };\n }\n\n setError(purchaseError);\n setState(\"error\");\n return { status: \"failed\", error: purchaseError };\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 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\nconst EMPTY_ENTITLEMENTS: string[] = [];\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()\n .then((s) => {\n setStatus(s);\n setIsLoading(false);\n })\n .catch((err) => {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\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 ?? EMPTY_ENTITLEMENTS,\n refresh,\n restore,\n };\n}\n","import React, { useCallback, useEffect, useLayoutEffect, 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\nexport interface 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 const autoPreloadTriggeredRef = useRef(false);\n const preloadedWebViewRef = useRef(preloadedWebView);\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollCancelledRef = useRef(false);\n\n useEffect(() => { preloadedWebViewRef.current = preloadedWebView; }, [preloadedWebView]);\n\n const triggerRepreload = useCallback((placement: string): void => {\n void PaywalloClient.preloadCampaign(placement).catch(() => {});\n }, []);\n\n const { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady: baseHandlePreloadedWebViewReady, handlePreloadedClose: baseHandlePreloadedClose, setShowingPreloadedWebView, presentedAtRef } =\n usePaywallPresenter(preloadedWebView, setPreloadedWebView);\n\n const SCREEN_HEIGHT = useMemo(() => Dimensions.get(\"window\").height, []);\n const slideAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo WEBVIEW] loaded — placement: ${preloadedWebView?.placement}`); }\n baseHandlePreloadedWebViewReady();\n }, [preloadedWebView?.placement, baseHandlePreloadedWebViewReady]);\n\n const handlePreloadedClose = useCallback((): void => {\n const placement = preloadedWebView?.placement;\n Animated.timing(slideAnim, { toValue: SCREEN_HEIGHT, duration: 200, easing: Easing.in(Easing.cubic), useNativeDriver: true }).start(() => {\n baseHandlePreloadedClose();\n if (placement) triggerRepreload(placement);\n });\n }, [baseHandlePreloadedClose, preloadedWebView, triggerRepreload, slideAnim, SCREEN_HEIGHT]);\n\n const { handlePreloadedPurchase: rawPreloadedPurchase, handlePreloadedRestore } = usePurchaseOrchestrator(\n preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, invalidateCache\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 const configRef = useRef(config);\n\n useEffect(() => {\n let mounted = true;\n initLocalization({ detectDevice: true });\n PaywalloClient.init(configRef.current)\n .then(async () => {\n if (!mounted) return;\n setDistinctId(PaywalloClient.getDistinctId());\n setIsInitialized(true);\n if (!autoPreloadTriggeredRef.current) {\n autoPreloadTriggeredRef.current = true;\n const placement = await PaywalloClient.waitForAutoPreloadedPlacement();\n if (mounted && placement) void preloadCampaign(placement).catch(() => {});\n }\n })\n .catch((err: unknown) => {\n if (!mounted) return;\n setInitError(err instanceof Error ? err : new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, String(err)));\n });\n return () => { mounted = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [preloadCampaign]); // config is captured via ref — re-init on config change is intentional no-op\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 const bridgePaywallPresenter = useCallback((placement: string): Promise<PaywallResult> => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRESENT] called — preloaded: ${preloadedWebViewRef.current?.loaded === true} placement: ${placement}`); }\n if (preloadedWebViewRef.current?.placement === placement) {\n if (preloadedWebViewRef.current.loaded) {\n return presentPreloadedWebView();\n }\n pollCancelledRef.current = false;\n return new Promise<PaywallResult>((resolve) => {\n let elapsed = 0;\n const poll = (): void => {\n if (pollCancelledRef.current) return;\n if (preloadedWebViewRef.current?.loaded) { resolve(presentPreloadedWebView()); return; }\n elapsed += 100;\n if (elapsed >= 500) { resolve(presentCampaign(placement)); return; }\n pollTimerRef.current = setTimeout(poll, 100);\n };\n pollTimerRef.current = setTimeout(poll, 100);\n });\n }\n return presentCampaign(placement);\n }, [presentPreloadedWebView, presentCampaign]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const onEmergency = async (id: string): Promise<void> => { try { await bridgePaywallPresenter(id); } catch { /* non-critical */ } };\n PaywalloClient.registerPaywallPresenter(bridgePaywallPresenter);\n PaywalloClient.registerSubscriptionGetter(getSubscription);\n PaywalloClient.registerActiveChecker(hasActiveSubscription);\n PaywalloClient.registerRestoreHandler(restorePurchases);\n PaywalloClient.registerEmergencyPaywallHandler(onEmergency);\n return () => {\n pollCancelledRef.current = true;\n if (pollTimerRef.current !== null) { clearTimeout(pollTimerRef.current); pollTimerRef.current = null; }\n PaywalloClient.registerPaywallPresenter(null);\n PaywalloClient.registerSubscriptionGetter(null);\n PaywalloClient.registerActiveChecker(null);\n PaywalloClient.registerRestoreHandler(null);\n PaywalloClient.registerEmergencyPaywallHandler(null);\n };\n }, [isInitialized, bridgePaywallPresenter, getSubscription, hasActiveSubscription, restorePurchases]);\n\n\n const isReady = isInitialized && !isLoadingProducts;\n\n const noOp = useCallback(() => {}, []);\n const contextValue: PaywalloContextValue = useMemo(() => ({\n config: PaywalloClient.getConfig(), isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts,\n }), [isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts]);\n\n useLayoutEffect(() => {\n if (showingPreloadedWebView) {\n slideAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(slideAnim, { toValue: 0, duration: 200, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }\n }, [showingPreloadedWebView, slideAnim, SCREEN_HEIGHT]);\n\n const preloadStyle = [\n styles.preloadOverlay,\n showingPreloadedWebView ? styles.visible : styles.hidden,\n showingPreloadedWebView ? { transform: [{ translateY: slideAnim }] } : undefined,\n ];\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 webUrl={isInitialized ? PaywalloClient.getWebUrl() : null}\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, opacity: 0, width: 1, height: 1, overflow: \"hidden\" },\n visible: { zIndex: 9999, opacity: 1 },\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 getCacheEntry,\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 getCacheEntry(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 if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo WEBVIEW] mounting hidden — placement: ${placement}`);\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);\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);\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 getCacheEntry(\n cache: Map<string, PreloadedCampaign>,\n placement: string\n): PreloadedCampaign | null {\n const entry = cache.get(placement);\n if (!isCacheEntryValid(entry)) return null;\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] refreshProducts failed\", err);\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 invalidateSubscriptionCache: () => void\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 setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\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 invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: true, cancelled: false, restored: false });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded purchase failed\", 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, invalidateSubscriptionCache]\n );\n\n const handlePreloadedRestore = useCallback(async (): Promise<void> => {\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length === 0) return;\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 invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: true });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded restore failed\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n }, [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, invalidateSubscriptionCache]);\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 SubscriptionStatus as DomainSubscriptionStatus,\n SubscriptionStatusResponse as DomainStatusResponse,\n} from \"../domains/subscription/types\";\nimport type { Subscription, SubscriptionStatusResponse, SubscriptionStatus } 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\nconst PUBLIC_TO_DOMAIN_STATUS: Record<string, DomainSubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n in_billing_retry: \"billing_retry\",\n in_grace_period: \"grace_period\",\n revoked: \"unknown\",\n cancelled: \"canceled\",\n};\n\nconst DOMAIN_TO_PUBLIC_STATUS: Record<string, SubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n billing_retry: \"in_billing_retry\",\n grace_period: \"in_grace_period\",\n canceled: \"cancelled\",\n paused: \"expired\",\n unknown: \"expired\",\n};\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 status: PUBLIC_TO_DOMAIN_STATUS[sub.status] ?? \"unknown\",\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: status.entitlements ?? [],\n };\n}\n\nfunction isSubscriptionStillActive(sub: { status: string; expiresAt: Date | null } | null): boolean {\n if (!sub) return false;\n if (!ACTIVE_STATUSES.includes(sub.status)) return false;\n if (sub.expiresAt && sub.expiresAt.getTime() !== 0 && sub.expiresAt < new Date()) return false;\n return true;\n}\n\nfunction subscriptionInfoToSub(s: SubscriptionInfo): Subscription {\n const status: SubscriptionStatus = DOMAIN_TO_PUBLIC_STATUS[s.status] ?? \"expired\";\n return { productId: s.productId, status, expiresAt: s.expiresAt ?? null, platform: s.platform, autoRenewEnabled: s.willRenew, inGracePeriod: status === \"in_grace_period\" };\n}\n\nasync function resolveOfflineFromCache(distinctId: string): Promise<boolean> {\n try {\n const cached = await subscriptionCache.get(distinctId);\n if (!cached) return false;\n const sub = cached.data.subscription;\n return isSubscriptionStillActive(sub ? { status: sub.status, expiresAt: sub.expiresAt ?? null } : null);\n } catch { return false; }\n}\n\nfunction isActiveCacheEntry(entry: CacheEntry): boolean {\n return isSubscriptionStillActive(entry.data);\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 const distinctId = PaywalloClient.getDistinctId();\n if (distinctId) void subscriptionCache.invalidate(distinctId);\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(distinctId, 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()) return isActiveCacheEntry(cached);\n\n try {\n const persisted = await subscriptionCache.get(distinctId);\n if (persisted && !persisted.isStale) {\n const sub = persisted.data.subscription ? subscriptionInfoToSub(persisted.data.subscription) : null;\n if (isSubscriptionStillActive(sub)) {\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n return true;\n }\n }\n } catch { /* fall through to server fetch */ }\n\n try {\n const apiStatus = await apiClient.getSubscriptionStatus(distinctId);\n const sub = apiStatus.subscription ? { ...apiStatus.subscription, expiresAt: apiStatus.subscription.expiresAt ? new Date(apiStatus.subscription.expiresAt) : null } : null;\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n void subscriptionCache.set(distinctId, toDomainResponse(apiStatus));\n return apiStatus.hasActiveSubscription === true;\n } catch {\n return resolveOfflineFromCache(distinctId);\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 try {\n const persisted = await subscriptionCache.get(distinctId);\n if (!persisted?.data.subscription) return null;\n return subscriptionInfoToSub(persisted.data.subscription);\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 { 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 { MetaBridge, metaBridge } 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 {\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 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, type PaywalloProviderProps } 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 PaywallErrorStrings,\n BlockType,\n EmergencyPaywallResponse,\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} 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","NativeModules","NativeModules","_debug","isAvailable","_debug","KEYCHAIN_KEY_PREFIX","NativeModules","isAvailable","Platform","useCallback","useRef","useState","useState","useRef","NativeModules","Platform","useCallback","useEffect","useRef","useState","NativeModules","NativeModules","useRef","useState","useEffect","useCallback","jsx","View","styles","Dimensions","useRef","Animated","useState","useCallback","useEffect","StyleSheet","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","Platform","item","Platform","Platform","Platform","Platform","idfv","Dimensions","Platform","NativeModules","Platform","Platform","AppState","AppState","Dimensions","Platform","generateUUID","isActive","createContext","useContext","useContext","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useState","useState","useCallback","useCallback","useEffect","useState","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","useRef","useEffect","useMemo","Dimensions","Animated","Easing","r","styles","StyleSheet"]}
1
+ {"version":3,"sources":["../src/errors/PaywalloError.ts","../src/domains/analytics/AnalyticsError.ts","../src/domains/analytics/index.ts","../src/errors/ClientError.ts","../src/domains/iap/PurchaseError.ts","../src/domains/identity/IdentityError.ts","../src/utils/uuid.ts","../src/utils/NativeDeviceInfo.ts","../src/core/storage/NativeStorage.ts","../src/core/storage/SecureStorage.ts","../src/core/storage/StorageMigration.ts","../src/domains/identity/IdentityManager.ts","../src/domains/iap/NativeStoreKit.ts","../src/domains/iap/IAPService.ts","../src/domains/paywall/usePaywallTracking.ts","../src/domains/paywall/usePaywallActions.ts","../src/domains/paywall/PaywallError.ts","../src/domains/paywall/usePaywallLoader.ts","../src/utils/localization.ts","../src/domains/paywall/parseWebViewMessage.ts","../src/domains/paywall/paywallScripts.ts","../src/domains/paywall/PaywallWebView.tsx","../src/domains/paywall/PaywallModal.tsx","../src/domains/paywall/PaywallErrorBoundary.tsx","../src/domains/paywall/PaywallContext.ts","../src/domains/paywall/usePaywallPresenter.ts","../src/domains/paywall/index.ts","../src/domains/subscription/SubscriptionCache.ts","../src/domains/session/SessionError.ts","../src/domains/subscription/SubscriptionManager.ts","../src/core/apiUrlUtils.ts","../src/domains/iap/apiPurchaseMethods.ts","../src/core/http/types.ts","../src/core/http/HttpClient.ts","../src/core/http/index.ts","../src/core/network/types.ts","../src/core/network/NetworkMonitor.ts","../src/core/network/index.ts","../src/core/queue/deduplication.ts","../src/core/queue/types.ts","../src/core/queue/OfflineQueue.ts","../src/core/queue/QueueProcessor.ts","../src/core/queue/index.ts","../src/core/ApiCache.ts","../src/core/EventBatcher.ts","../src/core/FlagStorage.ts","../src/core/ApiClient.ts","../src/domains/campaign/CampaignError.ts","../src/domains/campaign/CampaignGateService.ts","../src/domains/campaign/index.ts","../src/domains/identity/AdvertisingIdManager.ts","../src/domains/identity/MetaBridge.ts","../src/domains/identity/InstallReferrerManager.ts","../src/utils/deviceInfo.ts","../src/domains/session/sessionTracking.ts","../src/domains/session/SessionManager.ts","../src/domains/identity/InstallTracker.ts","../src/domains/identity/index.ts","../src/domains/session/index.ts","../src/core/PaywalloClient.ts","../src/index.ts","../src/context/PaywalloContext.ts","../src/domains/iap/index.ts","../src/domains/iap/errors.ts","../src/errors/index.ts","../src/hooks/usePaywallo.ts","../src/hooks/useProducts.ts","../src/utils/productMappers.ts","../src/hooks/usePurchase.ts","../src/hooks/useSubscription.ts","../src/PaywalloProvider.tsx","../src/hooks/useCampaignPreload.ts","../src/utils/loadCampaignProducts.ts","../src/utils/serverProduct.ts","../src/utils/preloadCache.ts","../src/hooks/useProductLoader.ts","../src/hooks/usePurchaseOrchestrator.ts","../src/hooks/useSubscriptionSync.ts","../src/domains/subscription/index.ts","../src/utils/productVariableResolver.ts","../src/utils/variableResolver.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 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","export { AnalyticsError, ANALYTICS_ERROR_CODES } from \"./AnalyticsError\";\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 INSECURE_REQUEST: \"CLIENT_INSECURE_REQUEST\",\n UNKNOWN: \"CLIENT_UNKNOWN\",\n} as const;\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 { 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 { NativeModules } from \"react-native\";\n\nexport interface DeviceInfoResult {\n deviceId: string;\n model: string;\n modelId: string;\n systemVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n brand: string;\n systemName: string;\n totalDisk: number;\n freeDisk: number;\n totalRam: number;\n carrier: string;\n installerPackage: string | null;\n idfv: string | null;\n}\n\ninterface PaywalloDeviceModule {\n // Native modules return unknown at runtime; Promise<unknown> forces explicit validation.\n getDeviceInfo(): Promise<unknown>;\n getInstallReferrer(): Promise<string | null>;\n}\n\nconst FALLBACK: DeviceInfoResult = {\n deviceId: \"unknown\", model: \"unknown\", modelId: \"unknown\",\n systemVersion: \"0.0.0\", appVersion: \"0.0.0\", buildNumber: \"0\",\n bundleId: \"unknown\", brand: \"unknown\", systemName: \"unknown\",\n totalDisk: 0, freeDisk: 0, totalRam: 0, carrier: \"unknown\",\n installerPackage: null, idfv: null,\n};\n\nlet _debug = false;\nlet warnedOnce = false;\nlet cachedDeviceInfo: DeviceInfoResult | null = null;\n\nexport function setNativeDeviceInfoDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isDeviceInfoResult(value: unknown): value is DeviceInfoResult {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v[\"deviceId\"] === \"string\" &&\n typeof v[\"model\"] === \"string\" &&\n typeof v[\"systemVersion\"] === \"string\" &&\n typeof v[\"appVersion\"] === \"string\" &&\n typeof v[\"bundleId\"] === \"string\"\n );\n}\n\nfunction getNativeModule(): PaywalloDeviceModule | null {\n const mod = NativeModules.PaywalloDevice as PaywalloDeviceModule | undefined;\n if (!mod) {\n if (!warnedOnce) {\n warnedOnce = true;\n console.warn(\"[Paywallo] NativeModules.PaywalloDevice not found — falling back to defaults\");\n }\n return null;\n }\n return mod;\n}\n\nasync function getDeviceInfo(): Promise<DeviceInfoResult> {\n if (cachedDeviceInfo !== null) return cachedDeviceInfo;\n const mod = getNativeModule();\n if (!mod) return FALLBACK;\n const raw = await mod.getDeviceInfo();\n if (!isDeviceInfoResult(raw)) return FALLBACK;\n cachedDeviceInfo = raw;\n return raw;\n}\n\nasync function getInstallReferrer(): Promise<string | null> {\n const mod = getNativeModule();\n if (!mod) return null;\n try {\n return await mod.getInstallReferrer();\n } catch {\n return null;\n }\n}\n\nfunction isAvailable(): boolean {\n return NativeModules.PaywalloDevice != null;\n}\n\n/** Clears the cached device info. Call after an OTA update if needed. */\nfunction clearCache(): void {\n cachedDeviceInfo = null;\n}\n\nexport const nativeDeviceInfo = {\n getDeviceInfo,\n getInstallReferrer,\n isAvailable,\n clearCache,\n};\n","import { NativeModules } from \"react-native\";\n\ninterface PaywalloStorageModule {\n // Secure (Keychain iOS / EncryptedSharedPreferences Android)\n secureGet(key: string): Promise<string | null>;\n secureSet(key: string, value: string): Promise<boolean>;\n secureRemove(key: string): Promise<boolean>;\n // Regular (UserDefaults iOS / SharedPreferences Android)\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<boolean>;\n remove(key: string): Promise<boolean>;\n // Migration helper — reads legacy react-native-keychain format (iOS only, SDK ≤1.5.0)\n // Optional: only available on native builds that include the method.\n legacySecureGet?(key: string): Promise<string | null>;\n}\n\nconst NativeModule = NativeModules.PaywalloStorage as PaywalloStorageModule | undefined;\n\nlet _debug = false;\nlet _warnedUnavailable = false;\n\nexport function setNativeStorageDebug(debug: boolean): void {\n _debug = debug;\n}\n\nfunction isAvailable(): boolean {\n return NativeModule != null;\n}\n\nfunction warnIfUnavailable(): boolean {\n if (NativeModule != null) return true;\n if (!_warnedUnavailable) {\n _warnedUnavailable = true;\n if (_debug) console.warn(\"[Paywallo] PaywalloStorage native module not available — storage will not persist\");\n }\n return false;\n}\n\nfunction getModule(): PaywalloStorageModule | null {\n if (!warnIfUnavailable()) return null;\n // NativeModule is captured once at module load — safe to assert here.\n return NativeModule as PaywalloStorageModule;\n}\n\nasync function get(key: string): Promise<string | null> {\n return getModule()?.get(key) ?? null;\n}\n\nasync function set(key: string, value: string): Promise<boolean> {\n return getModule()?.set(key, value) ?? false;\n}\n\nasync function remove(key: string): Promise<boolean> {\n return getModule()?.remove(key) ?? false;\n}\n\nasync function secureGet(key: string): Promise<string | null> {\n return getModule()?.secureGet(key) ?? null;\n}\n\nasync function secureSet(key: string, value: string): Promise<boolean> {\n return getModule()?.secureSet(key, value) ?? false;\n}\n\nasync function secureRemove(key: string): Promise<boolean> {\n return getModule()?.secureRemove(key) ?? false;\n}\n\n/**\n * Read a value stored by react-native-keychain (SDK ≤1.5.0) using the legacy\n * service-per-key layout: service=legacyService, account=\"panel\".\n * Only available on iOS builds that expose `legacySecureGet` on the native module.\n */\nasync function legacySecureGet(key: string): Promise<string | null> {\n const mod = getModule();\n if (!mod?.legacySecureGet) return null;\n return mod.legacySecureGet(key);\n}\n\nexport const nativeStorage = {\n isAvailable,\n get,\n set,\n remove,\n secureGet,\n secureSet,\n secureRemove,\n legacySecureGet,\n};\n","import { nativeStorage } from \"./NativeStorage\";\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\nconst REGULAR_KEY_PREFIX = \"@paywallo:\";\n\nexport class SecureStorage {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(_debug = false) {}\n\n async get(key: string): Promise<string | null> {\n const keychainValue = await this.getFromKeychain(key);\n if (keychainValue) {\n return keychainValue;\n }\n\n try {\n const value = await nativeStorage.get(`${REGULAR_KEY_PREFIX}${key}`);\n if (value) {\n await this.setToKeychain(key, value);\n // Remove the plaintext copy after promoting to keychain — prevents stale\n // reads if keychain is later cleared (e.g. Android reinstall, iOS biometric reset).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined);\n }\n return value;\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<boolean> {\n // Write only to Keychain — never to plaintext NativeStorage.\n // Sensitive values (email, properties, device IDs) must not land in UserDefaults/SharedPreferences.\n // The read() fallback below handles migration of pre-existing plaintext entries.\n return this.setToKeychain(key, value);\n }\n\n async remove(key: string): Promise<boolean> {\n try {\n await Promise.all([\n // Also remove the legacy plaintext copy if it exists (migration cleanup).\n nativeStorage.remove(`${REGULAR_KEY_PREFIX}${key}`).catch(() => undefined),\n this.removeFromKeychain(key),\n ]);\n return true;\n } catch {\n return false;\n }\n }\n\n hasKeychainSupport(): boolean {\n return nativeStorage.isAvailable();\n }\n\n private async getFromKeychain(key: string): Promise<string | null> {\n try {\n return await nativeStorage.secureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return null;\n }\n }\n\n private async setToKeychain(key: string, value: string): Promise<boolean> {\n try {\n return await nativeStorage.secureSet(`${KEYCHAIN_KEY_PREFIX}${key}`, value);\n } catch {\n return false;\n }\n }\n\n private async removeFromKeychain(key: string): Promise<boolean> {\n try {\n return await nativeStorage.secureRemove(`${KEYCHAIN_KEY_PREFIX}${key}`);\n } catch {\n return false;\n }\n }\n\n}\n\nexport const secureStorage = new SecureStorage();\n","/**\n * StorageMigration — upgrades data from SDK ≤1.5.0 to ≥1.5.2 storage layout.\n *\n * SDK ≤1.5.0 used:\n * - AsyncStorage (SQLite) → regular data with key \"@paywallo:{key}\"\n * - react-native-keychain → secure data with service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n *\n * SDK ≥1.5.2 uses:\n * - UserDefaults / SharedPreferences → regular data with key \"@paywallo:{key}\"\n * - iOS Keychain / EncryptedSharedPreferences → secure data with\n * service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * Migration is run once at init and guarded by a flag stored in NativeStorage.\n */\n\nimport { nativeStorage } from \"./NativeStorage\";\n\nconst MIGRATION_FLAG_KEY = \"@paywallo:_migration_v152_done\";\n\n// Keys that were stored in secure storage in ≤1.5.0.\n// Regular storage keys are migrated wholesale from AsyncStorage.\nconst LEGACY_SECURE_KEYS = [\n \"device_id\",\n \"device_id_fallback\",\n \"anon_id\",\n \"user_email\",\n \"user_properties\",\n];\n\nconst KEYCHAIN_KEY_PREFIX = \"com.paywallo.sdk.\";\n\nexport async function runStorageMigrationIfNeeded(): Promise<void> {\n if (!nativeStorage.isAvailable()) return;\n\n const alreadyDone = await nativeStorage.get(MIGRATION_FLAG_KEY);\n if (alreadyDone === \"1\") return;\n\n // Sequential — avoid concurrent NativeStorage writes on Android.\n await migrateAsyncStorage();\n await migrateKeychainLegacy();\n\n await nativeStorage.set(MIGRATION_FLAG_KEY, \"1\");\n}\n\n/**\n * Migrate regular data from AsyncStorage → UserDefaults/SharedPreferences.\n * Only writes keys that don't already exist in NativeStorage (safe to re-run).\n */\nasync function migrateAsyncStorage(): Promise<void> {\n try {\n // Dynamic import — AsyncStorage may not be installed in 1.5.2+ projects.\n const mod = await import(\"@react-native-async-storage/async-storage\") as {\n default: {\n getAllKeys(): Promise<readonly string[]>;\n multiGet(keys: readonly string[]): Promise<readonly [string, string | null][]>;\n };\n };\n const AsyncStorage = mod.default;\n\n const allKeys = await AsyncStorage.getAllKeys();\n const paywallo = allKeys.filter((k) => k.startsWith(\"@paywallo:\"));\n if (paywallo.length === 0) return;\n\n const pairs = await AsyncStorage.multiGet(paywallo);\n // Sequential writes — avoids concurrent NativeStorage access on Android\n // (SharedPreferences writes are not guaranteed safe under parallel JS calls).\n for (const [key, value] of pairs) {\n if (!value) continue;\n const existing = await nativeStorage.get(key);\n if (!existing) {\n await nativeStorage.set(key, value);\n }\n }\n } catch {\n // AsyncStorage not installed or no data — nothing to migrate.\n }\n}\n\n/**\n * Migrate secure data from legacy react-native-keychain layout →\n * new Keychain layout (via NativeStorage.secureSet).\n *\n * Legacy: service=\"com.paywallo.sdk.{key}\", account=\"panel\"\n * New: service=\"com.paywallo.sdk\", account=\"com.paywallo.sdk.{key}\"\n *\n * iOS: uses legacySecureGet (reads old service/account combo).\n * Android: EncryptedSharedPreferences was introduced in 1.5.2, no prior data.\n */\nasync function migrateKeychainLegacy(): Promise<void> {\n // Sequential writes — avoids concurrent NativeStorage access on Android.\n for (const key of LEGACY_SECURE_KEYS) {\n try {\n // legacySecureGet reads legacy Keychain slot (service=\"{prefix}{key}\", account=\"panel\")\n const legacyValue = await nativeStorage.legacySecureGet(`${KEYCHAIN_KEY_PREFIX}${key}`);\n if (!legacyValue) continue;\n\n // Only migrate if new slot is empty\n const newSlotKey = `${KEYCHAIN_KEY_PREFIX}${key}`;\n const existing = await nativeStorage.secureGet(newSlotKey);\n if (!existing) {\n await nativeStorage.secureSet(newSlotKey, legacyValue);\n }\n } catch {\n // Non-critical — skip this key.\n }\n }\n}\n","import { IDENTITY_ERROR_CODES, IdentityError } from \"./IdentityError\";\nimport type { IdentifyOptions, UserProperties } from \"../../types\";\nimport { generateUUID } from \"../../utils/uuid\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\n\nimport { ApiClient } from \"../../core/ApiClient\";\nimport { SecureStorage } from \"../../core/storage/SecureStorage\";\nimport { runStorageMigrationIfNeeded } from \"../../core/storage/StorageMigration\";\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nconst DEVICE_ID_KEY = \"device_id\";\nconst ANON_ID_KEY = \"anon_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 anonId: 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 private initPromise: Promise<string> | null = null;\n\n async initialize(apiClient: ApiClient, debug = false): Promise<string> {\n if (this.initialized) {\n return this.deviceId ?? \"\";\n }\n // Concurrent calls: return the in-flight promise so only one execution runs\n if (this.initPromise) {\n return this.initPromise;\n }\n this.initPromise = this._doInitialize(apiClient, debug).finally(() => {\n this.initPromise = null;\n });\n return this.initPromise;\n }\n\n private async _doInitialize(apiClient: ApiClient, debug: boolean): Promise<string> {\n\n this.apiClient = apiClient;\n this.debug = debug;\n this.secureStorage = new SecureStorage(debug);\n\n // Migrate data from SDK ≤1.5.0 (AsyncStorage + react-native-keychain) to\n // NativeStorage (UserDefaults/SharedPreferences + native Keychain) before\n // reading persisted state so no device_id is lost on upgrade.\n await runStorageMigrationIfNeeded();\n\n await this.loadPersistedState();\n\n if (!this.deviceId) {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n const deviceId = info.deviceId;\n this.deviceId = (!deviceId || deviceId === \"unknown\") ? generateUUID() : deviceId;\n } catch {\n this.deviceId = generateUUID();\n }\n const stored = await this.secureStorage.set(DEVICE_ID_KEY, this.deviceId);\n if (!stored) {\n await this.secureStorage.set(\"device_id_fallback\", this.deviceId).catch(() => { /* non-critical */ });\n }\n }\n\n if (!this.anonId) {\n this.anonId = \"$paywallo_anon:\" + generateUUID();\n await this.secureStorage.set(ANON_ID_KEY, this.anonId).catch(() => { /* non-critical */ });\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 if (!EMAIL_REGEX.test(email)) {\n if (this.debug) console.warn('[Paywallo] Invalid email format, skipping email field');\n email = undefined;\n } else {\n this.email = email;\n await this.secureStorage!.set(USER_EMAIL_KEY, email);\n }\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.anonId) {\n try {\n await this.apiClient.identify(this.anonId, properties, email, this.deviceId ?? undefined);\n } catch { /* non-critical */ }\n }\n }\n\n getDistinctId(): string {\n if (!this.initialized || !this.anonId) {\n return \"\";\n }\n return this.anonId;\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.anonId) {\n try {\n await this.apiClient.identify(this.anonId, this.properties, this.email ?? undefined, this.deviceId ?? undefined);\n } catch { /* non-critical */ }\n }\n }\n\n async reset(): Promise<void> {\n const newAnonId = \"$paywallo_anon:\" + generateUUID();\n this.anonId = newAnonId;\n this.email = null;\n this.properties = {};\n\n await Promise.all([\n this.secureStorage?.set(ANON_ID_KEY, newAnonId) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_EMAIL_KEY) ?? Promise.resolve(false),\n this.secureStorage?.remove(USER_PROPERTIES_KEY) ?? 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, storedAnonId, storedEmail, storedPropertiesJson] = await Promise.all([\n this.secureStorage.get(DEVICE_ID_KEY),\n this.secureStorage.get(ANON_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 } else {\n const fallbackDeviceId = await this.secureStorage.get(\"device_id_fallback\");\n if (fallbackDeviceId) {\n this.deviceId = fallbackDeviceId;\n }\n }\n\n if (storedAnonId) {\n this.anonId = storedAnonId;\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 { /* malformed JSON in storage — reset to empty */\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}\n\nexport const identityManager = new IdentityManager();\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 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 uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (distinctId && !uuidRegex.test(distinctId)) {\n if (PaywalloClient.getConfig()?.debug) console.warn(\"[Paywallo] distinctId is not a valid UUID for appAccountToken:\", distinctId);\n }\n try {\n const result = await PaywalloStoreKitNative.purchase(productId, distinctId ?? null);\n if (!result || result.pending) {\n return null;\n }\n return mapNativePurchase(result);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.toLowerCase().includes(\"cancel\")) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.USER_CANCELLED, message, true);\n }\n throw new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, message);\n }\n },\n\n async finishTransaction(transactionId: string): Promise<void> {\n if (!PaywalloStoreKitNative) return;\n try {\n await PaywalloStoreKitNative.finishTransaction(transactionId);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] finishTransaction native error\", err);\n }\n },\n\n async getActiveTransactions(): Promise<Purchase[]> {\n if (!PaywalloStoreKitNative) return [];\n try {\n const results = await PaywalloStoreKitNative.getActiveTransactions();\n return results.map(mapNativePurchase);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] getActiveTransactions failed\", err);\n return [];\n }\n },\n};\n\n/** @deprecated Use `nativeStoreKit` (camelCase) */\nexport const NativeStoreKit = nativeStoreKit;\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 private purchaseInFlight: string | 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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] loadProducts failed', err);\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 validateWithRetry(\n attempt: () => Promise<ValidatePurchaseResponse>,\n maxRetries = 2,\n delayMs = 3000\n ): Promise<ValidatePurchaseResponse> {\n let lastError: unknown;\n for (let i = 0; i <= maxRetries; i++) {\n try {\n return await attempt();\n } catch (error) {\n lastError = error;\n if (i < maxRetries) await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw lastError;\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 return this.validateWithRetry(\n () => 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 }\n\n private async finishTransaction(transactionId: string): Promise<void> {\n try {\n await NativeStoreKit.finishTransaction(transactionId);\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] finishTransaction failed', err);\n }\n }\n\n async purchase(\n productId: string,\n options?: { paywallPlacement?: string; variantKey?: string }\n ): Promise<PurchaseResult> {\n if (!NativeStoreKit.isAvailable()) {\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 if (this.purchaseInFlight) {\n return {\n success: false,\n error: new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, \"A purchase is already in progress\"),\n };\n }\n this.purchaseInFlight = productId;\n\n const debug = PaywalloClient.getConfig()?.debug;\n if (debug) console.log(`[Paywallo PURCHASE] starting ${productId}`);\n try {\n const purchase = await NativeStoreKit.purchase(productId);\n\n if (!purchase) {\n if (debug) console.log(`[Paywallo PURCHASE] ${productId} cancelled`);\n return { success: false };\n }\n\n if (debug) console.log(`[Paywallo PURCHASE] ${productId} approved`, { transactionId: purchase.transactionId });\n\n await this.finishTransaction(purchase.transactionId);\n if (debug) console.log(`[Paywallo PURCHASE] ${productId} finished`);\n\n this.validateWithServer(purchase, productId, options)\n .then(() => { if (debug) console.log(`[Paywallo PURCHASE] ${productId} server validated`); })\n .catch((err) => { if (debug) console.error(\"[Paywallo PURCHASE] background validation failed\", err); });\n\n return { success: true, purchase };\n } catch (error) {\n if (debug) console.error(`[Paywallo PURCHASE] ${productId} failed`, error);\n const e = error instanceof PurchaseError ? error : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, error instanceof Error ? error.message : String(error));\n return { success: false, error: e };\n } finally {\n this.purchaseInFlight = null;\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] finishTransaction failed', err);\n }\n validated.push(tx);\n }\n }\n\n return validated;\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error('[Paywallo] restore failed', err);\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 { 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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] trackDismissed failed\", err);\n }\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((err) => { if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] trackProductSelected failed\", err); });\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo] trackPurchased failed\", err);\n }\n }, []);\n\n return { trackDismissed, trackProductSelected, trackPurchased };\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\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 openAnim?: Animated.Value\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 const animTarget = openAnim ?? slideAnim;\n Animated.timing(animTarget, { toValue: Dimensions.get(\"window\").height, duration: 350, 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, openAnim, 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 onResult({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n } catch (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 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 { 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 { 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 let cancelled = false;\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 if (cancelled) return;\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 if (!cancelled) setProducts(snapProducts);\n } else if (productIds.length > 0) {\n try {\n const storeProducts = await getIAPService().loadProducts(productIds);\n if (!cancelled) {\n const map = new Map<string, Product>();\n for (const p of storeProducts) map.set(p.productId, p);\n setProducts(map);\n }\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] loadProducts in paywall failed\", err);\n if (!cancelled) setProducts(new Map());\n }\n } else {\n if (!cancelled) setProducts(new Map());\n }\n\n if (!trackingDoneRef.current && !cancelled) {\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 if (cancelled) return;\n const e = err instanceof Error ? err : new PaywallError(PAYWALL_ERROR_CODES.LOAD_FAILED, String(err));\n setError(e);\n }\n };\n\n void load();\n return () => { cancelled = true; };\n }, [placement, visible, variantKey, campaignId]);\n\n return { paywallConfig, products, error };\n}\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\nconst SDK_STRINGS = {\n paywallErrorTitle: {\n \"pt-BR\": \"Algo deu errado\",\n \"pt\": \"Algo deu errado\",\n \"en\": \"Something went wrong\",\n \"en-US\": \"Something went wrong\",\n \"en-GB\": \"Something went wrong\",\n \"es\": \"Algo salió mal\",\n \"es-419\": \"Algo salió mal\",\n },\n paywallRetryButton: {\n \"pt-BR\": \"Tentar novamente\",\n \"pt\": \"Tentar novamente\",\n \"en\": \"Try again\",\n \"en-US\": \"Try again\",\n \"en-GB\": \"Try again\",\n \"es\": \"Reintentar\",\n \"es-419\": \"Reintentar\",\n },\n paywallCloseButton: {\n \"pt-BR\": \"Fechar\",\n \"pt\": \"Fechar\",\n \"en\": \"Close\",\n \"en-US\": \"Close\",\n \"en-GB\": \"Close\",\n \"es\": \"Cerrar\",\n \"es-419\": \"Cerrar\",\n },\n} as const;\n\ntype SdkStringKey = keyof typeof SDK_STRINGS;\n\nexport function getSdkString(key: SdkStringKey): string {\n const map: Record<string, string> = SDK_STRINGS[key];\n if (currentLanguage in map) return map[currentLanguage]!;\n const base = currentLanguage.split(\"-\")[0];\n if (base && base in map) return map[base]!;\n if (defaultLanguage in map) return map[defaultLanguage]!;\n return Object.values(map)[0];\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","export interface WebViewMessage {\n type: \"purchase\" | \"close\" | \"restore\" | \"select-product\" | \"open-url\" | \"ready\";\n id?: string;\n payload?: {\n productId?: string;\n url?: string;\n timestamp?: number;\n };\n}\n\nconst ALLOWED_MESSAGE_TYPES: ReadonlySet<string> = new Set([\n \"purchase\",\n \"close\",\n \"restore\",\n \"select-product\",\n \"open-url\",\n \"ready\",\n]);\n\nexport function deriveMessageId(message: WebViewMessage): string {\n if (message.id) return message.id;\n\n const payloadKey =\n message.payload?.productId ??\n message.payload?.url ??\n (message.payload?.timestamp != null ? String(message.payload.timestamp) : \"\");\n\n return `${message.type}:${payloadKey}`;\n}\n\nexport function parseWebViewMessage(raw: string): WebViewMessage | null {\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed?.type !== \"string\" || !ALLOWED_MESSAGE_TYPES.has(parsed.type)) {\n return null;\n }\n\n const payload = parsed.payload;\n const safePayload: WebViewMessage[\"payload\"] =\n payload !== null && typeof payload === \"object\"\n ? {\n productId: typeof (payload as Record<string, unknown>).productId === \"string\"\n ? String((payload as Record<string, unknown>).productId)\n : undefined,\n url: typeof (payload as Record<string, unknown>).url === \"string\"\n ? String((payload as Record<string, unknown>).url)\n : undefined,\n timestamp: typeof (payload as Record<string, unknown>).timestamp === \"number\"\n ? Number((payload as Record<string, unknown>).timestamp)\n : undefined,\n }\n : undefined;\n\n return {\n type: parsed.type as WebViewMessage[\"type\"],\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n payload: safePayload,\n };\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\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);}}t();})();true;`;\n}\n\nexport function buildPurchaseStateScript(isPurchasing: boolean): string {\n return `if(window.receiveNativeMessage){window.receiveNativeMessage({type:\"purchaseState\",data:{isPurchasing:${isPurchasing}}});}true;`;\n}\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 { deriveMessageId, 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 webUrl?: string | null;\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 webUrl: webUrlProp,\n onPurchase,\n onClose,\n onRestore,\n onReady,\n onError,\n}: PaywallWebViewProps): React.ReactElement | null {\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 const onReadyRef = useRef(onReady);\n onReadyRef.current = onReady;\n\n const NativeWebView = useMemo(() => getNativeWebView(), []);\n\n const [resolvedWebUrl, setResolvedWebUrl] = useState<string | null>(\n () => webUrlProp ?? PaywalloClient.getWebUrl()\n );\n\n useEffect(() => {\n if (webUrlProp !== undefined) {\n setResolvedWebUrl(webUrlProp ?? null);\n return;\n }\n const url = PaywalloClient.getWebUrl();\n if (url) { setResolvedWebUrl(url); return; }\n const interval = setInterval(() => {\n const u = PaywalloClient.getWebUrl();\n if (u) { setResolvedWebUrl(u); clearInterval(interval); }\n }, 200);\n return () => clearInterval(interval);\n }, [webUrlProp]);\n\n useEffect(() => {\n if (!resolvedWebUrl) {\n onErrorRef.current?.({\n code: -1,\n description: \"Paywall URL not configured. SDK may not be initialized.\",\n });\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\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 }, [craftData, products, primaryProductId, secondaryProductId]);\n\n const processedIdsRef = useRef<Set<string>>(new Set());\n const dedupeTimersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(() => {\n return () => {\n for (const timerId of dedupeTimersRef.current.values()) clearTimeout(timerId);\n dedupeTimersRef.current.clear();\n processedIdsRef.current.clear();\n };\n }, []);\n\n const handleParsedMessage = useCallback(\n (message: WebViewMessage) => {\n const msgId = deriveMessageId(message);\n if (processedIdsRef.current.has(msgId)) return;\n processedIdsRef.current.add(msgId);\n const timerId = setTimeout(() => {\n processedIdsRef.current.delete(msgId);\n dedupeTimersRef.current.delete(msgId);\n }, 5_000);\n dedupeTimersRef.current.set(msgId, timerId);\n\n switch (message.type) {\n case \"ready\":\n if (!paywallDataSent.current) {\n buildAndSetInjectionScript();\n } else {\n onReadyRef.current?.();\n }\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 // Allow safe external schemes — https/http for web links, mailto for contact\n // links in paywall content, and platform store deep-links (itms-apps/\n // itms-services on iOS, market: on Android). Everything else is dropped.\n if (\n /^https?:\\/\\//i.test(url) ||\n /^mailto:/i.test(url) ||\n /^itms-apps:/i.test(url) ||\n /^itms-services:/i.test(url) ||\n /^market:/i.test(url)\n ) {\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 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 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 if (!resolvedWebUrl) return null;\n\n const paywallUrl = `${resolvedWebUrl}/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","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\";\nimport { PaywalloClient } from \"../../core/PaywalloClient\";\nimport { getSdkString } from \"../../utils/localization\";\n\nimport { PaywallWebView } from \"./PaywallWebView\";\n\ninterface ErrorFallbackProps {\n description: string;\n onRetry: () => void;\n onClose: () => void;\n}\n\nfunction ErrorFallback({ description, onRetry, onClose }: ErrorFallbackProps): React.ReactElement {\n const overrides = PaywalloClient.getConfig()?.errorStrings;\n const title = overrides?.title ?? getSdkString(\"paywallErrorTitle\");\n const retryLabel = overrides?.retry ?? getSdkString(\"paywallRetryButton\");\n const closeLabel = overrides?.close ?? getSdkString(\"paywallCloseButton\");\n\n return (\n <View style={styles.fallbackContainer}>\n <View style={styles.fallbackCard}>\n <Text style={styles.fallbackTitle}>{title}</Text>\n <Text style={styles.fallbackDescription}>{description}</Text>\n <Pressable style={styles.retryButton} onPress={onRetry}>\n <Text style={styles.retryButtonText}>{retryLabel}</Text>\n </Pressable>\n <Pressable style={styles.closeButton} onPress={onClose}>\n <Text style={styles.closeButtonText}>{closeLabel}</Text>\n </Pressable>\n </View>\n </View>\n );\n}\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 screenHeight = Dimensions.get(\"window\").height;\n const openAnim = useRef(new Animated.Value(screenHeight)).current;\n const [modalVisible, setModalVisible] = useState(false);\n\n const handleResult = useCallback((result: PaywallResult) => {\n setModalVisible(false);\n onResult(result);\n }, [onResult]);\n\n const { isPurchasing, slideAnim, handleClose, handlePurchase, handleRestore } =\n usePaywallActions(placement, paywallConfig, handleResult, variantKey, campaignId, openAnim);\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 useEffect(() => {\n if (visible) {\n setModalVisible(true);\n openAnim.setValue(Dimensions.get(\"window\").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 (!modalVisible && !visible) return null;\n\n return (\n <Modal\n visible={modalVisible}\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 <ErrorFallback\n description={webViewError.description}\n onRetry={handleRetry}\n onClose={handleClose}\n />\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 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 {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] Paywall render error:\", error);\n try { PaywalloClient.getApiClient()?.reportError(\"PAYWALL_RENDER_ERROR\", error.message); } catch {}\n }\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 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 setShowingPreloadedWebView(false);\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 { /* non-critical — analytics event, dismiss flow must continue */ }\n };\n void track();\n setShowingPreloadedWebView(false);\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: true, restored: false });\n }, [preloadedWebView, resolvePreloadedPaywall]);\n\n return { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady, handlePreloadedClose, setShowingPreloadedWebView, presentedAtRef };\n}\n","export { PaywallModal } from \"./PaywallModal\";\nexport { PaywallWebView } from \"./PaywallWebView\";\nexport { PaywallErrorBoundary } from \"./PaywallErrorBoundary\";\nexport { PaywallContext, usePaywallContext } from \"./PaywallContext\";\nexport type { PaywallContextValue } from \"./PaywallContext\";\nexport { usePaywallActions } from \"./usePaywallActions\";\nexport type { UsePaywallActionsResult } from \"./usePaywallActions\";\nexport { usePaywallLoader } from \"./usePaywallLoader\";\nexport { usePaywallPresenter } from \"./usePaywallPresenter\";\nexport { usePaywallTracking } from \"./usePaywallTracking\";\nexport type { UsePaywallTrackingResult } from \"./usePaywallTracking\";\nexport { PaywallError, PAYWALL_ERROR_CODES } from \"./PaywallError\";\nexport { buildPaywallInjectionScript, buildPurchaseStateScript } from \"./paywallScripts\";\nexport { parseWebViewMessage } from \"./parseWebViewMessage\";\nexport type { WebViewMessage } from \"./parseWebViewMessage\";\n","import { SecureStorage } from \"../../core/storage/SecureStorage\";\n\nimport type { CachedSubscription, SubscriptionStatusResponse } from \"./types\";\n\nconst LEGACY_CACHE_KEY = \"@panel:subscription_cache\";\nconst CACHE_KEY_PREFIX = \"subscription_cache:\";\nconst CACHE_INDEX_KEY = \"subscription_cache:__index__\";\nconst DEFAULT_TTL = 24 * 60 * 60 * 1000;\n\nfunction keyFor(distinctId: string): string {\n return `${CACHE_KEY_PREFIX}${distinctId}`;\n}\n\nexport class SubscriptionCache {\n private ttl: number;\n private memoryCache: Map<string, CachedSubscription> = new Map();\n private storage: SecureStorage;\n private legacyCleanupDone = false;\n\n constructor(ttl: number = DEFAULT_TTL) {\n this.ttl = ttl;\n this.storage = new SecureStorage();\n }\n\n private async cleanupLegacyCache(): Promise<void> {\n if (this.legacyCleanupDone) return;\n this.legacyCleanupDone = true;\n try {\n await this.storage.remove(LEGACY_CACHE_KEY);\n } catch {\n }\n }\n\n async get(distinctId: string): Promise<CachedSubscription | null> {\n await this.cleanupLegacyCache();\n if (!distinctId) return null;\n\n const memEntry = this.memoryCache.get(distinctId);\n if (memEntry && !this.isExpired(memEntry)) {\n return memEntry;\n }\n\n try {\n const stored = await this.storage.get(keyFor(distinctId));\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(keyFor(distinctId));\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 if (!cached.isStale) {\n this.memoryCache.set(distinctId, cached);\n }\n\n return cached;\n } catch {\n return null;\n }\n }\n\n async set(distinctId: string, data: SubscriptionStatusResponse): Promise<void> {\n if (!distinctId) return;\n const cached: CachedSubscription = {\n data,\n cachedAt: Date.now(),\n isStale: false,\n };\n\n this.memoryCache.set(distinctId, cached);\n\n try {\n await this.storage.set(keyFor(distinctId), JSON.stringify(cached));\n await this.addToIndex(distinctId);\n } catch {\n }\n }\n\n private async addToIndex(distinctId: string): Promise<void> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n const ids: string[] = raw ? (JSON.parse(raw) as string[]) : [];\n if (!ids.includes(distinctId)) {\n ids.push(distinctId);\n await this.storage.set(CACHE_INDEX_KEY, JSON.stringify(ids));\n }\n } catch {\n }\n }\n\n private async readIndex(): Promise<string[]> {\n try {\n const raw = await this.storage.get(CACHE_INDEX_KEY);\n if (!raw) return [];\n return JSON.parse(raw) as string[];\n } catch {\n return [];\n }\n }\n\n async invalidate(distinctId: string): Promise<void> {\n if (!distinctId) return;\n this.memoryCache.delete(distinctId);\n\n try {\n await this.storage.remove(keyFor(distinctId));\n } catch {\n }\n }\n\n async invalidateAll(): Promise<void> {\n // Collect keys from memory AND from the persisted index (survives restarts)\n const memKeys = Array.from(this.memoryCache.keys());\n const indexKeys = await this.readIndex();\n const allKeys = Array.from(new Set([...memKeys, ...indexKeys]));\n\n this.memoryCache.clear();\n\n await Promise.allSettled([\n this.storage.remove(LEGACY_CACHE_KEY),\n this.storage.remove(CACHE_INDEX_KEY),\n ...allKeys.map((k) => this.storage.remove(keyFor(k))),\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 { 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 { 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 private cacheKey(): string {\n return this.userId ?? \"__anonymous__\";\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.invalidateAll();\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(this.cacheKey());\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(this.cacheKey(), 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(this.cacheKey());\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(this.cacheKey());\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}/purchases/status/${encodeURIComponent(this.config.appKey)}`);\n if (this.userId) {\n url.searchParams.set(\"distinctId\", this.userId);\n }\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(this.cacheKey());\n await this.getSubscriptionStatus(true);\n }\n\n private log(...args: unknown[]): void {\n if (this.config?.debug) console.log(\"[Paywallo:Subscription]\", ...args);\n }\n}\n\nexport const subscriptionManager = new SubscriptionManagerClass();\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\";\nimport { PURCHASE_ERROR_CODES, PurchaseError } from \"./PurchaseError\";\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 if (!response.ok) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.VALIDATION_FAILED, `Server validation failed: HTTP ${response.status}`);\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 if (!response.ok) {\n throw new PurchaseError(PURCHASE_ERROR_CODES.NETWORK_ERROR, `Subscription status check failed: HTTP ${response.status}`);\n }\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 ?? 10000,\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 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.calculateDelayForResponse(state.attempt, response.headers, 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 // Redact URL path segments that may contain the app key (e.g. /validate/{key}, /status/{key})\n // to avoid leaking credentials in debug logs.\n this.log(\"Request failed\", {\n url: this.redactUrl(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 // Warn and block plain-HTTP absolute URLs to prevent credential leakage.\n // Exception: localhost / 192.168.x dev servers are allowed for local dev.\n if (path.startsWith(\"http://\")) {\n const isLocalDev = /^http:\\/\\/(localhost|127\\.0\\.0\\.1|192\\.168\\.\\d{1,3}\\.\\d{1,3})/.test(path);\n if (!isLocalDev) {\n const sanitizedPath = path.split(\"?\")[0];\n this.log(\"Blocked http:// request — only HTTPS is allowed in production:\", sanitizedPath);\n throw new ClientError(CLIENT_ERROR_CODES.INSECURE_REQUEST, `Insecure HTTP request blocked: ${sanitizedPath}`);\n }\n }\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 calculateDelayForResponse(\n attempt: number,\n headers: Record<string, string>,\n config: RetryConfig\n ): number {\n // Honour Retry-After header (seconds or HTTP-date) to avoid 429 storms.\n const retryAfter = headers[\"retry-after\"];\n if (retryAfter) {\n const seconds = Number(retryAfter);\n if (!Number.isNaN(seconds) && seconds > 0) {\n return Math.min(seconds * 1000, config.maxDelay);\n }\n // HTTP-date format\n const date = new Date(retryAfter);\n if (!Number.isNaN(date.getTime())) {\n const ms = date.getTime() - Date.now();\n if (ms > 0) return Math.min(ms, config.maxDelay);\n }\n }\n return this.calculateDelay(attempt, config);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /** Strips path segments that look like app keys (alphanumeric, 20–64 chars) from URLs before logging. */\n private redactUrl(url: string): string {\n return url.replace(/\\/([a-zA-Z0-9_-]{20,64})(\\?|$|\\/)/g, \"/[REDACTED]$2\");\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Http]\", ...args);\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","export { HttpClient } from \"./HttpClient\";\nexport type {\n HttpClientConfig,\n HttpResponse,\n RequestOptions,\n RetryConfig,\n RetryState,\n} from \"./types\";\nexport { DEFAULT_HTTP_CONFIG, DEFAULT_RETRY_CONFIG } from \"./types\";\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 { AppState, AppStateStatus } from \"react-native\";\n\nimport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nimport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n\nclass NetworkMonitorClass {\n private config: NetworkMonitorConfig = DEFAULT_NETWORK_CONFIG;\n private listeners: Set<NetworkListener> = new Set();\n private currentState: NetworkState = \"unknown\";\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 this.currentState = \"unknown\";\n this.initialized = true;\n\n this.log(\"Initialized (state: unknown, awaiting first connectivity check)\");\n\n void this.setupFallbackDetection();\n this.setupAppStateListener();\n }\n\n private async setupFallbackDetection(): Promise<void> {\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 // Resume polling and check immediately on foreground.\n if (!this.checkIntervalId) {\n this.checkIntervalId = setInterval(() => {\n void this.checkConnectivity();\n }, this.config.checkInterval);\n }\n void this.checkConnectivity();\n } else if (state === \"background\" || state === \"inactive\") {\n // Pause polling to avoid background battery drain.\n if (this.checkIntervalId) {\n clearInterval(this.checkIntervalId);\n this.checkIntervalId = null;\n }\n }\n });\n }\n\n private async checkConnectivity(): Promise<void> {\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 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 (!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.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(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Network]\", ...args);\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 { NetworkMonitor,networkMonitor } from \"./NetworkMonitor\";\nexport type { NetworkListener, NetworkMonitorConfig, NetworkState } from \"./types\";\nexport { DEFAULT_NETWORK_CONFIG } from \"./types\";\n","import type { QueueItem } from \"./types\";\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 byId = queue.findIndex((existing) => existing.id === item.id);\n if (byId !== -1) return byId;\n\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 { nativeStorage } from \"../storage/NativeStorage\";\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 nativeStorage.get(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 nativeStorage.set(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) => 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 id?: string\n ): Promise<QueueItem> {\n const item: QueueItem = {\n id: 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 // Evict the item closest to expiry: most attempts first, oldest timestamp as tiebreaker.\n let evictIndex = 0;\n for (let i = 1; i < this.queue.length; i++) {\n const candidate = this.queue[i];\n const current = this.queue[evictIndex];\n if (\n candidate.attempts > current.attempts ||\n (candidate.attempts === current.attempts && candidate.timestamp < current.timestamp)\n ) {\n evictIndex = i;\n }\n }\n const [removed] = this.queue.splice(evictIndex, 1);\n this.emit({ type: \"item:evicted\", item: removed, queueSize: this.queue.length });\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 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 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(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:Queue]\", ...args);\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 { 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 const allItems = offlineQueue.getQueue();\n const eventItems = allItems.filter(\n (i) => i.url.includes(\"/api/v1/events\") && !i.url.includes(\"/batch\")\n );\n const eventItemIds = new Set(eventItems.map((i) => i.id));\n\n const { processed: batchProcessed, failed: batchFailed, retryIds } =\n await this.processEventBatches(eventItems);\n\n const batchResult = { processed: batchProcessed, failed: batchFailed };\n\n const individualResult = await offlineQueue.processQueue(async (item: QueueItem) => {\n if (eventItemIds.has(item.id)) {\n // This event item was handled by batch processing.\n // If it's in retryIds, it failed with 5xx and should stay in queue for next cycle.\n // Return success=false, permanent=false to keep it and increment attempts.\n // If it was already removed (success/4xx), processQueue won't see it — so this\n // branch only executes for 5xx items still in the queue.\n if (retryIds.has(item.id)) {\n return { success: false, permanent: false };\n }\n // Already removed externally (shouldn't reach here, but guard anyway)\n return { success: true, permanent: false };\n }\n return this.processItem(item);\n });\n\n this.log(\"Queue processing complete\", {\n batchProcessed: batchResult.processed,\n batchFailed: batchResult.failed,\n individualProcessed: individualResult.processed,\n individualFailed: individualResult.failed,\n });\n\n return {\n processed: batchResult.processed + individualResult.processed,\n failed: batchResult.failed + individualResult.failed,\n };\n }\n\n private async processEventBatches(\n eventItems: QueueItem[]\n ): Promise<{ processed: number; failed: number; retryIds: Set<string> }> {\n if (eventItems.length === 0 || !this.httpClient) {\n return { processed: 0, failed: 0, retryIds: new Set() };\n }\n\n const BATCH_SIZE = 50;\n let processed = 0;\n let failed = 0;\n const retryIds = new Set<string>();\n\n for (let i = 0; i < eventItems.length; i += BATCH_SIZE) {\n const batch = eventItems.slice(i, i + BATCH_SIZE);\n const bodies = batch.map((item) => item.body);\n const headers = batch[0].headers;\n\n this.log(\"Sending event batch\", { size: batch.length, batchIndex: Math.floor(i / BATCH_SIZE) });\n\n const response = await this.httpClient.request(\"/api/v1/events/batch\", {\n method: \"POST\",\n body: { events: bodies },\n headers,\n skipRetry: false,\n });\n\n if (response.ok) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n processed++;\n }\n this.log(\"Event batch processed successfully\", { size: batch.length });\n } else if (response.status >= 400 && response.status < 500) {\n for (const item of batch) {\n await offlineQueue.removeItem(item.id);\n failed++;\n }\n this.log(\"Event batch failed permanently (4xx) - removing from queue\", {\n status: response.status,\n size: batch.length,\n });\n } else {\n for (const item of batch) {\n retryIds.add(item.id);\n }\n this.log(\"Event batch failed with server error - will retry\", {\n status: response.status,\n size: batch.length,\n });\n }\n }\n\n return { processed, failed, retryIds };\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 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 if (response.ok) {\n this.log(\"Queue item processed successfully\", { id: item.id });\n return { success: true, permanent: false };\n }\n\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 hasAppKey: item.headers?.[\"X-App-Key\"] != null,\n });\n return { success: false, permanent: true, status: response.status };\n }\n\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 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 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(...args: unknown[]): void {\n if (this.config.debug) console.log(\"[Paywallo:QueueProcessor]\", ...args);\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","export { OfflineQueue,offlineQueue } from \"./OfflineQueue\";\nexport { QueueProcessor, queueProcessor, type QueueProcessorConfig } from \"./QueueProcessor\";\nexport type {\n OfflineQueueConfig,\n QueueEvent,\n QueueEventType,\n QueueItem,\n QueueListener,\n} from \"./types\";\nexport { DEFAULT_QUEUE_CONFIG } from \"./types\";\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;\n private readonly CACHE_NULL_TTL = 30_000;\n private readonly MAX_SIZE = 200;\n private readonly STALE_WINDOW_MS = 86_400_000;\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 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 < this.STALE_WINDOW_MS) 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 < this.STALE_WINDOW_MS) 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, ttlOverride?: number): void {\n this.setCached(this.campaignCache, key, value, ttlOverride);\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 < this.STALE_WINDOW_MS) return entry.value;\n return undefined;\n }\n}\n","import { Platform } from \"react-native\";\nimport type { UserProperties } from \"../types\";\n\ninterface EventPayload {\n eventName: string;\n distinctId: string;\n properties: unknown;\n timestamp: number;\n environment: string;\n}\n\ntype PostFn = (url: string, payload: unknown, label: string) => Promise<void>;\n\nconst BATCH_MAX_SIZE = 10;\nconst BATCH_FLUSH_MS = 5000;\n\nexport class EventBatcher {\n private batch: EventPayload[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly post: PostFn;\n private readonly debug: boolean;\n\n constructor(post: PostFn, debug = false) {\n this.post = post;\n this.debug = debug;\n }\n\n async track(eventName: string, distinctId: string, environment: string, properties?: UserProperties, timestamp?: number): Promise<void> {\n const EVENT_NAME_REGEX = /^(\\$[a-zA-Z0-9_]+|[a-z][a-z0-9_]*)$/;\n if (!EVENT_NAME_REGEX.test(eventName)) {\n if (this.debug) console.warn(`[Paywallo] Invalid event name \"${eventName}\". Must be snake_case or start with $`);\n }\n\n const event: EventPayload = {\n eventName,\n distinctId,\n properties: { ...(properties as Record<string, unknown>), platform: Platform.OS },\n timestamp: timestamp ?? Date.now(),\n environment: environment.toLowerCase(),\n };\n\n this.batch.push(event);\n\n if (this.batch.length >= BATCH_MAX_SIZE) {\n if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; }\n await this.flush();\n return;\n }\n\n if (this.timer !== null) clearTimeout(this.timer);\n this.timer = setTimeout(() => { this.timer = null; void this.flush(); }, BATCH_FLUSH_MS);\n }\n\n async flush(): Promise<void> {\n if (this.batch.length === 0) return;\n const batch = this.batch.splice(0, this.batch.length);\n if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; }\n\n try {\n await this.post(\"/api/v1/events/batch\", { events: batch }, `event_batch:${batch.length}`);\n } catch {\n for (const event of batch) {\n await this.post(\"/api/v1/events\", event, `event:${event.eventName}`);\n }\n }\n }\n\n dispose(): void {\n if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; }\n this.batch = [];\n }\n}\n","import type { FlagVariant } from \"../types\";\nimport { secureStorage } from \"./storage/SecureStorage\";\n\nconst FLAG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport async function 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 > FLAG_MAX_AGE_MS) return null;\n return { variant, payload };\n } catch {\n return null;\n }\n}\n\nexport async function 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 failures are non-critical\n }\n}\n","import { Platform } from \"react-native\";\n\nconst SDK_VERSION = \"1.5.4\";\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 { EventBatcher } from \"./EventBatcher\";\nimport { readFlagFromStorage, writeFlagToStorage } from \"./FlagStorage\";\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 private readonly batcher: EventBatcher;\n\n constructor(\n appKey: string,\n apiUrl: string,\n debug = false,\n environment: Environment = \"Production\",\n offlineQueueEnabled = true,\n timeout = 30000,\n ) {\n this.appKey = appKey;\n this.baseUrl = apiUrl;\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 this.batcher = new EventBatcher((url, payload, label) => this.postWithQueue(url, payload as Record<string, unknown>, label), debug);\n }\n\n getHttpClient(): HttpClient { return this.httpClient; }\n getBaseUrl(): string { return this.baseUrl; }\n getWebUrl(): string { return this.webUrl; }\n getAppKey(): string { return this.appKey; }\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 { this.environment = environment; }\n setDebug(debug: boolean): void { this.debug = debug; this.httpClient.setDebug(debug); }\n async clearQueue(): Promise<void> { await offlineQueue.clear(); }\n async get<T>(path: string): Promise<HttpResponse<T>> {\n return this.httpClient.get<T>(path, { headers: { \"X-App-Key\": this.appKey } });\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 (err) {\n if (this.debug) console.log(\"[Paywallo:ApiClient] reportError failed\", err);\n }\n }\n\n async trackEvent(eventName: string, distinctId: string, properties?: UserProperties, timestamp?: number): Promise<void> {\n await this.batcher.track(eventName, distinctId, this.environment, properties, timestamp);\n }\n async flushEventBatch(): Promise<void> { await this.batcher.flush(); }\n dispose(): void { this.batcher.dispose(); }\n\n async identify(distinctId: string, properties?: UserProperties, email?: string, deviceId?: string): Promise<void> {\n await this.postWithQueue(\"/api/v1/identify\", { distinctId, properties: properties ?? {}, email, platform: Platform.OS, ...(deviceId && { deviceId }) }, \"identify\");\n }\n\n async startSession(\n distinctId: string,\n sessionId: string,\n platform?: string,\n appVersion?: string,\n deviceModel?: string,\n osVersion?: string,\n ): Promise<{ success: boolean }> {\n await this.postWithQueue(\"/api/v1/sessions/start\", {\n distinctId, sessionId,\n platform: platform ?? Platform.OS,\n environment: this.environment.toLowerCase(),\n appVersion: appVersion ?? \"unknown\",\n deviceModel: deviceModel ?? \"unknown\",\n osVersion: osVersion ?? String(Platform.Version),\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 readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { this.cache.setVariant(key, persisted); return persisted; }\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 const stale = this.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { variant: null };\n }\n this.cache.setVariant(key, res.data);\n await writeFlagToStorage(flagKey, distinctId, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStaleVariant(key);\n return stale !== undefined ? stale : { 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 const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n this.cache.setPaywall(placement, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStalePaywall(placement);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n return getEmergencyPaywall(this);\n }\n\n async getCampaign(placement: string, distinctId: string, context?: Record<string, unknown>): 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) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n this.cache.setCampaign(key, result);\n return result;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n }\n\n async getPrimaryCampaign(distinctId: string): Promise<CampaignResponse | null> {\n const key = `primary:${distinctId}`;\n const hit = this.cache.getCampaign(key);\n if (hit !== undefined) return hit;\n try {\n const res = await this.get<CampaignResponse>(`/campaigns/public/primary?distinctId=${encodeURIComponent(distinctId)}`);\n if (res.status === 404) { this.cache.setCampaign(key, null, this.cache.nullTTL); return null; }\n if (!res.ok) {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : null;\n }\n this.cache.setCampaign(key, res.data);\n return res.data;\n } catch {\n const stale = this.cache.getStaleCampaign(key);\n return stale !== undefined ? stale : 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 return validatePurchase(this, this.appKey, platform, receipt, productId, transactionId, priceLocal, currency, country, distinctId, paywallPlacement, variantKey);\n }\n\n async getSubscriptionStatus(distinctId: string): Promise<SubscriptionStatusResponse> {\n return getSubscriptionStatus(this, this.baseUrl, this.appKey, distinctId);\n }\n\n async evaluateFlags(keys: string[], distinctId: string): Promise<Record<string, string | null>> {\n const query = keys.map(encodeURIComponent).join(\",\");\n try {\n const res = await this.httpClient.get<unknown>(`/api/v1/flags/evaluate?keys=${query}`, {\n headers: { \"X-App-Key\": this.appKey, \"x-distinct-id\": distinctId },\n });\n if (!res.ok || typeof res.data !== \"object\" || res.data === null || Array.isArray(res.data)) return {};\n const record = res.data 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 writeFlagToStorage(key, distinctId, flagVariant);\n }\n return result;\n } catch {\n return {};\n }\n }\n\n async getConditionalFlag(flagKey: string, context: ConditionalFlagContext): 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 || !response.ok) return { value: false, flagKey };\n return { value: response.data.value, flagKey };\n } catch {\n return { value: false, flagKey };\n }\n }\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 readFlagFromStorage(flagKey, distinctId);\n if (persisted !== null) { this.cache.setVariant(key, persisted); return persisted; }\n return null;\n }\n\n private async postWithQueue(url: string, payload: unknown, label: string): Promise<void> {\n if (this.offlineQueueEnabled && !networkMonitor.isOnline()) {\n await offlineQueue.enqueue(\"POST\", url, payload as Record<string, unknown>, { \"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 return;\n }\n throw error;\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) console.log(\"[Paywallo:ApiClient]\", ...args);\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 { PaywalloClient } from \"../../core/PaywalloClient\";\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;\nconst PRELOAD_WAIT_MAX_MS = 2000;\nconst PRELOAD_WAIT_INTERVAL_MS = 100;\ninterface PreloadedCampaignCache { campaign: CampaignResponse; preloadedAt: number }\n\nexport class CampaignGateService {\n private readonly preloadedCampaigns: Map<string, PreloadedCampaignCache> = new Map();\n private readonly pendingPreloads: Set<string> = new Set();\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 private async waitForPreload(placement: string): Promise<void> {\n if (!this.pendingPreloads.has(placement)) return;\n const deadline = Date.now() + PRELOAD_WAIT_MAX_MS;\n await new Promise<void>((resolve) => {\n const check = () => {\n if (!this.pendingPreloads.has(placement) || Date.now() >= deadline) { resolve(); return; }\n setTimeout(check, PRELOAD_WAIT_INTERVAL_MS);\n };\n check();\n });\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 await this.waitForPreload(placement);\n const preloaded = this.getPreloadedCampaign(placement);\n const campaign = preloaded ?? 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) {\n const isActive = await hasActive();\n if (isActive) {\n return { presented: false, purchased: false, cancelled: false, restored: false, skippedReason: \"subscriber\" };\n }\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(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 const isActive = await hasActive();\n if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo] requireSubscription — hasActive: ${isActive}`);\n if (isActive) return true;\n const r = await this.presentCampaign(apiClient, placement, hasActive, paywallPresenter, campaignPresenter, { ...context, forceShow: true });\n return r.purchased || r.restored;\n }\n\n private readonly activePreloadPromises: Map<string, Promise<PreloadCampaignResult>> = new Map();\n\n async preloadCampaign(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n // Return the in-flight promise if a preload for this placement is already running\n const existing = this.activePreloadPromises.get(placement);\n if (existing) return existing;\n\n const promise = this._doPreload(apiClient, placement, context);\n this.activePreloadPromises.set(placement, promise);\n try {\n return await promise;\n } finally {\n this.activePreloadPromises.delete(placement);\n }\n }\n\n private async _doPreload(apiClient: ApiClient, placement: string, context?: Record<string, unknown>): Promise<PreloadCampaignResult> {\n this.pendingPreloads.add(placement);\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 if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRELOAD] data cached — placement: ${placement}`); }\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error : new PaywalloError(\"panel\", \"PANEL_UNKNOWN\", String(error)) };\n } finally {\n this.pendingPreloads.delete(placement);\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(); this.pendingPreloads.clear(); }\n}\n\nexport const campaignGateService = new CampaignGateService();\n","export { CampaignGateService, campaignGateService } from \"./CampaignGateService\";\nexport { CampaignError, CAMPAIGN_ERROR_CODES } from \"./CampaignError\";\nexport type { CampaignResponse, CampaignResult, CampaignPresentOptions, ServerProductInfo } from \"../../types\";\n","import { Platform } from \"react-native\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\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 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() is a no-op shim — always granted.\n // Actual opt-out is signaled by getAdvertisingId() returning the all-zeros UUID,\n // which sanitizeId() correctly normalizes to null.\n const rawGaid = tracking.getAdvertisingId();\n const gaid = this.sanitizeId(rawGaid);\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 this.cached = fallback;\n return this.cached;\n }\n }\n\n private async collectIdfv(): Promise<string | null> {\n try {\n const info = await nativeDeviceInfo.getDeviceInfo();\n return this.sanitizeId(info.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","import { NativeModules } from \"react-native\";\n\nconst TIMEOUT_MS = 2000;\n\ninterface PaywalloFBBridgeModule {\n getAnonymousID(): Promise<string | null>;\n logEvent(name: string, params: Record<string, unknown>): Promise<void>;\n logPurchase(amount: number, currency: string, params: Record<string, unknown>): Promise<void>;\n setUserID(userId: string): void;\n flush(): void;\n}\n\nconst NativeBridge: PaywalloFBBridgeModule | null =\n NativeModules.PaywalloFBBridge ?? null;\n\nexport class MetaBridge {\n async getAnonymousID(): Promise<string | null> {\n if (!NativeBridge) return null;\n try {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<null>((resolve) => {\n timerId = setTimeout(() => resolve(null), TIMEOUT_MS);\n });\n const result = await Promise.race([NativeBridge.getAnonymousID(), timeout]);\n clearTimeout(timerId);\n return result;\n } catch {\n return null;\n }\n }\n\n async logEvent(name: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logEvent(name, params);\n } catch {\n // swallow silently\n }\n }\n\n async logPurchase(amount: number, currency: string, params: Record<string, unknown> = {}): Promise<void> {\n if (!NativeBridge) return;\n try {\n await NativeBridge.logPurchase(amount, currency, params);\n } catch {\n // swallow silently\n }\n }\n\n setUserID(userId: string): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.setUserID(userId);\n } catch {\n // swallow silently\n }\n }\n\n flush(): void {\n if (!NativeBridge) return;\n try {\n NativeBridge.flush();\n } catch {\n // swallow silently\n }\n }\n}\n\nexport const metaBridge = new MetaBridge();\n","import { Platform } from \"react-native\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\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 referrer = await nativeDeviceInfo.getInstallReferrer();\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 }\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 { nativeDeviceInfo } from \"./NativeDeviceInfo\";\n\nexport interface DeviceInfo {\n appVersion: string;\n deviceModel: string;\n osVersion: string;\n}\n\nexport async function collectDeviceInfo(): Promise<DeviceInfo> {\n const result = await nativeDeviceInfo.getDeviceInfo();\n\n return {\n appVersion: result.appVersion,\n deviceModel: result.model,\n osVersion: result.systemVersion,\n };\n}\n","import type { ApiClient } from \"../../core/ApiClient\";\nimport { identityManager } from \"../identity/IdentityManager\";\nimport { collectDeviceInfo } from \"../../utils/deviceInfo\";\n\nexport async function trackSessionStart(\n apiClient: ApiClient,\n sessionId: string,\n sessionStartedAt: Date | null\n): Promise<void> {\n const distinctId = identityManager.getDistinctId();\n const deviceInfo = await collectDeviceInfo().catch(() => ({\n appVersion: \"unknown\",\n deviceModel: \"unknown\",\n osVersion: \"unknown\",\n }));\n\n await Promise.all([\n apiClient.startSession(\n distinctId,\n sessionId,\n undefined,\n deviceInfo.appVersion,\n deviceInfo.deviceModel,\n deviceInfo.osVersion,\n ),\n apiClient\n .trackEvent(\"$session_start\", distinctId, {\n sessionId,\n timestamp: sessionStartedAt?.toISOString() ?? null,\n appVersion: deviceInfo.appVersion,\n deviceModel: deviceInfo.deviceModel,\n osVersion: deviceInfo.osVersion,\n })\n .catch(() => {}),\n ]);\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 { 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 if (this.apiClient) {\n await this.apiClient.flushEventBatch();\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 | null): 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 if (this.apiClient) {\n await this.apiClient.flushEventBatch();\n }\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) console.log(\"[Paywallo:Session]\", ...args);\n }\n}\n\nexport const sessionManager = new SessionManager();\n","import { Dimensions, Platform } from \"react-native\";\n\nimport type { ApiClient } from \"../../core/ApiClient\";\nimport { nativeStorage } from \"../../core/storage/NativeStorage\";\nimport { nativeDeviceInfo } from \"../../utils/NativeDeviceInfo\";\nimport { AdvertisingIdManager } from \"./AdvertisingIdManager\";\nimport { metaBridge } from \"./MetaBridge\";\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 private _trackingInProgress = false;\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 if (this._trackingInProgress) return;\n this._trackingInProgress = true;\n try {\n await this._doTrack(apiClient, requestATT);\n } finally {\n this._trackingInProgress = false;\n }\n }\n\n private async _doTrack(apiClient: ApiClient, requestATT: boolean): Promise<void> {\n const storage = new SecureStorage(this.debug);\n const alreadyTracked = await storage.get(\"@panel:install_tracked\");\n if (alreadyTracked) return;\n\n let fallbackTracked: string | null = null;\n try {\n fallbackTracked = await nativeStorage.get(\"@paywallo:install_tracked\");\n } catch { /* NativeStorage not available */ }\n if (fallbackTracked) return;\n\n const distinctId = identityManager.getDistinctId();\n const sessionId = sessionManager.getSessionId();\n const installedAt = Date.now();\n\n // distinctId may not be ready yet — allow retry on next call\n if (!distinctId) return;\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\n const info = await nativeDeviceInfo.getDeviceInfo();\n\n const deviceModel = info.modelId || info.model || \"unknown\";\n const osVersion = info.systemVersion || \"unknown\";\n const appVersion = info.appVersion || \"unknown\";\n const buildNumber = info.buildNumber || \"0\";\n\n let carrier = \"unknown\";\n try { carrier = info.carrier ?? \"unknown\"; } catch { /* non-critical */ }\n\n let totalDisk = 0;\n try { totalDisk = Number(info.totalDisk) || 0; } catch { /* non-critical */ }\n\n let freeDisk = 0;\n try { freeDisk = Number(info.freeDisk) || 0; } catch { /* non-critical */ }\n\n let totalRam = 0;\n try { totalRam = Number(info.totalRam) || 0; } catch { /* non-critical */ }\n\n let brand = \"unknown\";\n try { brand = info.brand ?? \"unknown\"; } catch { /* non-critical */ }\n\n let installerPackage: string | null = null;\n try {\n if (Platform.OS === \"android\") {\n installerPackage = info.installerPackage ?? null;\n }\n } catch { /* non-critical */ }\n\n deviceData = {\n deviceModel,\n osVersion,\n appVersion,\n buildNumber,\n ...(screenWidth > 0 && { screenWidth }),\n ...(screenHeight > 0 && { screenHeight }),\n timezone,\n locale,\n ...(carrier !== \"unknown\" && { carrier }),\n ...(totalDisk > 0 && { totalDisk }),\n ...(freeDisk > 0 && { freeDisk }),\n ...(totalRam > 0 && { totalRam }),\n ...(brand !== \"unknown\" && { brand }),\n ...(installerPackage && { installerPackage }),\n };\n } catch { /* non-critical */ }\n\n const [fbAnonId, referrer, adIds] = await Promise.all([\n metaBridge.getAnonymousID(),\n installReferrerManager.getReferrer(),\n this.advertisingIdManager.collect(requestATT),\n ]);\n\n let effectiveAnonId = fbAnonId;\n if (!effectiveAnonId) {\n const stored = await storage.get(\"@panel:anon_id\");\n if (stored) {\n effectiveAnonId = stored;\n } else {\n const { generateUUID } = await import(\"../../utils/uuid\");\n effectiveAnonId = `PW_${generateUUID()}`;\n await storage.set(\"@panel:anon_id\", effectiveAnonId).catch(() => {});\n }\n }\n\n // Allow retry on transient failures (network down, storage error) — throws propagate to finally\n await apiClient.trackEvent(\"$app_installed\", distinctId, {\n installedAt,\n platform: Platform.OS,\n ...(sessionId && { sessionId }),\n ...deviceData,\n ...(effectiveAnonId && { fbAnonId: effectiveAnonId }),\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\n if (Platform.OS === \"ios\") {\n void this.callDeferredMatch(apiClient, deviceData, adIds, effectiveAnonId, installedAt).catch(() => {});\n }\n\n await storage.set(\"@panel:install_tracked\", String(installedAt));\n try {\n await nativeStorage.set(\"@paywallo:install_tracked\", String(installedAt));\n } catch { /* non-critical */ }\n }\n\n private async callDeferredMatch(\n apiClient: ApiClient,\n deviceData: Record<string, string | number>,\n adIds: { idfv: string | null },\n anonId: string | null,\n installedAt: number,\n ): Promise<void> {\n const storage = new SecureStorage(this.debug);\n const alreadyMatched = await storage.get(\"@panel:deferred_match_done\");\n if (alreadyMatched) return;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 5000);\n\n try {\n const baseUrl = apiClient.getBaseUrl();\n const appKey = apiClient.getAppKey();\n\n await fetch(`${baseUrl}/api/v1/attribution/deferred-match`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-App-Key\": appKey },\n body: JSON.stringify({\n idfv: adIds.idfv,\n deviceModel: deviceData.deviceModel,\n osVersion: deviceData.osVersion,\n screenWidth: deviceData.screenWidth,\n screenHeight: deviceData.screenHeight,\n timezone: deviceData.timezone,\n locale: deviceData.locale,\n fbAnonId: anonId,\n installTimestamp: new Date(installedAt).toISOString(),\n }),\n signal: controller.signal,\n });\n\n await storage.set(\"@panel:deferred_match_done\", \"1\").catch(() => {});\n } catch {\n // Non-critical — deferred match is best-effort\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","export { IdentityManager, identityManager } from \"./IdentityManager\";\nexport type { IdentityState } from \"./IdentityManager\";\n\nexport { AdvertisingIdManager } from \"./AdvertisingIdManager\";\nexport type { AdvertisingIdResult, AttStatus } from \"./AdvertisingIdManager\";\n\n\nexport { InstallTracker } from \"./InstallTracker\";\n\nexport { InstallReferrerManager, installReferrerManager } from \"./InstallReferrerManager\";\n\nexport { IdentityError, IDENTITY_ERROR_CODES } from \"./IdentityError\";\n\nexport type { UserProperties, IdentifyOptions } from \"./types\";\n\nexport { MetaBridge, metaBridge } from \"./MetaBridge\";\n","export { SessionManager, sessionManager } from \"./SessionManager\";\nexport { SessionError, SESSION_ERROR_CODES } from \"./SessionError\";\nexport type { SessionState, SessionConfig, EmergencyPaywallHandler } from \"./types\";\nexport {\n trackSessionStart,\n trackSessionEnd,\n trackAppOpen,\n trackAppBackground,\n} from \"./sessionTracking\";\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 { subscriptionCache } from \"../domains/subscription/SubscriptionCache\";\nimport { subscriptionManager } from \"../domains/subscription/SubscriptionManager\";\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 type { EmergencyPaywallResponse } from \"../types/paywall\";\nimport { sessionManager } from \"../domains/session\";\nimport type { IPaywalloClient, PaywalloInitConfig, PreloadCampaignResult } from \"./types\";\nimport { setNativeStorageDebug } from \"./storage/NativeStorage\";\nimport { setNativeDeviceInfoDebug } from \"../utils/NativeDeviceInfo\";\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 readyPromise: Promise<void> | null = null;\n private resolveReady: (() => 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 private autoPreloadedPlacement: string | null = null;\n private autoPreloadPlacementPromise: Promise<string | null> | null = null;\n private readonly sessionFlagsMap: Map<string, string | null> = new Map();\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 (!this.readyPromise) {\n this.readyPromise = new Promise<void>((resolve) => { this.resolveReady = resolve; });\n }\n if (this.config && this.apiClient) {\n return;\n }\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n if (!config.appKey) throw new ClientError(CLIENT_ERROR_CODES.MISSING_APP_KEY, \"appKey is required\");\n this.pendingConfig = config;\n this.initAttempts = 0;\n this.initPromise = this.initWithRetry(config);\n try {\n await this.initPromise;\n } catch (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 isReady(): boolean {\n return this.config !== null && this.apiClient !== null;\n }\n\n waitUntilReady(): Promise<void> {\n if (this.isReady()) return Promise.resolve();\n if (!this.readyPromise) {\n this.readyPromise = new Promise<void>((resolve) => { this.resolveReady = resolve; });\n }\n return this.readyPromise;\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 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;\n if (this.initPromise) return;\n this.initPromise = this.initWithRetry(config);\n this.initPromise\n .catch(() => { this.reportInitFailure(config, null, \"NETWORK_RECOVERY_FAILED\"); })\n .finally(() => { if (!this.isReady()) this.initPromise = null; });\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.apiUrl ?? \"https://paywallo.com.br\", 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 (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitFailure error\", err);\n }\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 (err) {\n if (config.debug) console.error(\"[Paywallo] reportInitSuccess error\", err);\n }\n }\n\n private async resolveSessionFlags(keys: string[], apiClient: ApiClient, distinctId: string): Promise<void> {\n try {\n const results = await apiClient.evaluateFlags(keys, distinctId);\n this.sessionFlagsMap.clear();\n for (const key of keys) {\n this.sessionFlagsMap.set(key, key in results ? results[key] : null);\n }\n } catch (error) {\n for (const key of keys) {\n this.sessionFlagsMap.set(key, null);\n }\n }\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 await Promise.all([\n networkMonitor.initialize({ debug: config.debug }),\n offlineQueue.initialize({ debug: config.debug }).then(() =>\n offlineQueue.clearItemsWithInvalidAppKey(config.appKey)\n ),\n ]);\n\n this.apiClient = new ApiClient(config.appKey, config.apiUrl ?? \"https://paywallo.com.br\", config.debug, environment, offlineQueueEnabled, config.timeout);\n queueProcessor.initialize(this.apiClient.getHttpClient(), { debug: config.debug });\n subscriptionManager.init({\n serverUrl: this.apiClient.getBaseUrl(),\n appKey: config.appKey,\n cacheTTL: config.subscriptionCacheTTL,\n debug: config.debug,\n });\n\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\n if (config.autoStartSession !== false) {\n sessionManager.startSession().catch(() => {});\n }\n new InstallTracker(config.debug).trackIfNeeded(this.apiClient, config.requestATT === true).catch(() => {});\n\n if (config.sessionFlags && config.sessionFlags.length > 0) {\n await this.resolveSessionFlags(config.sessionFlags, this.apiClient, distinctId);\n }\n\n setNativeStorageDebug(config.debug ?? false);\n setNativeDeviceInfoDebug(config.debug ?? false);\n this.config = config;\n if (this.resolveReady) { this.resolveReady(); this.resolveReady = null; }\n if (config.debug) console.log(\"[Paywallo INIT] complete\");\n\n if (distinctId) {\n this.apiClient.getSubscriptionStatus(distinctId)\n .then(() => { if (config.debug) console.log(\"[Paywallo SUB] preloaded on boot\"); })\n .catch(() => {});\n }\n\n {\n const apiClientRef = this.apiClient;\n if (config.autoPreloadCampaign) {\n this.autoPreloadedPlacement = config.autoPreloadCampaign;\n this.autoPreloadPlacementPromise = Promise.resolve(config.autoPreloadCampaign);\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${config.autoPreloadCampaign}`);\n void campaignGateService.preloadCampaign(apiClientRef, config.autoPreloadCampaign).catch(() => {});\n } else {\n this.autoPreloadPlacementPromise = apiClientRef.getPrimaryCampaign(distinctId).then((primary) => {\n const placement = primary?.placement ?? primary?.paywall?.placement;\n if (placement) {\n this.autoPreloadedPlacement = placement;\n if (config.debug) console.log(`[Paywallo PRELOAD] started — placement: ${placement}`);\n void campaignGateService.preloadCampaign(apiClientRef, placement).catch(() => {});\n return placement;\n }\n return null;\n }).catch(() => null);\n }\n }\n }\n\n async identify(options?: IdentifyOptions | UserProperties): Promise<void> {\n this.ensureInitialized();\n if (this.config?.debug) console.log(\"[Paywallo IDENTIFY]\", options ? { hasEmail: \"email\" in options && !!(options as { email?: unknown }).email, hasProperties: \"properties\" in options } : undefined);\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.log(`[Paywallo TRACK] ${eventName} skipped (no distinctId)`);\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 if (this.config?.debug && eventName.startsWith(\"$purchase\")) console.log(`[Paywallo TRACK] ${eventName}`, options?.properties ?? {});\n const sessionId = sessionManager.getSessionId();\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 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 await apiClient.trackEvent(\"$onboarding_step\", distinctId, {\n stepIndex: index,\n stepName: name,\n timeOnPreviousStep,\n });\n }\n\n async coreAction(actionName: string): Promise<void> {\n const apiClient = this.getApiClientOrThrow();\n const distinctId = identityManager.getDistinctId();\n if (!distinctId) {\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 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.log(`[Paywallo FLAG] ${flagKey} → null (no distinctId)`);\n return { variant: null };\n }\n const result = await this.getApiClientOrThrow().getVariant(flagKey, distinctId);\n if (this.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} →`, result.variant);\n return result;\n } catch (error) {\n if (this.config?.debug) console.log(`[Paywallo FLAG] ${flagKey} → error`, 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.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 if (this.config?.debug) console.log(`[Paywallo CAMPAIGN] presenting ${placement}`);\n const result = await campaignGateService.presentCampaign(this.getApiClientOrThrow(), placement, () => this.hasActiveSubscription(), this.paywallPresenter, this.campaignPresenter, context);\n if (this.config?.debug) {\n if (result.error) console.log(`[Paywallo CAMPAIGN] ${placement} error:`, result.error.message);\n else console.log(`[Paywallo CAMPAIGN] ${placement} result:`, { purchased: result.purchased, cancelled: result.cancelled, restored: result.restored, skippedReason: result.skippedReason });\n }\n return result;\n }\n async hasActiveSubscription(): Promise<boolean> {\n this.ensureInitialized();\n try {\n if (this.activeChecker) {\n const result = await this.activeChecker();\n const isActive = result === true;\n if (this.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (checker):\", isActive);\n return isActive;\n }\n const distinctId = identityManager.getDistinctId();\n if (!distinctId || !this.apiClient) {\n if (this.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription: false (no distinctId/apiClient)\");\n return false;\n }\n const status = await this.apiClient.getSubscriptionStatus(distinctId);\n const isActive = status.hasActiveSubscription === true;\n if (this.config?.debug) console.log(\"[Paywallo SUB] hasActiveSubscription (server):\", isActive);\n return isActive;\n } catch (error) {\n if (this.config?.debug) console.error(\"[Paywallo SUB] hasActiveSubscription error\", error);\n if (this.apiClient) void this.apiClient.reportError(\"SUBSCRIPTION_CHECK_FAILED\", error instanceof Error ? error.message : \"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 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 if (this.config?.debug) console.log(\"[Paywallo RESTORE] starting\");\n const result = await this.restoreHandler();\n if (this.config?.debug) console.log(\"[Paywallo RESTORE] result:\", { success: result.success, restoredProducts: result.restoredProducts?.length ?? 0 });\n return result;\n }\n async reset(): Promise<void> {\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n }\n async fullReset(): Promise<void> {\n const wasDebug = this.config?.debug ?? false;\n await sessionManager.endSession();\n sessionManager.destroy();\n await identityManager.reset();\n await subscriptionCache.invalidateAll();\n queueProcessor.dispose(); offlineQueue.dispose(); networkMonitor.dispose();\n campaignGateService.clearPreloaded();\n this.cleanupNetworkRecovery();\n this.sessionFlagsMap.clear();\n this.apiClient?.dispose();\n this.apiClient = null; this.config = null; this.initPromise = null;\n this.readyPromise = null; this.resolveReady = 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; this.autoPreloadedPlacement = null; this.autoPreloadPlacementPromise = null;\n }\n\n getSessionFlag(key: string): string | null {\n if (!this.config || !this.apiClient) return null;\n const value = this.sessionFlagsMap.get(key);\n return value !== undefined ? value : null;\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 | null): void { this.paywallPresenter = p; }\n registerCampaignPresenter(p: CampaignPresenter | null): void { this.campaignPresenter = p; }\n registerSubscriptionGetter(g: SubscriptionGetter | null): void { this.subscriptionGetter = g; }\n registerActiveChecker(c: ActiveChecker | null): void { this.activeChecker = c; }\n registerRestoreHandler(h: RestoreHandler | null): void { this.restoreHandler = h; }\n registerEmergencyPaywallHandler(h: EmergencyPaywallHandler | null): void { sessionManager.registerEmergencyPaywallHandler(h); }\n\n async getEmergencyPaywall(): Promise<EmergencyPaywallResponse> {\n if (!this.apiClient) throw new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, \"SDK not initialized\");\n return this.apiClient.getEmergencyPaywall();\n }\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 isPreloaded(placement: string): boolean { return campaignGateService.getPreloadedCampaign(placement) !== null; }\n getAutoPreloadedPlacement(): string | null { return this.autoPreloadedPlacement; }\n waitForAutoPreloadedPlacement(): Promise<string | null> { return this.autoPreloadPlacementPromise ?? Promise.resolve(null); }\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\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 { 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 { MetaBridge, metaBridge } 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 {\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 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, type PaywalloProviderProps } 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 PaywallErrorStrings,\n BlockType,\n EmergencyPaywallResponse,\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} 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","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 isReady: 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","export { IAPService, getIAPService } from \"./IAPService\";\nexport { nativeStoreKit, NativeStoreKit } from \"./NativeStoreKit\";\nexport {\n validatePurchase,\n getSubscriptionStatus,\n getEmergencyPaywall,\n getCampaignData,\n} from \"./apiPurchaseMethods\";\nexport {\n parsePrice,\n getSubscriptionPeriodDays,\n calculatePricePerPeriod,\n} from \"./priceFormatter\";\nexport { formatProductForSDK } from \"./productFormatter\";\nexport { PurchaseError, PURCHASE_ERROR_CODES, createPurchaseError } from \"./PurchaseError\";\nexport { ERROR_CODES } from \"./errors\";\nexport type {\n PurchaseState,\n IAPProduct,\n IAPPurchase,\n PurchaseControllerConfig,\n ProductPriceInfo,\n} from \"./types\";\n","export {\n createPurchaseError,\n PURCHASE_ERROR_CODES as ERROR_CODES,\n PurchaseError,\n} from \"./PurchaseError\";\n","export { ANALYTICS_ERROR_CODES, AnalyticsError } from \"../domains/analytics\";\nexport { CAMPAIGN_ERROR_CODES, CampaignError } from \"../domains/campaign\";\nexport { CLIENT_ERROR_CODES, ClientError } from \"./ClientError\";\nexport { IDENTITY_ERROR_CODES, IdentityError } from \"../domains/identity\";\nexport { PaywalloError } from \"./PaywalloError\";\nexport { PAYWALL_ERROR_CODES, PaywallError } from \"../domains/paywall\";\nexport { createPurchaseError, PURCHASE_ERROR_CODES, PurchaseError } from \"../domains/iap\";\nexport { SESSION_ERROR_CODES, SessionError } from \"../domains/session\";\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 // Intentionally runs once on mount — initialProductIds is a seed value, not a reactive dep.\n // Callers that need reactive reloads should call loadProducts() directly.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\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 trialDays?: number;\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 trialDays: number;\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 trialDays: product.trialDays ?? 0,\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 trialDays: product.trialDays ?? 0,\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\nexport interface PurchaseOutcome {\n status: \"success\" | \"cancelled\" | \"failed\";\n purchase?: IAPPurchase;\n error?: PurchaseError;\n}\n\ninterface UsePurchaseResult {\n state: PurchaseState;\n purchase: (productId: string) => Promise<PurchaseOutcome>;\n restore: () => Promise<IAPPurchase[]>;\n error: PurchaseError | null;\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<PurchaseOutcome> => {\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 status: \"success\",\n purchase: {\n productId: result.purchase.productId,\n transactionId: result.purchase.transactionId,\n transactionDate: result.purchase.transactionDate,\n transactionReceipt: result.purchase.receipt,\n },\n };\n }\n\n if (result.error) {\n setError(result.error);\n setState(\"error\");\n return { status: \"failed\", error: result.error };\n }\n\n setState(\"idle\");\n return { status: \"cancelled\" };\n } catch (err) {\n const purchaseError = err instanceof PurchaseError\n ? err\n : createPurchaseError(\"PURCHASE_FAILED\", err instanceof Error ? err.message : String(err));\n\n if (purchaseError.userCancelled) {\n setState(\"idle\");\n return { status: \"cancelled\" };\n }\n\n setError(purchaseError);\n setState(\"error\");\n return { status: \"failed\", error: purchaseError };\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 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\nconst EMPTY_ENTITLEMENTS: string[] = [];\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()\n .then((s) => {\n setStatus(s);\n setIsLoading(false);\n })\n .catch((err) => {\n const e = err instanceof PurchaseError ? err : new PurchaseError(PURCHASE_ERROR_CODES.PURCHASE_FAILED, String(err));\n setError(e);\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 ?? EMPTY_ENTITLEMENTS,\n refresh,\n restore,\n };\n}\n","import React, { useCallback, useEffect, useLayoutEffect, 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\nexport interface 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 const autoPreloadTriggeredRef = useRef(false);\n const preloadedWebViewRef = useRef(preloadedWebView);\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollCancelledRef = useRef(false);\n\n useEffect(() => { preloadedWebViewRef.current = preloadedWebView; }, [preloadedWebView]);\n\n const triggerRepreload = useCallback((placement: string): void => {\n void PaywalloClient.preloadCampaign(placement).catch(() => {});\n }, []);\n\n const { showingPreloadedWebView, presentPreloadedWebView, resolvePreloadedPaywall, handlePreloadedWebViewReady: baseHandlePreloadedWebViewReady, handlePreloadedClose: baseHandlePreloadedClose, setShowingPreloadedWebView, presentedAtRef } =\n usePaywallPresenter(preloadedWebView, setPreloadedWebView);\n\n const SCREEN_HEIGHT = useMemo(() => Dimensions.get(\"window\").height, []);\n const slideAnim = useRef(new Animated.Value(SCREEN_HEIGHT)).current;\n\n const handlePreloadedWebViewReady = useCallback((): void => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo WEBVIEW] loaded — placement: ${preloadedWebView?.placement}`); }\n baseHandlePreloadedWebViewReady();\n }, [preloadedWebView?.placement, baseHandlePreloadedWebViewReady]);\n\n const handlePreloadedClose = useCallback((): void => {\n const placement = preloadedWebView?.placement;\n Animated.timing(slideAnim, { toValue: SCREEN_HEIGHT, duration: 200, easing: Easing.in(Easing.cubic), useNativeDriver: true }).start(() => {\n baseHandlePreloadedClose();\n if (placement) triggerRepreload(placement);\n });\n }, [baseHandlePreloadedClose, preloadedWebView, triggerRepreload, slideAnim, SCREEN_HEIGHT]);\n\n const { handlePreloadedPurchase: rawPreloadedPurchase, handlePreloadedRestore } = usePurchaseOrchestrator(\n preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, invalidateCache\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 const configRef = useRef(config);\n\n useEffect(() => {\n let mounted = true;\n initLocalization({ detectDevice: true });\n PaywalloClient.init(configRef.current)\n .then(async () => {\n if (!mounted) return;\n setDistinctId(PaywalloClient.getDistinctId());\n setIsInitialized(true);\n if (!autoPreloadTriggeredRef.current) {\n autoPreloadTriggeredRef.current = true;\n const placement = await PaywalloClient.waitForAutoPreloadedPlacement();\n if (mounted && placement) void preloadCampaign(placement).catch(() => {});\n }\n })\n .catch((err: unknown) => {\n if (!mounted) return;\n setInitError(err instanceof Error ? err : new ClientError(CLIENT_ERROR_CODES.NOT_INITIALIZED, String(err)));\n });\n return () => { mounted = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [preloadCampaign]); // config is captured via ref — re-init on config change is intentional no-op\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 const bridgePaywallPresenter = useCallback((placement: string): Promise<PaywallResult> => {\n if (PaywalloClient.getConfig()?.debug) { console.log(`[Paywallo PRESENT] called — preloaded: ${preloadedWebViewRef.current?.loaded === true} placement: ${placement}`); }\n if (preloadedWebViewRef.current?.placement === placement) {\n if (preloadedWebViewRef.current.loaded) {\n return presentPreloadedWebView();\n }\n pollCancelledRef.current = false;\n return new Promise<PaywallResult>((resolve) => {\n let elapsed = 0;\n const poll = (): void => {\n if (pollCancelledRef.current) return;\n if (preloadedWebViewRef.current?.loaded) { resolve(presentPreloadedWebView()); return; }\n elapsed += 100;\n if (elapsed >= 500) { resolve(presentCampaign(placement)); return; }\n pollTimerRef.current = setTimeout(poll, 100);\n };\n pollTimerRef.current = setTimeout(poll, 100);\n });\n }\n return presentCampaign(placement);\n }, [presentPreloadedWebView, presentCampaign]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const onEmergency = async (id: string): Promise<void> => { try { await bridgePaywallPresenter(id); } catch { /* non-critical */ } };\n PaywalloClient.registerPaywallPresenter(bridgePaywallPresenter);\n PaywalloClient.registerSubscriptionGetter(getSubscription);\n PaywalloClient.registerActiveChecker(hasActiveSubscription);\n PaywalloClient.registerRestoreHandler(restorePurchases);\n PaywalloClient.registerEmergencyPaywallHandler(onEmergency);\n return () => {\n pollCancelledRef.current = true;\n if (pollTimerRef.current !== null) { clearTimeout(pollTimerRef.current); pollTimerRef.current = null; }\n PaywalloClient.registerPaywallPresenter(null);\n PaywalloClient.registerSubscriptionGetter(null);\n PaywalloClient.registerActiveChecker(null);\n PaywalloClient.registerRestoreHandler(null);\n PaywalloClient.registerEmergencyPaywallHandler(null);\n };\n }, [isInitialized, bridgePaywallPresenter, getSubscription, hasActiveSubscription, restorePurchases]);\n\n\n const isReady = isInitialized && !isLoadingProducts;\n\n const noOp = useCallback(() => {}, []);\n const contextValue: PaywalloContextValue = useMemo(() => ({\n config: PaywalloClient.getConfig(), isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts,\n }), [isInitialized, isReady, initError, distinctId, subscription, products, isLoadingProducts,\n presentPaywall, presentCampaign, preloadCampaign, hasActiveSubscription, getSubscription, restorePurchases, getPaywallConfig, refreshProducts]);\n\n useLayoutEffect(() => {\n if (showingPreloadedWebView) {\n slideAnim.setValue(SCREEN_HEIGHT);\n Animated.timing(slideAnim, { toValue: 0, duration: 200, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }\n }, [showingPreloadedWebView, slideAnim, SCREEN_HEIGHT]);\n\n const preloadStyle = [\n styles.preloadOverlay,\n showingPreloadedWebView ? styles.visible : styles.hidden,\n showingPreloadedWebView ? { transform: [{ translateY: slideAnim }] } : undefined,\n ];\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 webUrl={isInitialized ? PaywalloClient.getWebUrl() : null}\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, opacity: 0, width: 1, height: 1, overflow: \"hidden\" },\n visible: { zIndex: 9999, opacity: 1 },\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 getCacheEntry,\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 getCacheEntry(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 if (PaywalloClient.getConfig()?.debug) console.log(`[Paywallo WEBVIEW] mounting hidden — placement: ${placement}`);\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 { 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);\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);\n }\n }\n\n return productsMap;\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 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 getCacheEntry(\n cache: Map<string, PreloadedCampaign>,\n placement: string\n): PreloadedCampaign | null {\n const entry = cache.get(placement);\n if (!isCacheEntryValid(entry)) return null;\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 (err) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] refreshProducts failed\", err);\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 invalidateSubscriptionCache: () => void\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 setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\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 invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: true, cancelled: false, restored: false });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded purchase failed\", 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, invalidateSubscriptionCache]\n );\n\n const handlePreloadedRestore = useCallback(async (): Promise<void> => {\n try {\n const transactions = await getIAPService().restore();\n if (transactions.length === 0) return;\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 invalidateSubscriptionCache();\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: true });\n } catch (error) {\n if (PaywalloClient.getConfig()?.debug) console.error(\"[Paywallo] preloaded restore failed\", error);\n setShowingPreloadedWebView(false);\n clearPreloadedWebView();\n resolvePreloadedPaywall({ presented: true, purchased: false, cancelled: false, restored: false });\n }\n }, [preloadedWebView, resolvePreloadedPaywall, clearPreloadedWebView, setShowingPreloadedWebView, presentedAtRef, trackDismissed, invalidateSubscriptionCache]);\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 SubscriptionStatus as DomainSubscriptionStatus,\n SubscriptionStatusResponse as DomainStatusResponse,\n} from \"../domains/subscription/types\";\nimport type { Subscription, SubscriptionStatusResponse, SubscriptionStatus } 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\nconst PUBLIC_TO_DOMAIN_STATUS: Record<string, DomainSubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n in_billing_retry: \"billing_retry\",\n in_grace_period: \"grace_period\",\n revoked: \"unknown\",\n cancelled: \"canceled\",\n};\n\nconst DOMAIN_TO_PUBLIC_STATUS: Record<string, SubscriptionStatus> = {\n active: \"active\",\n expired: \"expired\",\n billing_retry: \"in_billing_retry\",\n grace_period: \"in_grace_period\",\n canceled: \"cancelled\",\n paused: \"expired\",\n unknown: \"expired\",\n};\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 status: PUBLIC_TO_DOMAIN_STATUS[sub.status] ?? \"unknown\",\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: status.entitlements ?? [],\n };\n}\n\nfunction isSubscriptionStillActive(sub: { status: string; expiresAt: Date | null } | null): boolean {\n if (!sub) return false;\n if (!ACTIVE_STATUSES.includes(sub.status)) return false;\n if (sub.expiresAt && sub.expiresAt.getTime() !== 0 && sub.expiresAt < new Date()) return false;\n return true;\n}\n\nfunction subscriptionInfoToSub(s: SubscriptionInfo): Subscription {\n const status: SubscriptionStatus = DOMAIN_TO_PUBLIC_STATUS[s.status] ?? \"expired\";\n return { productId: s.productId, status, expiresAt: s.expiresAt ?? null, platform: s.platform, autoRenewEnabled: s.willRenew, inGracePeriod: status === \"in_grace_period\" };\n}\n\nasync function resolveOfflineFromCache(distinctId: string): Promise<boolean> {\n try {\n const cached = await subscriptionCache.get(distinctId);\n if (!cached) return false;\n const sub = cached.data.subscription;\n return isSubscriptionStillActive(sub ? { status: sub.status, expiresAt: sub.expiresAt ?? null } : null);\n } catch { return false; }\n}\n\nfunction isActiveCacheEntry(entry: CacheEntry): boolean {\n return isSubscriptionStillActive(entry.data);\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 const distinctId = PaywalloClient.getDistinctId();\n if (distinctId) void subscriptionCache.invalidate(distinctId);\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(distinctId, 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 try {\n const { nativeStoreKit } = await import(\"../domains/iap/NativeStoreKit\");\n if (nativeStoreKit.isAvailable()) {\n const activeTransactions = await nativeStoreKit.getActiveTransactions();\n if (activeTransactions.length > 0) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo SUB] StoreKit: active entitlement found\", activeTransactions[0].productId);\n return true;\n }\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo SUB] StoreKit: no active entitlements → showing paywall\");\n return false;\n }\n } catch (err) {\n if (PaywalloClient.getConfig()?.debug) console.log(\"[Paywallo SUB] StoreKit check failed, falling through to server\", err);\n }\n\n const cached = cacheRef.current;\n if (cached && cached.expiresAt > Date.now()) return isActiveCacheEntry(cached);\n\n try {\n const persisted = await subscriptionCache.get(distinctId);\n if (persisted && !persisted.isStale) {\n const sub = persisted.data.subscription ? subscriptionInfoToSub(persisted.data.subscription) : null;\n if (isSubscriptionStillActive(sub)) {\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n return true;\n }\n }\n } catch {}\n\n try {\n const apiStatus = await apiClient.getSubscriptionStatus(distinctId);\n const sub = apiStatus.subscription ? { ...apiStatus.subscription, expiresAt: apiStatus.subscription.expiresAt ? new Date(apiStatus.subscription.expiresAt) : null } : null;\n cacheRef.current = { data: sub, expiresAt: Date.now() + CACHE_TTL_MS };\n setSubscription(sub);\n void subscriptionCache.set(distinctId, toDomainResponse(apiStatus));\n return apiStatus.hasActiveSubscription === true;\n } catch {\n return resolveOfflineFromCache(distinctId);\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 try {\n const persisted = await subscriptionCache.get(distinctId);\n if (!persisted?.data.subscription) return null;\n return subscriptionInfoToSub(persisted.data.subscription);\n } catch {\n return null;\n }\n }\n }, [fetchAndCache]);\n\n return { subscription, hasActiveSubscription, getSubscription, invalidateCache };\n}\n","export { SubscriptionCache } from \"./SubscriptionCache\";\nexport { subscriptionManager } from \"./SubscriptionManager\";\nexport type {\n CachedSubscription,\n SubscriptionInfo,\n SubscriptionManagerConfig,\n} from \"./types\";\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"],"mappings":"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","names":["NativeModules","_debug","isAvailable","_debug","KEYCHAIN_KEY_PREFIX","NativeModules","isAvailable","Platform","useCallback","useRef","useState","NativeModules","Platform","useCallback","useEffect","useRef","useState","NativeModules","useCallback","useEffect","useRef","useState","Animated","Dimensions","StyleSheet","View","jsx","styles","useCallback","useEffect","useRef","useState","init_types","init_types","init_types","init_types","item","Platform","Platform","Platform","idfv","NativeModules","Platform","AppState","Dimensions","Platform","generateUUID","isActive","createContext","useContext","useContext","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useState","useState","useCallback","useCallback","useEffect","useState","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","nativeStoreKit","jsx","jsxs","useState","useCallback","useRef","useEffect","useMemo","Dimensions","Animated","Easing","r","styles","StyleSheet"]}