-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHomeViewModel.swift
More file actions
103 lines (87 loc) · 2.67 KB
/
Copy pathHomeViewModel.swift
File metadata and controls
103 lines (87 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//
// HomeViewModel.swift
// DevLog
//
// Created by 최윤진 on 11/22/25.
//
import Foundation
final class HomeViewModel: Store {
struct State {
// UI
var todoKindPreferences = TodoKind.allCases.map { TodoKindPreference(kind: $0, isVisible: true) }
var pinnedTodos: [Todo] = []
// User Input
var searchText: String = ""
var isSearching: Bool = false
var reorderTodo: Bool = false
// Side Effect UI
var isLoading: Bool = false
var toastMessage: String = ""
var showToast: Bool = false
}
enum Action {
// Life Cycle
case onAppear
// User
case tapEllipsisButton
case upsertTodo(Todo)
case orderTodoKindPreferences([TodoKindPreference])
// Binding
case updateSearching(Bool)
case updateSearchText(String)
case closeOrderingSheet
case closeToast
// Call from run
case didFetchPinnedTodos([Todo])
}
enum SideEffect {
case upsertTodo(Todo)
case fetchPinnedTodos
}
private let upsertTodoUseCase: UpsertTodoUseCase
private let fetchPinnedTodosUseCase: FetchPinnedTodosUseCase
@Published private(set) var state = State()
init(
upsertTodoUseCase: UpsertTodoUseCase,
fetchPinnedTodosUseCase: FetchPinnedTodosUseCase
) {
self.upsertTodoUseCase = upsertTodoUseCase
self.fetchPinnedTodosUseCase = fetchPinnedTodosUseCase
}
func reduce(with action: Action) -> [SideEffect] {
switch action {
case .onAppear:
return [.fetchPinnedTodos]
case.tapEllipsisButton:
state.reorderTodo = true
case .updateSearching(let isSearching):
state.isSearching = isSearching
case .updateSearchText(let text):
state.searchText = text
case .upsertTodo(let todo):
return [.upsertTodo(todo)]
case .orderTodoKindPreferences(let preferences):
state.todoKindPreferences = preferences
case .closeOrderingSheet:
state.reorderTodo = false
case .closeToast:
state.showToast = false
case .didFetchPinnedTodos(let todos):
state.pinnedTodos = todos
}
return []
}
func run(_ effect: SideEffect) {
switch effect {
case .upsertTodo(let todo):
Task {
try await upsertTodoUseCase.execute(todo)
}
case .fetchPinnedTodos:
Task {
let todos = try await fetchPinnedTodosUseCase.execute()
send(.didFetchPinnedTodos(todos))
}
}
}
}