From f85ab38a7079173155b4e871412345265dee50f9 Mon Sep 17 00:00:00 2001 From: opficdev Date: Mon, 16 Mar 2026 11:24:03 +0900 Subject: [PATCH 1/2] =?UTF-8?q?ui:=20=EB=A7=88=EA=B0=90=EC=9D=BC=EC=9D=B4?= =?UTF-8?q?=20=EC=97=86=EC=9D=84=20=EB=95=8C=EB=8A=94=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EA=B3=BC=20=EB=8F=99=EC=9D=BC,=20=EC=84=A4=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=A9=B4=20=ED=95=B4=EB=8B=B9=20=EB=82=A0=EC=A7=9C=EB=A5=BC=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20=ED=98=95=ED=83=9C=EB=A1=9C=20=EB=B3=B4?= =?UTF-8?q?=EC=97=AC=EC=A4=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModel/TodoEditorViewModel.swift | 7 +-- DevLog/UI/Home/TodoEditorView.swift | 56 ++++++++++++------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift b/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift index 05e414bf..722b9355 100644 --- a/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift +++ b/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift @@ -42,7 +42,6 @@ final class TodoEditorViewModel: Store { var tags: OrderedSet = [] var tagText: String = "" var focusOnEditor: Bool = false - var hasDueDate: Bool { dueDate != nil } var tabViewTag: Tag = .editor var isValidToSave: Bool { !title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty @@ -141,10 +140,10 @@ final class TodoEditorViewModel: Store { case .togglePinned: state.isPinned.toggle() case .toggleDueDate: - if state.hasDueDate { - state.dueDate = nil - } else { + if state.dueDate == nil { state.dueDate = calendar.date(byAdding: .day, value: 1, to: Date()) + } else { + state.dueDate = nil } } diff --git a/DevLog/UI/Home/TodoEditorView.swift b/DevLog/UI/Home/TodoEditorView.swift index 2c8b0334..f7126e38 100644 --- a/DevLog/UI/Home/TodoEditorView.swift +++ b/DevLog/UI/Home/TodoEditorView.swift @@ -15,6 +15,7 @@ struct TodoEditorView: View { @Environment(\.dismiss) private var dismiss @FocusState private var field: Field? @State private var showDueDatePicker: Bool = false + private let calendar = Calendar.current var onSubmit: ((Todo) -> Void)? var body: some View { @@ -175,30 +176,30 @@ struct TodoEditorView: View { } .adaptiveButtonStyle() } - DueDatePicker(selection: Binding( - get: { viewModel.state.dueDate ?? Date() }, - set: { viewModel.send(.setDueDate($0)) } - )) { - HStack { - Label { - Text("마감일") - } icon: { - Image(systemName: "calendar") - .foregroundStyle(.gray) + dueDateControl + } + } + + private var dueDateControl: some View { + DueDatePicker(selection: Binding( + get: { viewModel.state.dueDate ?? Date() }, + set: { viewModel.send(.setDueDate($0)) } + )) { + Label { + if let dueDate = viewModel.state.dueDate { + Tag(dueDateText(for: dueDate), isEditing: true) { + viewModel.send(.setDueDate(nil)) } - Image(systemName: "checkmark.square") - .symbolRenderingMode(.palette) - .foregroundStyle( - viewModel.state.hasDueDate ? .blue : .clear, - .gray - ) - .onTapGesture { - viewModel.send(.setDueDate(viewModel.state.hasDueDate ? nil : Date())) - } + .padding(.vertical, -4) + } else { + Text("마감일") } - .adaptiveButtonStyle() + } icon: { + Image(systemName: "calendar") + .foregroundStyle(.gray) } } + .adaptiveButtonStyle() } private func submit() { @@ -210,6 +211,21 @@ struct TodoEditorView: View { private enum Field: Hashable { case title, description, tag } + + private func dueDateText(for dueDate: Date) -> String { + let currentYear = calendar.component(.year, from: Date()) + let dueDateYear = calendar.component(.year, from: dueDate) + + if currentYear == dueDateYear { + return dueDate.formatted( + .dateTime.month(.defaultDigits).day(.defaultDigits) + ) + } + + return dueDate.formatted( + .dateTime.year(.twoDigits).month(.defaultDigits).day(.defaultDigits) + ) + } } private struct TagEditor: View { From 750cd9156c96d8a782a81718bc4543d0e63f97c4 Mon Sep 17 00:00:00 2001 From: opficdev Date: Mon, 16 Mar 2026 11:30:52 +0900 Subject: [PATCH 2/2] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DevLog/Presentation/ViewModel/TodoEditorViewModel.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift b/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift index 722b9355..60149c90 100644 --- a/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift +++ b/DevLog/Presentation/ViewModel/TodoEditorViewModel.swift @@ -61,7 +61,6 @@ final class TodoEditorViewModel: Store { case setTagText(String) case setTitle(String) case togglePinned - case toggleDueDate } enum SideEffect { } @@ -139,12 +138,6 @@ final class TodoEditorViewModel: Store { state.tabViewTag = tag case .togglePinned: state.isPinned.toggle() - case .toggleDueDate: - if state.dueDate == nil { - state.dueDate = calendar.date(byAdding: .day, value: 1, to: Date()) - } else { - state.dueDate = nil - } } if self.state != state { self.state = state }