"use client"; import { useState, useEffect } from "react"; interface BlockMeta { path: string; name: string; version: string; isInPreview: boolean; } interface BlockMetaBarProps { path: string; defaultVersion: string; defaultIsInPreview: boolean; } export function BlockMetaBar({ path, defaultVersion, defaultIsInPreview }: BlockMetaBarProps) { const [meta, setMeta] = useState(null); const [editing, setEditing] = useState(false); const [versionInput, setVersionInput] = useState(defaultVersion); const [saving, setSaving] = useState(false); const [togglingPreview, setTogglingPreview] = useState(false); const [apiDown, setApiDown] = useState(false); const apiUrl = process.env.NEXT_PUBLIC_API_URL; useEffect(() => { if (!apiUrl) { setApiDown(true); return; } fetch(`${apiUrl}/blocks/by-path?path=${encodeURIComponent(path)}`) .then((r) => r.json()) .then((data: BlockMeta) => { setMeta(data); setVersionInput(data.version); }) .catch(() => setApiDown(true)); }, [apiUrl, path]); async function patch(data: { version?: string; isInPreview?: boolean }) { if (!apiUrl) return null; const r = await fetch(`${apiUrl}/blocks/by-path?path=${encodeURIComponent(path)}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return r.json() as Promise; } async function saveVersion() { if (!meta) return; setSaving(true); try { const updated = await patch({ version: versionInput }); if (updated) { setMeta(updated); setEditing(false); } } finally { setSaving(false); } } async function togglePreview() { if (!meta) return; setTogglingPreview(true); try { const updated = await patch({ isInPreview: !meta.isInPreview }); if (updated) setMeta(updated); } finally { setTogglingPreview(false); } } const version = meta?.version ?? defaultVersion; const isInPreview = meta?.isInPreview ?? defaultIsInPreview; return (
{/* Version badge */} Версия: {editing ? ( setVersionInput(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') saveVersion(); if (e.key === 'Escape') setEditing(false); }} autoFocus /> ) : ( )} · {/* Preview toggle */} {apiDown ? ( {isInPreview ? "В превью" : "Не в превью"} ) : ( )} {apiDown && ( <> · API офлайн )}
); }