Skip to content

Commit 1ba4346

Browse files
committed
feat: TODO 수정 시 커스텀 카테고리도 떠있을 수 있도록 추가
1 parent 8f38d90 commit 1ba4346

5 files changed

Lines changed: 27 additions & 2 deletions

File tree

DevLog/Presentation/ViewModel/TodoEditorViewModel.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ final class TodoEditorViewModel: Store {
5757
var tagText: String = ""
5858
var focusOnEditor: Bool = false
5959
var tabViewTag: Tag = .editor
60+
var categories: [TodoCategory] = []
6061
var category: TodoCategory = .system(.etc)
6162
var isValidToSave: Bool {
6263
!title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
@@ -68,6 +69,7 @@ final class TodoEditorViewModel: Store {
6869
}
6970

7071
enum Action {
72+
case onAppear
7173
case addTag(String)
7274
case removeTag(String)
7375
case setContent(String)
@@ -80,15 +82,18 @@ final class TodoEditorViewModel: Store {
8082
case setTabViewTag(Tag)
8183
case setTagText(String)
8284
case setTitle(String)
85+
case setCategories([TodoCategory])
8386
case setReferenceItems([Int: TodoReferenceItem])
8487
}
8588

8689
enum SideEffect {
90+
case fetchCategories
8791
case resolveMarkdown(String)
8892
}
8993

9094
private(set) var state = State()
9195
private let calendar = Calendar.current
96+
private let fetchPreferencesUseCase: FetchTodoCategoryPreferencesUseCase
9297
private let fetchReferenceItemsUseCase: FetchReferenceItemsUseCase
9398
private let id: String
9499
private let isCompleted: Bool
@@ -117,8 +122,10 @@ final class TodoEditorViewModel: Store {
117122
// 새로운 Todo 생성용 생성자
118123
init(
119124
category: TodoCategory,
125+
fetchPreferencesUseCase: FetchTodoCategoryPreferencesUseCase,
120126
fetchReferenceItemsUseCase: FetchReferenceItemsUseCase
121127
) {
128+
self.fetchPreferencesUseCase = fetchPreferencesUseCase
122129
self.fetchReferenceItemsUseCase = fetchReferenceItemsUseCase
123130
self.id = UUID().uuidString
124131
self.isCompleted = false
@@ -127,13 +134,16 @@ final class TodoEditorViewModel: Store {
127134
self.createdAt = nil
128135
self.originalDraft = nil
129136
state.category = category
137+
state.categories = [category]
130138
}
131139

132140
// 기존 Todo 편집용 생성자
133141
init(
134142
todo: Todo,
143+
fetchPreferencesUseCase: FetchTodoCategoryPreferencesUseCase,
135144
fetchReferenceItemsUseCase: FetchReferenceItemsUseCase
136145
) {
146+
self.fetchPreferencesUseCase = fetchPreferencesUseCase
137147
self.fetchReferenceItemsUseCase = fetchReferenceItemsUseCase
138148
self.id = todo.id
139149
self.isCompleted = todo.isCompleted
@@ -156,6 +166,8 @@ final class TodoEditorViewModel: Store {
156166
var effects: [SideEffect] = []
157167

158168
switch action {
169+
case .onAppear:
170+
effects = [.fetchCategories]
159171
case .addTag(let tag):
160172
if !tag.isEmpty {
161173
state.tags.append(tag)
@@ -193,6 +205,8 @@ final class TodoEditorViewModel: Store {
193205
if tag == .preview {
194206
effects = [.resolveMarkdown(state.content)]
195207
}
208+
case .setCategories(let categories):
209+
state.categories = categories
196210
case .setReferenceItems(let items):
197211
state.referenceItems = items
198212
}
@@ -203,6 +217,13 @@ final class TodoEditorViewModel: Store {
203217

204218
func run(_ effect: SideEffect) {
205219
switch effect {
220+
case .fetchCategories:
221+
Task {
222+
do {
223+
let preferences = try await fetchPreferencesUseCase.execute()
224+
send(.setCategories(preferences.map(\.category)))
225+
} catch { }
226+
}
206227
case .resolveMarkdown(let content):
207228
Task {
208229
let numbers = content.todoReferenceNumbers

DevLog/UI/Home/HomeView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ struct HomeView: View {
8383
TodoEditorView(
8484
viewModel: TodoEditorViewModel(
8585
category: selectedCategory,
86+
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
8687
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self)
8788
),
8889
onSubmit: { viewModel.send(.addTodo($0)) }

DevLog/UI/Home/TodoDetailView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ struct TodoDetailView: View {
6363
TodoEditorView(
6464
viewModel: TodoEditorViewModel(
6565
todo: todo,
66+
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
6667
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self)
6768
),
6869
onSubmit: { viewModel.send(.upsertTodo($0)) }

DevLog/UI/Home/TodoEditorView.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct TodoEditorView: View {
3838
.onTapGesture {
3939
field = .content
4040
}
41+
.onAppear { viewModel.send(.onAppear) }
4142
.navigationTitle(viewModel.navigationTitle)
4243
.navigationBarTitleDisplayMode(.inline)
4344
.toolbarBackground(.background, for: .navigationBar)
@@ -215,9 +216,9 @@ private struct TodoEditorInfoSheetView: View {
215216
set: { viewModel.send(.setCategory($0)) }
216217
)
217218
) {
218-
ForEach(SystemTodoCategory.allCases) { category in
219+
ForEach(viewModel.state.categories, id: \.id) { category in
219220
Text(category.localizedName)
220-
.tag(TodoCategory.system(category))
221+
.tag(category)
221222
}
222223
}
223224

DevLog/UI/Home/TodoListView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ struct TodoListView: View {
8484
TodoEditorView(
8585
viewModel: TodoEditorViewModel(
8686
category: viewModel.state.category,
87+
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
8788
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self)
8889
),
8990
onSubmit: { viewModel.send(.upsertTodo($0)) }

0 commit comments

Comments
 (0)