import { useTranslation } from "next-i18next"; import useSWR from "swr"; import { compareVersions } from "compare-versions"; import { MdNewReleases } from "react-icons/md"; export default function Version() { const { t, i18n } = useTranslation(); const buildTime = process.env.NEXT_PUBLIC_BUILDTIME?.length ? process.env.NEXT_PUBLIC_BUILDTIME : new Date().toISOString(); const revision = process.env.NEXT_PUBLIC_REVISION?.length ? process.env.NEXT_PUBLIC_REVISION : "dev"; const version = process.env.NEXT_PUBLIC_VERSION?.length ? process.env.NEXT_PUBLIC_VERSION : "dev"; const { data: releaseData } = useSWR("api/releases"); // use Intl.DateTimeFormat to format the date const formatDate = (date) => { const options = { year: "numeric", month: "short", day: "numeric", }; return new Intl.DateTimeFormat(i18n.language, options).format(new Date(date)); }; const latestRelease = releaseData?.[0]; return ( <div id="version" className="flex flex-row items-center"> <span className="text-xs text-theme-500 dark:text-theme-400"> {version === "main" || version === "dev" || version === "nightly" ? ( <> {version} ({revision.substring(0, 7)}, {formatDate(buildTime)}) </> ) : ( <a href={`https://github.com/gethomepage/homepage/releases/tag/${version}`} target="_blank" rel="noopener noreferrer" className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center" > {version} ({revision.substring(0, 7)}, {formatDate(buildTime)}) </a> )} </span> {version === "main" || version === "dev" || version === "nightly" ? null : releaseData && latestRelease && compareVersions(latestRelease.tag_name, version) > 0 && ( <a href={latestRelease.html_url} target="_blank" rel="noopener noreferrer" className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center" > <MdNewReleases className="mr-1" /> {t("Update Available")} </a> )} </div> ); }