VB: Move view logic to the view model

This commit is contained in:
manuroe
2022-10-19 12:56:59 +02:00
parent ac90c2ab51
commit cb0224abf8
5 changed files with 51 additions and 62 deletions
@@ -24,15 +24,13 @@ struct VoiceBroadcastPlaybackCoordinatorParameters {
let voiceBroadcastStartEvent: MXEvent
}
final class VoiceBroadcastPlaybackCoordinator: Coordinator, Presentable, VoiceBroadcastAggregatorDelegate {
final class VoiceBroadcastPlaybackCoordinator: Coordinator, Presentable {
// MARK: - Properties
// MARK: Private
private let parameters: VoiceBroadcastPlaybackCoordinatorParameters
private let selectedAnswerIdentifiersSubject = PassthroughSubject<[String], Never>()
private var voiceBroadcastAggregator: VoiceBroadcastAggregator
private var viewModel: VoiceBroadcastPlaybackViewModelProtocol!
private var cancellables = Set<AnyCancellable>()
@@ -46,23 +44,10 @@ final class VoiceBroadcastPlaybackCoordinator: Coordinator, Presentable, VoiceBr
init(parameters: VoiceBroadcastPlaybackCoordinatorParameters) throws {
self.parameters = parameters
try voiceBroadcastAggregator = VoiceBroadcastAggregator(session: parameters.session, room: parameters.room, voiceBroadcastStartEventId: parameters.voiceBroadcastStartEvent.eventId)
voiceBroadcastAggregator.delegate = self
viewModel = VoiceBroadcastPlaybackViewModel(VoiceBroadcastPlaybackDetails: buildVoiceBroadcastPlaybackFrom(voiceBroadcastAggregator.voiceBroadcast))
viewModel.completion = { [weak self] result in
guard let self = self else { return }
switch result {
case .played:
// TODO: VB Add player and playing chunk files
MXLog.debug("click on play")
case .paused:
// TODO: VB stop playing chunk files
MXLog.debug("click on pause")
}
}
let voiceBroadcastAggregator = try VoiceBroadcastAggregator(session: parameters.session, room: parameters.room, voiceBroadcastStartEventId: parameters.voiceBroadcastStartEvent.eventId)
viewModel = VoiceBroadcastPlaybackViewModel(mediaServiceProvider: VoiceMessageMediaServiceProvider.sharedProvider,
cacheManager: VoiceMessageAttachmentCacheManager.sharedManager,
voiceBroadcastAggregator: voiceBroadcastAggregator)
}
@@ -85,32 +70,4 @@ final class VoiceBroadcastPlaybackCoordinator: Coordinator, Presentable, VoiceBr
}
func endVoiceBroadcast() {}
// MARK: - VoiceBroadcastAggregatorDelegate
func voiceBroadcastAggregatorDidUpdateData(_ aggregator: VoiceBroadcastAggregator) {
viewModel.updateWithVoiceBroadcastDetails(buildVoiceBroadcastPlaybackFrom(aggregator.voiceBroadcast))
}
func voiceBroadcastAggregatorDidStartLoading(_ aggregator: VoiceBroadcastAggregator) { }
func voiceBroadcastAggregatorDidEndLoading(_ aggregator: VoiceBroadcastAggregator) { }
func voiceBroadcastAggregator(_ aggregator: VoiceBroadcastAggregator, didFailWithError: Error) { }
// MARK: - Private
// VoiceBroadcast is intentionally not available in the SwiftUI target as we don't want
// to add the SDK as a dependency to it. We need to translate from one to the other on this level.
func buildVoiceBroadcastPlaybackFrom(_ voiceBroadcast: VoiceBroadcast) -> VoiceBroadcastPlaybackDetails {
return VoiceBroadcastPlaybackDetails(type: voiceBroadcastKindToVoiceBroadcastPlaybackType(voiceBroadcast.kind), chunks: Array(voiceBroadcast.chunks))
}
private func voiceBroadcastKindToVoiceBroadcastPlaybackType(_ kind: VoiceBroadcastKind) -> VoiceBroadcastPlaybackType {
let mapping = [VoiceBroadcastKind.player: VoiceBroadcastPlaybackType.player,
VoiceBroadcastKind.recorder: VoiceBroadcastPlaybackType.recorder]
return mapping[kind] ?? .player
}
}
@@ -22,8 +22,8 @@ enum VoiceBroadcastPlaybackViewAction {
case pause
}
// TODO: Rename it to VoiceBroadcastPlaybackState
enum VoiceBroadcastPlaybackViewModelResult {
// TODO: VB send all chunk file urls from ViewModel
case played
case paused
}
@@ -17,6 +17,12 @@
import Foundation
import SwiftUI
typealias MockVoiceBroadcastPlaybackViewModelType = StateStoreViewModel<VoiceBroadcastPlaybackViewState, VoiceBroadcastPlaybackViewAction>
class MockVoiceBroadcastPlaybackViewModel: MockVoiceBroadcastPlaybackViewModelType, VoiceBroadcastPlaybackViewModelProtocol {
func updateWithVoiceBroadcastDetails(_ voiceBroadcastDetails: VoiceBroadcastPlaybackDetails) {
}
}
/// Using an enum for the screen allows you define the different state cases with
/// the relevant associated data for each case.
enum MockVoiceBroadcastPlaybackScreenState: MockScreenState, CaseIterable {
@@ -36,10 +42,10 @@ enum MockVoiceBroadcastPlaybackScreenState: MockScreenState, CaseIterable {
}
/// Generate the view struct for the screen state.
var screenView: ([Any], AnyView) {
let voiceBroadcast = VoiceBroadcastPlaybackDetails(type: VoiceBroadcastPlaybackType.player, chunks: [])
var screenView: ([Any], AnyView) {
let viewModel = VoiceBroadcastPlaybackViewModel(VoiceBroadcastPlaybackDetails: voiceBroadcast)
let voiceBroadcastPlaybackDetails = VoiceBroadcastPlaybackDetails(type: VoiceBroadcastPlaybackType.player, chunks: [])
let viewModel = MockVoiceBroadcastPlaybackViewModel(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: voiceBroadcastPlaybackDetails, bindings: VoiceBroadcastPlaybackViewStateBindings()))
return (
[false, viewModel],
@@ -20,19 +20,30 @@ import SwiftUI
typealias VoiceBroadcastPlaybackViewModelType = StateStoreViewModel<VoiceBroadcastPlaybackViewState, VoiceBroadcastPlaybackViewAction>
class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType, VoiceBroadcastPlaybackViewModelProtocol {
// MARK: - Properties
// MARK: Private
private var voiceBroadcastAggregator: VoiceBroadcastAggregator
private let mediaServiceProvider: VoiceMessageMediaServiceProvider
private let cacheManager: VoiceMessageAttachmentCacheManager
private var audioPlayer: VoiceMessageAudioPlayer?
// MARK: Public
var completion: ((VoiceBroadcastPlaybackViewModelResult) -> Void)?
// MARK: - Setup
init(VoiceBroadcastPlaybackDetails: VoiceBroadcastPlaybackDetails) {
super.init(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: VoiceBroadcastPlaybackDetails, bindings: VoiceBroadcastPlaybackViewStateBindings()))
init(mediaServiceProvider: VoiceMessageMediaServiceProvider,
cacheManager: VoiceMessageAttachmentCacheManager,
voiceBroadcastAggregator: VoiceBroadcastAggregator) {
self.mediaServiceProvider = mediaServiceProvider
self.cacheManager = cacheManager
self.voiceBroadcastAggregator = voiceBroadcastAggregator
let voiceBroadcastPlaybackDetails = VoiceBroadcastPlaybackDetails(type: VoiceBroadcastPlaybackType.player, chunks: [])
super.init(initialViewState: VoiceBroadcastPlaybackViewState(voiceBroadcast: voiceBroadcastPlaybackDetails, bindings: VoiceBroadcastPlaybackViewStateBindings()))
self.voiceBroadcastAggregator.delegate = self
}
// MARK: - Public
@@ -49,12 +60,10 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType, Voic
/// Listen voice broadcast
private func play() {
// TODO: VB call voice broadcast playback service to play the chunks
completion?(.played)
}
/// Stop voice broadcast
private func pause() {
completion?(.paused)
}
// MARK: - VoiceBroadcastPlaybackViewModelProtocol
@@ -63,3 +72,22 @@ class VoiceBroadcastPlaybackViewModel: VoiceBroadcastPlaybackViewModelType, Voic
state.voiceBroadcast = voiceBroadcastDetails
}
}
extension VoiceBroadcastPlaybackViewModel: VoiceBroadcastAggregatorDelegate {
func voiceBroadcastAggregatorDidStartLoading(_ aggregator: VoiceBroadcastAggregator) {
// TODO: VB
}
func voiceBroadcastAggregatorDidEndLoading(_ aggregator: VoiceBroadcastAggregator) {
// TODO: VB
}
func voiceBroadcastAggregator(_ aggregator: VoiceBroadcastAggregator, didFailWithError: Error) {
// TODO: VB
}
func voiceBroadcastAggregatorDidUpdateData(_ aggregator: VoiceBroadcastAggregator) {
let voiceBroadcastPlaybackDetails = VoiceBroadcastPlaybackDetails(type: .player, chunks: Array(aggregator.voiceBroadcast.chunks))
self.updateWithVoiceBroadcastDetails(voiceBroadcastPlaybackDetails)
}
}
@@ -17,8 +17,6 @@
import Foundation
protocol VoiceBroadcastPlaybackViewModelProtocol {
var context: VoiceBroadcastPlaybackViewModelType.Context { get }
var completion: ((VoiceBroadcastPlaybackViewModelResult) -> Void)? { get set }
var context: VoiceBroadcastPlaybackViewModelType.Context { get }
func updateWithVoiceBroadcastDetails(_ voiceBroadcastDetails: VoiceBroadcastPlaybackDetails)
}