AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/Manager/UpdatableOptionsManager.swift (226 lines of code) (raw):

// // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // import Foundation import Combine protocol UpdatableOptionsManagerProtocol { var setupScreenOptions: SetupScreenOptions? { get } var callScreenOptions: CallScreenOptions? { get } } class UpdatableOptionsManager: UpdatableOptionsManagerProtocol { private let store: Store<AppState, Action> private var subscriptions = Set<AnyCancellable>() let setupScreenOptions: SetupScreenOptions? let callScreenOptions: CallScreenOptions? // swiftlint:disable function_body_length init(store: Store<AppState, Action>, setupScreenOptions: SetupScreenOptions?, callScreenOptions: CallScreenOptions? ) { self.store = store self.callScreenOptions = callScreenOptions self.setupScreenOptions = setupScreenOptions callScreenOptions?.headerViewData?.$title .sink { [weak self] newTitle in self?.store.dispatch(action: .callScreenInfoHeaderAction(.updateTitle(title: newTitle))) } .store(in: &subscriptions) callScreenOptions?.headerViewData?.$subtitle .sink { [weak self] newSubtitle in self?.store.dispatch(action: .callScreenInfoHeaderAction(.updateSubtitle(subtitle: newSubtitle))) } .store(in: &subscriptions) setupScreenOptions?.audioDeviceButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .setupScreenAudioDeviceButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) setupScreenOptions?.audioDeviceButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .setupScreenAudioDeviceButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) setupScreenOptions?.cameraButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .setupScreenCameraButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) setupScreenOptions?.cameraButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .setupScreenCameraButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) setupScreenOptions?.microphoneButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .setupScreenMicButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) setupScreenOptions?.microphoneButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .setupScreenMicButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.audioDeviceButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenAudioDeviceButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.audioDeviceButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenAudioDeviceButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.cameraButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCameraButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.cameraButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCameraButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.microphoneButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenMicButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.microphoneButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenMicButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.reportIssueButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenReportIssueButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.reportIssueButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenReportIssueButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.shareDiagnosticsButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenShareDiagnosticsButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.shareDiagnosticsButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenShareDiagnosticsButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.liveCaptionsButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenLiveCaptionsButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.liveCaptionsButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenLiveCaptionsButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.liveCaptionsToggleButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenLiveCaptionsToggleButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.liveCaptionsToggleButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenLiveCaptionsToggleButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.spokenLanguageButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenSpokenLanguageButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.spokenLanguageButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenSpokenLanguageButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.captionsLanguageButton?.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCaptionsLanguageButtonIsVisibleUpdated(visible: visible))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.captionsLanguageButton?.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCaptionsLanguageButtonIsEnabledUpdated(enabled: enabled))) } .store(in: &subscriptions) callScreenOptions?.controlBarOptions?.customButtons.forEach { button in button.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCustomButtonIsEnabledUpdated(id: button.id, enabled: enabled))) } .store(in: &subscriptions) button.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCustomButtonIsVisibleUpdated(id: button.id, visible: visible))) } .store(in: &subscriptions) button.$image .sink { [weak self] image in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCustomButtonIconUpdated(id: button.id, image: image))) } .store(in: &subscriptions) button.$title .sink { [weak self] title in self?.store.dispatch(action: .buttonViewDataAction( .callScreenCustomButtonTitleUpdated(id: button.id, title: title))) } .store(in: &subscriptions) } callScreenOptions?.headerViewData?.customButtons.forEach { button in button.$enabled .sink { [weak self] enabled in self?.store.dispatch(action: .buttonViewDataAction( .callScreenHeaderCustomButtonIsEnabledUpdated(id: button.id, enabled: enabled))) } .store(in: &subscriptions) button.$visible .sink { [weak self] visible in self?.store.dispatch(action: .buttonViewDataAction( .callScreenHeaderCustomButtonIsVisibleUpdated(id: button.id, visible: visible))) } .store(in: &subscriptions) button.$image .sink { [weak self] image in self?.store.dispatch(action: .buttonViewDataAction( .callScreenHeaderCustomButtonIconUpdated(id: button.id, image: image))) } .store(in: &subscriptions) button.$title .sink { [weak self] title in self?.store.dispatch(action: .buttonViewDataAction( .callScreenHeaderCustomButtonTitleUpdated(id: button.id, title: title))) } .store(in: &subscriptions) } } // swiftlint:enable function_body_length }