mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-05 00:15:26 -04:00
The Wails UI regressed the non-enforced update download to the plain GitHub releases page. Restore the old Fyne behavior: the tray update item and the About card's Get installer button now open version.DownloadUrl(), which points to the direct installer download (pkgs.netbird.io) per OS/arch and falls back to the generic install page where no installer exists. Also fix the dead brew detection on darwin: exec.Command passed the whole pipeline as a single argument to brew, so the check always failed. Query the netbird formula and netbird-ui cask explicitly via exit codes instead. ## Describe your changes ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [x] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [ ] It is a refactor - [ ] Created tests that fail without the change (if possible) - [ ] This change does **not** modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — **OR** I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See [CONTRIBUTING.md](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTING.md#discuss-changes-with-the-netbird-team-first). > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (explain why) ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ <!-- codesmith:footer --> --- <a href="https://app.blacksmith.sh/netbirdio/codesmith/netbird/pr/6922"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-light-v2.svg"><img alt="View with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"></picture></a> <a href="https://backend.blacksmith.sh/track/enable-autofix?expires=1787764680&installation_model_id=427504&pr_number=6922&repository=netbirdio%2Fnetbird&return_to=https%3A%2F%2Fgithub.com%2Fnetbirdio%2Fnetbird%2Fpull%2F6922&signature=3d9d640b25a17589114cc704e1d631895ffcd9f554947ff5790fe90d54410d2f"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-light.svg"><img alt="Autofix with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"></picture></a> <sup>Need help on this PR? Tag <code>@codesmith-bot</code> with what you need. Autofix is disabled.</sup> <!-- codesmith:autofix:disabled --> <!-- /codesmith:footer --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a direct installer download option for manual application updates. * Non-enforced updates now open the appropriate platform-specific installer instead of the general releases page. * **Bug Fixes** * Improved macOS download behavior for Homebrew installations. * Preserved architecture-specific downloads for Intel and Apple silicon Macs. * Updated the tray “About” links to use the GitHub repository and documentation instead of the releases page. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
100 lines
3.3 KiB
TypeScript
100 lines
3.3 KiB
TypeScript
import { type ReactNode } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { Browser } from "@wailsio/runtime";
|
|
import { DownloadIcon, NotepadText } from "lucide-react";
|
|
import { Update as UpdateSvc } from "@bindings/services";
|
|
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");
|
|
});
|
|
}
|
|
|
|
function openInstallerDownload() {
|
|
UpdateSvc.DownloadURL()
|
|
.then(openUrl)
|
|
.catch(() => openUrl(GITHUB_RELEASES));
|
|
}
|
|
|
|
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={openInstallerDownload}>
|
|
<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(
|
|
"flex w-full 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 font-medium text-netbird hover:underline hover:decoration-[0.5px] hover:underline-offset-4"
|
|
}
|
|
>
|
|
{children}
|
|
</button>
|
|
);
|
|
}
|