import { useEffect, useState } from "react"; import { siteConfig } from "@/config/site"; import { UPDATE_CHANNEL_CHANGED_EVENT, type UpdateReleaseChannel, getLatestVersionByChannel, getUpdateReleaseChannel, hasVersionUpdate, } from "@/utils/version-update"; const FALLBACK_GITHUB_REPO = "https://github.com/Sagit-chu/flux-panel"; interface VersionFooterProps { version: string; containerClassName?: string; versionClassName?: string; poweredClassName?: string; updateBadgeClassName?: string; } export function VersionFooter({ version, containerClassName, versionClassName, poweredClassName, updateBadgeClassName, }: VersionFooterProps) { const [channel, setChannel] = useState( getUpdateReleaseChannel(), ); const [updateAvailable, setUpdateAvailable] = useState(false); const [latestUpdateVersion, setLatestUpdateVersion] = useState( null, ); useEffect(() => { const handleChannelChange = () => { setChannel(getUpdateReleaseChannel()); }; window.addEventListener(UPDATE_CHANNEL_CHANGED_EVENT, handleChannelChange); window.addEventListener("storage", handleChannelChange); return () => { window.removeEventListener( UPDATE_CHANNEL_CHANGED_EVENT, handleChannelChange, ); window.removeEventListener("storage", handleChannelChange); }; }, []); useEffect(() => { let active = true; const checkUpdate = async () => { const latestVersion = await getLatestVersionByChannel( channel, siteConfig.github_repo || FALLBACK_GITHUB_REPO, ); if (!active) { return; } if (!latestVersion) { setUpdateAvailable(false); setLatestUpdateVersion(null); return; } const hasUpdate = hasVersionUpdate(version, latestVersion); setUpdateAvailable(hasUpdate); setLatestUpdateVersion(hasUpdate ? latestVersion : null); }; void checkUpdate(); return () => { active = false; }; }, [channel, version]); return (

v{version} {updateAvailable && latestUpdateVersion && ( {latestUpdateVersion} )}

{siteConfig.hide_footer_brand !== true && (

Powered by{" "} FLVX

)}
); }