Skip to content

Commit 0c1d6dd

Browse files
authored
Merge pull request #285 from Team-return/feature/(#282)-profile_edit
🔗 :: (#282) 프로필 수정 기능 추가
2 parents 31d3d97 + 1c775d5 commit 0c1d6dd

File tree

3 files changed

+88
-17
lines changed

3 files changed

+88
-17
lines changed

Projects/Modules/DesignSystem/Sources/View/StudentInfoView.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,8 @@ public final class StudentInfoView: UIView {
6565
}
6666
}
6767
}
68+
extension StudentInfoView {
69+
public func updateProfileImage(image: UIImage) {
70+
profileImageView.image = image
71+
}
72+
}

Projects/Presentation/Sources/MyPage/MyPageViewController.swift

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,26 @@ public final class MyPageViewController: BaseViewController<MyPageViewModel> {
1414
}
1515
private let contentView = UIView()
1616
private let studentInfoView = StudentInfoView()
17-
// private let editButton = UIButton(type: .system).then {
18-
// $0.setJobisText("수정", font: .subHeadLine, color: .Primary.blue20)
19-
// }
17+
private let editButton = UIButton(type: .system).then {
18+
$0.setJobisText("수정", font: .subHeadLine, color: .Primary.blue20)
19+
}
2020
private let reviewNavigateStackView = ReviewNavigateStackView()
2121
private let notificationSettingSectionView = NotificationSettingSectionView()
2222
private let accountSectionView = AccountSectionView()
2323
private let bugSectionView = BugSectionView()
2424
private let helpSectionView = HelpSectionView()
25+
private let selectedImage = PublishRelay<UploadFileModel>()
26+
private let picker = UIImagePickerController()
2527
private let logoutPublisher = PublishRelay<Void>()
2628
private let withdrawalPublisher = PublishRelay<Void>()
29+
private let changedImageURL = PublishRelay<String>()
2730

2831
public override func addView() {
2932
self.view.addSubview(scrollView)
3033
self.scrollView.addSubview(contentView)
3134
[
3235
studentInfoView,
33-
// editButton,
36+
editButton,
3437
reviewNavigateStackView,
3538
notificationSettingSectionView,
3639
helpSectionView,
@@ -55,10 +58,10 @@ public final class MyPageViewController: BaseViewController<MyPageViewModel> {
5558
$0.leading.trailing.equalToSuperview()
5659
}
5760

58-
// editButton.snp.makeConstraints {
59-
// $0.centerY.equalTo(studentInfoView)
60-
// $0.trailing.equalToSuperview().offset(-28)
61-
// }
61+
editButton.snp.makeConstraints {
62+
$0.centerY.equalTo(studentInfoView)
63+
$0.trailing.equalToSuperview().offset(-28)
64+
}
6265

6366
reviewNavigateStackView.snp.updateConstraints {
6467
$0.leading.trailing.equalToSuperview().inset(24)
@@ -90,15 +93,18 @@ public final class MyPageViewController: BaseViewController<MyPageViewModel> {
9093

9194
public override func bind() {
9295
let input = MyPageViewModel.Input(
93-
viewAppear: self.viewDidLoadPublisher,
96+
viewAppear: viewWillAppearPublisher,
9497
reviewNavigate: reviewNavigateStackView.reviewNavigateButtonDidTap,
95-
notificationSettingSectionDidTap: notificationSettingSectionView.getSelectedItem(type: .notificationSetting),
98+
selectedImage: selectedImage,
99+
notificationSettingSectionDidTap: notificationSettingSectionView.getSelectedItem(type:
100+
.notificationSetting),
96101
helpSectionDidTap: helpSectionView.getSelectedItem(type: .announcement),
97102
bugReportSectionDidTap: bugSectionView.getSelectedItem(type: .reportBug),
98103
// bugReportListSectionDidTap: bugSectionView.getSelectedItem(type: .bugList),
99104
changePasswordSectionDidTap: accountSectionView.getSelectedItem(type: .changePassword),
100105
logoutPublisher: logoutPublisher,
101-
withdrawalPublisher: withdrawalPublisher
106+
withdrawalPublisher: withdrawalPublisher,
107+
changedImageURL: changedImageURL
102108
)
103109

104110
input.changePasswordSectionDidTap.asObservable()
@@ -126,6 +132,7 @@ public final class MyPageViewController: BaseViewController<MyPageViewModel> {
126132
}
127133

128134
public override func configureViewController() {
135+
self.picker.delegate = self
129136
self.viewWillAppearPublisher.asObservable()
130137
.subscribe(onNext: { [weak self] in
131138
self?.showTabbar()
@@ -157,9 +164,36 @@ public final class MyPageViewController: BaseViewController<MyPageViewModel> {
157164
.show()
158165
})
159166
.disposed(by: disposeBag)
167+
168+
self.editButton.rx.tap
169+
.subscribe(onNext: { [weak self] in
170+
self?.openLibrary()
171+
})
172+
.disposed(by: disposeBag)
160173
}
161174

162175
public override func configureNavigation() {
163176
self.setLargeTitle(title: "마이페이지")
164177
}
165178
}
179+
180+
extension MyPageViewController: UIImagePickerControllerDelegate {
181+
func openLibrary() {
182+
picker.sourceType = .photoLibrary
183+
present(picker, animated: true, completion: nil)
184+
}
185+
}
186+
187+
extension MyPageViewController: UINavigationControllerDelegate {
188+
public func imagePickerController(
189+
_ picker: UIImagePickerController,
190+
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
191+
) {
192+
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
193+
guard let imageData = image.pngData() else { return }
194+
self.studentInfoView.updateProfileImage(image: image)
195+
self.selectedImage.accept(.init(file: imageData, fileName: "profile.png"))
196+
dismiss(animated: true, completion: nil)
197+
}
198+
}
199+
}

Projects/Presentation/Sources/MyPage/MyPageViewModel.swift

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,27 @@ public final class MyPageViewModel: BaseViewModel, Stepper {
3737
public struct Input {
3838
let viewAppear: PublishRelay<Void>
3939
let reviewNavigate: PublishRelay<Int>
40+
let selectedImage: PublishRelay<UploadFileModel>
4041
let notificationSettingSectionDidTap: Observable<IndexPath>
4142
let helpSectionDidTap: Observable<IndexPath>
4243
let bugReportSectionDidTap: Observable<IndexPath>
43-
// let bugReportListSectionDidTap: Observable<IndexPath>
44+
// let bugReportListSectionDidTap: Observable<IndexPath>
4445
let changePasswordSectionDidTap: Observable<IndexPath>
4546
let logoutPublisher: PublishRelay<Void>
4647
let withdrawalPublisher: PublishRelay<Void>
48+
let changedImageURL: PublishRelay<String>
4749
}
4850

4951
public struct Output {
5052
let studentInfo: PublishRelay<StudentInfoEntity>
5153
let writableReviewList: BehaviorRelay<[WritableReviewCompanyEntity]>
54+
let changedImageURL: PublishRelay<String>
5255
}
5356

5457
public func transform(_ input: Input) -> Output {
5558
let studentInfo = PublishRelay<StudentInfoEntity>()
5659
let writableReviewList = BehaviorRelay<[WritableReviewCompanyEntity]>(value: [])
60+
let changedImageURL = PublishRelay<String>()
5761

5862
input.viewAppear.asObservable()
5963
.flatMap { self.fetchStudentInfoUseCase.execute() }
@@ -70,6 +74,33 @@ public final class MyPageViewModel: BaseViewModel, Stepper {
7074
.bind(to: steps)
7175
.disposed(by: disposeBag)
7276

77+
input.selectedImage
78+
.flatMapLatest { [weak self] file -> Observable<String?> in
79+
guard let self = self else { return .empty() }
80+
81+
return self.fetchPresignedURLUseCase.execute(
82+
req: .init(files: [.init(fileName: file.fileName)])
83+
)
84+
.asObservable()
85+
.flatMap { presignedURLs -> Observable<String?> in
86+
guard let url = presignedURLs.first else { return .empty() }
87+
88+
return Observable.zip(
89+
self.uploadImageToS3UseCase.execute(
90+
presignedURL: url.presignedUrl,
91+
data: file.file
92+
)
93+
.asObservable(),
94+
self.changeProfileImageUseCase.execute(url: url.filePath)
95+
.asObservable()
96+
)
97+
.map { _ in "" }
98+
}
99+
}
100+
.map { _ in "" }
101+
.bind(to: changedImageURL)
102+
.disposed(by: disposeBag)
103+
73104
input.notificationSettingSectionDidTap.asObservable()
74105
.map { _ in MyPageStep.notificationSettingIsRequired }
75106
.bind(to: steps)
@@ -108,14 +139,15 @@ public final class MyPageViewModel: BaseViewModel, Stepper {
108139
.bind(to: steps)
109140
.disposed(by: disposeBag)
110141

111-
// input.bugReportListSectionDidTap.asObservable()
112-
// .map { _ in MyPageStep.bugReportListIsRequired }
113-
// .bind(to: steps)
114-
// .disposed(by: disposeBag)
142+
// input.bugReportListSectionDidTap.asObservable()
143+
// .map { _ in MyPageStep.bugReportListIsRequired }
144+
// .bind(to: steps)
145+
// .disposed(by: disposeBag)
115146

116147
return Output(
117148
studentInfo: studentInfo,
118-
writableReviewList: writableReviewList
149+
writableReviewList: writableReviewList,
150+
changedImageURL: changedImageURL
119151
)
120152
}
121153
}

0 commit comments

Comments
 (0)