From de8a2d101ded0ac59a3bbc194b5456bed7c122f2 Mon Sep 17 00:00:00 2001 From: opficdev Date: Fri, 27 Feb 2026 09:16:08 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=96=BC=EB=A6=AC=20=EB=A6=AC?= =?UTF-8?q?=ED=84=B4=20=ED=8C=A8=ED=84=B4=EC=9D=84=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B7=B0=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EC=88=98?= =?UTF-8?q?=20=EA=B0=90=EC=86=8C=20=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModel/AccountViewModel.swift | 9 +++++---- .../Presentation/ViewModel/LoginViewModel.swift | 9 ++++----- .../PushNotificationSettingsViewModel.swift | 1 + .../Presentation/ViewModel/RootViewModel.swift | 5 +++-- .../ViewModel/SettingViewModel.swift | 11 ++++++++--- .../ViewModel/TodoDetailViewModel.swift | 2 +- .../ViewModel/TodoEditorViewModel.swift | 16 +++++++++++++--- .../ViewModel/TodoManageViewModel.swift | 4 ++++ 8 files changed, 39 insertions(+), 18 deletions(-) diff --git a/DevLog/Presentation/ViewModel/AccountViewModel.swift b/DevLog/Presentation/ViewModel/AccountViewModel.swift index 9aac2661..096d3f06 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 45cdb564..622d3e07 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 99790865..e7829128 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 0ff64a04..1cd8c4cb 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 7a688627..80a96040 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 8f484b28..850fba76 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 8942b765..f5c0ae53 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 ac993b65..bf3549c8 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 [] } }