Skip to content

Commit 389efce

Browse files
authored
[#287] TodoEditorView에서 Todo의 카테고리를 수정할 수 있는 UI를 구현한다 (#294)
* ui: 중요 표시, 태그, 마감일을 별도의 시트로 구성해서 컨텐츠 작성 시 가리지 않도록 수정 * ui: 카테고리를 옵션 쪽으로 병합 * feat: 뷰모델로 시트 로직 옮김 * style: description -> content * ui: 시트로 태그 확인 및 수정 처리 * ui: 토글 색상 변경 * refactor: 변경 값을 적용하도록 수정
1 parent e5d6499 commit 389efce

4 files changed

Lines changed: 181 additions & 202 deletions

File tree

DevLog/Presentation/ViewModel/TodoEditorViewModel.swift

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ final class TodoEditorViewModel: Store {
1616
let content: String
1717
let dueDate: Date?
1818
let tags: [String]
19+
let kind: TodoKind
1920

2021
init(todo: Todo) {
2122
self.isPinned = todo.isPinned
2223
self.title = todo.title
2324
self.content = todo.content
2425
self.dueDate = todo.dueDate
2526
self.tags = todo.tags
27+
self.kind = todo.kind
2628
}
2729

2830
init(state: State) {
@@ -31,6 +33,7 @@ final class TodoEditorViewModel: Store {
3133
self.content = state.content
3234
self.dueDate = state.dueDate
3335
self.tags = Array(state.tags)
36+
self.kind = state.kind
3437
}
3538
}
3639

@@ -39,10 +42,12 @@ final class TodoEditorViewModel: Store {
3942
var title: String = ""
4043
var content: String = ""
4144
var dueDate: Date?
45+
var showInfo: Bool = false
4246
var tags: OrderedSet<String> = []
4347
var tagText: String = ""
4448
var focusOnEditor: Bool = false
4549
var tabViewTag: Tag = .editor
50+
var kind: TodoKind = .etc
4651
var isValidToSave: Bool {
4752
!title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
4853
}
@@ -57,25 +62,33 @@ final class TodoEditorViewModel: Store {
5762
case removeTag(String)
5863
case setContent(String)
5964
case setDueDate(Date?)
65+
case setKind(TodoKind)
66+
case setPinned(Bool)
67+
case setShowInfo(Bool)
6068
case setTabViewTag(Tag)
6169
case setTagText(String)
6270
case setTitle(String)
63-
case togglePinned
6471
}
6572

6673
enum SideEffect { }
6774

6875
private(set) var state = State()
6976
private let calendar = Calendar.current
70-
let navigationTitle: String
7177
private let id: String
7278
private let isCompleted: Bool
7379
private let isChecked: Bool
7480
private let createdAt: Date?
7581
private let completedAt: Date?
76-
private let kind: TodoKind
7782
private let originalDraft: Draft?
7883

84+
var navigationTitle: String {
85+
if originalDraft == nil {
86+
return "\(state.kind.localizedName) 추가"
87+
}
88+
89+
return "편집"
90+
}
91+
7992
var hasChanges: Bool {
8093
guard let originalDraft else { return true }
8194
return originalDraft != Draft(state: state)
@@ -87,31 +100,29 @@ final class TodoEditorViewModel: Store {
87100

88101
// 새로운 Todo 생성용 생성자
89102
init(kind: TodoKind) {
90-
self.navigationTitle = "\(kind.localizedName) 추가"
91103
self.id = UUID().uuidString
92104
self.isCompleted = false
93105
self.isChecked = false
94106
self.createdAt = nil
95107
self.completedAt = nil
96-
self.kind = kind
97108
self.originalDraft = nil
109+
state.kind = kind
98110
}
99111

100112
// 기존 Todo 편집용 생성자
101113
init(todo: Todo) {
102-
self.navigationTitle = "편집"
103114
self.id = todo.id
104115
self.isCompleted = todo.isCompleted
105116
self.isChecked = todo.isChecked
106117
self.createdAt = todo.createdAt
107118
self.completedAt = todo.completedAt
108-
self.kind = todo.kind
109119
self.originalDraft = Draft(todo: todo)
110120
state.isPinned = todo.isPinned
111121
state.title = todo.title
112122
state.content = todo.content
113123
state.dueDate = todo.dueDate
114124
state.tags = OrderedSet(todo.tags)
125+
state.kind = todo.kind
115126
}
116127

117128
func reduce(with action: Action) -> [SideEffect] {
@@ -134,10 +145,14 @@ final class TodoEditorViewModel: Store {
134145
} else {
135146
state.dueDate = nil
136147
}
148+
case .setKind(let todoKind):
149+
state.kind = todoKind
150+
case .setPinned(let isPinned):
151+
state.isPinned = isPinned
152+
case .setShowInfo(let isPresented):
153+
state.showInfo = isPresented
137154
case .setTabViewTag(let tag):
138155
state.tabViewTag = tag
139-
case .togglePinned:
140-
state.isPinned.toggle()
141156
}
142157

143158
if self.state != state { self.state = state }
@@ -177,7 +192,7 @@ extension TodoEditorViewModel {
177192
completedAt: self.completedAt,
178193
dueDate: state.dueDate,
179194
tags: state.tags.map { $0 },
180-
kind: self.kind
195+
kind: state.kind
181196
)
182197
}
183198
}

DevLog/Resource/Localizable.xcstrings

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@
332332
},
333333
"설정에서의 푸시 알람 설정과 별개입니다." : {
334334

335+
},
336+
"세부 정보" : {
337+
335338
},
336339
"소셜 계정" : {
337340

@@ -347,6 +350,9 @@
347350
},
348351
"알림" : {
349352

353+
},
354+
"없음" : {
355+
350356
},
351357
"연결" : {
352358

@@ -359,6 +365,9 @@
359365
},
360366
"오늘" : {
361367

368+
},
369+
"옵션" : {
370+
362371
},
363372
"완료" : {
364373

@@ -414,9 +423,6 @@
414423
},
415424
"주차" : {
416425

417-
},
418-
"중요" : {
419-
420426
},
421427
"중요 표시" : {
422428

@@ -441,6 +447,9 @@
441447
},
442448
"취소" : {
443449

450+
},
451+
"카테고리" : {
452+
444453
},
445454
"컨텐츠" : {
446455

@@ -451,7 +460,7 @@
451460
"태그" : {
452461

453462
},
454-
"태그 입력" : {
463+
"태그 없음" : {
455464

456465
},
457466
"테마" : {

DevLog/UI/Common/Component/Tag+.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ struct Tag: View {
5454
)
5555

5656
}
57+
.buttonStyle(.plain)
5758
}
5859
}
5960
.background {

0 commit comments

Comments
 (0)