@markvivanco/app-version-checker
Version:
React App version checking and update prompts for React, React Native, and web applications
1 lines • 49.8 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/core/types.ts","../../../src/core/version-compare.ts","../../../src/core/stores.ts","../../../src/core/version-checker.ts","../../../src/adapters/react/VersionCheckContext.tsx","../../../src/adapters/react/hooks.ts"],"names":["error","useState","useEffect","useCallback","isUpdateAvailable"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for version checking\n */\n\nexport type Platform = 'ios' | 'android' | 'web';\n\nexport interface VersionInfo {\n currentVersion: string;\n latestVersion: string | null;\n updateAvailable: boolean;\n storeUrl: string | null;\n platform: Platform;\n}\n\nexport interface VersionCheckOptions {\n /** Minimum time between version checks in milliseconds */\n minCheckInterval?: number;\n /** Duration to wait after user selects \"Remind Me Later\" in milliseconds */\n remindLaterDuration?: number;\n /** Whether to skip version checking on web platform */\n skipWebPlatform?: boolean;\n /** Custom platform detection function */\n getPlatform?: () => Platform;\n}\n\nexport interface VersionCheckTimestamps {\n lastCheckTime: number | null;\n remindLaterTime: number | null;\n}\n\nexport interface AppStoreConfig {\n /** iOS App Store ID */\n iosAppStoreId?: string;\n /** Android package name */\n androidPackageName?: string;\n /** Custom iOS App Store URL */\n iosStoreUrl?: string;\n /** Custom Android Play Store URL */\n androidStoreUrl?: string;\n}\n\nexport interface VersionCheckResult {\n /** Whether an update is available */\n shouldShowPrompt: boolean;\n /** Version information */\n versionInfo: VersionInfo;\n /** Reason for not showing prompt (if applicable) */\n skipReason?: 'no_update' | 'web_platform' | 'remind_later' | 'too_soon' | 'error';\n}\n\n/** Version check intervals (in milliseconds) */\nexport const DEFAULT_CHECK_INTERVALS = {\n MIN_CHECK_INTERVAL: 60 * 60 * 1000, // 1 hour minimum between checks\n REMIND_LATER_DURATION: 24 * 60 * 60 * 1000, // 24 hours for \"remind me later\"\n} as const;","/**\n * Core version comparison utilities\n * Pure functions with no external dependencies\n */\n\n/**\n * Compare two semantic version strings\n * Returns: -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: string, v2: string): number {\n const parts1 = v1.split('.').map(num => parseInt(num, 10));\n const parts2 = v2.split('.').map(num => parseInt(num, 10));\n\n // Pad arrays to same length\n const maxLength = Math.max(parts1.length, parts2.length);\n while (parts1.length < maxLength) parts1.push(0);\n while (parts2.length < maxLength) parts2.push(0);\n\n for (let i = 0; i < maxLength; i++) {\n if (parts1[i] < parts2[i]) return -1;\n if (parts1[i] > parts2[i]) return 1;\n }\n\n return 0;\n}\n\n/**\n * Check if an update is available by comparing versions\n */\nexport function isUpdateAvailable(currentVersion: string, latestVersion: string): boolean {\n return compareVersions(currentVersion, latestVersion) < 0;\n}\n\n/**\n * Parse a version string into its components\n */\nexport function parseVersion(version: string): {\n major: number;\n minor: number;\n patch: number;\n build?: number;\n} {\n const parts = version.split('.').map(num => parseInt(num, 10));\n return {\n major: parts[0] || 0,\n minor: parts[1] || 0,\n patch: parts[2] || 0,\n build: parts[3] // Optional build number\n };\n}\n\n/**\n * Format version components back into a string\n */\nexport function formatVersion(\n major: number,\n minor: number,\n patch: number,\n build?: number\n): string {\n const parts = [major, minor, patch];\n if (build !== undefined) {\n parts.push(build);\n }\n return parts.join('.');\n}\n\n/**\n * Get the major version from a version string\n */\nexport function getMajorVersion(version: string): number {\n return parseVersion(version).major;\n}\n\n/**\n * Get the minor version from a version string\n */\nexport function getMinorVersion(version: string): number {\n return parseVersion(version).minor;\n}\n\n/**\n * Get the patch version from a version string\n */\nexport function getPatchVersion(version: string): number {\n return parseVersion(version).patch;\n}\n\n/**\n * Check if version is a valid semantic version string\n */\nexport function isValidVersion(version: string): boolean {\n const regex = /^\\d+\\.\\d+\\.\\d+(\\.\\d+)?$/;\n return regex.test(version);\n}\n\n/**\n * Get the difference between two versions\n * Returns an object describing what changed\n */\nexport function getVersionDiff(v1: string, v2: string): {\n type: 'major' | 'minor' | 'patch' | 'build' | 'none';\n fromVersion: string;\n toVersion: string;\n} {\n const comparison = compareVersions(v1, v2);\n\n if (comparison === 0) {\n return { type: 'none', fromVersion: v1, toVersion: v2 };\n }\n\n const parsed1 = parseVersion(v1);\n const parsed2 = parseVersion(v2);\n\n let type: 'major' | 'minor' | 'patch' | 'build' = 'build';\n\n if (parsed1.major !== parsed2.major) {\n type = 'major';\n } else if (parsed1.minor !== parsed2.minor) {\n type = 'minor';\n } else if (parsed1.patch !== parsed2.patch) {\n type = 'patch';\n }\n\n return {\n type,\n fromVersion: comparison < 0 ? v1 : v2,\n toVersion: comparison < 0 ? v2 : v1\n };\n}","/**\n * App store utilities\n * Functions for generating app store URLs and handling store-specific logic\n */\n\nimport { Platform, AppStoreConfig } from './types';\n\n/**\n * Generate iOS App Store URL\n * @param appStoreId The iOS App Store ID\n * @param customUrl Optional custom URL to override default\n */\nexport function getIosStoreUrl(appStoreId?: string, customUrl?: string): string | null {\n if (customUrl) {\n return customUrl;\n }\n\n if (!appStoreId) {\n return null;\n }\n\n return `https://apps.apple.com/app/id${appStoreId}`;\n}\n\n/**\n * Generate Android Play Store URL\n * @param packageName The Android package name\n * @param customUrl Optional custom URL to override default\n */\nexport function getAndroidStoreUrl(packageName?: string, customUrl?: string): string | null {\n if (customUrl) {\n return customUrl;\n }\n\n if (!packageName) {\n return null;\n }\n\n return `https://play.google.com/store/apps/details?id=${packageName}`;\n}\n\n/**\n * Get the appropriate store URL for a platform\n */\nexport function getStoreUrl(platform: Platform, config: AppStoreConfig): string | null {\n switch (platform) {\n case 'ios':\n return getIosStoreUrl(config.iosAppStoreId, config.iosStoreUrl);\n case 'android':\n return getAndroidStoreUrl(config.androidPackageName, config.androidStoreUrl);\n case 'web':\n return null;\n default:\n return null;\n }\n}\n\n/**\n * Validate an iOS App Store ID\n */\nexport function isValidIosAppStoreId(appStoreId: string): boolean {\n // iOS App Store IDs are typically 9-10 digit numbers\n return /^\\d{9,10}$/.test(appStoreId);\n}\n\n/**\n * Validate an Android package name\n */\nexport function isValidAndroidPackageName(packageName: string): boolean {\n // Android package names follow reverse domain name notation\n // e.g., com.example.app\n return /^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$/.test(packageName);\n}\n\n/**\n * Extract app ID from store URL\n */\nexport function extractAppIdFromUrl(url: string, platform: Platform): string | null {\n if (platform === 'ios') {\n // Extract from URLs like: https://apps.apple.com/app/id123456789\n const match = url.match(/\\/id(\\d+)/);\n return match ? match[1] : null;\n }\n\n if (platform === 'android') {\n // Extract from URLs like: https://play.google.com/store/apps/details?id=com.example.app\n const match = url.match(/[?&]id=([^&]+)/);\n return match ? match[1] : null;\n }\n\n return null;\n}\n\n/**\n * Get store name for display\n */\nexport function getStoreName(platform: Platform): string {\n switch (platform) {\n case 'ios':\n return 'App Store';\n case 'android':\n return 'Google Play Store';\n case 'web':\n return 'Web';\n default:\n return 'Unknown';\n }\n}\n\n/**\n * Get store badge image URL (for documentation/UI purposes)\n */\nexport function getStoreBadgeUrl(platform: Platform, _locale: string = 'en-US'): string | null {\n switch (platform) {\n case 'ios':\n return `https://developer.apple.com/app-store/marketing/guidelines/images/badge-download-on-the-app-store.svg`;\n case 'android':\n return `https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png`;\n default:\n return null;\n }\n}","/**\n * Main VersionChecker class\n * Coordinates version checking using pluggable providers\n */\n\nimport {\n Platform,\n VersionInfo,\n VersionCheckOptions,\n VersionCheckResult,\n DEFAULT_CHECK_INTERVALS,\n} from './types';\nimport { isUpdateAvailable } from './version-compare';\nimport { getStoreUrl } from './stores';\nimport { IVersionDataProvider } from '../providers/data-provider.interface';\nimport { IStorageProvider } from '../providers/storage-provider.interface';\n\nexport class VersionChecker {\n private dataProvider: IVersionDataProvider;\n private storageProvider: IStorageProvider;\n private options: Required<VersionCheckOptions>;\n private initialized: boolean = false;\n\n constructor(\n dataProvider: IVersionDataProvider,\n storageProvider: IStorageProvider,\n options: VersionCheckOptions = {}\n ) {\n this.dataProvider = dataProvider;\n this.storageProvider = storageProvider;\n\n // Merge with default options\n this.options = {\n minCheckInterval: options.minCheckInterval ?? DEFAULT_CHECK_INTERVALS.MIN_CHECK_INTERVAL,\n remindLaterDuration: options.remindLaterDuration ?? DEFAULT_CHECK_INTERVALS.REMIND_LATER_DURATION,\n skipWebPlatform: options.skipWebPlatform ?? true,\n getPlatform: options.getPlatform ?? (() => this.detectPlatform()),\n };\n }\n\n /**\n * Initialize the version checker\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n // Initialize providers if they have initialization logic\n if (this.dataProvider.initialize) {\n await this.dataProvider.initialize();\n }\n\n if (this.storageProvider.initialize) {\n await this.storageProvider.initialize();\n }\n\n this.initialized = true;\n }\n\n /**\n * Detect the current platform\n */\n private detectPlatform(): Platform {\n // Use provider's platform detection if available\n if (this.dataProvider.getCurrentPlatform) {\n return this.dataProvider.getCurrentPlatform();\n }\n\n // Basic platform detection\n if (typeof window !== 'undefined') {\n const userAgent = window.navigator?.userAgent || '';\n\n if (/android/i.test(userAgent)) {\n return 'android';\n }\n\n if (/iPad|iPhone|iPod/.test(userAgent)) {\n return 'ios';\n }\n\n return 'web';\n }\n\n // Default to web if we can't determine\n return 'web';\n }\n\n /**\n * Get the current platform\n */\n getPlatform(): Platform {\n return this.options.getPlatform();\n }\n\n /**\n * Get version information\n */\n async getVersionInfo(): Promise<VersionInfo> {\n const platform = this.getPlatform();\n const currentVersion = await this.dataProvider.getCurrentVersion();\n const latestVersion = await this.dataProvider.getLatestVersion(platform);\n const appStoreConfig = await this.dataProvider.getAppStoreConfig();\n\n const updateAvailable = latestVersion\n ? isUpdateAvailable(currentVersion, latestVersion)\n : false;\n\n const storeUrl = getStoreUrl(platform, appStoreConfig);\n\n return {\n currentVersion,\n latestVersion,\n updateAvailable,\n storeUrl,\n platform,\n };\n }\n\n /**\n * Check if an update is available\n */\n async isUpdateAvailable(): Promise<boolean> {\n const platform = this.getPlatform();\n\n // Skip check for web platform if configured\n if (platform === 'web' && this.options.skipWebPlatform) {\n return false;\n }\n\n const versionInfo = await this.getVersionInfo();\n return versionInfo.updateAvailable;\n }\n\n /**\n * Check if we should show the update prompt\n */\n async shouldShowUpdatePrompt(): Promise<VersionCheckResult> {\n const platform = this.getPlatform();\n\n // Skip for web platform if configured\n if (platform === 'web' && this.options.skipWebPlatform) {\n const versionInfo = await this.getVersionInfo();\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'web_platform',\n };\n }\n\n try {\n const versionInfo = await this.getVersionInfo();\n\n // No update available\n if (!versionInfo.updateAvailable) {\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'no_update',\n };\n }\n\n // Check if we're in \"remind me later\" period\n const remindLaterTime = await this.storageProvider.getRemindLaterTime();\n if (remindLaterTime && Date.now() < remindLaterTime) {\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'remind_later',\n };\n }\n\n // Check minimum interval between checks\n const lastCheckTime = await this.storageProvider.getLastCheckTime();\n if (lastCheckTime && Date.now() - lastCheckTime < this.options.minCheckInterval) {\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'too_soon',\n };\n }\n\n // Check if this version was already shown (optional)\n if (this.storageProvider.getLastShownVersion) {\n const lastShownVersion = await this.storageProvider.getLastShownVersion();\n if (lastShownVersion === versionInfo.latestVersion) {\n // Still check mandatory updates\n if (this.dataProvider.isUpdateMandatory) {\n const isMandatory = await this.dataProvider.isUpdateMandatory(\n versionInfo.currentVersion,\n versionInfo.latestVersion!\n );\n if (!isMandatory) {\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'remind_later',\n };\n }\n } else {\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'remind_later',\n };\n }\n }\n }\n\n // Update last check time\n await this.storageProvider.setLastCheckTime(Date.now());\n\n // Record shown version if supported\n if (this.storageProvider.setLastShownVersion && versionInfo.latestVersion) {\n await this.storageProvider.setLastShownVersion(versionInfo.latestVersion);\n }\n\n return {\n shouldShowPrompt: true,\n versionInfo,\n };\n } catch (error) {\n console.error('Error checking for updates:', error);\n const versionInfo = await this.getVersionInfo();\n return {\n shouldShowPrompt: false,\n versionInfo,\n skipReason: 'error',\n };\n }\n }\n\n /**\n * Set \"remind me later\" for the update prompt\n */\n async setRemindMeLater(): Promise<void> {\n const remindTime = Date.now() + this.options.remindLaterDuration;\n await this.storageProvider.setRemindLaterTime(remindTime);\n\n // Increment dismiss count if supported\n if (this.storageProvider.incrementDismissCount) {\n await this.storageProvider.incrementDismissCount();\n }\n }\n\n /**\n * Clear the \"remind me later\" setting\n */\n async clearRemindMeLater(): Promise<void> {\n await this.storageProvider.clearRemindLaterTime();\n }\n\n /**\n * Check if update is mandatory\n */\n async isUpdateMandatory(): Promise<boolean> {\n if (!this.dataProvider.isUpdateMandatory) {\n return false;\n }\n\n const versionInfo = await this.getVersionInfo();\n if (!versionInfo.latestVersion) {\n return false;\n }\n\n return await this.dataProvider.isUpdateMandatory(\n versionInfo.currentVersion,\n versionInfo.latestVersion\n );\n }\n\n /**\n * Get changelog for the latest version\n */\n async getChangeLog(): Promise<string | null> {\n if (!this.dataProvider.getChangeLog) {\n return null;\n }\n\n const versionInfo = await this.getVersionInfo();\n if (!versionInfo.latestVersion) {\n return null;\n }\n\n return await this.dataProvider.getChangeLog(versionInfo.latestVersion);\n }\n\n /**\n * Reset all version check data (useful for testing)\n */\n async resetVersionCheckData(): Promise<void> {\n await this.storageProvider.clearRemindLaterTime();\n await this.storageProvider.setLastCheckTime(0);\n\n if (this.storageProvider.clearAll) {\n await this.storageProvider.clearAll();\n }\n }\n\n /**\n * Get formatted version string\n */\n async getFormattedVersion(): Promise<string> {\n if (this.dataProvider.getFormattedVersion) {\n return await this.dataProvider.getFormattedVersion();\n }\n\n return await this.dataProvider.getCurrentVersion();\n }\n\n /**\n * Dispose of resources\n */\n async dispose(): Promise<void> {\n if (this.dataProvider.dispose) {\n await this.dataProvider.dispose();\n }\n\n if (this.storageProvider.dispose) {\n await this.storageProvider.dispose();\n }\n\n this.initialized = false;\n }\n}","/**\n * React Context and Provider for version checking\n * Framework-agnostic implementation that works with any data/storage providers\n */\n\nimport React, {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n ReactNode,\n useMemo,\n} from 'react';\nimport { VersionChecker } from '../../core/version-checker';\nimport { VersionInfo, VersionCheckOptions } from '../../core/types';\nimport { IVersionDataProvider } from '../../providers/data-provider.interface';\nimport { IStorageProvider } from '../../providers/storage-provider.interface';\n\n/**\n * Version check context value\n */\nexport interface VersionCheckContextValue {\n /** Current version information */\n versionInfo: VersionInfo | null;\n /** Whether an update is available */\n isUpdateAvailable: boolean;\n /** Current app version */\n currentVersion: string | null;\n /** Formatted version string */\n formattedVersion: string | null;\n /** Whether the update dialog should be shown */\n showUpdateDialog: boolean;\n /** Whether a check is in progress */\n isChecking: boolean;\n /** Any error that occurred during checking */\n error: Error | null;\n /** Manually trigger a version check */\n checkForUpdates: () => Promise<void>;\n /** Handle update now action */\n handleUpdateNow: () => Promise<void>;\n /** Handle remind later action */\n handleRemindLater: () => Promise<void>;\n /** Reset version check data */\n resetVersionCheck: () => Promise<void>;\n /** Get changelog for latest version */\n getChangeLog: () => Promise<string | null>;\n /** Check if update is mandatory */\n isUpdateMandatory: () => Promise<boolean>;\n}\n\nconst VersionCheckContext = createContext<VersionCheckContextValue | undefined>(undefined);\n\n/**\n * Props for VersionCheckProvider\n */\nexport interface VersionCheckProviderProps {\n children: ReactNode;\n /** Data provider for version information */\n dataProvider: IVersionDataProvider;\n /** Storage provider for preferences */\n storageProvider: IStorageProvider;\n /** Optional version check options */\n options?: VersionCheckOptions;\n /** Whether to check for updates automatically on mount */\n checkOnMount?: boolean;\n /** Whether to check for updates when app becomes active (React Native) */\n checkOnForeground?: boolean;\n /** Custom handler for opening the app store */\n onOpenStore?: (url: string) => Promise<void>;\n /** Callback when update dialog should be shown */\n onShowUpdateDialog?: (versionInfo: VersionInfo) => void;\n /** Callback when update dialog should be hidden */\n onHideUpdateDialog?: () => void;\n /** Whether to render the update dialog internally (set to false if using custom dialog) */\n renderDialog?: boolean;\n /** Custom update dialog component */\n dialogComponent?: React.ComponentType<UpdateDialogProps>;\n}\n\n/**\n * Props for update dialog components\n */\nexport interface UpdateDialogProps {\n visible: boolean;\n versionInfo: VersionInfo;\n onUpdateNow: () => Promise<void>;\n onRemindLater: () => Promise<void>;\n isUpdateMandatory?: boolean;\n changeLog?: string | null;\n}\n\n/**\n * Version Check Provider Component\n */\nexport const VersionCheckProvider: React.FC<VersionCheckProviderProps> = ({\n children,\n dataProvider,\n storageProvider,\n options = {},\n checkOnMount = true,\n checkOnForeground = false,\n onOpenStore,\n onShowUpdateDialog,\n onHideUpdateDialog,\n renderDialog = true,\n dialogComponent: DialogComponent,\n}) => {\n const [versionInfo, setVersionInfo] = useState<VersionInfo | null>(null);\n const [showUpdateDialog, setShowUpdateDialog] = useState(false);\n const [isChecking, setIsChecking] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [currentVersion, setCurrentVersion] = useState<string | null>(null);\n const [formattedVersion, setFormattedVersion] = useState<string | null>(null);\n\n // Create version checker instance\n const versionChecker = useMemo(\n () => new VersionChecker(dataProvider, storageProvider, options),\n [dataProvider, storageProvider, options]\n );\n\n // Initialize version checker\n useEffect(() => {\n versionChecker.initialize().catch(console.error);\n\n return () => {\n versionChecker.dispose().catch(console.error);\n };\n }, [versionChecker]);\n\n // Get initial version info\n useEffect(() => {\n const loadVersions = async () => {\n try {\n const current = await dataProvider.getCurrentVersion();\n setCurrentVersion(current);\n\n const formatted = dataProvider.getFormattedVersion\n ? await dataProvider.getFormattedVersion()\n : current;\n setFormattedVersion(formatted);\n } catch (err) {\n console.error('Error loading versions:', err);\n }\n };\n\n loadVersions();\n }, [dataProvider]);\n\n // Check for updates\n const checkForUpdates = useCallback(async () => {\n if (isChecking) return;\n\n setIsChecking(true);\n setError(null);\n\n try {\n const result = await versionChecker.shouldShowUpdatePrompt();\n const info = result.versionInfo;\n\n setVersionInfo(info);\n\n if (result.shouldShowPrompt) {\n setShowUpdateDialog(true);\n onShowUpdateDialog?.(info);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n console.error('Error checking for updates:', error);\n } finally {\n setIsChecking(false);\n }\n }, [versionChecker, isChecking, onShowUpdateDialog]);\n\n // Handle update now\n const handleUpdateNow = useCallback(async () => {\n setShowUpdateDialog(false);\n onHideUpdateDialog?.();\n\n if (versionInfo?.storeUrl) {\n if (onOpenStore) {\n await onOpenStore(versionInfo.storeUrl);\n } else {\n // Default behavior - open URL in browser\n if (typeof window !== 'undefined' && window.open) {\n window.open(versionInfo.storeUrl, '_blank');\n }\n }\n }\n }, [versionInfo, onOpenStore, onHideUpdateDialog]);\n\n // Handle remind later\n const handleRemindLater = useCallback(async () => {\n setShowUpdateDialog(false);\n onHideUpdateDialog?.();\n\n await versionChecker.setRemindMeLater();\n }, [versionChecker, onHideUpdateDialog]);\n\n // Reset version check data\n const resetVersionCheck = useCallback(async () => {\n await versionChecker.resetVersionCheckData();\n setVersionInfo(null);\n setShowUpdateDialog(false);\n setError(null);\n }, [versionChecker]);\n\n // Get change log\n const getChangeLog = useCallback(async () => {\n return await versionChecker.getChangeLog();\n }, [versionChecker]);\n\n // Check if update is mandatory\n const isUpdateMandatory = useCallback(async () => {\n return await versionChecker.isUpdateMandatory();\n }, [versionChecker]);\n\n // Check on mount if enabled\n useEffect(() => {\n if (checkOnMount) {\n checkForUpdates();\n }\n }, [checkOnMount]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Setup foreground checking for React Native (optional)\n useEffect(() => {\n if (!checkOnForeground) return;\n\n // This would be implemented by the consumer for React Native\n // Example: using AppState.addEventListener('change', ...)\n // We'll provide a hook for this\n }, [checkOnForeground, checkForUpdates]);\n\n // Context value\n const contextValue: VersionCheckContextValue = useMemo(\n () => ({\n versionInfo,\n isUpdateAvailable: versionInfo?.updateAvailable || false,\n currentVersion,\n formattedVersion,\n showUpdateDialog,\n isChecking,\n error,\n checkForUpdates,\n handleUpdateNow,\n handleRemindLater,\n resetVersionCheck,\n getChangeLog,\n isUpdateMandatory,\n }),\n [\n versionInfo,\n currentVersion,\n formattedVersion,\n showUpdateDialog,\n isChecking,\n error,\n checkForUpdates,\n handleUpdateNow,\n handleRemindLater,\n resetVersionCheck,\n getChangeLog,\n isUpdateMandatory,\n ]\n );\n\n return (\n <VersionCheckContext.Provider value={contextValue}>\n {children}\n {renderDialog && DialogComponent && versionInfo && (\n <DialogComponent\n visible={showUpdateDialog}\n versionInfo={versionInfo}\n onUpdateNow={handleUpdateNow}\n onRemindLater={handleRemindLater}\n />\n )}\n </VersionCheckContext.Provider>\n );\n};\n\n/**\n * Hook to use version check context\n */\nexport const useVersionCheck = () => {\n const context = useContext(VersionCheckContext);\n if (context === undefined) {\n throw new Error('useVersionCheck must be used within a VersionCheckProvider');\n }\n return context;\n};","/**\n * React hooks for version checking\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { VersionChecker } from '../../core/version-checker';\nimport { VersionInfo } from '../../core/types';\nimport { IVersionDataProvider } from '../../providers/data-provider.interface';\nimport { IStorageProvider } from '../../providers/storage-provider.interface';\nimport { useVersionCheck } from './VersionCheckContext';\n\n/**\n * Hook for checking app state changes (React Native)\n * This is a helper for React Native apps to check on foreground\n */\nexport const useAppStateVersionCheck = (\n appStateModule?: any, // React Native's AppState module\n enabled: boolean = true\n) => {\n const { checkForUpdates } = useVersionCheck();\n const [appState, setAppState] = useState<string>('active');\n\n useEffect(() => {\n if (!enabled || !appStateModule) return;\n\n const currentState = appStateModule.currentState || 'active';\n setAppState(currentState);\n\n const handleAppStateChange = (nextAppState: string) => {\n if (appState.match(/inactive|background/) && nextAppState === 'active') {\n // App has come to foreground\n checkForUpdates();\n }\n setAppState(nextAppState);\n };\n\n const subscription = appStateModule.addEventListener('change', handleAppStateChange);\n\n return () => {\n subscription?.remove?.();\n };\n }, [appState, checkForUpdates, enabled, appStateModule]);\n\n return appState;\n};\n\n/**\n * Hook for periodic version checking\n */\nexport const usePeriodicVersionCheck = (\n intervalMs: number = 60 * 60 * 1000, // Default: 1 hour\n enabled: boolean = true\n) => {\n const { checkForUpdates } = useVersionCheck();\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return;\n }\n\n // Setup interval\n intervalRef.current = setInterval(() => {\n checkForUpdates();\n }, intervalMs);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [checkForUpdates, intervalMs, enabled]);\n};\n\n/**\n * Hook for visibility-based version checking (web)\n */\nexport const useVisibilityVersionCheck = (enabled: boolean = true) => {\n const { checkForUpdates } = useVersionCheck();\n\n useEffect(() => {\n if (!enabled || typeof document === 'undefined') return;\n\n const handleVisibilityChange = () => {\n if (!document.hidden) {\n // Page became visible\n checkForUpdates();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, [checkForUpdates, enabled]);\n};\n\n/**\n * Standalone hook for version checking without context\n * Useful when you want to manage the version checking logic yourself\n */\nexport const useStandaloneVersionChecker = (\n dataProvider: IVersionDataProvider,\n storageProvider: IStorageProvider,\n options?: {\n checkOnMount?: boolean;\n checkOnFocus?: boolean;\n checkInterval?: number;\n }\n) => {\n const [versionInfo, setVersionInfo] = useState<VersionInfo | null>(null);\n const [isChecking, setIsChecking] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [showUpdatePrompt, setShowUpdatePrompt] = useState(false);\n\n const versionCheckerRef = useRef<VersionChecker | null>(null);\n\n // Initialize version checker\n useEffect(() => {\n const checker = new VersionChecker(dataProvider, storageProvider);\n versionCheckerRef.current = checker;\n\n checker.initialize().catch(console.error);\n\n return () => {\n checker.dispose().catch(console.error);\n };\n }, [dataProvider, storageProvider]);\n\n // Check for updates\n const checkForUpdates = useCallback(async () => {\n if (!versionCheckerRef.current || isChecking) return;\n\n setIsChecking(true);\n setError(null);\n\n try {\n const result = await versionCheckerRef.current.shouldShowUpdatePrompt();\n setVersionInfo(result.versionInfo);\n setShowUpdatePrompt(result.shouldShowPrompt);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n } finally {\n setIsChecking(false);\n }\n }, [isChecking]);\n\n // Handle remind later\n const setRemindMeLater = useCallback(async () => {\n if (!versionCheckerRef.current) return;\n\n await versionCheckerRef.current.setRemindMeLater();\n setShowUpdatePrompt(false);\n }, []);\n\n // Check on mount\n useEffect(() => {\n if (options?.checkOnMount !== false) {\n checkForUpdates();\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Check on focus\n useEffect(() => {\n if (!options?.checkOnFocus) return;\n\n const handleFocus = () => checkForUpdates();\n\n window.addEventListener('focus', handleFocus);\n return () => window.removeEventListener('focus', handleFocus);\n }, [checkForUpdates, options?.checkOnFocus]);\n\n // Periodic checking\n useEffect(() => {\n if (!options?.checkInterval) return;\n\n const interval = setInterval(checkForUpdates, options.checkInterval);\n return () => clearInterval(interval);\n }, [checkForUpdates, options?.checkInterval]);\n\n return {\n versionInfo,\n isChecking,\n error,\n showUpdatePrompt,\n checkForUpdates,\n setRemindMeLater,\n isUpdateAvailable: versionInfo?.updateAvailable || false,\n };\n};\n\n/**\n * Hook to get just the version info\n */\nexport const useVersionInfo = () => {\n const { versionInfo, currentVersion, formattedVersion } = useVersionCheck();\n\n return {\n current: currentVersion,\n latest: versionInfo?.latestVersion,\n formatted: formattedVersion,\n updateAvailable: versionInfo?.updateAvailable || false,\n platform: versionInfo?.platform,\n storeUrl: versionInfo?.storeUrl,\n };\n};\n\n/**\n * Hook to get update status\n */\nexport const useUpdateStatus = () => {\n const { isUpdateAvailable, isChecking, error, showUpdateDialog } = useVersionCheck();\n\n return {\n isUpdateAvailable,\n isChecking,\n hasError: !!error,\n error,\n isDialogVisible: showUpdateDialog,\n };\n};"]}