"use client"; import { useEffect, useState } from "react"; import { Download, RefreshCw, X } from "lucide-react"; import { useTranslations } from "next-intl"; import pkg from "package.json"; import { Button } from "../ui/button"; interface VersionNotifierProps { currentVersion?: string; githubRepo?: string; className?: string; } const VersionNotifier: React.FC = ({ currentVersion = pkg.version, githubRepo = "oiov/wr.do", className = "", }) => { const [latestVersion, setLatestVersion] = useState(""); const [showUpdate, setShowUpdate] = useState(false); const [isLoading, setIsLoading] = useState(false); const t = useTranslations("Setting"); const compareVersions = (v1: string, v2: string): boolean => { const normalize = (v: string) => v.replace(/^v/, "").split(".").map(Number); const parts1 = normalize(v1); const parts2 = normalize(v2); for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) { const a = parts1[i] || 0; const b = parts2[i] || 0; if (a > b) return true; if (a < b) return false; } return false; }; const checkVersion = async () => { if (isLoading) return; setIsLoading(true); try { const response = await fetch( `https://api.github.com/repos/${githubRepo}/releases/latest`, ); if (response.ok) { const data = await response.json(); setLatestVersion(data.tag_name); const hasUpdate = compareVersions(data.tag_name, currentVersion); const dismissed = localStorage.getItem(`dismissed-${data.tag_name}`) === "true"; setShowUpdate(hasUpdate && !dismissed); } } catch (error) { console.error("Failed to check version:", error); } finally { setIsLoading(false); } }; const dismissUpdate = () => { localStorage.setItem(`dismissed-${latestVersion}`, "true"); setShowUpdate(false); }; useEffect(() => { checkVersion(); // 每小时检查一次 const interval = setInterval(checkVersion, 60 * 60 * 1000); return () => clearInterval(interval); }, []); return ( <> {showUpdate && (
🎉 {t("New version available")}: {latestVersion}
{t("Update now")}
)} ); }; export default VersionNotifier;