"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { FiDatabase, FiUsers, FiBarChart2, FiGithub } from "react-icons/fi"; import { CloseOutlined } from "@ant-design/icons"; import { APP_VERSION } from "@/lib/version"; import { message } from "antd"; import { useTranslation } from "react-i18next"; import { motion } from "framer-motion"; import { AnimatedGridPattern } from "@/components/ui/animated-grid-pattern"; import { cn } from "@/lib/utils"; export default function HomePage() { const { t } = useTranslation("common"); const [isUpdateVisible, setIsUpdateVisible] = useState(false); const [latestVersion, setLatestVersion] = useState(""); useEffect(() => { const checkUpdate = async () => { try { const response = await fetch( "https://api.github.com/repos/variantconst/openwebui-monitor/releases/latest" ); const data = await response.json(); const latestVer = data.tag_name; if (!latestVer) { return; } const currentVer = APP_VERSION.replace(/^v/, ""); const newVer = latestVer.replace(/^v/, ""); const ignoredVersion = localStorage.getItem("ignoredVersion"); if (currentVer !== newVer && ignoredVersion !== latestVer) { setLatestVersion(latestVer); setIsUpdateVisible(true); } } catch (error) { console.error(t("header.messages.updateCheckFailed"), error); } }; checkUpdate(); }, [t]); const handleUpdate = () => { window.open( "https://github.com/VariantConst/OpenWebUI-Monitor/releases/latest", "_blank" ); setIsUpdateVisible(false); }; const handleIgnore = () => { localStorage.setItem("ignoredVersion", latestVersion); setIsUpdateVisible(false); message.success(t("update.ignore")); }; return (
{t("common.appName")} {t("common.description")}
{[ { path: "/models", icon: , title: t("home.features.models.title"), desc: t("home.features.models.description"), gradient: "from-blue-500/80 to-indigo-500/80", lightColor: "bg-blue-50/50", borderColor: "border-blue-200/20", iconColor: "text-blue-500/70", }, { path: "/users", icon: , title: t("home.features.users.title"), desc: t("home.features.users.description"), gradient: "from-rose-500/80 to-pink-500/80", lightColor: "bg-rose-50/50", borderColor: "border-rose-200/20", iconColor: "text-rose-500/70", }, { path: "/panel", icon: , title: t("home.features.stats.title"), desc: t("home.features.stats.description"), gradient: "from-emerald-500/80 to-teal-500/80", lightColor: "bg-emerald-50/50", borderColor: "border-emerald-200/20", iconColor: "text-emerald-500/70", }, ].map((item, index) => (
{item.icon}

{item.title}

{item.desc}

))}
{isUpdateVisible && (
{t("update.newVersion")} {latestVersion}
|
)}
); }