Files
VPS 4 Builder a991f1fe2c 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>
2026-06-17 05:19:27 +02:00

36 lines
1.5 KiB
TypeScript

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<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;
}