Skip to content

Commit d1fe63c

Browse files
authored
[Merge] #220 - 1차 QA 반영
[Merge] #220 - 1차 QA 반영
2 parents 5228bfa + 4d6c0af commit d1fe63c

10 files changed

Lines changed: 60 additions & 48 deletions

File tree

CERTI-iOS/Application/DIContainer/AppDIContainer.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,6 @@ extension AppDIContainer {
290290
getPreUseCase: makeGetPreCertificationUseCase(),
291291
getFavoriteUseCase: makeGetFavoritePreCertificationUseCase(),
292292
fetchUserInfoUseCase: makeFetchUserInfoUseCase(),
293-
withDrawUseCase: makeWithDrawUseCase(),
294293
switchFavoriteUseCase: makeSwitchFavoriteUseCase(),
295294
fetchRecommendUseCase: makeFetchRecommendUseCase(),
296295
getMonthlyPreCertificationUseCase: makeGetMonthlyPreCertificationUseCase(),

CERTI-iOS/Data/Network/Home/DTO/Response/DailyPreCertificationResponseDTO.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ typealias DailyPreCertificationResponseDTO = BaseResponseDTO<DailyPreCertificati
99

1010
struct DailyPreCertificationData: Decodable {
1111
let date: String
12-
let certifications: [DailyPreCertificationInfoData]
12+
let certifications: [DailyPreCertificationInfoData]?
1313
}
1414

1515
extension DailyPreCertificationData {
1616
func toDailyPreCertificationEntity() -> DailyPreCertificationEntity {
1717
return DailyPreCertificationEntity(
1818
date: date,
19-
certifications: certifications.map {
19+
certifications: certifications?.map {
2020
$0.toDailyPreCertificationEntityData()
21-
}
21+
} ?? []
2222
)
2323
}
2424
}

CERTI-iOS/Domain/Entities/UserInfoEntity.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ struct UserInfoEntity {
2222
}
2323

2424
func toResumeUserModel() -> ResumeUserModel {
25-
return ResumeUserModel(name: name, university: university, major: major, birthDate: birthDate ?? nil)
25+
return ResumeUserModel(name: name, university: university, major: major, profileImage: profileImage ?? "", birthDate: birthDate ?? nil)
2626
}
2727
}

CERTI-iOS/Presentation/Home/View/HomeCoordinatorView.swift renamed to CERTI-iOS/Presentation/Home/Coordinator/HomeCoordinatorView.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import SwiftUI
99

1010
struct HomeCoordinatorView: View {
11-
@EnvironmentObject var appCoordinator: AppCoordinator
1211
@EnvironmentObject var tabCoordinator: CertiTabCoordinator
1312

1413
@ObservedObject var homeCoordinator: HomeCoordinator
@@ -33,8 +32,6 @@ struct HomeCoordinatorView: View {
3332
.onChange(of: homeViewModel.homeViewRoute) { route in
3433
guard let route = route else { return }
3534
switch route {
36-
case .withDraw:
37-
appCoordinator.withDraw()
3835
case .navigateToCertificateDetail:
3936
homeCoordinator.push(next: .certificateDetail)
4037
case .navigateToPreLicenseEdit:

CERTI-iOS/Presentation/Home/Factory/HomeFactory.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ final class DefaultHomeFactory: HomeFactory {
1616
let getPreUseCase: GetPreCertificationUseCase
1717
let getFavoriteUseCase: GetFavoriteCertificationUseCase
1818
let fetchUserInfoUseCase: FetchUserInfoUseCase
19-
let withDrawUseCase: WithDrawUseCase
2019
let switchFavoriteUseCase: SwitchFavoriteUseCase
2120
let fetchRecommendUseCase: FetchRecommendUseCase
2221
let getMonthlyPreCertificationUseCase: GetMonthlyPreCertificationUseCase
@@ -27,7 +26,6 @@ final class DefaultHomeFactory: HomeFactory {
2726
getPreUseCase: GetPreCertificationUseCase,
2827
getFavoriteUseCase: GetFavoriteCertificationUseCase,
2928
fetchUserInfoUseCase: FetchUserInfoUseCase,
30-
withDrawUseCase: WithDrawUseCase,
3129
switchFavoriteUseCase: SwitchFavoriteUseCase,
3230
fetchRecommendUseCase: FetchRecommendUseCase,
3331
getMonthlyPreCertificationUseCase: GetMonthlyPreCertificationUseCase,
@@ -37,7 +35,6 @@ final class DefaultHomeFactory: HomeFactory {
3735
self.getPreUseCase = getPreUseCase
3836
self.getFavoriteUseCase = getFavoriteUseCase
3937
self.fetchUserInfoUseCase = fetchUserInfoUseCase
40-
self.withDrawUseCase = withDrawUseCase
4138
self.switchFavoriteUseCase = switchFavoriteUseCase
4239
self.fetchRecommendUseCase = fetchRecommendUseCase
4340
self.getMonthlyPreCertificationUseCase = getMonthlyPreCertificationUseCase
@@ -51,7 +48,6 @@ final class DefaultHomeFactory: HomeFactory {
5148
getPreCertificationsUseCase: getPreUseCase,
5249
getFavoriteCertificationsUseCase: getFavoriteUseCase,
5350
fetchUserInfoUseCase: fetchUserInfoUseCase,
54-
withDrawUseCase: withDrawUseCase,
5551
switchFavoriteUseCase: switchFavoriteUseCase,
5652
fetchRecommendUseCase: fetchRecommendUseCase,
5753
getMonthlyPreCertificationUseCase: getMonthlyPreCertificationUseCase,

CERTI-iOS/Presentation/Home/View/HomeView.swift

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import SwiftUI
99

10+
import Kingfisher
11+
1012
struct HomeView: View {
1113
@ObservedObject var viewModel: HomeViewModel
1214

@@ -72,13 +74,6 @@ extension HomeView {
7274
.resizable()
7375
.scaledToFit()
7476
.frame(width: 75, height: 25)
75-
.onTapGesture {
76-
//TODO: - 탈퇴하기 뷰 생기면 지우기
77-
Task {
78-
await viewModel.withDraw()
79-
viewModel.withDrawNavigate()
80-
}
81-
}
8277

8378
Spacer()
8479
}
@@ -88,11 +83,29 @@ extension HomeView {
8883
private var profileSection: some View {
8984
Group {
9085
HStack(alignment: .center, spacing: 0) {
91-
Image(.imageProfilePdf)
92-
.resizable()
93-
.scaledToFit()
94-
.frame(width: 80, height: 80)
95-
.padding(.trailing, 12)
86+
if let url = URL(string: viewModel.homeStateModel.profileImage),
87+
!viewModel.homeStateModel.profileImage.isEmpty {
88+
KFImage(url)
89+
.resizable()
90+
.placeholder {
91+
Color.grayscale100
92+
}
93+
.retry(maxCount: 3, interval: .seconds(5))
94+
.onFailure { error in
95+
print("failure: \(error.localizedDescription)")
96+
}
97+
.aspectRatio(contentMode: .fill)
98+
.frame(width: 80, height: 80)
99+
.clipShape(.circle)
100+
.clipped()
101+
.padding(.trailing, 12)
102+
} else {
103+
Image(.imageProfilePdf)
104+
.resizable()
105+
.scaledToFit()
106+
.frame(width: 80, height: 80)
107+
.padding(.trailing, 12)
108+
}
96109

97110
Text(viewModel.homeStateModel.username.trimmedUsername())
98111
.frame(height: 22)
@@ -160,6 +173,7 @@ extension HomeView {
160173

161174
Spacer()
162175
}
176+
.padding(.top, 16)
163177
.padding(.horizontal, 20)
164178

165179
Text("예정된 일정이 없습니다.\n자격증 탭에서 취득 예정 자격증을 추가해보세요.")

CERTI-iOS/Presentation/Home/ViewModel/HomeViewModel.swift

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import Foundation
1010
import os
1111

1212
enum HomeViewRoute {
13-
case withDraw
1413
case navigateToPreLicenseEdit
1514
case navigateToCertificateDetail
1615
case navigateToCertificateTab
@@ -23,6 +22,7 @@ struct HomeStateModel {
2322
var username: String = ""
2423
var userUniversity: String = ""
2524
var userDepartment: String = ""
25+
var profileImage: String = ""
2626
var progressValue: Int = 0
2727

2828
var recommendLicenses: [RecommendCeritificateTileModel] = []
@@ -46,7 +46,6 @@ final class HomeViewModel: ObservableObject {
4646
private let getPreCertificationsUseCase: GetPreCertificationUseCase
4747
private let getFavoriteCertificationsUseCase: GetFavoriteCertificationUseCase
4848
private let fetchUserInfoUseCase: FetchUserInfoUseCase
49-
private let withDrawUseCase: WithDrawUseCase
5049
private let switchFavoriteUseCase: SwitchFavoriteUseCase
5150
private let fetchRecommendUseCase: FetchRecommendUseCase
5251
private let getMonthlyPreCertificationUseCase: GetMonthlyPreCertificationUseCase
@@ -57,7 +56,6 @@ final class HomeViewModel: ObservableObject {
5756
getPreCertificationsUseCase: GetPreCertificationUseCase,
5857
getFavoriteCertificationsUseCase: GetFavoriteCertificationUseCase,
5958
fetchUserInfoUseCase: FetchUserInfoUseCase,
60-
withDrawUseCase: WithDrawUseCase,
6159
switchFavoriteUseCase: SwitchFavoriteUseCase,
6260
fetchRecommendUseCase: FetchRecommendUseCase,
6361
getMonthlyPreCertificationUseCase: GetMonthlyPreCertificationUseCase,
@@ -67,7 +65,6 @@ final class HomeViewModel: ObservableObject {
6765
self.getPreCertificationsUseCase = getPreCertificationsUseCase
6866
self.getFavoriteCertificationsUseCase = getFavoriteCertificationsUseCase
6967
self.fetchUserInfoUseCase = fetchUserInfoUseCase
70-
self.withDrawUseCase = withDrawUseCase
7168
self.switchFavoriteUseCase = switchFavoriteUseCase
7269
self.fetchRecommendUseCase = fetchRecommendUseCase
7370
self.getMonthlyPreCertificationUseCase = getMonthlyPreCertificationUseCase
@@ -81,10 +78,6 @@ final class HomeViewModel: ObservableObject {
8178

8279
extension HomeViewModel {
8380

84-
func withDrawNavigate() {
85-
homeViewRoute = .withDraw
86-
}
87-
8881
func navigateToPreLicenseEdit() {
8982
homeViewRoute = .navigateToPreLicenseEdit
9083
}
@@ -106,18 +99,6 @@ extension HomeViewModel {
10699
// MARK: - Network
107100

108101
extension HomeViewModel {
109-
func withDraw() async {
110-
let result = await withDrawUseCase.execute()
111-
112-
switch result {
113-
case .success:
114-
logger.info("✅ 탈퇴 성공")
115-
AuthManager.shared.cleanUserInfo()
116-
117-
case .failure(let error):
118-
logger.error("❌ 탈퇴 실패: \(error.localizedDescription)")
119-
}
120-
}
121102

122103
func getUserInfo() async {
123104
let result = await fetchUserInfoUseCase.execute()
@@ -130,6 +111,7 @@ extension HomeViewModel {
130111
homeStateModel.userUniversity = response.university
131112
homeStateModel.userDepartment = response.major
132113
homeStateModel.progressValue = response.percentage
114+
homeStateModel.profileImage = response.profileImage ?? ""
133115

134116
AuthManager.shared.nickname = response.nickname
135117
AuthManager.shared.name = response.name
@@ -368,7 +350,7 @@ extension HomeViewModel {
368350
formatter.dateFormat = "M월 d일 EEEE"
369351
let dateText = formatter.string(from: displayDate)
370352

371-
if currentDate == .distantPast {
353+
if currentDate == .distantPast || Calendar.current.isDate(displayDate, inSameDayAs: Date()) {
372354
return "\(dateText) (오늘)"
373355
} else {
374356
return dateText

CERTI-iOS/Presentation/Resume/Models/ResumeUserModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import Foundation
99

1010
struct ResumeUserModel {
11-
let name, university, major: String
11+
let name, university, major, profileImage: String
1212
let birthDate: String?
1313

1414
var birthDateAgeText: String {

CERTI-iOS/Presentation/Resume/View/ResumeView.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import SwiftUI
99

10+
import Kingfisher
11+
1012
struct ResumeView: View {
1113
@EnvironmentObject var tabRouter: CertiTabCoordinator
1214
@ObservedObject var viewModel: ResumeViewModel
@@ -73,8 +75,29 @@ extension ResumeView {
7375

7476
private var ResumeProfileView: some View {
7577
HStack(alignment: .top, spacing: 0){
76-
Image(.imageProfilePdf)
77-
.padding(.top, 13)
78+
if let url = URL(string: viewModel.resumeUserModel.profileImage),
79+
!viewModel.resumeUserModel.profileImage.isEmpty {
80+
KFImage(url)
81+
.resizable()
82+
.placeholder {
83+
Color.grayscale100
84+
}
85+
.retry(maxCount: 3, interval: .seconds(5))
86+
.onFailure { error in
87+
print("failure: \(error.localizedDescription)")
88+
}
89+
.aspectRatio(contentMode: .fill)
90+
.frame(width: 80, height: 80)
91+
.clipShape(.circle)
92+
.clipped()
93+
.padding(.trailing, 12)
94+
} else {
95+
Image(.imageProfilePdf)
96+
.resizable()
97+
.scaledToFit()
98+
.frame(width: 80, height: 80)
99+
.padding(.trailing, 12)
100+
}
78101

79102
VStack(alignment: .leading, spacing: 0) {
80103
HStack{

CERTI-iOS/Presentation/Resume/ViewModel/ResumeViewModel.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ final class ResumeViewModel: ObservableObject {
4545
name: "",
4646
university: "",
4747
major: "",
48+
profileImage: "",
4849
birthDate: nil
4950
)
5051
@Published var isCardDetailPresented = false

0 commit comments

Comments
 (0)