UNPKG

react-native-simple-version-update

Version:

react-native-simple-version-update is a lightweight and easy-to-use custom React Native hook that checks if your app needs to be updated by comparing the installed version with the latest version available on the App Store (iOS) or Google Play Store (Andr

92 lines (80 loc) 3.17 kB
import {useState, useEffect} from 'react'; import DeviceInfo from 'react-native-device-info'; import {Linking, Platform} from 'react-native'; const useVersionUpdate = () => { const [currentVersion, setCurrentVersion] = useState<string | null>(null); const [liveVersion, setLiveVersion] = useState<string | null>(null); const [needUpdate, setNeedUpdate] = useState<boolean>(false); const [updateUrl, setUpdateUrl] = useState<string | null>(null); useEffect(() => { const checkForUpdate = async () => { const appVersion = DeviceInfo.getVersion(); // Current app version setCurrentVersion(appVersion); try { const latestVersion = await getLatestStoreVersion(); setLiveVersion(latestVersion); if (latestVersion && compareVersions(latestVersion, appVersion)) { setNeedUpdate(true); } } catch (error) { console.error('Error checking for update:', error); } }; checkForUpdate(); }, []); const getLatestStoreVersion = async () => { try { const bundleId = DeviceInfo.getBundleId(); if (Platform.OS === 'ios') { const response = await fetch( `https://itunes.apple.com/lookup?bundleId=${bundleId}`, ); const data = await response.json(); if (data.resultCount > 0) { setUpdateUrl(data?.results[0]?.trackViewUrl); return data.results[0].version; } } else { const response = await fetch( `https://play.google.com/store/apps/details?id=${bundleId}&hl=en&gl=US`, ); const html = await response.text(); const match = html.match(/Current Version.+?>([\d.-]+)<\/span>/); let latestVersion = null; if (match) { latestVersion = match[1].trim(); } const matchNewLayout = html.match(/\[\[\["([\d-.]+?)"\]\]/); if (matchNewLayout) { latestVersion = matchNewLayout[1].trim(); } setLiveVersion(latestVersion); setUpdateUrl( `https://play.google.com/store/apps/details?id=${bundleId}`, ); return latestVersion; } return null; } catch (error) { console.error('Error fetching the latest version:', error); return null; } }; const compareVersions = (latestVersion: string, currentV: string) => { const latest = latestVersion.replace(/\./g, ''); const current = currentV.replace(/\./g, ''); return latest > current; }; const handleUpdate = async () => { if (updateUrl) { await Linking.openURL(updateUrl); } }; return { currentVersion, liveVersion, needUpdate, handleUpdate, }; }; export default useVersionUpdate;