diff --git a/Mail/SceneDelegate.swift b/Mail/SceneDelegate.swift index e522a28e7..110d2ef8e 100644 --- a/Mail/SceneDelegate.swift +++ b/Mail/SceneDelegate.swift @@ -37,6 +37,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, AccountManagerDelegate // `application:configurationForConnectingSceneSession` instead). guard let _ = (scene as? UIWindowScene) else { return } accountManager = AccountManager.instance + accountManager.delegate = self updateWindowUI() setupLaunch() if let mailToURL = connectionOptions.urlContexts.first?.url { @@ -107,7 +108,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate, AccountManagerDelegate } func currentAccountNeedsAuthentication() { - showLoginView() + DispatchQueue.main.async { [weak self] in + self?.showLoginView() + } } private func setupLaunch() { diff --git a/MailCore/API/MailApiFetcher.swift b/MailCore/API/MailApiFetcher.swift index 4f3078e15..78c4f4f05 100644 --- a/MailCore/API/MailApiFetcher.swift +++ b/MailCore/API/MailApiFetcher.swift @@ -36,20 +36,27 @@ public extension ApiFetcher { public class MailApiFetcher: ApiFetcher { public static let clientId = "E90BC22D-67A8-452C-BE93-28DA33588CA4" + /// All status except 401 are handled by our code, 401 status is handled by Alamofire's Authenticator code + private lazy var handledHttpStatus: Set = { + var allStatus = Set(200 ... 500) + allStatus.remove(401) + return allStatus + }() + override public func perform( request: DataRequest, decoder: JSONDecoder = ApiFetcher.decoder ) async throws -> (data: T, responseAt: Int?) { do { - return try await super.perform(request: request) - } catch let InfomaniakError.apiError(apiError) { + return try await super.perform(request: request.validate(statusCode: handledHttpStatus)) + } catch InfomaniakError.apiError(let apiError) { throw MailApiError.mailApiErrorWithFallback(apiErrorCode: apiError.code) - } catch let InfomaniakError.serverError(statusCode: statusCode) { + } catch InfomaniakError.serverError(statusCode: let statusCode) { throw MailServerError(httpStatus: statusCode) } catch { if let afError = error.asAFError { - if case let .responseSerializationFailed(reason) = afError, - case let .decodingFailed(error) = reason { + if case .responseSerializationFailed(let reason) = afError, + case .decodingFailed(let error) = reason { var rawJson = "No data" if let data = request.data, let stringData = String(data: data, encoding: .utf8) {