AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/SwiftUI/Calling/CallingViewComponent/LobbyWaitingHeaderViewModel.swift (89 lines of code) (raw):

// // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // import Foundation internal class LobbyWaitingHeaderViewModel: ObservableObject { @Published var accessibilityLabel: String @Published var title: String @Published var isDisplayed = false @Published var isVoiceOverEnabled = false private let logger: Logger private let accessibilityProvider: AccessibilityProviderProtocol private let localizationProvider: LocalizationProviderProtocol private var lobbyParticipantCount: Int = 0 var participantListButtonViewModel: PrimaryButtonViewModel! var dismissButtonViewModel: IconButtonViewModel! var isPad = false init(compositeViewModelFactory: CompositeViewModelFactoryProtocol, logger: Logger, localUserState: LocalUserState, localizationProvider: LocalizationProviderProtocol, accessibilityProvider: AccessibilityProviderProtocol, dispatchAction: @escaping ActionDispatch) { self.logger = logger self.accessibilityProvider = accessibilityProvider self.localizationProvider = localizationProvider let title = localizationProvider.getLocalizedString(.lobbyWaitingToJoin) self.title = title self.accessibilityLabel = title self.participantListButtonViewModel = compositeViewModelFactory.makePrimaryButtonViewModel( buttonStyle: .primaryFilled, buttonLabel: localizationProvider.getLocalizedString(.lobbyWaitingHeaderViewButton), iconName: nil, isDisabled: false, paddings: CompositeButton.Paddings(horizontal: 10, vertical: 6)) { [weak self] in guard self != nil else { return } dispatchAction(.showParticipants) } self.participantListButtonViewModel.accessibilityLabel = self.localizationProvider.getLocalizedString( .lobbyWaitingHeaderViewButtonAccessibilityLabel) self.dismissButtonViewModel = compositeViewModelFactory.makeIconButtonViewModel( iconName: .dismiss, buttonType: .infoButton, isDisabled: false) { [weak self] in guard let self = self else { return } self.isDisplayed = false } self.dismissButtonViewModel.accessibilityLabel = self.localizationProvider.getLocalizedString( .lobbyWaitingHeaderDismissButtonAccessibilityLabel) } func update(localUserState: LocalUserState, remoteParticipantsState: RemoteParticipantsState, callingState: CallingState, visibilityState: VisibilityState) { let canShow = canShowLobby(callingState: callingState, visibilityState: visibilityState, participantRole: localUserState.participantRole) let newLobbyParticipantCount = lobbyUsersCount(remoteParticipantsState) let isDisplayed = canShow && newLobbyParticipantCount > 0 && (isDisplayed || newLobbyParticipantCount > lobbyParticipantCount) if self.isDisplayed != isDisplayed { self.isDisplayed = isDisplayed } self.lobbyParticipantCount = canShow ? newLobbyParticipantCount : 0 } private func lobbyUsersCount(_ remoteParticipantsState: RemoteParticipantsState) -> Int { return remoteParticipantsState.participantInfoList .filter({ participantInfoModel in participantInfoModel.status == .inLobby }) .count } private func canShowLobby( callingState: CallingState, visibilityState: VisibilityState, participantRole: ParticipantRoleEnum? ) -> Bool { guard callingState.status != .inLobby, callingState.status != .localHold, visibilityState.currentStatus == .visible, let participantRole = participantRole else { return false } return participantRole == .organizer || participantRole == .presenter || participantRole == .coOrganizer } }