feat(version): versão em runtime via /api/version (Passos 1/3/4)
- buildInfo.ts: hook useAppVersion() consome GET /api/version (fonte única = backend),
com fallback ao carimbo do bundle; deixa de depender do APP_VERSION manual.
- Versão exibida em Configurações ("Sobre o sistema") + telas públicas (Login/WaitingInvite);
removida do rodapé do Sidebar.
- compose.prod/deploy-prod.sh: injetam APP_VERSION (=tag) e APP_ENV=PROD em runtime,
desacoplando a versão semântica do build (commit/build seguem da imagem).
- constants.ts marcado legado + bump V1.0.15 (transitório até o Passo 5; evita colisão de tag).
- DEPLOY-PRODUCAO.md reescrito com status ✅/🧪/🎯 + nota de fase transitória.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+24
-6
@@ -1,17 +1,35 @@
|
||||
import { APP_VERSION } from './constants.ts';
|
||||
import { useState, useEffect } from 'react';
|
||||
|
||||
// Metadados de build. commit/build/ambiente são carimbados no build via
|
||||
// variáveis VITE_* (ARGs do Dockerfile do frontend). Em dev sem build args,
|
||||
// caem nos defaults abaixo.
|
||||
// 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: APP_VERSION,
|
||||
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.13 · 7a9b3c1 · DEV"
|
||||
// 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<any>(_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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user