Fluxo: PWA (Progressive Web App)

O Portal Meu Núcleo - MBL funciona como PWA, permitindo instalacao na tela inicial do celular e funcionamento offline basico.


manifest.json

Arquivo de manifesto localizado em apps/web/public/manifest.json com as configuracoes do app:

CampoValorDescricao
namePortal Meu Núcleo - MBLNome completo do app
short_nameMeu Núcleo MBLNome curto para a tela inicial
displaystandaloneApp roda sem barra de endereco do browser
theme_color#5CBCAECor da barra de status (verde MBL)
background_color#000000Cor de fundo na splash screen
iconsarrayIcones em multiplos tamanhos (192x192, 512x512)
start_url/dashboardURL inicial ao abrir o app instalado

Service Worker (sw.js)

Arquivo em apps/web/public/sw.js. Gerencia cache, offline fallback e push notifications.

Eventos tratados

EventoDescricao
installPre-cacheia recursos essenciais (offline page, icones)
activateLimpa caches antigos de versoes anteriores
fetchIntercepta requisicoes — serve do cache quando offline, fallback para pagina offline
pushRecebe push notification e exibe via showNotification()
notificationclickAo clicar na notificacao, abre/foca a janela do app na URL do payload

Registro do Service Worker

O service worker e registrado no apps/web/src/app/layout.tsx no carregamento inicial da pagina:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js');
}

Banner de Instalacao PWA

Componente React que incentiva o usuario a instalar o app na tela inicial.

Comportamento

  • Aparece automaticamente 3 segundos apos o carregamento, apenas em browsers mobile
  • Oculto quando o app ja esta rodando em modo standalone (ja instalado)
  • O usuario pode dispensar o banner — a dismissao e salva em sessionStorage (reaparece na proxima sessao)

Android (beforeinstallprompt)

  • O browser dispara o evento beforeinstallprompt quando os criterios PWA sao atendidos
  • O componente captura o evento e armazena a referencia
  • Ao clicar no botao "Instalar", chama prompt() no evento capturado
  • O browser exibe o dialogo nativo de instalacao do Android

iOS

  • iOS/Safari nao suporta beforeinstallprompt
  • Ao clicar no botao, exibe um alert() com instrucoes manuais:
  • "Toque no botao Compartilhar e selecione Adicionar a Tela de Inicio"

Deteccao de Modo Standalone

O componente verifica se o app ja esta instalado usando:

window.matchMedia('(display-mode: standalone)').matches
|| window.navigator.standalone === true

Se estiver em modo standalone, o banner de instalacao nunca e exibido.


Fluxo Completo

  1. Usuario acessa o portal pelo browser mobile
  2. Service worker e registrado automaticamente
  3. Apos 3 segundos, banner de instalacao aparece (se nao dispensado nesta sessao)
  4. Usuario clica "Instalar"
  5. Android: prompt nativo exibido / iOS: alert com instrucoes
  6. App instalado aparece na tela inicial com icone e splash screen
  7. Ao abrir, roda em modo standalone (sem barra de URL)
  8. Push notifications continuam funcionando em background