AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Redux/Reducer/NavigationReducer.swift (126 lines of code) (raw):

// // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // import Combine extension Reducer where State == NavigationState, Actions == Action { static var liveNavigationReducer: Self = Reducer { state, action in var navigationStatus = state.status var drawerVisibility = getDrawerVisibility(state: state) var selectedParticipant = state.selectedParticipant switch action { case .visibilityAction(.pipModeEntered): drawerVisibility = .hidden case .callingViewLaunched: navigationStatus = .inCall drawerVisibility = .hidden case .errorAction(.fatalErrorUpdated): navigationStatus = .inCall case .compositeExitAction: navigationStatus = .exit case .errorAction(.statusErrorAndCallReset): navigationStatus = .setup case .hideDrawer: selectedParticipant = nil drawerVisibility = .hidden case .showSupportForm: drawerVisibility = .supportFormVisible case .showEndCallConfirmation: drawerVisibility = .endCallConfirmationVisible case .showMoreOptions: drawerVisibility = .moreOptionsVisible case .showAudioSelection: drawerVisibility = .audioSelectionVisible case .showSupportShare: drawerVisibility = .supportShareSheetVisible case .showParticipants: drawerVisibility = .participantsVisible case .showParticipantActions(let participant): drawerVisibility = .participantActionsVisible selectedParticipant = participant case .showCaptionsRttListView: drawerVisibility = .captionsViewVisible case .showSpokenLanguageView: drawerVisibility = .spokenLanguageViewVisible case .showCaptionsLanguageView: drawerVisibility = .captionsLangaugeViewVisible case .localUserAction(.audioDeviceChangeRequested): drawerVisibility = .hidden case .captionsAction(.setSpokenLanguageRequested(language: let language)), .captionsAction(.setCaptionLanguageRequested(language: let language)): drawerVisibility = .hidden case .audioSessionAction, .callingAction(.callIdUpdated), .callingAction(.callStartRequested), .callingAction(.callEndRequested), .callingAction(.callEnded), .callingAction(.requestFailed), .callingAction(.stateUpdated), .callingAction(.setupCall), .callingAction(.recordingStateUpdated), .callingAction(.transcriptionStateUpdated), .callingAction(.resumeRequested), .callingAction(.holdRequested), .callingAction(.recordingUpdated), .callingAction(.transcriptionUpdated), .callingAction(.dismissRecordingTranscriptionBannedUpdated), /* <CALL_START_TIME> .callingAction(.callStartTimeUpdated), </CALL_START_TIME> */ .captionsAction, .rttAction, .lifecycleAction, .localUserAction, .remoteParticipantsAction, .permissionAction, .visibilityAction, .callDiagnosticAction, .toastNotificationAction, .callScreenInfoHeaderAction, .setTotalParticipantCount, .buttonViewDataAction: return state } return NavigationState(status: navigationStatus, supportFormVisible: drawerVisibility.isSupportFormVisible, captionsViewVisible: drawerVisibility.isCaptionsViewVisible, captionsLanguageViewVisible: drawerVisibility.isCaptionsLangauageViewVisible, spokenLanguageViewVisible: drawerVisibility.isSpokenLanguageViewVisible, endCallConfirmationVisible: drawerVisibility.isEndCallConfirmationVisible, audioSelectionVisible: drawerVisibility.isAudioSelectionVisible, moreOptionsVisible: drawerVisibility.isMoreOptionsVisible, supportShareSheetVisible: drawerVisibility.isSupportShareSheetVisible, participantsVisible: drawerVisibility.isParticipantsVisible, participantActionsVisible: drawerVisibility.isParticipantActionsVisible, selectedParticipant: selectedParticipant) } enum DrawerVisibility { case hidden case supportFormVisible case supportShareSheetVisible case endCallConfirmationVisible case audioSelectionVisible case moreOptionsVisible case participantsVisible case participantActionsVisible case captionsViewVisible case captionsLangaugeViewVisible case spokenLanguageViewVisible var isSupportFormVisible: Bool { self == .supportFormVisible } var isSupportShareSheetVisible: Bool { self == .supportShareSheetVisible } var isEndCallConfirmationVisible: Bool { self == .endCallConfirmationVisible } var isAudioSelectionVisible: Bool { self == .audioSelectionVisible } var isMoreOptionsVisible: Bool { self == .moreOptionsVisible } var isParticipantsVisible: Bool { self == .participantsVisible } var isParticipantActionsVisible: Bool { self == .participantActionsVisible } var isCaptionsViewVisible: Bool { self == .captionsViewVisible } var isCaptionsLangauageViewVisible: Bool { self == .captionsLangaugeViewVisible } var isSpokenLanguageViewVisible: Bool { self == .spokenLanguageViewVisible} } static func getDrawerVisibility(state: NavigationState) -> DrawerVisibility { return state.supportFormVisible ? .supportFormVisible : state.supportShareSheetVisible ? .supportShareSheetVisible : state.endCallConfirmationVisible ? .endCallConfirmationVisible : state.audioSelectionVisible ? .audioSelectionVisible : state.participantsVisible ? .participantsVisible : state.participantActionsVisible ? .participantActionsVisible : state.captionsRttViewVisible ? .captionsViewVisible : state.captionsLanguageViewVisible ? .captionsLangaugeViewVisible : state.spokenLanguageViewVisible ? .spokenLanguageViewVisible : state.moreOptionsVisible ? .moreOptionsVisible : .hidden } }