Files
VPS 4 Builder cb00d9f383 feat: ViaCEP em todos os forms de endereço + menus por papel + fix preview de plugins
ViaCEP (auto-preenche endereço ao completar 8 dígitos):
- novo util services/viacep.ts (buscarCep), reutilizado
- ligado em Pacientes, Salas, Profissionais(perfil); Configurações migrada p/ o util
- filtro 'CEP (região)' do marketplace mantido como busca (sem auto-fill)

Menus por papel:
- biomédico: sem Ortodontia, RX e 'Ser Tutor Orto' (não são escopo)
- protético: passa a ver Dashboard/Agenda/Tratamentos/Lançar GTO (antes não via nada)
- RX/Radiografias: só papéis odonto (dentista + donos/funcionário)
- bottom nav mobile ajustado (biomédico/protético)

Fix 'Visualizar como':
- getActivePlugins é preview-aware (todos os plugins ativos enquanto houver PREVIEW_ROLE),
  imune ao timing de hydrate/cache; enterPreview/exitPreview simplificados

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 20:14:31 +02:00

28 lines
887 B
TypeScript

// Busca de endereço por CEP via ViaCEP. Retorna os campos em MAIÚSCULAS
// (padrão de endereço do sistema). Retorna null se o CEP for inválido,
// não existir ou a API falhar — o chamador trata o feedback ao usuário.
export interface EnderecoCep {
logradouro: string;
bairro: string;
cidade: string;
estado: string;
}
export async function buscarCep(cep: string): Promise<EnderecoCep | null> {
const digits = (cep || '').replace(/\D/g, '');
if (digits.length !== 8) return null;
try {
const r = await fetch(`https://viacep.com.br/ws/${digits}/json/`);
const d = await r.json();
if (d.erro) return null;
return {
logradouro: (d.logradouro || '').toUpperCase(),
bairro: (d.bairro || '').toUpperCase(),
cidade: (d.localidade || '').toUpperCase(),
estado: (d.uf || '').toUpperCase(),
};
} catch {
return null;
}
}