Made StateStoreViewModel state mutable and removed the reducer for all the features using it.

This commit is contained in:
Stefan Ceriu
2022-01-28 12:58:31 +02:00
committed by Stefan Ceriu
parent fc9e95aee8
commit 313b05485a
42 changed files with 324 additions and 431 deletions
@@ -83,13 +83,6 @@ enum TemplateRoomChatRoomInitializationStatus {
case failedToInitialize
}
/// Actions to be performed on the `ViewModel` State
enum TemplateRoomChatStateAction {
case updateRoomInitializationStatus(TemplateRoomChatRoomInitializationStatus)
case updateBubbles([TemplateRoomChatBubble])
case clearMessageInput
}
/// Actions sent by the `ViewModel` to the `Coordinator`
enum TemplateRoomChatViewModelAction {
case done
@@ -19,7 +19,7 @@ import Combine
@available(iOS 14, *)
typealias TemplateRoomChatViewModelType = StateStoreViewModel<TemplateRoomChatViewState,
TemplateRoomChatStateAction,
Never,
TemplateRoomChatViewAction>
@available(iOS 14, *)
@@ -48,21 +48,22 @@ class TemplateRoomChatViewModel: TemplateRoomChatViewModelType, TemplateRoomChat
}
private func setupRoomInitializationObserving() {
let initializationPublisher = templateRoomChatService
templateRoomChatService
.roomInitializationStatus
.map(TemplateRoomChatStateAction.updateRoomInitializationStatus)
.eraseToAnyPublisher()
dispatch(actionPublisher: initializationPublisher)
.sink { [weak self] status in
self?.state.roomInitializationStatus = status
}
.store(in: &cancellables)
}
private func setupMessageObserving() {
let messageActionPublisher = templateRoomChatService
templateRoomChatService
.chatMessagesSubject
.map(Self.makeBubbles(messages:))
.map(TemplateRoomChatStateAction.updateBubbles)
.eraseToAnyPublisher()
dispatch(actionPublisher: messageActionPublisher)
.sink { [weak self] bubbles in
self?.state.bubbles = bubbles
}
.store(in: &cancellables)
}
private static func defaultState(templateRoomChatService: TemplateRoomChatServiceProtocol) -> TemplateRoomChatViewState {
@@ -117,27 +118,10 @@ class TemplateRoomChatViewModel: TemplateRoomChatViewModelType, TemplateRoomChat
override func process(viewAction: TemplateRoomChatViewAction) {
switch viewAction {
case .done:
done()
callback?(.done)
case .sendMessage:
templateRoomChatService.send(textMessage: state.bindings.messageInput)
dispatch(action: .clearMessageInput)
}
}
override class func reducer(state: inout TemplateRoomChatViewState, action: TemplateRoomChatStateAction) {
switch action {
case .updateRoomInitializationStatus(let status):
state.roomInitializationStatus = status
case .clearMessageInput:
state.bindings.messageInput = ""
case .updateBubbles(let bubbles):
state.bubbles = bubbles
}
}
// MARK: - Private
private func done() {
callback?(.done)
}
}
@@ -32,11 +32,6 @@ enum TemplateRoomListCoordinatorAction {
// MARK: - View model
/// Actions to be performed on the `ViewModel` State
enum TemplateRoomListStateAction {
case updateRooms([TemplateRoomListRoom])
}
/// Actions sent by the`ViewModel` to the `Coordinator`.
enum TemplateRoomListViewModelAction {
case didSelectRoom(String)
@@ -19,7 +19,7 @@ import Combine
@available(iOS 14, *)
typealias TemplateRoomListViewModelType = StateStoreViewModel<TemplateRoomListViewState,
TemplateRoomListStateAction,
Never,
TemplateRoomListViewAction>
@available(iOS 14.0, *)
class TemplateRoomListViewModel: TemplateRoomListViewModelType, TemplateRoomListViewModelProtocol {
@@ -47,10 +47,12 @@ class TemplateRoomListViewModel: TemplateRoomListViewModelType, TemplateRoomList
}
private func startObservingRooms() {
let roomsUpdatePublisher = templateRoomListService.roomsSubject
.map(TemplateRoomListStateAction.updateRooms)
.eraseToAnyPublisher()
dispatch(actionPublisher: roomsUpdatePublisher)
templateRoomListService
.roomsSubject
.sink { [weak self] rooms in
self?.state.rooms = rooms
}
.store(in: &cancellables)
}
// MARK: - Public
@@ -64,13 +66,6 @@ class TemplateRoomListViewModel: TemplateRoomListViewModelType, TemplateRoomList
}
}
override class func reducer(state: inout TemplateRoomListViewState, action: TemplateRoomListStateAction) {
switch action {
case .updateRooms(let rooms):
state.rooms = rooms
}
}
// MARK: - Private
private func done() {