Pular para o conteúdo principal

Renderização no servidor e Next.js

Importar os pacotes, criar o adapter e renderizar no servidor nunca tocam em window, document nem navigator. O servidor renderiza os tokens e os seus filhos, e nenhuma peça (a menos que você passe initialStatus="offline"). A primeira verificação de conectividade roda em um efeito após a montagem; assim, a hidratação produz o mesmo HTML do servidor e nada pisca.

Next.js App Router​

O componente usa estado e efeitos; portanto coloque-o em um componente cliente:

'use client';

import { OfflineDetector } from '@rogeriodocarmo/offline-detector-web';

export function Offline({ children }: { children: React.ReactNode }) {
return <OfflineDetector>{children}</OfflineDetector>;
}

Depois use <Offline> no seu layout raiz. O mesmo vale para qualquer hook do pacote React: ele roda apenas em componentes cliente.

initialStatus​

Sem initialStatus, a primeira renderização no servidor e no cliente mostra o estado unknown, que isOnline trata como online. Passe initialStatus="offline" quando você souber mais, por exemplo por um cookie ou um cabeçalho da requisição:

<OfflineDetector initialStatus="offline">{children}</OfflineDetector>

Assim, o HTML do servidor e a primeira renderização no cliente concordam, e a dica vale até a primeira verificação real terminar. É apenas uma dica para a primeira pintura: se a primeira verificação real achar o app online, as peças simplesmente somem, sem a mensagem "Conexão restabelecida".

Exportação estática​

Um site exportado estaticamente (output: 'export' do Next.js, Docusaurus, ilhas do Astro) funciona do mesmo jeito: nada roda até a página estar em um navegador. A demonstração ao vivo é uma exportação estática.

Política de segurança de conteúdo​

<OfflineDetector> renderiza um elemento <style> em linha com os tokens --od-* e os estilos das peças. Sob um style-src estrito, sem unsafe-inline, passe o nonce que os seus outros estilos em linha usam:

<OfflineDetector nonce={nonce}>{children}</OfflineDetector>

Os blocos de construção são exportados caso você precise montar o seu: OfflineTokens (também aceita um nonce) e as constantes offlineTokensCss e offlineCss (o CSS como strings). Veja a referência web. Esse caminho não foi testado contra uma política real.