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
@@ -47,10 +47,6 @@ extension TemplateSimpleScreenPromptType: Identifiable, CaseIterable {
// MARK: View model
enum TemplateSimpleScreenStateAction {
case viewAction(TemplateSimpleScreenViewAction)
}
enum TemplateSimpleScreenViewModelResult {
case accept
case cancel
@@ -18,7 +18,7 @@ import SwiftUI
@available(iOS 14, *)
typealias TemplateSimpleScreenViewModelType = StateStoreViewModel<TemplateSimpleScreenViewState,
TemplateSimpleScreenStateAction,
Never,
TemplateSimpleScreenViewAction>
@available(iOS 14, *)
class TemplateSimpleScreenViewModel: TemplateSimpleScreenViewModelType, TemplateSimpleScreenViewModelProtocol {
@@ -45,23 +45,10 @@ class TemplateSimpleScreenViewModel: TemplateSimpleScreenViewModelType, Template
completion?(.accept)
case .cancel:
completion?(.cancel)
case .incrementCount, .decrementCount:
dispatch(action: .viewAction(viewAction))
case .incrementCount:
state.count += 1
case .decrementCount:
state.count -= 1
}
}
override class func reducer(state: inout TemplateSimpleScreenViewState, action: TemplateSimpleScreenStateAction) {
switch action {
case .viewAction(let viewAction):
switch viewAction {
case .incrementCount:
state.count += 1
case .decrementCount:
state.count -= 1
case .accept, .cancel:
break
}
}
UILog.debug("[TemplateSimpleScreenViewModel] reducer with action \(action) produced state: \(state)")
}
}
@@ -41,11 +41,6 @@ extension TemplateUserProfilePresence: Identifiable, CaseIterable {
// MARK: View model
enum TemplateUserProfileStateAction {
case viewAction(TemplateUserProfileViewAction)
case updatePresence(TemplateUserProfilePresence)
}
enum TemplateUserProfileViewModelResult {
case cancel
case done
@@ -19,7 +19,7 @@ import Combine
@available(iOS 14, *)
typealias TemplateUserProfileViewModelType = StateStoreViewModel<TemplateUserProfileViewState,
TemplateUserProfileStateAction,
Never,
TemplateUserProfileViewAction>
@available(iOS 14, *)
class TemplateUserProfileViewModel: TemplateUserProfileViewModelType, TemplateUserProfileViewModelProtocol {
@@ -54,49 +54,28 @@ class TemplateUserProfileViewModel: TemplateUserProfileViewModelType, TemplateUs
count: 0
)
}
private func setupPresenceObserving() {
let presenceUpdatePublisher = templateUserProfileService.presenceSubject
.map(TemplateUserProfileStateAction.updatePresence)
.eraseToAnyPublisher()
dispatch(actionPublisher: presenceUpdatePublisher)
templateUserProfileService
.presenceSubject
.sink(receiveValue: { [weak self] presence in
self?.state.presence = presence
})
.store(in: &cancellables)
}
// MARK: - Public
override func process(viewAction: TemplateUserProfileViewAction) {
switch viewAction {
case .cancel:
cancel()
completion?(.cancel)
case .done:
done()
case .incrementCount, .decrementCount:
dispatch(action: .viewAction(viewAction))
completion?(.done)
case .incrementCount:
state.count += 1
case .decrementCount:
state.count -= 1
}
}
override class func reducer(state: inout TemplateUserProfileViewState, action: TemplateUserProfileStateAction) {
switch action {
case .updatePresence(let presence):
state.presence = presence
case .viewAction(let viewAction):
switch viewAction {
case .incrementCount:
state.count += 1
case .decrementCount:
state.count -= 1
case .cancel, .done:
break
}
}
UILog.debug("[TemplateUserProfileViewModel] reducer with action \(action) produced state: \(state)")
}
private func done() {
completion?(.done)
}
private func cancel() {
completion?(.cancel)
}
}
@@ -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() {