Skip to content

Commit 451341e

Browse files
committed
refactor: 뷰모델 생성 역할을 뷰에서 코디네이터로 전환
1 parent 096b9d3 commit 451341e

2 files changed

Lines changed: 55 additions & 29 deletions

File tree

DevLog/UI/Main/MainView.swift

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@ struct MainView: View {
1313
@State private var homeViewCoordinator: HomeViewCoordinator
1414
@State private var todayViewCoordinator: TodayViewCoordinator
1515
@Binding var selectedTab: MainTab
16-
private let container: DIContainer
1716

1817
init(
1918
container: DIContainer,
2019
selectedTab: Binding<MainTab>
2120
) {
22-
self.container = container
2321
self._coordinator = State(initialValue: MainViewCoordinator(container: container))
2422
self._homeViewCoordinator = State(initialValue: HomeViewCoordinator(container: container))
2523
self._todayViewCoordinator = State(initialValue: TodayViewCoordinator(container: container))
@@ -117,7 +115,7 @@ struct MainView: View {
117115
Group {
118116
if let todoId = coordinator.todoIdToPresent?.id {
119117
TodoDetailView(
120-
viewModel: makeTodoDetailViewModel(
118+
viewModel: coordinator.todoDetailViewModel(
121119
todoId: todoId,
122120
showEditButton: false
123121
)
@@ -235,11 +233,11 @@ struct MainView: View {
235233
switch homeRoute {
236234
case .category(let item):
237235
TodoListView(
238-
viewModel: makeTodoListViewModel(category: item.todoCategory)
236+
viewModel: coordinator.todoListViewModel(category: item.todoCategory)
239237
)
240238
.id(item.id)
241239
case .todo(let item):
242-
TodoDetailView(viewModel: makeTodoDetailViewModel(todoId: item.id))
240+
TodoDetailView(viewModel: coordinator.todoDetailViewModel(todoId: item.id))
243241
.id(item.id)
244242
case .webPage(let item):
245243
WebView(url: item.url)
@@ -302,7 +300,7 @@ struct MainView: View {
302300
private func todayDestinationView(_ todayRoute: TodayRoute) -> some View {
303301
switch todayRoute {
304302
case .todo(let item):
305-
TodoDetailView(viewModel: makeTodoDetailViewModel(todoId: item.id))
303+
TodoDetailView(viewModel: coordinator.todoDetailViewModel(todoId: item.id))
306304
.id(item.id)
307305
}
308306
}
@@ -378,29 +376,6 @@ private extension MainView {
378376
)
379377
}
380378

381-
func makeTodoListViewModel(category: TodoCategory) -> TodoListViewModel {
382-
TodoListViewModel(
383-
fetchTodosUseCase: container.resolve(FetchTodosUseCase.self),
384-
fetchTodoByIdUseCase: container.resolve(FetchTodoByIdUseCase.self),
385-
upsertTodoUseCase: container.resolve(UpsertTodoUseCase.self),
386-
deleteTodoUseCase: container.resolve(DeleteTodoUseCase.self),
387-
undoDeleteTodoUseCase: container.resolve(UndoDeleteTodoUseCase.self),
388-
category: category
389-
)
390-
}
391-
392-
func makeTodoDetailViewModel(
393-
todoId: String,
394-
showEditButton: Bool = true
395-
) -> TodoDetailViewModel {
396-
TodoDetailViewModel(
397-
fetchTodoUseCase: container.resolve(FetchTodoByIdUseCase.self),
398-
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self),
399-
upsertUseCase: container.resolve(UpsertTodoUseCase.self),
400-
todoId: todoId,
401-
showEditButton: showEditButton
402-
)
403-
}
404379
}
405380

406381
private enum MainTabSplitStyle {

DevLog/UI/Main/MainViewCoordinator.swift

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@ final class MainViewCoordinator {
1414
let pushNotificationListViewModel: PushNotificationListViewModel
1515
let profileViewModel: ProfileViewModel
1616
var todoIdToPresent: TodoIdItem?
17+
private let diContainer: DIContainer
18+
@ObservationIgnored
19+
private var todoListViewModels = [TodoCategory: TodoListViewModel]()
20+
@ObservationIgnored
21+
private var todoDetailViewModels = [TodoDetailViewModelKey: TodoDetailViewModel]()
1722

1823
init(container: DIContainer) {
24+
self.diContainer = container
1925
self.mainViewModel = MainViewModel(
2026
unreadPushCountUseCase: container.resolve(ObserveUnreadPushCountUseCase.self)
2127
)
@@ -36,4 +42,49 @@ final class MainViewCoordinator {
3642
updateHeatmapActivityTypesUseCase: container.resolve(UpdateHeatmapActivityTypesUseCase.self)
3743
)
3844
}
45+
46+
func todoListViewModel(category: TodoCategory) -> TodoListViewModel {
47+
if let todoListViewModel = todoListViewModels[category] {
48+
return todoListViewModel
49+
}
50+
51+
let todoListViewModel = TodoListViewModel(
52+
fetchTodosUseCase: diContainer.resolve(FetchTodosUseCase.self),
53+
fetchTodoByIdUseCase: diContainer.resolve(FetchTodoByIdUseCase.self),
54+
upsertTodoUseCase: diContainer.resolve(UpsertTodoUseCase.self),
55+
deleteTodoUseCase: diContainer.resolve(DeleteTodoUseCase.self),
56+
undoDeleteTodoUseCase: diContainer.resolve(UndoDeleteTodoUseCase.self),
57+
category: category
58+
)
59+
todoListViewModels[category] = todoListViewModel
60+
return todoListViewModel
61+
}
62+
63+
func todoDetailViewModel(
64+
todoId: String,
65+
showEditButton: Bool = true
66+
) -> TodoDetailViewModel {
67+
let todoDetailViewModelKey = TodoDetailViewModelKey(
68+
todoId: todoId,
69+
showEditButton: showEditButton
70+
)
71+
if let todoDetailViewModel = todoDetailViewModels[todoDetailViewModelKey] {
72+
return todoDetailViewModel
73+
}
74+
75+
let todoDetailViewModel = TodoDetailViewModel(
76+
fetchTodoUseCase: diContainer.resolve(FetchTodoByIdUseCase.self),
77+
fetchReferenceItemsUseCase: diContainer.resolve(FetchReferenceItemsUseCase.self),
78+
upsertUseCase: diContainer.resolve(UpsertTodoUseCase.self),
79+
todoId: todoId,
80+
showEditButton: showEditButton
81+
)
82+
todoDetailViewModels[todoDetailViewModelKey] = todoDetailViewModel
83+
return todoDetailViewModel
84+
}
85+
86+
private struct TodoDetailViewModelKey: Hashable {
87+
let todoId: String
88+
let showEditButton: Bool
89+
}
3990
}

0 commit comments

Comments
 (0)