AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/Manager/CompositeErrorManager.swift (52 lines of code) (raw):
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
import Foundation
import Combine
protocol ErrorManagerProtocol {
}
class CompositeErrorManager: ErrorManagerProtocol {
private let store: Store<AppState, Action>
private let eventsHandler: CallComposite.Events
private var previousError: CallCompositeInternalError?
var cancellables = Set<AnyCancellable>()
init(store: Store<AppState, Action>,
callCompositeEventsHandler: CallComposite.Events) {
self.store = store
self.eventsHandler = callCompositeEventsHandler
store.$state
.receive(on: RunLoop.main)
.sink { [weak self] state in
self?.receive(state)
}.store(in: &cancellables)
}
private func receive(_ state: AppState) {
let errorState = state.errorState
guard previousError != errorState.internalError else {
return
}
previousError = errorState.internalError
updateEventHandler(state.errorState)
updateFatalError(state.errorState)
}
private func updateEventHandler(_ errorState: ErrorState) {
guard let didFail = eventsHandler.onError,
let compositeError = getCallCompositeError(errorState: errorState) else {
return
}
didFail(compositeError)
}
private func updateFatalError(_ errorState: ErrorState) {
guard let internalError = errorState.internalError,
errorState.errorCategory == .fatal,
internalError.isFatalError() else {
return
}
store.dispatch(action: .compositeExitAction)
}
private func getCallCompositeError(errorState: ErrorState) -> CallCompositeError? {
guard let internalError = errorState.internalError,
let errorCode = internalError.toCallCompositeErrorCode() else {
return nil
}
return CallCompositeError(code: errorCode,
error: errorState.error)
}
}