import type { DesktopBridge, DesktopUpdateState } from "@t3tools/contracts"; import { ExternalLinkIcon } from "lucide-react"; import { getDesktopUpdateReleaseHistoryUrl, getDesktopUpdateReleaseUrl, } from "../desktopUpdate.logic"; import { openDesktopUpdateReleaseNotes } from "../desktopUpdate.toast"; import { Separator } from "../ui/separator"; type DesktopUpdateShell = Pick; function keyReleaseNoteItems(items: ReadonlyArray) { const occurrences = new Map(); return items.map((item) => { const occurrence = occurrences.get(item) ?? 0; occurrences.set(item, occurrence + 1); return { item, key: JSON.stringify([item, occurrence]) }; }); } function ReleaseLink({ children, releaseUrl, shell, }: { readonly children: string; readonly releaseUrl: string; readonly shell: DesktopUpdateShell | undefined; }) { return ( { event.preventDefault(); void openDesktopUpdateReleaseNotes(shell, releaseUrl); }} > {children} ); } export function SidebarUpdateReleaseNotes({ shell, state, tooltip, }: { readonly shell: DesktopUpdateShell | undefined; readonly state: DesktopUpdateState; readonly tooltip: string; }) { if (state.channel !== "nightly" || state.releaseNotes.length === 0) { return <>{tooltip}; } return (
{state.status === "available" ? (
Update ready to download
{state.availableVersion ? (
{state.availableVersion}
) : null}
) : (
{tooltip}
)}
{state.releaseNotes.map((releaseNote, index) => { const releaseUrl = getDesktopUpdateReleaseUrl(releaseNote.version); const omittedItemCount = Math.max(0, releaseNote.totalItems - releaseNote.items.length); const linkLabel = omittedItemCount === 0 ? "View release on GitHub" : `${omittedItemCount} more ${omittedItemCount === 1 ? "change" : "changes"} on GitHub`; return (
{index > 0 && }

{index === 0 ? "What's changed" : `Changes in ${releaseNote.version}`}

    {keyReleaseNoteItems(releaseNote.items).map(({ item, key }) => (
  • {item}
  • ))}
{releaseUrl ? ( {linkLabel} ) : null}
); })} {state.omittedReleaseCount > 0 ? (
{`${state.omittedReleaseCount} older ${state.omittedReleaseCount === 1 ? "release" : "releases"} on GitHub`}
) : null}
); }