import { useTranslation } from 'react-i18next' import { Button } from '@/ui' import { ArrowClockwise, BookOpen, X } from '@phosphor-icons/react' import { useState } from 'react' import { useAppVersion } from './useAppVersion' const DOCS_URL = '/docs/' // ordinis-docs deployment, mirrors prod /docs path /** * Banner — показывается top-of-page когда client bundle отстаёт от server. * *

Pattern такой же как Altum VS / Geoportal: persistent strip, contextual * CTAs, dismissable (но re-appears после next refetch если still mismatched). * *

Two CTAs: *

* *

Dismiss button (×) — temporarily скрывает banner до следующего * {@code useServerVersion} refetch (5 min). Не persists в localStorage — * критичный update должен progressively становиться более insistent. */ export function UpdateBanner() { const { t } = useTranslation() const { updateAvailable, serverVersion, serverCommit, serverTag } = useAppVersion() const [dismissed, setDismissed] = useState(false) if (!updateAvailable || dismissed) return null // serverTag === 'none' для branch builds (Spring Boot build-info default // sentinel non-null). Не показываем "none" как версию — fallback к // serverVersion (e.g. "0.1.0-SNAPSHOT") и потом к 7-char commit hash. const tag = serverTag && serverTag !== 'none' ? serverTag : null const versionLabel = tag || serverVersion || serverCommit?.substring(0, 7) || '' return (

{t('updateBanner.message', { version: versionLabel })}
) }