Skip to content

Commit e239de4

Browse files
committed
refactor: MainViewCoordinator에서 Todo 관련 뷰모델 책임 분리
1 parent 618ad67 commit e239de4

3 files changed

Lines changed: 69 additions & 49 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// TodoSceneCoordinator.swift
3+
// DevLogPresentation
4+
//
5+
// Created by opfic on 5/31/26.
6+
//
7+
8+
import Foundation
9+
import DevLogCore
10+
import DevLogDomain
11+
12+
@MainActor
13+
@Observable
14+
final class TodoSceneCoordinator {
15+
private let diContainer: DIContainer
16+
@ObservationIgnored
17+
private var listViewModel: TodoListViewModel?
18+
@ObservationIgnored
19+
private var detailViewModel: TodoDetailViewModel?
20+
21+
init(container: DIContainer) {
22+
self.diContainer = container
23+
}
24+
25+
func makeListViewModel(category: TodoCategory) -> TodoListViewModel {
26+
if let listViewModel,
27+
listViewModel.category == category {
28+
return listViewModel
29+
}
30+
31+
let listViewModel = TodoListViewModel(
32+
fetchTodosUseCase: diContainer.resolve(FetchTodosUseCase.self),
33+
fetchTodoByIdUseCase: diContainer.resolve(FetchTodoByIdUseCase.self),
34+
upsertTodoUseCase: diContainer.resolve(UpsertTodoUseCase.self),
35+
deleteTodoUseCase: diContainer.resolve(DeleteTodoUseCase.self),
36+
undoDeleteTodoUseCase: diContainer.resolve(UndoDeleteTodoUseCase.self),
37+
trackAnalyticsEventUseCase: diContainer.resolve(TrackAnalyticsEventUseCase.self),
38+
category: category
39+
)
40+
self.listViewModel = listViewModel
41+
return listViewModel
42+
}
43+
44+
func makeDetailViewModel(
45+
todoId: String,
46+
showEditButton: Bool = true
47+
) -> TodoDetailViewModel {
48+
if let detailViewModel,
49+
detailViewModel.todoId == todoId,
50+
detailViewModel.showEditButton == showEditButton {
51+
return detailViewModel
52+
}
53+
54+
let detailViewModel = TodoDetailViewModel(
55+
fetchTodoUseCase: diContainer.resolve(FetchTodoByIdUseCase.self),
56+
fetchReferenceItemsUseCase: diContainer.resolve(FetchReferenceItemsUseCase.self),
57+
upsertUseCase: diContainer.resolve(UpsertTodoUseCase.self),
58+
todoId: todoId,
59+
showEditButton: showEditButton
60+
)
61+
self.detailViewModel = detailViewModel
62+
return detailViewModel
63+
}
64+
}

Application/DevLogPresentation/Sources/Main/MainView.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import DevLogDomain
1212
struct MainView: View {
1313
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
1414
@State private var coordinator: MainViewCoordinator
15+
@State private var todoSceneCoordinator: TodoSceneCoordinator
1516
@State private var homeViewCoordinator: HomeViewCoordinator
1617
@State private var todayViewCoordinator: TodayViewCoordinator
1718
@State private var pushNotificationListViewCoordinator: PushNotificationListViewCoordinator
@@ -23,6 +24,7 @@ struct MainView: View {
2324
selectedTab: Binding<MainTab?>
2425
) {
2526
self._coordinator = State(initialValue: MainViewCoordinator(container: container))
27+
self._todoSceneCoordinator = State(initialValue: TodoSceneCoordinator(container: container))
2628
self._homeViewCoordinator = State(initialValue: HomeViewCoordinator(container: container))
2729
self._todayViewCoordinator = State(initialValue: TodayViewCoordinator(container: container))
2830
self._pushNotificationListViewCoordinator = State(
@@ -254,11 +256,11 @@ struct MainView: View {
254256
switch homeRoute {
255257
case .category(let item):
256258
TodoListView(
257-
viewModel: coordinator.todoListViewModel(category: item.todoCategory)
259+
viewModel: todoSceneCoordinator.makeListViewModel(category: item.todoCategory)
258260
)
259261
.id(item.id)
260262
case .todo(let item):
261-
TodoDetailView(viewModel: coordinator.todoDetailViewModel(todoId: item.id))
263+
TodoDetailView(viewModel: todoSceneCoordinator.makeDetailViewModel(todoId: item.id))
262264
.id(item.id)
263265
case .webPage(let item):
264266
WebView(url: item.url)
@@ -321,7 +323,7 @@ struct MainView: View {
321323
private func todayDestinationView(_ todayRoute: TodayRoute) -> some View {
322324
switch todayRoute {
323325
case .todo(let item):
324-
TodoDetailView(viewModel: coordinator.todoDetailViewModel(todoId: item.id))
326+
TodoDetailView(viewModel: todoSceneCoordinator.makeDetailViewModel(todoId: item.id))
325327
.id(item.id)
326328
}
327329
}

Application/DevLogPresentation/Sources/Main/MainViewCoordinator.swift

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,57 +13,11 @@ import DevLogDomain
1313
@Observable
1414
final class MainViewCoordinator {
1515
let mainViewModel: MainViewModel
16-
private let diContainer: DIContainer
17-
@ObservationIgnored
18-
private var todoListViewModel: TodoListViewModel?
19-
@ObservationIgnored
20-
private var todoDetailViewModel: TodoDetailViewModel?
2116

2217
init(container: DIContainer) {
23-
self.diContainer = container
2418
self.mainViewModel = MainViewModel(
2519
trackAnalyticsEventUseCase: container.resolve(TrackAnalyticsEventUseCase.self),
2620
unreadPushCountUseCase: container.resolve(ObserveUnreadPushCountUseCase.self)
2721
)
2822
}
29-
30-
func todoListViewModel(category: TodoCategory) -> TodoListViewModel {
31-
if let todoListViewModel,
32-
todoListViewModel.category == category {
33-
return todoListViewModel
34-
}
35-
36-
let todoListViewModel = TodoListViewModel(
37-
fetchTodosUseCase: diContainer.resolve(FetchTodosUseCase.self),
38-
fetchTodoByIdUseCase: diContainer.resolve(FetchTodoByIdUseCase.self),
39-
upsertTodoUseCase: diContainer.resolve(UpsertTodoUseCase.self),
40-
deleteTodoUseCase: diContainer.resolve(DeleteTodoUseCase.self),
41-
undoDeleteTodoUseCase: diContainer.resolve(UndoDeleteTodoUseCase.self),
42-
trackAnalyticsEventUseCase: diContainer.resolve(TrackAnalyticsEventUseCase.self),
43-
category: category
44-
)
45-
self.todoListViewModel = todoListViewModel
46-
return todoListViewModel
47-
}
48-
49-
func todoDetailViewModel(
50-
todoId: String,
51-
showEditButton: Bool = true
52-
) -> TodoDetailViewModel {
53-
if let todoDetailViewModel,
54-
todoDetailViewModel.todoId == todoId,
55-
todoDetailViewModel.showEditButton == showEditButton {
56-
return todoDetailViewModel
57-
}
58-
59-
let todoDetailViewModel = TodoDetailViewModel(
60-
fetchTodoUseCase: diContainer.resolve(FetchTodoByIdUseCase.self),
61-
fetchReferenceItemsUseCase: diContainer.resolve(FetchReferenceItemsUseCase.self),
62-
upsertUseCase: diContainer.resolve(UpsertTodoUseCase.self),
63-
todoId: todoId,
64-
showEditButton: showEditButton
65-
)
66-
self.todoDetailViewModel = todoDetailViewModel
67-
return todoDetailViewModel
68-
}
6923
}

0 commit comments

Comments
 (0)