From 02692ef25928fe9e59726c14290cf4f90a04a205 Mon Sep 17 00:00:00 2001 From: opficdev Date: Sun, 1 Feb 2026 21:01:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20Date=20=ED=83=80=EC=9E=85=EC=9D=B4?= =?UTF-8?q?=20=EC=9D=B8=EC=BD=94=EB=94=A9=20=EB=90=98=EB=A9=B4=20=EC=8B=A4?= =?UTF-8?q?=EC=88=98=ED=98=95=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=ED=98=84=EC=83=81=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DevLog/Data/Protocol/Dictionaryable.swift | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/DevLog/Data/Protocol/Dictionaryable.swift b/DevLog/Data/Protocol/Dictionaryable.swift index 251ab09..fd7e1c8 100644 --- a/DevLog/Data/Protocol/Dictionaryable.swift +++ b/DevLog/Data/Protocol/Dictionaryable.swift @@ -5,7 +5,7 @@ // Created by 최윤진 on 12/14/25. // -import Foundation +import FirebaseFirestore protocol Dictionaryable: Encodable { func toDictionary() -> [String: Any] @@ -13,11 +13,23 @@ protocol Dictionaryable: Encodable { extension Dictionaryable { func toDictionary() -> [String: Any] { - guard let encodedData = try? JSONEncoder().encode(self), - var dictionary = (try? JSONSerialization.jsonObject(with: encodedData)) as? [String: Any] - else { return [:] } + let encoder = Firestore.Encoder() + guard var dictionary = try? encoder.encode(self) else { return [:] } + + let mirror = Mirror(reflecting: self) + for child in mirror.children { + guard let key = child.label else { continue } + if isNilValue(child.value) { + dictionary[key] = NSNull() + } + } dictionary.removeValue(forKey: "id") return dictionary } + + private func isNilValue(_ value: Any) -> Bool { + let mirror = Mirror(reflecting: value) + return mirror.displayStyle == .optional && mirror.children.isEmpty + } } From 17e36cdd8c7cd7820a7d7d7cd34eedfc84515ecb Mon Sep 17 00:00:00 2001 From: opficdev Date: Sun, 1 Feb 2026 21:02:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20Todo=EC=9D=98=20=EC=A4=91=EC=9A=94?= =?UTF-8?q?=20=ED=91=9C=EC=8B=9C=20=ED=86=A0=EA=B8=80=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DevLog/Presentation/ViewModel/TodoViewModel.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/DevLog/Presentation/ViewModel/TodoViewModel.swift b/DevLog/Presentation/ViewModel/TodoViewModel.swift index f60e833..cad300c 100644 --- a/DevLog/Presentation/ViewModel/TodoViewModel.swift +++ b/DevLog/Presentation/ViewModel/TodoViewModel.swift @@ -131,7 +131,18 @@ final class TodoViewModel: Store { } } case .togglePinned(let todo): - break + Task { + do { + defer { send(.didLoading(false)) } + send(.didLoading(true)) + var todo = todo + todo.isPinned.toggle() + try await upsertTodoUseCase.execute(todo) + send(.didTogglePinned(todo)) + } catch { + send(.didShowAlert(error.localizedDescription)) + } + } case .swipeTodo(let todo): break }