Carregamento e tratamento de erros

Nesta seção, você encontra informações de como customizar o comportamento do Beagle para casos de carregamento das telas e tratamento de erros.

Introdução

Para customizar os comportamentos de carregamento e erro no Beagle iOS, você precisa criar seu próprio navigation controller.

Ao cria-lo, você precisa seguir os seguintes passos:

  1. Extender sua controller a partir daBeagleNavigationController
  2. Alterar as dependências do Beagle para utilizá-lo.

Exemplo

Criando o Beagle navigation controller

Passo 1: Criar um Beagle navigation controller:

import Beagle

class MyAppNavigationController: BeagleNavigationController {
    override func serverDrivenStateDidChange(
        to state: ServerDrivenState,
        at screenController: BeagleController
    ) {
        // TODO: Exibir carregamento e erros quando necessário.
    }
}

Passo 2: Configurar a dependência:

let dependencies = BeagleDependencies()
dependencies.navigation.registerNavigationController(
    builder: MyAppNavigationController.init,
    forId: "MyAppNavigationController")
Beagle.dependencies = dependencies

É possível cadastrar mais de uma customização do BeagleNavigationController. Para escolher qual delas usar, o BFF precisa que você informe o forId.

Configurando o Carregamento

Por padrão, a implementação no Beagle sempre retorna uma interface com fundo preto semitransparente. Você pode ver isso por meio do UIActivityIndicatorView.

Se você quiser apresentar um carregamento específico da sua aplicação, verifique o estado da tela (state) e reaja apropriadamente. Veja no exemplo a seguir:

extension UIView {
    func showLoading() {
        // ...
    }
    func hideLoading() {
        // ...
    }
}

class MyAppNavigationController: BeagleNavigationController {
    override func serverDrivenStateDidChange(
        to state: ServerDrivenState,
        at screenController: BeagleController
    ) {
        switch state {
        case .loading(let loading):
            loading ? view.showLoading() : view.hideLoading()
        case .error:
            view.hideLoading()
        }
    }
}

Caso queira manter o estilo original de carregamento, basta executar a implementação padrão e seguir para o tratamento de erros.

override func serverDrivenStateDidChange(
    to state: ServerDrivenState,
    at screenController: BeagleController
) {
    super.serverDrivenStateDidChange(to: state, at: screenController)
    // TODO: Tratar casos de erro
}

Tratando os erros

Quando ocorre algum erro na aplicação, o Beagle altera o estado da tela (state) para ServerDrivenState.Error. Nesse caso, você deve verificar qual foi tipo do erro e fazer a tratativa quando necessário.

Os possíveis erros são:

  • remoteScreen(Request.Error): A requisição para carregar uma tela remota falhou. Veja abaixo quando isso ocorre.
  • lazyLoad(Request.Error): A requisição para carregar um componente Lazy falhou. Veja abaixo quando isso ocorre.
  • action(Swift.Error): A execução de uma Action falhou.

Erros em uma requisição (Request.Error):

  • urlBuilderError: A URL do recurso ou a baseURL é inválida.
  • networkError: Não foi possível estabelecer a conexão ou um erro foi retornado pelo BFF.
  • decoding: A resposta enviado pelo BFF é diferente do objeto esperado.

Veja o exemplo de como exibir uma tela de erro quando o carregamento de uma tela falha:

class ErrorView: UIVIew {
    var retry: (() -> Void)?
    func present(in view: UIView) {
        // ...
    }
}

class MyAppNavigationController: BeagleNavigationController {
    override func serverDrivenStateDidChange(
        to state: ServerDrivenState,
        at screenController: BeagleController
    ) {
        super.serverDrivenStateDidChange(to: state, at: screenController)
        if case let .error(serverDrivenError, retry) = state,
           case .remoteScreen = serverDrivenError {
               let errorView = ErrorView()
               errorView.retry = retry
               errorView.present(in: view)
        }
    }
}

Última modificação 11/02/2021: create content (#298) (43225e15)