mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-05-05 07:27:42 +02:00
VB: Move view logic to the view model
This commit is contained in:
+5
-48
@@ -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
|
||||
}
|
||||
|
||||
+9
-3
@@ -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],
|
||||
|
||||
+35
-7
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-3
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user