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:
BeagleNavigationController
serverDrivenStateDidChange
deve ser sobrescrito para fazer a customização.import Beagle
class MyAppNavigationController: BeagleNavigationController {
override func serverDrivenStateDidChange(
to state: ServerDrivenState,
at screenController: BeagleController
) {
// TODO: Exibir carregamento e erros quando necessário.
}
}
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
.
navigationControllerType
com as demais configurações do Beagle para não sobrescrevê-las*.*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
}
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.retry
que permite executar novamente a ação que falhou.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)
}
}
}
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.