diff --git a/Projects/DataSource/Sources/Common/DataSourceDependencyAssembler.swift b/Projects/DataSource/Sources/Common/DataSourceDependencyAssembler.swift index 8e21d308..1113be05 100644 --- a/Projects/DataSource/Sources/Common/DataSourceDependencyAssembler.swift +++ b/Projects/DataSource/Sources/Common/DataSourceDependencyAssembler.swift @@ -52,5 +52,9 @@ public struct DataSourceDependencyAssembler: DependencyAssemblerProtocol { DIContainer.shared.register(type: FileRepositoryProtocol.self) { _ in return FileRepository() } + + DIContainer.shared.register(type: ActivityHistoryRepositoryProtocol.self) { _ in + return ActivityHistoryRepository() + } } } diff --git a/Projects/DataSource/Sources/DTO/EmotionMarbleHistoryDTO.swift b/Projects/DataSource/Sources/DTO/EmotionMarbleHistoryDTO.swift new file mode 100644 index 00000000..6105f56e --- /dev/null +++ b/Projects/DataSource/Sources/DTO/EmotionMarbleHistoryDTO.swift @@ -0,0 +1,23 @@ +// +// EmotionMarbleHistoryDTO.swift +// DataSource +// +// Created by 최정인 on 7/21/26. +// + +import Domain + +struct EmotionMarbleHistoryDTO: Decodable { + let date: String + let emotionMarbleType: String + let emotionMarbleName: String + let imageUrl: String + + func toEmotionHistoryEntity() -> EmotionHistoryEntity { + return EmotionHistoryEntity( + date: date, + emotionMarbleType: emotionMarbleType, + emotionMarbleName: emotionMarbleName, + imageUrl: imageUrl) + } +} diff --git a/Projects/DataSource/Sources/DTO/MonthlyBadgesDTO.swift b/Projects/DataSource/Sources/DTO/MonthlyBadgesDTO.swift new file mode 100644 index 00000000..7fc877b8 --- /dev/null +++ b/Projects/DataSource/Sources/DTO/MonthlyBadgesDTO.swift @@ -0,0 +1,27 @@ +// +// MonthlyBadgesDTO.swift +// DataSource +// +// Created by 최정인 on 7/21/26. +// + +import Domain + +struct MonthlyBadgesDTO: Decodable { + let badgeTitle: String + let badgeDescription: String + let badges: [BadgeDTO] + + func toBadgeEntity() -> BadgeEntity { + return BadgeEntity( + title: badgeTitle, + description: badgeDescription, + imageUrls: badges.map({ $0.imageUrl })) + } +} + +struct BadgeDTO: Decodable { + let badgeType: String + let imageUrl: String + let acquiredAt: String? +} diff --git a/Projects/DataSource/Sources/Endpoint/ActivityHistoryEndpoint.swift b/Projects/DataSource/Sources/Endpoint/ActivityHistoryEndpoint.swift new file mode 100644 index 00000000..05390345 --- /dev/null +++ b/Projects/DataSource/Sources/Endpoint/ActivityHistoryEndpoint.swift @@ -0,0 +1,64 @@ +// +// ActivityHistoryEndpoint.swift +// DataSource +// +// Created by 최정인 on 7/15/26. +// + +import Domain + +enum ActivityHistoryEndpoint { + case fetchMonthlyBadges(year: String, month: String) + case fetchEmotionHistory(startDate: String, endDate: String) +} + +extension ActivityHistoryEndpoint: Endpoint { + var baseURL: String { + return AppProperties.baseURL + "/api/v1/activity-logs" + } + + var path: String { + switch self { + case .fetchMonthlyBadges: + return baseURL + "/badges" + case .fetchEmotionHistory: + return baseURL + "/emotion-marbles" + } + } + + var method: HTTPMethod { + switch self { + case .fetchMonthlyBadges: .get + case .fetchEmotionHistory: .get + } + } + + var headers: [String : String] { + let headers: [String: String] = [ + "Content-Type": "application/json", + "accept": "*/*" + ] + return headers + } + + var queryParameters: [String : String] { + switch self { + case .fetchMonthlyBadges(let year, let month): + return [ + "year": year, + "month": month] + case .fetchEmotionHistory(let startDate, let endDate): + return [ + "startDate": startDate, + "endDate": endDate] + } + } + + var bodyParameters: [String : Any] { + return [:] + } + + var isAuthorized: Bool { + return true + } +} diff --git a/Projects/DataSource/Sources/Repository/ActivityHistoryRepository.swift b/Projects/DataSource/Sources/Repository/ActivityHistoryRepository.swift new file mode 100644 index 00000000..3385ff2e --- /dev/null +++ b/Projects/DataSource/Sources/Repository/ActivityHistoryRepository.swift @@ -0,0 +1,49 @@ +// +// ActivityHistoryRepository.swift +// DataSource +// +// Created by 최정인 on 7/21/26. +// + +import Domain + +final class ActivityHistoryRepository: ActivityHistoryRepositoryProtocol { + private let networkService = NetworkService.shared + + func fetchMonthlyBadges(year: Int, month: Int) async throws -> BadgeEntity { + let endpoint = ActivityHistoryEndpoint.fetchMonthlyBadges(year: "\(year)", month: "\(month)") + do { + guard let monthlyBadgesDTO = try await networkService.request(endpoint: endpoint, type: MonthlyBadgesDTO.self) + else { throw NetworkError.decodingError } + return monthlyBadgesDTO.toBadgeEntity() + } catch let error as NetworkError { + switch error { + case .needRetry, .invalidURL, .emptyData: + throw DomainError.requireRetry + default: + throw DomainError.business(error.description) + } + } catch { + throw DomainError.unknown + } + } + + func fetchEmotionMarbles(startDate: String, endDate: String) async throws -> [EmotionHistoryEntity] { + let endpoint = ActivityHistoryEndpoint.fetchEmotionHistory(startDate: startDate, endDate: endDate) + + do { + guard let emotionMarbleDTOs = try await networkService.request(endpoint: endpoint, type: [EmotionMarbleHistoryDTO].self) + else { throw NetworkError.decodingError } + return emotionMarbleDTOs.map { $0.toEmotionHistoryEntity() } + } catch let error as NetworkError { + switch error { + case .needRetry, .invalidURL, .emptyData: + throw DomainError.requireRetry + default: + throw DomainError.business(error.description) + } + } catch { + throw DomainError.unknown + } + } +} diff --git a/Projects/Domain/Sources/Entity/BadgeEntity.swift b/Projects/Domain/Sources/Entity/BadgeEntity.swift new file mode 100644 index 00000000..448053c9 --- /dev/null +++ b/Projects/Domain/Sources/Entity/BadgeEntity.swift @@ -0,0 +1,22 @@ +// +// BadgeEntity.swift +// Domain +// +// Created by 최정인 on 7/21/26. +// + +public struct BadgeEntity { + public let title: String + public let description: String + public let imageUrls: [String] + + public init( + title: String, + description: String, + imageUrls: [String] + ) { + self.title = title + self.description = description + self.imageUrls = imageUrls + } +} diff --git a/Projects/Domain/Sources/Entity/EmotionHistoryEntity.swift b/Projects/Domain/Sources/Entity/EmotionHistoryEntity.swift new file mode 100644 index 00000000..6906e8ba --- /dev/null +++ b/Projects/Domain/Sources/Entity/EmotionHistoryEntity.swift @@ -0,0 +1,25 @@ +// +// EmotionHistoryEntity.swift +// Domain +// +// Created by 최정인 on 7/21/26. +// + +public struct EmotionHistoryEntity { + public let date: String + public let emotionMarbleType: String + public let emotionMarbleName: String + public let imageUrl: String + + public init( + date: String, + emotionMarbleType: String, + emotionMarbleName: String, + imageUrl: String + ) { + self.date = date + self.emotionMarbleType = emotionMarbleType + self.emotionMarbleName = emotionMarbleName + self.imageUrl = imageUrl + } +} diff --git a/Projects/Domain/Sources/Protocol/Repository/ActivityHistoryRepositoryProtocol.swift b/Projects/Domain/Sources/Protocol/Repository/ActivityHistoryRepositoryProtocol.swift new file mode 100644 index 00000000..38a3d2ae --- /dev/null +++ b/Projects/Domain/Sources/Protocol/Repository/ActivityHistoryRepositoryProtocol.swift @@ -0,0 +1,21 @@ +// +// ActivityHistoryRepositoryProtocol.swift +// Domain +// +// Created by 최정인 on 7/21/26. +// + +/// 활동 기록 관련 로직(월 별 뱃지 조회, 감정 구슬 기록 조회 등)을 수행하는 Repository +public protocol ActivityHistoryRepositoryProtocol { + /// 월 별 뱃지를 조회합니다. + /// - Parameters: + /// - year: 조회하려고 하는 연도 + /// - month: 조회하려고 하는 월 + func fetchMonthlyBadges(year: Int, month: Int) async throws -> BadgeEntity + + /// 기간 내 감정 구슬 기록을 조회합니다. + /// - Parameters: + /// - startDate: 조회 시작 날짜 (yyyy-MM-dd) + /// - endDate: 조회 종료 날짜 (yyyy-MM-dd) + func fetchEmotionMarbles(startDate: String, endDate: String) async throws -> [EmotionHistoryEntity] +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/Contents.json deleted file mode 100644 index 51924006..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "emotion_multiple_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "emotion_multiple_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "emotion_multiple_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge.png deleted file mode 100644 index 3f50126a..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge@2x.png deleted file mode 100644 index 7017eab1..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge@3x.png deleted file mode 100644 index 417517bb..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_multiple_badge.imageset/emotion_multiple_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/Contents.json deleted file mode 100644 index ba86c7fd..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "emotion_single_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "emotion_single_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "emotion_single_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge.png deleted file mode 100644 index 3a588679..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge@2x.png deleted file mode 100644 index f104638f..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge@3x.png deleted file mode 100644 index a6945574..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/emotion_single_badge.imageset/emotion_single_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/Contents.json deleted file mode 100644 index cf9879dc..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "none_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "none_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "none_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge.png deleted file mode 100644 index 6fb4f9ed..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge@2x.png deleted file mode 100644 index b36f35ee..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge@3x.png deleted file mode 100644 index 91dcc26d..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/none_badge.imageset/none_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/Contents.json deleted file mode 100644 index 27e957b8..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "report_multiple_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "report_multiple_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "report_multiple_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge.png deleted file mode 100644 index f3a3773b..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge@2x.png deleted file mode 100644 index cc78532a..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge@3x.png deleted file mode 100644 index e2f6d933..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/report_multiple_badge.imageset/report_multiple_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/Contents.json deleted file mode 100644 index c16efddb..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "report_single_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "report_single_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "report_single_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge.png deleted file mode 100644 index a31f66b7..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge@2x.png deleted file mode 100644 index 13f198bd..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge@3x.png deleted file mode 100644 index fc78b2c2..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/report_single_badge.imageset/report_single_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/Contents.json deleted file mode 100644 index 89994963..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "routine_multiple_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "routine_multiple_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "routine_multiple_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge.png deleted file mode 100644 index 12801941..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge@2x.png deleted file mode 100644 index b108ad15..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge@3x.png deleted file mode 100644 index eb66b3b7..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_multiple_badge.imageset/routine_multiple_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/Contents.json deleted file mode 100644 index 017dbca2..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "routine_single_badge.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "routine_single_badge@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "routine_single_badge@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge.png b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge.png deleted file mode 100644 index bc10ee5c..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge@2x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge@2x.png deleted file mode 100644 index 0ccd58b1..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge@3x.png b/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge@3x.png deleted file mode 100644 index d3531ae4..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/Badge/routine_single_badge.imageset/routine_single_badge@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/Contents.json deleted file mode 100644 index 6bfe1846..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "anxiety_emotion_graphic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "anxiety_emotion_graphic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "anxiety_emotion_graphic@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic.png deleted file mode 100644 index 1e1a4e98..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic@2x.png deleted file mode 100644 index 2a3aacd3..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic@3x.png deleted file mode 100644 index 02952091..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/anxiety_emotion_graphic.imageset/anxiety_emotion_graphic@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/Contents.json deleted file mode 100644 index 040a60a8..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "calm_emotion_graphic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "calm_emotion_graphic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "calm_emotion_graphic@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic.png deleted file mode 100644 index b7395677..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic@2x.png deleted file mode 100644 index 25239e93..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic@3x.png deleted file mode 100644 index 30eeb4ed..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/calm_emotion_graphic.imageset/calm_emotion_graphic@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/Contents.json deleted file mode 100644 index 578692a3..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "fatigue_emotion_graphic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "fatigue_emotion_graphic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "fatigue_emotion_graphic@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic.png deleted file mode 100644 index 874e5540..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic@2x.png deleted file mode 100644 index 6dfcee85..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic@3x.png deleted file mode 100644 index 6d9e7e96..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/fatigue_emotion_graphic.imageset/fatigue_emotion_graphic@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/Contents.json deleted file mode 100644 index 2b583fd1..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "lethargy_emotion_graphic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "lethargy_emotion_graphic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "lethargy_emotion_graphic@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic.png deleted file mode 100644 index f72d5131..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic@2x.png deleted file mode 100644 index 2a7acbb5..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic@3x.png deleted file mode 100644 index e75d27f3..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/lethargy_emotion_graphic.imageset/lethargy_emotion_graphic@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/Contents.json deleted file mode 100644 index 6f51a77e..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "satisfaction_emotion_graphic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "satisfaction_emotion_graphic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "satisfaction_emotion_graphic@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic.png deleted file mode 100644 index af9125d5..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic@2x.png deleted file mode 100644 index fdd2ae8c..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic@3x.png deleted file mode 100644 index c278f986..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/satisfaction_emotion_graphic.imageset/satisfaction_emotion_graphic@3x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/Contents.json deleted file mode 100644 index 5491d424..00000000 --- a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "vitality_emotion_graphic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "vitality_emotion_graphic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "vitality_emotion_graphic@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic.png deleted file mode 100644 index 863d3a18..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic@2x.png deleted file mode 100644 index cbedf278..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic@2x.png and /dev/null differ diff --git a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic@3x.png deleted file mode 100644 index e2d589b7..00000000 Binary files a/Projects/Presentation/Resources/Images.xcassets/EmotionActivity/vitality_emotion_graphic.imageset/vitality_emotion_graphic@3x.png and /dev/null differ diff --git a/Projects/Presentation/Sources/ActivityHistory/Model/ActivityBadge.swift b/Projects/Presentation/Sources/ActivityHistory/Model/ActivityBadge.swift index 6e250a30..b85c76e5 100644 --- a/Projects/Presentation/Sources/ActivityHistory/Model/ActivityBadge.swift +++ b/Projects/Presentation/Sources/ActivityHistory/Model/ActivityBadge.swift @@ -5,43 +5,19 @@ // Created by 최정인 on 7/7/26. // -import UIKit +import Domain -enum ActivityBadge { - case emotionBadge - case routineBadge - case reportBadge - - var badgeTitle: String { - switch self { - case .emotionBadge: "점점 감정에\n솔직해지고 계시네요!" - case .routineBadge: "큰 성취를\n이루셨군요, 대단해요!" - case .reportBadge: "덕분에 도시가\n개선되고 있어요!" - } - } - - var expertTitle: String? { - switch self { - case .emotionBadge: "의욕 전문가" - case .routineBadge: "체크 전문가" - case .reportBadge: "외출 전문가" - } - } - - // TODO: 추후 서버에서 이미지 url 값을 받는다면, 수정될 가능성 있음 - var singleImage: UIImage? { - switch self { - case .emotionBadge: BitnagilGraphic.emotionSingleBadgeGraphic - case .routineBadge: BitnagilGraphic.routineSingleBadgeGraphic - case .reportBadge: BitnagilGraphic.reportSingleBadgeGraphic - } - } +struct ActivityBadge { + let title: String + let description: String + let imageUrls: [String] +} - var multipleImage: UIImage? { - switch self { - case .emotionBadge: BitnagilGraphic.emotionMultipleBadgeGraphic - case .routineBadge: BitnagilGraphic.routineMultipleBadgeGraphic - case .reportBadge: BitnagilGraphic.reportMultipleBadgeGraphic - } +extension BadgeEntity { + func toActivityBadge() -> ActivityBadge { + return ActivityBadge( + title: title, + description: description, + imageUrls: imageUrls) } } diff --git a/Projects/Presentation/Sources/ActivityHistory/Model/EmotionMarble.swift b/Projects/Presentation/Sources/ActivityHistory/Model/EmotionMarble.swift new file mode 100644 index 00000000..a40baa36 --- /dev/null +++ b/Projects/Presentation/Sources/ActivityHistory/Model/EmotionMarble.swift @@ -0,0 +1,13 @@ +// +// EmotionMarble.swift +// Presentation +// +// Created by 최정인 on 7/22/26. +// + +import Foundation + +struct EmotionMarble { + let marble: Marble + let imageUrl: String +} diff --git a/Projects/Presentation/Sources/ActivityHistory/View/ActivityHistoryViewController.swift b/Projects/Presentation/Sources/ActivityHistory/View/ActivityHistoryViewController.swift index 9417ad39..f01e506a 100644 --- a/Projects/Presentation/Sources/ActivityHistory/View/ActivityHistoryViewController.swift +++ b/Projects/Presentation/Sources/ActivityHistory/View/ActivityHistoryViewController.swift @@ -47,14 +47,17 @@ final class ActivityHistoryViewController: BaseViewController 1 ? Layout.badgeImagemultipleSize : Layout.badgeImageSingleSize - badgeImages.forEach { badgeImage in + let badgeImageSize: CGFloat = badge.imageUrls.count > 1 ? Layout.badgeImagemultipleSize : Layout.badgeImageSingleSize + badge.imageUrls.forEach { imageURL in let imageView = UIImageView() - imageView.image = badgeImage imageView.contentMode = .scaleAspectFit + + if let url = URL(string: imageURL) { + imageView.kf.setImage(with: url) + } imageView.snp.makeConstraints { make in make.size.equalTo(badgeImageSize) } diff --git a/Projects/Presentation/Sources/ActivityHistory/View/Component/EmotionCalendarView.swift b/Projects/Presentation/Sources/ActivityHistory/View/Component/EmotionCalendarView.swift index eaad6f7f..a116ee8b 100644 --- a/Projects/Presentation/Sources/ActivityHistory/View/Component/EmotionCalendarView.swift +++ b/Projects/Presentation/Sources/ActivityHistory/View/Component/EmotionCalendarView.swift @@ -30,9 +30,9 @@ final class EmotionCalendarView: UIView { private let nextMonthButton = UIButton() private let calendar = FSCalendar() - let dateSelected = PassthroughSubject<(date: Date, emotion: Marble?), Never>() + let dateSelected = PassthroughSubject<(date: Date, emotion: EmotionMarble?), Never>() let pageChanged = PassthroughSubject() - private var emotionRecords: [String: Marble] = [:] + private var emotionRecords: [String: EmotionMarble] = [:] private let cellIdentifier = "EmotionCalendarCell" override init(frame: CGRect) { @@ -121,7 +121,7 @@ final class EmotionCalendarView: UIView { } } - func update(records: [String: Marble]) { + func update(records: [String: EmotionMarble]) { self.emotionRecords = records calendar.reloadData() } @@ -161,7 +161,7 @@ extension EmotionCalendarView: FSCalendarDataSource, FSCalendarDelegate, FSCalen let key = date.convertToString(dateType: .yearMonthDate) guard let emotion = emotionRecords[key] else { return BitnagilColor.gray30 } - return emotion.textColor + return emotion.marble.textColor } func calendar(_ calendar: FSCalendar, cellFor date: Date, at position: FSCalendarMonthPosition) -> FSCalendarCell { @@ -175,7 +175,7 @@ extension EmotionCalendarView: FSCalendarDataSource, FSCalendarDelegate, FSCalen guard let emotion = emotionRecords[key] else { return cell } if isInCurrentMonth(date: date) { - cell.configure(backgroundColor: emotion.backgroundColor) + cell.configure(backgroundColor: emotion.marble.backgroundColor) } else { cell.configure(backgroundColor: BitnagilColor.gray98, isRecorded: false) } diff --git a/Projects/Presentation/Sources/ActivityHistory/View/EmotionDetailViewController.swift b/Projects/Presentation/Sources/ActivityHistory/View/EmotionDetailViewController.swift index 937a7b01..23dc09fd 100644 --- a/Projects/Presentation/Sources/ActivityHistory/View/EmotionDetailViewController.swift +++ b/Projects/Presentation/Sources/ActivityHistory/View/EmotionDetailViewController.swift @@ -5,6 +5,7 @@ // Created by 최정인 on 7/7/26. // +import Kingfisher import SnapKit import UIKit @@ -18,10 +19,12 @@ final class EmotionDetailViewController: UIViewController { static let closeButtonSize: CGFloat = 44 static let closeButtonImageSize: CGFloat = 24 static let emotionImageViewTopSpacing: CGFloat = 30 + static let emotionImageViewWidth: CGFloat = 327 + static let emotionImageViewHeight: CGFloat = 198 } private let date: Date - private let emotion: Marble + private let emotion: EmotionMarble private let headerStackView = UIStackView() private let dateLabel = UILabel() @@ -31,7 +34,7 @@ final class EmotionDetailViewController: UIViewController { private let emotionImageView = UIImageView() var onDismiss: (() -> Void)? - init(date: Date, emotion: Marble) { + init(date: Date, emotion: EmotionMarble) { self.date = date self.emotion = emotion super.init(nibName: nil, bundle: nil) @@ -63,7 +66,7 @@ final class EmotionDetailViewController: UIViewController { dateLabel.font = BitnagilFont(style: .title3, weight: .semiBold).font dateLabel.textColor = BitnagilColor.gray10 - descriptionLabel.attributedText = BitnagilFont(style: .body2, weight: .medium).attributedString(text: emotion.emotionDescription) + descriptionLabel.attributedText = BitnagilFont(style: .body2, weight: .medium).attributedString(text: emotion.marble.emotionDescription) descriptionLabel.numberOfLines = 2 descriptionLabel.font = BitnagilFont(style: .body2, weight: .medium).font descriptionLabel.textColor = BitnagilColor.gray40 @@ -72,8 +75,10 @@ final class EmotionDetailViewController: UIViewController { closeButtonImage.contentMode = .scaleAspectFit closeButton.addTarget(self, action: #selector(didTapCloseButton), for: .touchUpInside) - emotionImageView.image = emotion.emotionGraphic emotionImageView.contentMode = .scaleAspectFit + if let url = URL(string: emotion.imageUrl) { + emotionImageView.kf.setImage(with: url) + } } private func configureLayout() { @@ -111,10 +116,8 @@ final class EmotionDetailViewController: UIViewController { emotionImageView.snp.makeConstraints { make in make.top.equalTo(descriptionLabel.snp.bottom).offset(Layout.emotionImageViewTopSpacing) make.horizontalEdges.equalToSuperview().inset(Layout.horizontalMargin) - if let image = emotion.emotionGraphic { - let aspectRatio = image.size.height / image.size.width - make.height.equalTo(emotionImageView.snp.width).multipliedBy(aspectRatio) - } + make.width.equalTo(Layout.emotionImageViewWidth) + make.height.equalTo(Layout.emotionImageViewHeight) } } diff --git a/Projects/Presentation/Sources/ActivityHistory/ViewModel/ActivityHistoryViewModel.swift b/Projects/Presentation/Sources/ActivityHistory/ViewModel/ActivityHistoryViewModel.swift index f76d181c..8da075bc 100644 --- a/Projects/Presentation/Sources/ActivityHistory/ViewModel/ActivityHistoryViewModel.swift +++ b/Projects/Presentation/Sources/ActivityHistory/ViewModel/ActivityHistoryViewModel.swift @@ -6,24 +6,36 @@ // import Combine +import Domain import Foundation +import Shared final class ActivityHistoryViewModel: ViewModel { enum Input { + case invalidateCacheAndRefetch case fetchMonthlyBadge(date: Date) - case fetchMonthlyEmotionHistory(date: Date) + case fetchEmotionHistory(date: Date) } struct Output { - let monthlyBadgePublisher: AnyPublisher<[ActivityBadge], Never> - let monthlyEmotionHistoryPublisher: AnyPublisher<[String: Marble], Never> + let monthlyBadgePublisher: AnyPublisher + let monthlyEmotionHistoryPublisher: AnyPublisher<[String: EmotionMarble], Never> } - + private(set) var output: Output - private let monthlyBadgeSubject = CurrentValueSubject<[ActivityBadge], Never>([]) - private let monthlyEmotionHistorySubject = CurrentValueSubject<[String: Marble], Never>([:]) - - init() { + private let calendar = Calendar.current + private var emotionHistoryCache: [String: [String: EmotionMarble]] = [:] + + private let monthlyBadgeSubject = PassthroughSubject() + private let monthlyEmotionHistorySubject = CurrentValueSubject<[String: EmotionMarble], Never>([:]) + + private let activityHistoryRepository: ActivityHistoryRepositoryProtocol + private let networkRetryHandler: NetworkRetryHandler + + init(activityHistoryRepository: ActivityHistoryRepositoryProtocol) { + self.activityHistoryRepository = activityHistoryRepository + self.networkRetryHandler = NetworkRetryHandler() + self.output = Output( monthlyBadgePublisher: monthlyBadgeSubject.eraseToAnyPublisher(), monthlyEmotionHistoryPublisher: monthlyEmotionHistorySubject.eraseToAnyPublisher()) @@ -31,24 +43,73 @@ final class ActivityHistoryViewModel: ViewModel { func action(input: Input) { switch input { + case .invalidateCacheAndRefetch: + emotionHistoryCache.removeAll() + fetchMonthlyBadge(date: .now) + fetchEmotionHistory(date: .now) + case .fetchMonthlyBadge(let date): - // TODO: 추후 서버 로직 붙이기 - Task { - let badges: [ActivityBadge] = [] - monthlyBadgeSubject.send(badges) + fetchMonthlyBadge(date: date) + + case .fetchEmotionHistory(let date): + fetchEmotionHistory(date: date) + } + } + + private func fetchMonthlyBadge(date: Date) { + Task { + do { + let year = calendar.component(.year, from: date) + let month = calendar.component(.month, from: date) + let badgeEntity = try await activityHistoryRepository.fetchMonthlyBadges(year: year, month: month) + monthlyBadgeSubject.send(badgeEntity.toActivityBadge()) + } catch { + BitnagilLogger.log(logType: .error, message: "\(error.localizedDescription)") } - case .fetchMonthlyEmotionHistory(let date): - // TODO: 추후 서버 로직 붙이기 - Task { - let mockEmotionRecords: [String: Marble] = [ - "2026-07-01": .ANXIETY, - "2026-07-05": .FATIGUE, - "2026-07-11": .LETHARGY, - "2026-07-16": .VITALITY, - "2026-07-23": .CALM - ] - monthlyEmotionHistorySubject.send(mockEmotionRecords) + } + } + + private func fetchEmotionHistory(date: Date) { + let key = monthKey(for: date) + + if let cachedEmotionHistory = emotionHistoryCache[key] { + monthlyEmotionHistorySubject.send(cachedEmotionHistory) + return + } + + Task { + do { + guard + let firstDate = calendar.date(from: calendar.dateComponents([.year, .month], from: date)), + let lastDate = calendar.date(byAdding: DateComponents(month: 1, day: -1),to: firstDate), + let startDate = calendar.date(byAdding: .day, value: -6, to: firstDate), + let endDate = calendar.date(byAdding: .day, value: 6, to: lastDate) + else { return } + + let startDateString = startDate.convertToString(dateType: .yearMonthDate) + let endDateString = endDate.convertToString(dateType: .yearMonthDate) + let emotionHistoryEntities = try await activityHistoryRepository.fetchEmotionMarbles(startDate: startDateString, endDate: endDateString) + + var emotionHistoryRecords: [String: EmotionMarble] = [:] + for emotionHistory in emotionHistoryEntities { + guard let marble = Marble(rawValue: emotionHistory.emotionMarbleType) + else { return } + + let emotionMarble = EmotionMarble(marble: marble, imageUrl: emotionHistory.imageUrl) + emotionHistoryRecords[emotionHistory.date] = emotionMarble + } + + emotionHistoryCache[key] = emotionHistoryRecords + monthlyEmotionHistorySubject.send(emotionHistoryRecords) + } catch { + BitnagilLogger.log(logType: .error, message: "\(error.localizedDescription)") } } } + + private func monthKey(for date: Date) -> String { + let year = calendar.component(.year, from: date) + let month = calendar.component(.month, from: date) + return String(format: "%04d-%02d", year, month) + } } diff --git a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift index 204a5ec4..8919f249 100644 --- a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift +++ b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift @@ -65,20 +65,4 @@ enum BitnagilGraphic { // MARK: - Badge static let badgeBackgroundGraphic = UIImage(named: "badge_background_graphic", in: bundle, with: nil) - // TODO: - 뱃지 이미지는 추후 서버로부터 값을 받아온다면 삭제될 가능성 있음 - static let noneBadgeGraphic = UIImage(named: "none_badge", in: bundle, with: nil) - static let emotionSingleBadgeGraphic = UIImage(named: "emotion_single_badge", in: bundle, with: nil) - static let emotionMultipleBadgeGraphic = UIImage(named: "emotion_multiple_badge", in: bundle, with: nil) - static let routineSingleBadgeGraphic = UIImage(named: "routine_single_badge", in: bundle, with: nil) - static let routineMultipleBadgeGraphic = UIImage(named: "routine_multiple_badge", in: bundle, with: nil) - static let reportSingleBadgeGraphic = UIImage(named: "report_single_badge", in: bundle, with: nil) - static let reportMultipleBadgeGraphic = UIImage(named: "report_multiple_badge", in: bundle, with: nil) - - // MARK: - Emotion Marble - static let anxietyEmotionGraphic = UIImage(named: "anxiety_emotion_graphic", in: bundle, with: nil) - static let calmEmotionGraphic = UIImage(named: "calm_emotion_graphic", in: bundle, with: nil) - static let fatigueEmotionGraphic = UIImage(named: "fatigue_emotion_graphic", in: bundle, with: nil) - static let lethargyEmotionGraphic = UIImage(named: "lethargy_emotion_graphic", in: bundle, with: nil) - static let satisfactionEmotionGraphic = UIImage(named: "satisfaction_emotion_graphic", in: bundle, with: nil) - static let vitalityEmotionGraphic = UIImage(named: "vitality_emotion_graphic", in: bundle, with: nil) } diff --git a/Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift b/Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift index ac50a859..d3cb290d 100644 --- a/Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift +++ b/Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift @@ -142,8 +142,11 @@ public struct PresentationDependencyAssembler: DependencyAssemblerProtocol { return ReportDetailViewModel(reportRepository: reportRepository) } - DIContainer.shared.register(type: ActivityHistoryViewModel.self) { _ in - return ActivityHistoryViewModel() + DIContainer.shared.register(type: ActivityHistoryViewModel.self) { container in + guard let activityHistoryRepository = container.resolve(type: ActivityHistoryRepositoryProtocol.self) + else { fatalError("activityHistoryRepository 의존성이 등록되지 않았습니다.") } + + return ActivityHistoryViewModel(activityHistoryRepository: activityHistoryRepository) } } } diff --git a/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift b/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift index a270b1ba..d672f754 100644 --- a/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift +++ b/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift @@ -237,23 +237,4 @@ enum Marble:String, CaseIterable { """ } } - - var emotionGraphic: UIImage? { - switch self { - case .NONE: - return nil - case .CALM: - return BitnagilGraphic.calmEmotionGraphic - case .VITALITY: - return BitnagilGraphic.vitalityEmotionGraphic - case .LETHARGY: - return BitnagilGraphic.lethargyEmotionGraphic - case .ANXIETY: - return BitnagilGraphic.anxietyEmotionGraphic - case .SATISFACTION: - return BitnagilGraphic.satisfactionEmotionGraphic - case .FATIGUE: - return BitnagilGraphic.fatigueEmotionGraphic - } - } }