Skip to content

Commit f85ab38

Browse files
committed
ui: 마감일이 없을 때는 기존과 동일, 설정하면 해당 날짜를 태그 형태로 보여줌
1 parent 602f80b commit f85ab38

2 files changed

Lines changed: 39 additions & 24 deletions

File tree

DevLog/Presentation/ViewModel/TodoEditorViewModel.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ final class TodoEditorViewModel: Store {
4242
var tags: OrderedSet<String> = []
4343
var tagText: String = ""
4444
var focusOnEditor: Bool = false
45-
var hasDueDate: Bool { dueDate != nil }
4645
var tabViewTag: Tag = .editor
4746
var isValidToSave: Bool {
4847
!title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
@@ -141,10 +140,10 @@ final class TodoEditorViewModel: Store {
141140
case .togglePinned:
142141
state.isPinned.toggle()
143142
case .toggleDueDate:
144-
if state.hasDueDate {
145-
state.dueDate = nil
146-
} else {
143+
if state.dueDate == nil {
147144
state.dueDate = calendar.date(byAdding: .day, value: 1, to: Date())
145+
} else {
146+
state.dueDate = nil
148147
}
149148
}
150149

DevLog/UI/Home/TodoEditorView.swift

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct TodoEditorView: View {
1515
@Environment(\.dismiss) private var dismiss
1616
@FocusState private var field: Field?
1717
@State private var showDueDatePicker: Bool = false
18+
private let calendar = Calendar.current
1819
var onSubmit: ((Todo) -> Void)?
1920

2021
var body: some View {
@@ -175,30 +176,30 @@ struct TodoEditorView: View {
175176
}
176177
.adaptiveButtonStyle()
177178
}
178-
DueDatePicker(selection: Binding(
179-
get: { viewModel.state.dueDate ?? Date() },
180-
set: { viewModel.send(.setDueDate($0)) }
181-
)) {
182-
HStack {
183-
Label {
184-
Text("마감일")
185-
} icon: {
186-
Image(systemName: "calendar")
187-
.foregroundStyle(.gray)
179+
dueDateControl
180+
}
181+
}
182+
183+
private var dueDateControl: some View {
184+
DueDatePicker(selection: Binding(
185+
get: { viewModel.state.dueDate ?? Date() },
186+
set: { viewModel.send(.setDueDate($0)) }
187+
)) {
188+
Label {
189+
if let dueDate = viewModel.state.dueDate {
190+
Tag(dueDateText(for: dueDate), isEditing: true) {
191+
viewModel.send(.setDueDate(nil))
188192
}
189-
Image(systemName: "checkmark.square")
190-
.symbolRenderingMode(.palette)
191-
.foregroundStyle(
192-
viewModel.state.hasDueDate ? .blue : .clear,
193-
.gray
194-
)
195-
.onTapGesture {
196-
viewModel.send(.setDueDate(viewModel.state.hasDueDate ? nil : Date()))
197-
}
193+
.padding(.vertical, -4)
194+
} else {
195+
Text("마감일")
198196
}
199-
.adaptiveButtonStyle()
197+
} icon: {
198+
Image(systemName: "calendar")
199+
.foregroundStyle(.gray)
200200
}
201201
}
202+
.adaptiveButtonStyle()
202203
}
203204

204205
private func submit() {
@@ -210,6 +211,21 @@ struct TodoEditorView: View {
210211
private enum Field: Hashable {
211212
case title, description, tag
212213
}
214+
215+
private func dueDateText(for dueDate: Date) -> String {
216+
let currentYear = calendar.component(.year, from: Date())
217+
let dueDateYear = calendar.component(.year, from: dueDate)
218+
219+
if currentYear == dueDateYear {
220+
return dueDate.formatted(
221+
.dateTime.month(.defaultDigits).day(.defaultDigits)
222+
)
223+
}
224+
225+
return dueDate.formatted(
226+
.dateTime.year(.twoDigits).month(.defaultDigits).day(.defaultDigits)
227+
)
228+
}
213229
}
214230

215231
private struct TagEditor<Content: View>: View {

0 commit comments

Comments
 (0)