diff --git a/DevLog/Presentation/ViewModel/AccountViewModel.swift b/DevLog/Presentation/ViewModel/AccountViewModel.swift index 9aac266..096d3f0 100644 --- a/DevLog/Presentation/ViewModel/AccountViewModel.swift +++ b/DevLog/Presentation/ViewModel/AccountViewModel.swift @@ -64,14 +64,15 @@ final class AccountViewModel: Store { func reduce(with action: Action) -> [SideEffect] { var state = self.state + var effects: [SideEffect] = [] switch action { case .onAppear: - return [.fetch] + effects = [.fetch] case .linkWithProvider(let value): - return [.link(value)] + effects = [.link(value)] case .unlinkFromProvider(let value): - return [.unlink(value)] + effects = [.unlink(value)] case .setAlert(let isPresented, let type): setAlert(&state, isPresented: isPresented, type: type) case .setToast(let isPresented, let type): @@ -86,7 +87,7 @@ final class AccountViewModel: Store { } self.state = state - return [] + return effects } func run(_ effect: SideEffect) { diff --git a/DevLog/Presentation/ViewModel/LoginViewModel.swift b/DevLog/Presentation/ViewModel/LoginViewModel.swift index 45cdb56..622d3e0 100644 --- a/DevLog/Presentation/ViewModel/LoginViewModel.swift +++ b/DevLog/Presentation/ViewModel/LoginViewModel.swift @@ -60,16 +60,15 @@ final class LoginViewModel: Store { func reduce(with action: Action) -> [SideEffect] { var state = self.state + var effects: [SideEffect] = [] switch action { case .setAlert(let isPresented): setAlert(&state, isPresented: isPresented) case .tapSignInButton(let authProvider): - self.state = state - return [.signIn(authProvider)] + effects = [.signIn(authProvider)] case .tapSignOutButton, .signOutAuto: - self.state = state - return [.signOut] + effects = [.signOut] case .setLoading(let value): state.isLoading = value case .setLogined(let result): @@ -77,7 +76,7 @@ final class LoginViewModel: Store { } self.state = state - return [] + return effects } func run(_ effect: SideEffect) { diff --git a/DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift b/DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift index 9979086..e782912 100644 --- a/DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift +++ b/DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift @@ -61,6 +61,7 @@ final class PushNotificationSettingsViewModel: Store { func reduce(with action: Action) -> [SideEffect] { var state = self.state var effects: [SideEffect] = [] + switch action { case .fetchSettings: effects = [.fetchPushNotificationSettings] diff --git a/DevLog/Presentation/ViewModel/RootViewModel.swift b/DevLog/Presentation/ViewModel/RootViewModel.swift index 0ff64a0..1cd8c4c 100644 --- a/DevLog/Presentation/ViewModel/RootViewModel.swift +++ b/DevLog/Presentation/ViewModel/RootViewModel.swift @@ -66,6 +66,7 @@ final class RootViewModel: Store { func reduce(with action: Action) -> [SideEffect] { var state = self.state + var effects: [SideEffect] = [] switch action { case .setAlert(let isPresented): @@ -82,13 +83,13 @@ final class RootViewModel: Store { case .setTheme(let theme): state.theme = theme case .signOutAuto: - return [.signOut] + effects = [.signOut] case .didLogined(let result): state.signIn = result } self.state = state - return [] + return effects } func run(_ effect: SideEffect) { diff --git a/DevLog/Presentation/ViewModel/SettingViewModel.swift b/DevLog/Presentation/ViewModel/SettingViewModel.swift index 7a68862..80a9604 100644 --- a/DevLog/Presentation/ViewModel/SettingViewModel.swift +++ b/DevLog/Presentation/ViewModel/SettingViewModel.swift @@ -65,6 +65,9 @@ final class SettingViewModel: Store { } func reduce(with action: Action) -> [SideEffect] { + var state = self.state + var effects: [SideEffect] = [] + switch action { case .setAlert(let isPresented, let type): setAlert(&state, isPresented: isPresented, type: type) @@ -76,9 +79,9 @@ final class SettingViewModel: Store { case .updateDirSize: state.dirSize = dirSizeInBytes() case .tapDeleteAuthButton: - return [.deleteAuth] + effects = [.deleteAuth] case .tapSignOutButton: - return [.signOut] + effects = [.signOut] case .tapRemoveCacheButton: setAlert(&state, isPresented: true, type: .removeCache) case .confirmRemoveCache: @@ -90,7 +93,9 @@ final class SettingViewModel: Store { setAlert(&state, isPresented: true, type: .error) } } - return [] + + self.state = state + return effects } func run(_ effect: SideEffect) { diff --git a/DevLog/Presentation/ViewModel/TodoDetailViewModel.swift b/DevLog/Presentation/ViewModel/TodoDetailViewModel.swift index 8f484b2..850fba7 100644 --- a/DevLog/Presentation/ViewModel/TodoDetailViewModel.swift +++ b/DevLog/Presentation/ViewModel/TodoDetailViewModel.swift @@ -62,7 +62,7 @@ final class TodoDetailViewModel: Store { case .setLoading(let value): state.isLoading = value case .upsertTodo(let todo): - return [.upsertTodo(todo)] + effects = [.upsertTodo(todo)] } self.state = state diff --git a/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift b/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift index 8942b76..f5c0ae5 100644 --- a/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift +++ b/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift @@ -78,15 +78,19 @@ final class TodoEditorViewModel: Store { } func reduce(with action: Action) -> [SideEffect] { + var state = self.state + switch action { case .addTag(let tag): - if !tag.isEmpty { state.tags.append(tag) } + if !tag.isEmpty { + state.tags.append(tag) + } case .removeTag(let tagText): state.tags.removeAll { $0 == tagText } case .setContent(let stringValue), .setTagText(let stringValue), .setTitle(let stringValue): - handleStringAction(action, stringValue: stringValue) + handleStringAction(action, stringValue: stringValue, state: &state) case .setDueDate(let dueDate): if let tomorrowDate = calendar.date(byAdding: .day, value: 1, to: Date()), let dueDate { state.dueDate = max(dueDate, tomorrowDate) @@ -102,12 +106,18 @@ final class TodoEditorViewModel: Store { state.dueDate = calendar.date(byAdding: .day, value: 1, to: Date()) } } + + self.state = state return [] } } extension TodoEditorViewModel { - private func handleStringAction(_ action: Action, stringValue: String) { + private func handleStringAction( + _ action: Action, + stringValue: String, + state: inout State + ) { switch action { case .setContent: state.content = stringValue diff --git a/DevLog/Presentation/ViewModel/TodoManageViewModel.swift b/DevLog/Presentation/ViewModel/TodoManageViewModel.swift index ac993b6..bf3549c 100644 --- a/DevLog/Presentation/ViewModel/TodoManageViewModel.swift +++ b/DevLog/Presentation/ViewModel/TodoManageViewModel.swift @@ -26,6 +26,8 @@ final class TodoManageViewModel: Store { } func reduce(with action: Action) -> [SideEffect] { + var state = self.state + switch action { case .moveItem(let from, let target): state.todoKindPreferences.move(fromOffsets: from, toOffset: target) @@ -34,6 +36,8 @@ final class TodoManageViewModel: Store { state.todoKindPreferences[index].isVisible.toggle() } } + + self.state = state return [] } }