From 5740254564a1aa922c0869197369c47f9dd36347 Mon Sep 17 00:00:00 2001 From: opficdev Date: Fri, 22 May 2026 22:07:49 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20Home=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=A1=9C=EB=93=9C=20=ED=8A=B8?= =?UTF-8?q?=EB=A6=AC=EA=B1=B0=EB=A5=BC=20MainView=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Home/Home/HomeView.swift | 3 -- .../Sources/Home/Home/HomeViewModel.swift | 6 +-- .../Sources/Main/MainView.swift | 39 ++++++++++--------- .../Sources/Root/RootView.swift | 16 +++++--- .../Tests/WebPage/DeleteWebPageTests.swift | 4 +- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/Application/DevLogPresentation/Sources/Home/Home/HomeView.swift b/Application/DevLogPresentation/Sources/Home/Home/HomeView.swift index 45b19ddb..3627f29d 100644 --- a/Application/DevLogPresentation/Sources/Home/Home/HomeView.swift +++ b/Application/DevLogPresentation/Sources/Home/Home/HomeView.swift @@ -82,9 +82,6 @@ struct HomeView: View { .font(.caption) .multilineTextAlignment(.center) } - .onAppear { - coordinator.viewModel.send(.onAppear) - } .overlay { if coordinator.viewModel.state.isAppending { LoadingView() diff --git a/Application/DevLogPresentation/Sources/Home/Home/HomeViewModel.swift b/Application/DevLogPresentation/Sources/Home/Home/HomeViewModel.swift index ed634c75..11cb785b 100644 --- a/Application/DevLogPresentation/Sources/Home/Home/HomeViewModel.swift +++ b/Application/DevLogPresentation/Sources/Home/Home/HomeViewModel.swift @@ -38,7 +38,7 @@ final class HomeViewModel: Store { } enum Action { - case onAppear + case loadInitialData case networkStatusChanged(Bool) case setPresentation(Presentation, Bool) case setAlert(isPresented: Bool, type: AlertType? = nil) @@ -145,7 +145,7 @@ final class HomeViewModel: Store { switch action { case .networkStatusChanged(let isConnected): state.isNetworkConnected = isConnected - case .onAppear, .setPresentation, .setAlert, .setToast, .refreshWebPages, + case .loadInitialData, .setPresentation, .setAlert, .setToast, .refreshWebPages, .tapTodoCategory, .orderTodoCategory, .addTodo, .updateWebPageURLInput, .addWebPage, .deleteWebPage, .undoDeleteWebPage: effects = reduceByView(action, state: &state) @@ -274,7 +274,7 @@ private extension HomeViewModel { // swiftlint:disable cyclomatic_complexity func reduceByView(_ action: Action, state: inout State) -> [SideEffect] { switch action { - case .onAppear: + case .loadInitialData: return [.fetchTodoCategoryPreferences, .fetchRecentTodos, .fetchWebPages] case .refreshWebPages: return [.fetchWebPages] diff --git a/Application/DevLogPresentation/Sources/Main/MainView.swift b/Application/DevLogPresentation/Sources/Main/MainView.swift index ed8a86c0..ca66b3b2 100644 --- a/Application/DevLogPresentation/Sources/Main/MainView.swift +++ b/Application/DevLogPresentation/Sources/Main/MainView.swift @@ -15,11 +15,11 @@ struct MainView: View { @State private var homeViewCoordinator: HomeViewCoordinator @State private var todayViewCoordinator: TodayViewCoordinator @State private var profileViewCoordinator: ProfileViewCoordinator - @Binding var selectedTab: MainTab + @Binding var selectedTab: MainTab? init( container: DIContainer, - selectedTab: Binding + selectedTab: Binding ) { self._coordinator = State(initialValue: MainViewCoordinator(container: container)) self._homeViewCoordinator = State(initialValue: HomeViewCoordinator(container: container)) @@ -30,14 +30,19 @@ struct MainView: View { var body: some View { Group { - if isCompactLayout { - tabView - } else { - sidebarView + if let selectedTab { + if isCompactLayout { + tabView + } else { + sidebarView(for: selectedTab) + } } } - .onAppear { + .onChange(of: selectedTab) { oldValue, newValue in coordinator.mainViewModel.send(.onAppear) + if oldValue == nil && newValue == .home { + homeViewCoordinator.viewModel.send(.loadInitialData) + } } .alert( coordinator.mainViewModel.state.alertTitle, @@ -55,37 +60,37 @@ struct MainView: View { .tabItem { tabLabel(.home) } - .tag(MainTab.home) + .tag(MainTab.home as MainTab?) todayView .tabItem { tabLabel(.today) } - .tag(MainTab.today) + .tag(MainTab.today as MainTab?) notificationView .tabItem { tabLabel(.notification) } .badge(coordinator.mainViewModel.state.unreadPushCount) - .tag(MainTab.notification) + .tag(MainTab.notification as MainTab?) profileView .tabItem { tabLabel(.profile) } - .tag(MainTab.profile) + .tag(MainTab.profile as MainTab?) } } @ViewBuilder - private var sidebarView: some View { + private func sidebarView(for selectedTab: MainTab) -> some View { switch selectedTab.mainTabSplitStyle { case .detailOnly: NavigationSplitView { mainSidebar } detail: { - selectedTabView + selectedTabView(for: selectedTab) } case .contentDetail: switch selectedTab { @@ -138,7 +143,7 @@ struct MainView: View { NavigationSplitView { mainSidebar } detail: { - selectedTabView + selectedTabView(for: selectedTab) } } } @@ -155,7 +160,7 @@ struct MainView: View { } @ViewBuilder - private var selectedTabView: some View { + private func selectedTabView(for selectedTab: MainTab) -> some View { switch selectedTab { case .home: homeView @@ -338,9 +343,7 @@ private extension MainView { Binding( get: { selectedTab }, set: { tab in - if let tab { - selectedTab = tab - } + selectedTab = tab } ) } diff --git a/Application/DevLogPresentation/Sources/Root/RootView.swift b/Application/DevLogPresentation/Sources/Root/RootView.swift index 58a46cc4..81c34307 100644 --- a/Application/DevLogPresentation/Sources/Root/RootView.swift +++ b/Application/DevLogPresentation/Sources/Root/RootView.swift @@ -14,7 +14,7 @@ public struct RootView: View { @Environment(\.diContainer) var container: DIContainer @State var viewModel: RootViewModel @State private var selectedRoute: Route? - @State private var selectedMainTab = MainTab.home + @State private var selectedMainTab: MainTab? private let widgetURLTab: (URL) -> MainTab? private let pushNotificationTodoIdPublisher: AnyPublisher private let clearPushNotificationRoute: () -> Void @@ -56,16 +56,22 @@ public struct RootView: View { .preferredColorScheme(viewModel.state.theme.colorScheme) .onAppear { viewModel.send(.onAppear) } .onChange(of: viewModel.state.signIn) { _, value in - guard value == false else { return } - selectedMainTab = .home + guard let value else { return } + if value { + selectedMainTab = .home + } else { + selectedMainTab = nil + } } .onOpenURL { url in guard let mainTab = widgetURLTab(url) else { return } switch viewModel.state.signIn { case .some(false): - selectedMainTab = .home - case .some(true), .none: + break + case .some(true): selectedMainTab = mainTab + case .none: + break } } .alert(viewModel.state.alertTitle, isPresented: Binding( diff --git a/Application/DevLogPresentation/Tests/WebPage/DeleteWebPageTests.swift b/Application/DevLogPresentation/Tests/WebPage/DeleteWebPageTests.swift index 2af51c17..45c54902 100644 --- a/Application/DevLogPresentation/Tests/WebPage/DeleteWebPageTests.swift +++ b/Application/DevLogPresentation/Tests/WebPage/DeleteWebPageTests.swift @@ -45,7 +45,7 @@ struct DeleteWebPageTests { networkConnectivityUseCase: observeNetworkConnectivityUseCaseSpy ) - homeViewModel.send(.onAppear) + homeViewModel.send(.loadInitialData) await waitUntil { !homeViewModel.state.webPages.isEmpty } @@ -97,7 +97,7 @@ struct DeleteWebPageTests { networkConnectivityUseCase: observeNetworkConnectivityUseCaseSpy ) - homeViewModel.send(.onAppear) + homeViewModel.send(.loadInitialData) await waitUntil { !homeViewModel.state.webPages.isEmpty } From 800d31396df3bb8abe450c9b9df71bceb8f52b69 Mon Sep 17 00:00:00 2001 From: opficdev Date: Fri, 22 May 2026 22:11:08 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20HomeViewModel=EC=9D=98=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20=EB=B3=B8=EC=9D=B8?= =?UTF-8?q?=EC=9D=98=20Coordinator=EC=97=90=EC=84=9C=20=ED=98=B8=EC=B6=9C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=98=95=ED=83=9C=EB=A1=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Home/Home/HomeViewCoordinator.swift | 4 ++++ Application/DevLogPresentation/Sources/Main/MainView.swift | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Application/DevLogPresentation/Sources/Home/Home/HomeViewCoordinator.swift b/Application/DevLogPresentation/Sources/Home/Home/HomeViewCoordinator.swift index 1508b86c..477d4d44 100644 --- a/Application/DevLogPresentation/Sources/Home/Home/HomeViewCoordinator.swift +++ b/Application/DevLogPresentation/Sources/Home/Home/HomeViewCoordinator.swift @@ -45,6 +45,10 @@ final class HomeViewCoordinator { ) } + func loadInitialData() { + viewModel.send(.loadInitialData) + } + func makeTodoManageViewModel() -> TodoManageViewModel { TodoManageViewModel(viewModel.state.preferences) } diff --git a/Application/DevLogPresentation/Sources/Main/MainView.swift b/Application/DevLogPresentation/Sources/Main/MainView.swift index ca66b3b2..f59fb36d 100644 --- a/Application/DevLogPresentation/Sources/Main/MainView.swift +++ b/Application/DevLogPresentation/Sources/Main/MainView.swift @@ -41,7 +41,7 @@ struct MainView: View { .onChange(of: selectedTab) { oldValue, newValue in coordinator.mainViewModel.send(.onAppear) if oldValue == nil && newValue == .home { - homeViewCoordinator.viewModel.send(.loadInitialData) + homeViewCoordinator.loadInitialData() } } .alert( From 9ce11cab343a06e1a65518ab8f8249410ba5c859 Mon Sep 17 00:00:00 2001 From: opficdev Date: Fri, 22 May 2026 22:28:29 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=ED=98=B9=EC=8B=9C=EB=82=98=20?= =?UTF-8?q?=ED=95=98=EB=8A=94=20nil=20=EB=B0=A9=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Application/DevLogPresentation/Sources/Main/MainView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Application/DevLogPresentation/Sources/Main/MainView.swift b/Application/DevLogPresentation/Sources/Main/MainView.swift index f59fb36d..4394be98 100644 --- a/Application/DevLogPresentation/Sources/Main/MainView.swift +++ b/Application/DevLogPresentation/Sources/Main/MainView.swift @@ -343,7 +343,9 @@ private extension MainView { Binding( get: { selectedTab }, set: { tab in - selectedTab = tab + if let tab { + selectedTab = tab + } } ) } From 09a0e23f54b8c2e89e0e554109a75aad41577787 Mon Sep 17 00:00:00 2001 From: opficdev Date: Fri, 22 May 2026 22:34:54 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20MainView=EC=9D=98=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EA=B4=80=EC=B0=B0=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C?= =?UTF-8?q?=EC=A0=90=EC=9D=84=20onAppear=EB=A1=9C=20=EB=90=98=EB=8F=8C?= =?UTF-8?q?=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Application/DevLogPresentation/Sources/Main/MainView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Application/DevLogPresentation/Sources/Main/MainView.swift b/Application/DevLogPresentation/Sources/Main/MainView.swift index 4394be98..ee04bafb 100644 --- a/Application/DevLogPresentation/Sources/Main/MainView.swift +++ b/Application/DevLogPresentation/Sources/Main/MainView.swift @@ -38,8 +38,10 @@ struct MainView: View { } } } - .onChange(of: selectedTab) { oldValue, newValue in + .onAppear { coordinator.mainViewModel.send(.onAppear) + } + .onChange(of: selectedTab) { oldValue, newValue in if oldValue == nil && newValue == .home { homeViewCoordinator.loadInitialData() } From 1f50cf8173be67c63afcf11bd0478f51dbb9620d Mon Sep 17 00:00:00 2001 From: opficdev Date: Fri, 22 May 2026 22:59:29 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20Home=20=ED=83=AD=20=EC=9E=AC?= =?UTF-8?q?=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=EC=B4=88=EA=B8=B0=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=A1=9C=EB=93=9C=EA=B0=80=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EC=88=98=ED=96=89=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Application/DevLogPresentation/Sources/Main/MainView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Application/DevLogPresentation/Sources/Main/MainView.swift b/Application/DevLogPresentation/Sources/Main/MainView.swift index ee04bafb..b9dc7471 100644 --- a/Application/DevLogPresentation/Sources/Main/MainView.swift +++ b/Application/DevLogPresentation/Sources/Main/MainView.swift @@ -41,8 +41,8 @@ struct MainView: View { .onAppear { coordinator.mainViewModel.send(.onAppear) } - .onChange(of: selectedTab) { oldValue, newValue in - if oldValue == nil && newValue == .home { + .onChange(of: selectedTab) { _, newValue in + if newValue == .home { homeViewCoordinator.loadInitialData() } }