From 510e01974e810b9275f237dccec4cf1f6552f2e1 Mon Sep 17 00:00:00 2001 From: Jung Hwan Park Date: Thu, 7 May 2026 21:52:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Fix=20recruitEndDate=20=EC=97=86=EC=9D=84?= =?UTF-8?q?=EB=95=8C=20=EC=83=81=EC=8B=9C=EB=AA=A8=EC=A7=91=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20fallback=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9D=B4=EC=8A=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift | 2 +- UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift b/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift index 934eecb4..941c3e02 100644 --- a/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift +++ b/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift @@ -354,7 +354,7 @@ private extension ClubInfoDetailView { private func ddayText(for club: Club) -> (text: String, isUrgent: Bool) { guard let end = parseDate(club.recruitEndDate ?? "") else { - return ("상시모집", false) + return ("마감 종료", false) } let days = Calendar.current.dateComponents([.day], from: .now, to: end).day ?? 0 diff --git a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift index c657bdc9..5ecc3ecb 100644 --- a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift +++ b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift @@ -161,7 +161,7 @@ private extension ClubCardView { func ddayText(for club: Club) -> (text: String, isUrgent: Bool) { guard let end = parseDate(club.recruitEndDate ?? "") else { - return ("상시모집", false) + return ("마감 종료", false) } let days = Calendar.current.dateComponents([.day], from: Date(), to: end).day ?? 0 From f020ece14b01c8d8dd1590f6d8fa44a88ebeede9 Mon Sep 17 00:00:00 2001 From: Jung Hwan Park Date: Thu, 7 May 2026 21:53:00 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Fix=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC?= =?UTF-8?q?=20=EB=B0=94=EA=BE=B8=EA=B3=A0=20=EB=8F=99=EC=95=84=EB=A6=AC=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A7=84=EC=9E=85=ED=96=88=EB=8B=A4?= =?UTF-8?q?=EA=B0=80=20=EB=8B=A4=EC=8B=9C=20=EB=82=98=EC=99=80=EC=84=9C=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=EB=A1=9C=20=EA=B0=80=EB=A9=B4=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=EA=B0=80=20=EC=95=88=EB=82=98=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EC=9D=B4=EC=8A=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Features/ClubsFeatures/Sources/ClubsList.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Features/ClubsFeatures/Sources/ClubsList.swift b/Features/ClubsFeatures/Sources/ClubsList.swift index fb06be0d..a80290a4 100644 --- a/Features/ClubsFeatures/Sources/ClubsList.swift +++ b/Features/ClubsFeatures/Sources/ClubsList.swift @@ -125,9 +125,9 @@ public struct ClubsListFeature { state.subscribedClubsSortType = by return .none case .getClubsList: - return .run { [state] send in + return .run { send in do { - let result = try await kuringLink.getClubsList(state.selectedClubType, state.selectedDivisions.map { $0.code.lowercased() }) + let result = try await kuringLink.getClubsList(.all, []) await send(.getClubsListResponse(.success(result))) } catch { await send(.getClubsListResponse(.failure(.error(error.localizedDescription)))) From bb0ca37c35831f9dc08dd66ff6f9837ca1187d59 Mon Sep 17 00:00:00 2001 From: Jung Hwan Park Date: Thu, 7 May 2026 23:10:01 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Update=20=EC=82=AC=EC=86=8C=ED=95=9C=20UI?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift index 5ecc3ecb..d10fe74e 100644 --- a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift +++ b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift @@ -53,8 +53,8 @@ private extension ClubCardView { AsyncImage(url: URL(string: club.iconImageUrl ?? "")) { image in image .resizable() + .aspectRatio(1, contentMode: .fit) .frame(width: 84) - .aspectRatio(contentMode: .fit) .clipShape(RoundedRectangle(cornerRadius: 12)) } placeholder: { RoundedRectangle(cornerRadius: 14) @@ -105,7 +105,7 @@ private extension ClubCardView { Text(club.summary) .padding(.top, 4) .font(.system(size: 14)) - .foregroundStyle(!isRecruiting ? Color.Kuring.caption2 : Color.Kuring.caption1) + .foregroundStyle(Color.Kuring.caption1) .lineLimit(2) .truncationMode(.tail) } From d9070980d1e77c6eff6d24575d1d4944e9e3a179 Mon Sep 17 00:00:00 2001 From: Jung Hwan Park Date: Mon, 22 Jun 2026 16:43:53 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Add=20=EB=8F=99=EC=95=84=EB=A6=AC=20dto?= =?UTF-8?q?=EC=97=90=20=EB=AA=A8=EC=A7=91=EC=83=81=ED=83=9C=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80(recruitmentStatus)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared/Models/Sources/Clubs.swift | 4 ++++ UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift | 4 +++- UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift | 5 +++-- UIKit/ClubsUI/Sources/ClubsList/Views/ClubsListView.swift | 2 -- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Shared/Models/Sources/Clubs.swift b/Shared/Models/Sources/Clubs.swift index 4a5bff1f..523cc0c3 100644 --- a/Shared/Models/Sources/Clubs.swift +++ b/Shared/Models/Sources/Clubs.swift @@ -24,6 +24,7 @@ public struct Club: Codable, Equatable { public let category, division: String public var isSubscribed: Bool public var subscriberCount: Int + public let recruitmentStatus: RecruitmentStatus public let recruitStartDate, recruitEndDate: String? public init( @@ -35,6 +36,7 @@ public struct Club: Codable, Equatable { division: String, isSubscribed: Bool, subscriberCount: Int, + recruitmentStatus: RecruitmentStatus, recruitStartDate: String?, recruitEndDate: String? ) { @@ -46,6 +48,7 @@ public struct Club: Codable, Equatable { self.division = division self.isSubscribed = isSubscribed self.subscriberCount = subscriberCount + self.recruitmentStatus = recruitmentStatus self.recruitStartDate = recruitStartDate self.recruitEndDate = recruitEndDate } @@ -60,6 +63,7 @@ public struct Club: Codable, Equatable { division: "central", isSubscribed: true, subscriberCount: 19, + recruitmentStatus: .recruiting, recruitStartDate: "2026-05-01T00:00:00", recruitEndDate: "2026-06-03T23:59:59" ) diff --git a/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift b/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift index 941c3e02..9bfd83b9 100644 --- a/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift +++ b/UIKit/ClubsUI/Sources/ClubsDetail/ClubInfoDetailView.swift @@ -353,9 +353,11 @@ private extension ClubInfoDetailView { } private func ddayText(for club: Club) -> (text: String, isUrgent: Bool) { + // 마감일이 있다면 D-{n} 형식 노출, 없다면 recruitmentStatus 기반 guard let end = parseDate(club.recruitEndDate ?? "") else { - return ("마감 종료", false) + return (club.recruitmentStatus.rawValue, false) } + let days = Calendar.current.dateComponents([.day], from: .now, to: end).day ?? 0 switch days { diff --git a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift index d10fe74e..09785a09 100644 --- a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift +++ b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubCardView.swift @@ -18,7 +18,7 @@ struct ClubCardView: View { } private var isRecruiting: Bool { - dday.text != "마감 종료" + club.recruitmentStatus != .closed } // 12자 초과시 ... 처리 @@ -160,8 +160,9 @@ private extension ClubCardView { } func ddayText(for club: Club) -> (text: String, isUrgent: Bool) { + // 마감일이 있다면 D-{n} 형식 노출, 없다면 recruitmentStatus 기반 guard let end = parseDate(club.recruitEndDate ?? "") else { - return ("마감 종료", false) + return (club.recruitmentStatus.rawValue, false) } let days = Calendar.current.dateComponents([.day], from: Date(), to: end).day ?? 0 diff --git a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubsListView.swift b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubsListView.swift index ec6d669d..ad4e7205 100644 --- a/UIKit/ClubsUI/Sources/ClubsList/Views/ClubsListView.swift +++ b/UIKit/ClubsUI/Sources/ClubsList/Views/ClubsListView.swift @@ -65,9 +65,7 @@ struct ClubsListView: View { } // MARK: - Sub-views - private extension ClubsListView { - var sortByView: some View { HStack { Text("총 \(store.filteredClubs?.clubs.count ?? 0)개") From 363aa6cbfadb6e3b7ab66080e5de0850b2e76858 Mon Sep 17 00:00:00 2001 From: Jung Hwan Park Date: Mon, 22 Jun 2026 16:45:50 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Update=20=EA=B3=B5=EC=A7=80=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20id=20=ED=95=84=EB=93=9C=20string=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=ED=8C=8C=EC=8B=B1=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit int 형식으로 보내주는게 안된다고함 --- Shared/Models/Sources/Notice.swift | 2 +- Shared/PushNotifications/Sources/Message/Message.swift | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Shared/Models/Sources/Notice.swift b/Shared/Models/Sources/Notice.swift index 2d206e46..8c4daabe 100644 --- a/Shared/Models/Sources/Notice.swift +++ b/Shared/Models/Sources/Notice.swift @@ -51,7 +51,7 @@ extension Notice { /// try Notice(userInfo: userInfo) /// ``` public init(userInfo: [String: Any]) throws { - guard let id = userInfo["id"] as? Int else { + guard let idString = userInfo["id"] as? String, let id = Int(idString) else { throw DecodingError.noID } guard let articleID = userInfo["articleId"] as? String else { diff --git a/Shared/PushNotifications/Sources/Message/Message.swift b/Shared/PushNotifications/Sources/Message/Message.swift index 87a6550b..1d999065 100644 --- a/Shared/PushNotifications/Sources/Message/Message.swift +++ b/Shared/PushNotifications/Sources/Message/Message.swift @@ -33,7 +33,6 @@ extension Message { self = .notice( try Notice(userInfo: userInfo) ) - // 커스텀 알림 case "admin": @AppStorage("com.kuring.sdk.notification.custom")