mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-20 23:41:28 +02:00
95 lines
3.2 KiB
TypeScript
95 lines
3.2 KiB
TypeScript
import { type ReactNode } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { Browser } from "@wailsio/runtime";
|
|
import { DownloadIcon, NotepadText } from "lucide-react";
|
|
import { Button } from "@/components/buttons/Button";
|
|
import { useClientVersion } from "@/contexts/ClientVersionContext";
|
|
import { cn } from "@/lib/cn";
|
|
|
|
const GITHUB_RELEASES = "https://github.com/netbirdio/netbird/releases/latest";
|
|
|
|
function openUrl(url: string) {
|
|
Browser.OpenURL(url).catch(() => {
|
|
window.open(url, "_blank");
|
|
});
|
|
}
|
|
|
|
export function UpdateVersionCard() {
|
|
const { t } = useTranslation();
|
|
const { updateVersion, enforced, triggerUpdate } = useClientVersion();
|
|
|
|
if (updateVersion) {
|
|
const titleKey = enforced
|
|
? "update.card.versionAvailableInstall"
|
|
: "update.card.versionAvailableDownload";
|
|
return (
|
|
<Card className={"max-w-lg"}>
|
|
<div>
|
|
<Title>{t(titleKey, { version: updateVersion })}</Title>
|
|
<Link
|
|
url={`https://github.com/netbirdio/netbird/releases/tag/v${updateVersion}`}
|
|
>
|
|
{t("update.card.whatsNew")}
|
|
</Link>
|
|
</div>
|
|
{enforced ? (
|
|
<Button variant={"primary"} size={"xs"} onClick={triggerUpdate}>
|
|
{t("update.card.installNow")}
|
|
</Button>
|
|
) : (
|
|
<Button
|
|
variant={"primary"}
|
|
size={"xs"}
|
|
onClick={() => openUrl(GITHUB_RELEASES)}
|
|
>
|
|
<DownloadIcon size={14} />
|
|
{t("update.card.getInstaller")}
|
|
</Button>
|
|
)}
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Card className={"max-w-lg"}>
|
|
<div>
|
|
<Title>{t("update.card.onLatestVersion")}</Title>
|
|
<p className={"text-sm text-nb-gray-300"}>{t("update.card.autoCheckInterval")}</p>
|
|
</div>
|
|
<Button variant={"primary"} size={"xs"} onClick={() => openUrl(GITHUB_RELEASES)}>
|
|
<NotepadText size={14} />
|
|
{t("update.card.changelog")}
|
|
</Button>
|
|
</Card>
|
|
);
|
|
}
|
|
|
|
function Card({ children, className }: Readonly<{ children: ReactNode; className?: string }>) {
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"w-full flex items-center justify-between gap-4 rounded-md border border-nb-gray-800 bg-nb-gray-910 px-4 py-3",
|
|
className,
|
|
)}
|
|
>
|
|
{children}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function Title({ children }: Readonly<{ children: ReactNode }>) {
|
|
return <p className={"text-sm font-semibold"}>{children}</p>;
|
|
}
|
|
|
|
function Link({ url, children }: Readonly<{ url: string; children: ReactNode }>) {
|
|
return (
|
|
<button
|
|
type={"button"}
|
|
onClick={() => openUrl(url)}
|
|
className={"text-sm text-netbird hover:underline hover:underline-offset-4 hover:decoration-[0.5px] font-medium"}
|
|
>
|
|
{children}
|
|
</button>
|
|
);
|
|
}
|