func update()

in AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Presentation/SwiftUI/ViewComponents/ParticipantsList/ParticipantsListViewModel.swift [43:131]


    func update(localUserState: LocalUserState,
                remoteParticipantsState: RemoteParticipantsState,
                isDisplayed: Bool) {

        self.isDisplayed = isDisplayed

        // If timestamp or lastRoleChanged
        if lastUpdateTimeStamp != remoteParticipantsState.lastUpdateTimeStamp
           || self.lastParticipantRole != localUserState.participantRole {
            lastUpdateTimeStamp = remoteParticipantsState.lastUpdateTimeStamp
            self.lastParticipantRole = localUserState.participantRole

            let shouldFilterOutLobbyUsers = shouldFilterOutLobbyUsers(
                participantRole: localUserState.participantRole)

            // Build the Local Participant "List"
            let localParticipantVM = [ParticipantsListCellViewModel(
                localUserState: localUserState,
                localizationProvider: localizationProvider)]

            // Grab the Remote Participants
            let remoteParticipantVMs = remoteParticipantsState.participantInfoList
                .filter { participant in
                    participant.status == .connected || participant.status == .hold
                }.map {
                    let participant = $0
                    return ParticipantsListCellViewModel(participantInfoModel: participant,
                                                         localizationProvider: localizationProvider,
                                                         confirmTitle: nil,
                                                         confirmAccept: nil,
                                                         confirmDeny: nil,
                                                         onAccept: {
                        self.onUserClicked(participant)
                    }, onDeny: {})
                }

            let lobbyParticipantVMs = remoteParticipantsState.participantInfoList
                .filter { participant in
                    participant.status == .inLobby && !shouldFilterOutLobbyUsers
                }.map {
                    let participant = $0
                    return ParticipantsListCellViewModel(participantInfoModel: participant,
                                                  localizationProvider: localizationProvider,
                                                         confirmTitle: String(
                                                            format: getConfirmTitleAdmitParticipant(),
                                                            $0.displayName),
                                                         confirmAccept: getConfirmAdmit(),
                                                         confirmDeny: getConfirmDecline(),
                                                         onAccept: {
                        self.admitParticipant(participant.userIdentifier)
                    }, onDeny: {
                        self.declineParticipant(participant.userIdentifier)
                    })
                }

            meetingParticipants = sortParticipants(
                participants: localParticipantVM + remoteParticipantVMs,
                avatarManager: avatarManager)

            meetingParticipantsTitle = BodyTextDrawerListItemViewModel(
                title: String(format: getInTheCall(), meetingParticipants.count),
                accessibilityIdentifier: "??")

            lobbyParticipants = sortParticipants(
                participants: lobbyParticipantVMs,
                avatarManager: avatarManager)

            lobbyParticipantsTitle = BodyTextWithActionDrawerListItemViewModel(
                title: String(format: getWaitingInLobby(), lobbyParticipants.count),
                accessibilityIdentifier: "??",
                actionText: getAdmitAllButtonText(),
                confirmTitle: getConfirmTitleAdmitAll(),
                confirmAccept: getConfirmAdmit(),
                confirmDeny: getConfirmDecline(),
                accept: { self.admitAll() },
                deny: { self.declineAll() }
            )

            // Append + More item
            let plusMoreCount =
            remoteParticipantsState.totalParticipantCount - remoteParticipantsState.participantInfoList.count
            if plusMoreCount > 0 {
                meetingParticipants.append(BodyTextDrawerListItemViewModel(
                    title: String(format: getPlusMoreText(), "\(plusMoreCount)"),
                    accessibilityIdentifier: "PlusMore"
                ))
            }
        }
    }