AzureCommunicationUI/sdk/AzureCommunicationUICalling/Sources/Redux/Reducer/LocalUserReducer.swift (119 lines of code) (raw):
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
import Combine
import Foundation
extension Reducer where State == LocalUserState,
Actions == LocalUserAction {
static var liveLocalUserReducer: Self = Reducer { localUserState, action in
var cameraStatus = localUserState.cameraState.operation
var cameraDeviceStatus = localUserState.cameraState.device
var cameraTransmissionStatus = localUserState.cameraState.transmission
var cameraError = localUserState.cameraState.error
var audioOperationStatus = localUserState.audioState.operation
var audioDeviceStatus = localUserState.audioState.device
var audioError = localUserState.audioState.error
let displayName = localUserState.displayName
var localVideoStreamIdentifier = localUserState.localVideoStreamIdentifier
var participantRole = localUserState.participantRole
var capabilities = localUserState.capabilities
var currentCapabilitiesAreDefault = localUserState.currentCapabilitiesAreDefault
switch action {
case .cameraPreviewOnTriggered:
cameraTransmissionStatus = .local
cameraStatus = .pending
case .cameraOnTriggered:
cameraTransmissionStatus = .remote
cameraStatus = .pending
case .cameraOffTriggered:
cameraStatus = .pending
case .cameraOnSucceeded(let videoStreamId):
localVideoStreamIdentifier = videoStreamId
cameraStatus = .on
case .cameraOnFailed(let error):
cameraStatus = .off
cameraError = error
case .cameraOffSucceeded:
localVideoStreamIdentifier = nil
cameraStatus = .off
case .cameraOffFailed(let error):
cameraError = error
case .cameraPausedSucceeded:
cameraStatus = .paused
case .cameraPausedFailed(let error):
cameraError = error
case .cameraSwitchTriggered:
cameraDeviceStatus = .switching
case .cameraSwitchSucceeded(let cameraDevice):
cameraDeviceStatus = cameraDevice == .front ? .front : .back
case .cameraSwitchFailed(let previousCamera, let error):
cameraDeviceStatus = previousCamera
cameraError = error
case .microphoneOnTriggered,
.microphoneOffTriggered:
audioOperationStatus = .pending
case .microphonePreviewOn:
audioOperationStatus = .on
case .microphoneOnFailed(let error):
audioOperationStatus = .off
audioError = error
case .microphonePreviewOff:
audioOperationStatus = .off
case .microphoneMuteStateUpdated(let isMuted):
audioOperationStatus = isMuted ? .off : .on
case .microphoneOffFailed(let error):
audioOperationStatus = .on
audioError = error
case .audioDeviceChangeRequested(let device):
audioDeviceStatus = getRequestedDeviceStatus(for: device)
case .audioDeviceChangeSucceeded(let device):
audioDeviceStatus = getSelectedDeviceStatus(for: device)
case .audioDeviceChangeFailed(let error):
audioError = error
case .participantRoleChanged(let newParticipantRole):
participantRole = newParticipantRole
case .setCapabilities(let newCapabilities):
capabilities = newCapabilities
currentCapabilitiesAreDefault = false
case .onCapabilitiesChanged(event: let event):
break
}
let cameraState = LocalUserState.CameraState(operation: cameraStatus,
device: cameraDeviceStatus,
transmission: cameraTransmissionStatus,
error: cameraError)
let audioState = LocalUserState.AudioState(operation: audioOperationStatus,
device: audioDeviceStatus,
error: audioError)
return LocalUserState(cameraState: cameraState,
audioState: audioState,
displayName: displayName,
localVideoStreamIdentifier: localVideoStreamIdentifier,
participantRole: participantRole,
capabilities: capabilities,
currentCapabilitiesAreDefault: currentCapabilitiesAreDefault)
}
}
private func getRequestedDeviceStatus(for audioDeviceType: AudioDeviceType)
-> LocalUserState.AudioDeviceSelectionStatus {
switch audioDeviceType {
case .speaker:
return .speakerRequested
case .receiver:
return .receiverRequested
case .bluetooth:
return .bluetoothRequested
case .headphones:
return .headphonesRequested
}
}
private func getSelectedDeviceStatus(for audioDeviceType: AudioDeviceType)
-> LocalUserState.AudioDeviceSelectionStatus {
switch audioDeviceType {
case .speaker:
return .speakerSelected
case .receiver:
return .receiverSelected
case .bluetooth:
return .bluetoothSelected
case .headphones:
return .headphonesSelected
}
}