Skip to content

Commit 7dbfe63

Browse files
committed
[Chore] #220 - 프로필 이미지 구현
1 parent 17a59fb commit 7dbfe63

6 files changed

Lines changed: 55 additions & 9 deletions

File tree

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/HomeView.swift

Lines changed: 25 additions & 5 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

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

97117
Text(viewModel.homeStateModel.username.trimmedUsername())
98118
.frame(height: 22)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct HomeStateModel {
2323
var username: String = ""
2424
var userUniversity: String = ""
2525
var userDepartment: String = ""
26+
var profileImage: String = ""
2627
var progressValue: Int = 0
2728

2829
var recommendLicenses: [RecommendCeritificateTileModel] = []
@@ -130,6 +131,7 @@ extension HomeViewModel {
130131
homeStateModel.userUniversity = response.university
131132
homeStateModel.userDepartment = response.major
132133
homeStateModel.progressValue = response.percentage
134+
homeStateModel.profileImage = response.profileImage ?? ""
133135

134136
AuthManager.shared.nickname = response.nickname
135137
AuthManager.shared.name = response.name

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
@@ -44,6 +44,7 @@ final class ResumeViewModel: ObservableObject {
4444
name: "",
4545
university: "",
4646
major: "",
47+
profileImage: "",
4748
birthDate: nil
4849
)
4950
@Published var isCardDetailPresented = false

0 commit comments

Comments
 (0)