AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/SwiftUI/Calling/CallingViewComponent/CaptionsRtt/CaptionsRttInfoViewModel.swift (95 lines of code) (raw):

// // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // import Combine import Foundation class CaptionsRttInfoViewModel: ObservableObject { @Published var displayData = [CaptionsRttRecord]() @Published var captionsManager: CaptionsRttDataManager @Published var isCaptionsDisplayed = false @Published var isRttDisplayed = false @Published var isRttAvailable = false @Published var isLoading = false @Published var isDisplayed = false @Published var shouldExpand = false var loadingMessage = "" var rttInfoMessage = "" let localizationProvider: LocalizationProviderProtocol private let dispatch: ActionDispatch private let captionsOptions: CaptionsOptions var title: String var endIcon: CompositeIcon? var endIconAction: (() -> Void)? var textBoxHint: String? var endIconAccessibilityValue: String? var expandIconAccessibilityValue: String? var collapseIconAccessibilityValue: String? private var hasInsertedRttInfo = false init(state: AppState, captionsManager: CaptionsRttDataManager, captionsOptions: CaptionsOptions, dispatch: @escaping ActionDispatch, localizationProvider: LocalizationProviderProtocol) { self.captionsManager = captionsManager self.localizationProvider = localizationProvider loadingMessage = localizationProvider.getLocalizedString(LocalizationKey.captionsStartingCaptions) rttInfoMessage = localizationProvider.getLocalizedString(LocalizationKey.rttWarningMessage) self.dispatch = dispatch self.captionsOptions = captionsOptions self.endIcon = nil self.endIconAction = nil self.endIconAccessibilityValue = nil self.title = "" self.textBoxHint = nil bindCaptionsUpdates() setupItems(state: state) } private func bindCaptionsUpdates() { captionsManager.$captionsRttData .receive(on: DispatchQueue.main) .assign(to: &$displayData) } private func setupItems(state: AppState) { if state.rttState.isRttOn && state.captionsState.isCaptionsOn { title = localizationProvider.getLocalizedString(.rttCaptionsListTitle) } else if isRttDisplayed { title = localizationProvider.getLocalizedString(.rttListTitle) } else { title = localizationProvider.getLocalizedString(.captionsListTitle) } endIcon = state.captionsState.isCaptionsOn ? CompositeIcon.closeCaptions : CompositeIcon.closeCaptionsOff let language = captionsOptions.spokenLanguage?.lowercased() ?? "" endIconAction = { if state.captionsState.isCaptionsOn { self.dispatch(.captionsAction(.turnOffCaptions)) } else { self.dispatch(.captionsAction(.turnOnCaptions(language: language))) } } textBoxHint = localizationProvider.getLocalizedString(.rttTextBoxHint) endIconAccessibilityValue = { if state.captionsState.isCaptionsOn { localizationProvider.getLocalizedString(.captionsTurnOffCaptions) } else { localizationProvider.getLocalizedString(.captionsTurnOnCaptions) } }() expandIconAccessibilityValue = localizationProvider.getLocalizedString(.maximizeCaptionsRtt) collapseIconAccessibilityValue = localizationProvider.getLocalizedString(.minimizeCaptionsRtt) } func commitMessage(_ message: String, _ isFinal: Bool) { dispatch(.rttAction(.sendRtt(message: message, isFinal: isFinal))) } func updateLayoutHelight(_ shouldMaximize: Bool) { dispatch(.rttAction(.updateMaximized(isMaximized: shouldMaximize))) } func update(state: AppState) { self.isCaptionsDisplayed = state.captionsState.isCaptionsOn && state.captionsState.errors != .captionsFailedToStart && !isRttDisplayed self.isLoading = isCaptionsDisplayed && !state.captionsState.isStarted self.isRttDisplayed = state.rttState.isRttOn && !isCaptionsDisplayed setupItems(state: state) self.shouldExpand = state.rttState.isMaximized self.isRttAvailable = state.rttState.isRttOn self.isDisplayed = isCaptionsDisplayed || isRttDisplayed } }