import { useState, useEffect } from 'react'; // Carimbo do BUILD (bundle). É só FALLBACK enquanto o /api/version não responde. // A FONTE OFICIAL da versão é o backend, em runtime, via useAppVersion(). // Não depende mais de APP_VERSION manual: version cai em VITE_APP_VERSION (se o // pipeline injetar) ou 'dev'. commit/build/ambiente seguem carimbados no build (VITE_*). const meta = (import.meta as any).env || {}; export const BUILD_INFO = { name: 'ScoreOdonto', version: meta.VITE_APP_VERSION || 'dev', commit: meta.VITE_GIT_COMMIT || 'dev', build: meta.VITE_BUILD_TIME || '', environment: String(meta.VITE_APP_ENV || 'DEV').toUpperCase(), }; // Rótulo curto: "v1.0.15 · 7a9b3c1 · DEV" export const versionLabel = `${BUILD_INFO.version} · ${BUILD_INFO.commit} · ${BUILD_INFO.environment}`; // Fonte ÚNICA da versão exibida: o backend em runtime (GET /api/version, público). // Cache em módulo p/ não refazer o fetch a cada tela. Fallback = BUILD_INFO (bundle). let _verCache: any = null; export function useAppVersion() { const [info, setInfo] = useState(_verCache || BUILD_INFO); useEffect(() => { if (_verCache) { setInfo(_verCache); return; } let alive = true; fetch('/api/version') .then(r => (r.ok ? r.json() : null)) .then(v => { if (alive && v && v.version) { _verCache = { ...BUILD_INFO, ...v }; setInfo(_verCache); } }) .catch(() => {}); return () => { alive = false; }; }, []); return info; }