@@ -10,12 +10,13 @@ import Combine
1010import DesignSystem
1111import Foundation
1212import UIKit
13+ import DIInjector
1314
1415final class EditProfileViewController : BaseViewController {
1516
1617 private var store : Set < AnyCancellable > = [ ]
17- private let router : SettingRouter
1818 private let viewModel : EditProfileViewModel
19+ @Injected private var router : SettingRouter
1920
2021 private lazy var scrollView : UIScrollView = UIScrollView ( ) . then {
2122 $0. showsHorizontalScrollIndicator = false
@@ -30,6 +31,16 @@ final class EditProfileViewController: BaseViewController {
3031 $0. spacing = 28
3132 $0. alignment = . leading
3233 }
34+
35+ private lazy var backgourndView = UIView ( ) . then {
36+ $0. isHidden = true
37+ $0. backgroundColor = STColors . black. color. withAlphaComponent ( 0.5 )
38+ }
39+
40+ private lazy var popup = PopUp ( ) . then {
41+ $0. isHidden = true
42+ $0. update ( titile: " 수정 중인 내용이 있소 " , description: " 저장하지 않고 화면을 벗어나면 \n 감쪽같이 사라질 것이오 " , actionButtonTitle: " 계속 수정하기 " , outButtonTitle: " 나가기 " )
43+ }
3344
3445 private lazy var nameStack = UIStackView ( ) . then {
3546 $0. axis = . vertical
@@ -134,14 +145,14 @@ final class EditProfileViewController: BaseViewController {
134145 }
135146
136147 private lazy var saveButton : UIButton = UIButton ( ) . then {
137- $0. setTitle ( " 저장 " , for: . normal)
138- $0. setTitleColor ( STColors . white. color, for: . normal)
148+ let style = Typography . Body_18_B
149+ style. color = STColors . white. color
150+ $0. setAttributedTitle ( " 저장하기 " . set ( style: style) , for: . normal)
139151 $0. backgroundColor = STColors . primary2. color
140152 $0. layer. cornerRadius = 8
141153 }
142154
143- init ( router: SettingRouter , viewModel: EditProfileViewModel = EditProfileViewModel ( ) ) {
144- self . router = router
155+ init ( viewModel: EditProfileViewModel = EditProfileViewModel ( ) ) {
145156 self . viewModel = viewModel
146157 super. init ( nibName: nil , bundle: nil )
147158 }
@@ -165,6 +176,11 @@ extension EditProfileViewController {
165176 title = " 프로필 수정 "
166177 navigationBar. backgroundColor = STColors . white. color
167178 let backButtonItem = NaivgationBarButtonItem . back
179+ backButtonItem. tapPublisher
180+ . sink { [ weak self] in
181+ self ? . viewModel. send ( input: . backButtonTapped)
182+ }
183+ . store ( in: & store)
168184 setNavigationBarLeftButtonItems ( items: [ backButtonItem] )
169185 }
170186}
@@ -181,6 +197,8 @@ extension EditProfileViewController {
181197 self . view. backgroundColor = STColors . white. color
182198 self . view. addSubview ( scrollView)
183199 self . view. addSubview ( saveButton)
200+ self . view. addSubview ( backgourndView)
201+ backgourndView. addSubview ( popup)
184202 scrollView. addSubview ( contentView)
185203 contentView. addSubview ( contentStackView)
186204
@@ -215,6 +233,16 @@ extension EditProfileViewController {
215233 make. top. bottom. equalToSuperview ( )
216234 make. leading. trailing. equalToSuperview ( ) . inset ( 24 )
217235 }
236+
237+ backgourndView. snp. makeConstraints { make in
238+ make. edges. equalToSuperview ( )
239+ }
240+
241+ popup. snp. makeConstraints { make in
242+ make. center. equalToSuperview ( )
243+ make. width. equalTo ( 327 )
244+ make. height. equalTo ( 206 )
245+ }
218246
219247 nameStack. snp. makeConstraints {
220248 $0. leading. trailing. equalToSuperview ( )
@@ -266,10 +294,11 @@ extension EditProfileViewController {
266294 self . nameTextField. text = user. name
267295 self . genderSelectionView. setInitialSelection ( gender: user. gender. rawValue)
268296 self . birthTextField. text = user. birthDate
269- if let bornTime = user. bornTime {
270- self . bornTimeSetButton. selectedItem = bornTime
297+ if let bornTime = user. birthTime {
298+ self . bornTimeSetButton. selectedItem = " \( bornTime [ 0 ] ) ~ \( bornTime [ 1 ] ) "
271299 } else {
272300 self . dontKnowButton. isSelected = true
301+ self . bornTimeSetButton. isEnabled = false
273302 }
274303 }
275304 . store ( in: & store)
@@ -332,7 +361,47 @@ extension EditProfileViewController {
332361 self . birthStack. layoutIfNeeded ( )
333362 }
334363 . store ( in: & store)
364+
365+ viewModel. output. setTimePickerLabel
366+ . receive ( on: RunLoop . main)
367+ . sink { [ weak self] time in
368+ guard let self else { return }
369+ self . bornTimeSetButton. selectedItem = time
370+ }
371+ . store ( in: & store)
372+
373+ viewModel. output. navigate
374+ . receive ( on: RunLoop . main)
375+ . sink { [ weak self ] route in
376+ guard let self else { return }
377+ if route == . pop { self . navigationController? . popViewController ( animated: true ) }
378+ }
379+ . store ( in: & store)
380+
381+ viewModel. output. updatePopupHiden
382+ . receive ( on: RunLoop . main)
383+ . sink { [ weak self] isHidden in
384+ guard let self else { return }
385+ self . popup. isHidden = isHidden
386+ self . backgourndView. isHidden = isHidden
387+ }
388+ . store ( in: & store)
389+
390+ popup. outButton. tapPublisher
391+ . sink { [ weak self] _ in
392+ guard let self else { return }
393+ self . navigationController? . popViewController ( animated: true )
394+ }
395+ . store ( in: & store)
335396
397+ popup. actionButton. tapPublisher
398+ . sink { [ weak self] _ in
399+ guard let self else { return }
400+ self . popup. isHidden = true
401+ self . backgourndView. isHidden = true
402+ }
403+ . store ( in: & store)
404+
336405 saveButton. tapPublisher
337406 . sink { [ weak self] _ in
338407 guard let self else { return }
@@ -350,7 +419,7 @@ extension EditProfileViewController {
350419 dontKnowButton. gesturePublisher ( gestureRecognizer: UITapGestureRecognizer ( ) )
351420 . sink { [ weak self] _ in
352421 guard let self else { return }
353- self . viewModel. send ( input: . bornTimeSelected( bornTime: . dontKnow( isSelected: true ) ) )
422+ self . viewModel. send ( input: . bornTimeSelected( bornTime: . dontKnow( isSelected: self . dontKnowButton . isSelected ) ) )
354423 bornTimeSetButton. isEnabled. toggle ( )
355424 self . dontKnowButton. isSelected. toggle ( )
356425 }
@@ -463,6 +532,7 @@ extension EditProfileViewController: UITextFieldDelegate {
463532 }
464533
465534 public func textFieldShouldReturn( _ textField: UITextField ) -> Bool {
535+ textField. resignFirstResponder ( )
466536 if textField === nameTextField {
467537 guard let name = textField. text, !name. isEmpty else {
468538 return false
@@ -472,8 +542,3 @@ extension EditProfileViewController: UITextFieldDelegate {
472542 return true
473543 }
474544}
475-
476- @available ( iOS 17 . 0 , * )
477- #Preview {
478- return EditProfileViewController ( router: SettingRouter ( ) )
479- }
0 commit comments