"use client" import * as React from "react" import Link from "next/link" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { formatAppVersionLabel, getAppVersion } from "@/lib/app-version" import { formatCommitSubject, getReleaseCommitPreview, RELEASE_COMMIT_PREVIEW_LIMIT, } from "@/lib/release-commits" import type { ReleaseManifest } from "@/lib/release-manifest" import { hasSeenReleaseModal, markReleaseModalSeen } from "@/lib/release-modal-storage" export function ReleaseNotesModal() { const [open, setOpen] = React.useState(false) const [manifest, setManifest] = React.useState(null) React.useEffect(() => { let cancelled = false async function loadManifest() { try { const response = await fetch("/release-manifest.json", { cache: "no-store" }) if (!response.ok) return const data = (await response.json()) as ReleaseManifest if (cancelled || !data.commits?.length || hasSeenReleaseModal(data.tag)) return setManifest(data) setOpen(true) } catch { // Локальная сборка или недоступный manifest — модалку не показываем. } } void loadManifest() return () => { cancelled = true } }, []) const handleOpenChange = (nextOpen: boolean) => { setOpen(nextOpen) if (!nextOpen && manifest) { markReleaseModalSeen(manifest.tag) } } const versionLabel = formatAppVersionLabel(manifest?.version ?? getAppVersion()) const commits = getReleaseCommitPreview(manifest?.commits ?? []) return ( Что нового в {versionLabel} Последние {RELEASE_COMMIT_PREVIEW_LIMIT} коммитов текущей сборки MikrotikManager.
{commits.length ? (
    {commits.map((commit) => (
  • {commit.type} {commit.shortSha} {commit.author}

    {formatCommitSubject(commit.subject)}

  • ))}
) : null}
) }