Pular para o conteúdo principal

Dispensar e a opção dismissible

O snackbar, o banner e o indicador podem ser dispensados por quem usa o app. O estado de tela cheia nunca é dispensado assim: ele tem a sua própria ação "Continuar offline".

Dispensar vem ativado por padrão. Uma única opção o desliga:

<OfflineDetector dismissible={false}>
<App />
</OfflineDetector>

Um valor por peça tem prioridade sobre o global:

<OfflineDetector dismissible={false} banner={{ dismissible: true }}>
<App />
</OfflineDetector>

Como uma peça é dispensada​

PeçaGestoSem gesto
SnackbarDeslizar para a esquerda ou direitaO botão Fechar (44 por 44) ou Escape com o foco nele
BannerDeslizar para a esquerda ou direitaO botão de ícone Fechar no fim da linha, ou Escape
IndicadorDeslizar para a esquerda ou direitaEscape ou Delete com foco; uma ação dismiss no nativo

Deslizar é um gesto com trajetória; por isso toda peça dispensável tem uma alternativa que exige só um toque ou uma tecla.

As regras do deslize:

  • Um arrasto horizontal em qualquer direção. A peça acompanha o dedo ou o ponteiro.
  • Soltar em 30 por cento da largura ou além, ou a 0,5 px/ms ou mais, dispensa. Menos que isso faz a peça voltar.
  • Depois de 8 px de movimento, o arrasto trava no eixo dominante; assim, a rolagem vertical continua funcionando.
  • Com movimento reduzido, a peça some em fade em vez de deslizar.

O que "dispensada" significa​

  • Só a peça é escondida. O estado da conexão não muda, useNetworkStatus() e os callbacks não são afetados, e as outras peças continuam aparecendo.
  • Uma peça dispensada fica escondida até a próxima transição de status (offline, depois online, depois offline de novo mostra as peças outra vez). O snackbar de recuperação ainda aparece na recuperação.
  • A dispensa fica apenas na memória. Recarregar a página a reinicia. Nada é armazenado.
  • Dispensar o banner reorganiza o conteúdo que está abaixo dele.
  • Dispensar pelo usuário não é anunciado aos leitores de tela: foi o usuário quem fez.
  • Na web, ao dispensar uma peça que tinha o foco do teclado, o foco volta ao elemento que o tinha antes de a peça aparecer (ao corpo da página, se esse elemento sumiu).
  • Uma peça que você monta por conta própria é dispensável exatamente quando você passa actions.dismiss, tanto na web quanto no nativo.

Reagir a uma dispensa​

<OfflineDetector onDismiss={(piece) => analytics.track('dismissed', { piece })}>
<App />
</OfflineDetector>

piece é 'snackbar', 'banner' ou 'indicator'.

Nos seus próprios componentes​

resolveDismissible e useDismissals são exportados pelos pacotes web e nativo:

resolveDismissible('banner', { dismissible: false, banner: { dismissible: true } }); // true

const { isDismissed, dismiss } = useDismissals({ onDismiss: (piece) => log(piece) });
dismiss('snackbar'); // não faz nada quando essa peça não é dispensável

resolveDismissible(piece, options) é pura: um valor por peça vence o global e o padrão é true. Veja a referência do react.