Files
fusion/packages/dashboard/app/components/UpdateAvailableBanner.tsx
gsxdsm a2e96b132a feat(i18n): round-2 sweep — 488 residual strings migrated, markup fidelity restored (#1352)
- 51 fix agents covered every dirty batch from the round-1 verifiers:
  helper-function labels (roles, statuses, relative time), constant
  label maps (SETTINGS_SECTIONS, PROVIDER_INFO, EVENT_TYPE_LABELS),
  TUI help overlay + tab labels, toasts, placeholders, aria-labels
- Inline markup flattened by round 1 restored with <Trans>
  (DbCorruptionBanner storage-docs link, UpdateAvailableBanner code chip)
- Catalogs merged: +527 en keys across 5 locales; CLI bundles + app
  locale tree regenerated (6 locales)
- All 23 sweep-caused test regressions fixed: delta vs the clean-main
  baseline is now zero (remaining 4 local failures reproduce identically
  on origin/main; CI-green upstream)
- typecheck/lint clean; TUI 82/82, core locale 9/9

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 20:52:44 -07:00

47 lines
1.6 KiB
TypeScript

import "./UpdateAvailableBanner.css";
import { X } from "lucide-react";
import { useTranslation, Trans } from "react-i18next";
interface UpdateAvailableBannerProps {
latestVersion: string;
currentVersion: string;
onDismiss: () => void;
}
export function UpdateAvailableBanner({ latestVersion, currentVersion, onDismiss }: UpdateAvailableBannerProps) {
const { t } = useTranslation("app");
return (
<div className="update-available-banner" role="status" aria-live="polite">
<p className="update-available-banner__text">
<Trans
i18nKey="app:updateBanner.message"
defaults="Update available: v{{latestVersion}} (current: v{{currentVersion}}). Run <code>fn update</code> for an installed CLI, or pull this source checkout."
values={{ latestVersion, currentVersion }}
components={{ code: <code /> }}
/>{" "}
<a
className="update-available-banner__link"
href="https://github.com/Runfusion/Fusion/blob/main/CHANGELOG.md"
target="_blank"
rel="noreferrer"
>
{t("updateBanner.releaseNotes", "Release notes")}
</a>{" "}
·{" "}
<a className="update-available-banner__link" href="https://runfusion.ai" target="_blank" rel="noreferrer">
{t("updateBanner.learnMore", "Learn more")}
</a>
</p>
<button
type="button"
className="update-available-banner__dismiss touch-target"
aria-label={t("updateBanner.dismissLabel", "Dismiss update notice")}
onClick={onDismiss}
>
<X size={16} aria-hidden="true" />
</button>
</div>
);
}