55// Created by 이동현 on 7/17/25.
66//
77import Combine
8+ import SafariServices
89import Shared
910import SnapKit
1011import UIKit
1112
1213final class MypageView : BaseViewController < MypageViewModel > {
1314 private enum Layout {
14- static let titleLabelHeight : CGFloat = 54
15- static let settingButtonSize : CGFloat = 48
16- static let settingButtonTrailingSpacing : CGFloat = 8
1715 static let profileImageViewSize : CGFloat = 80
1816 static let profileImageViewCornerRadius : CGFloat = profileImageViewSize / 2
1917 static let profileImageViewTopSpacing : CGFloat = 32
@@ -25,7 +23,7 @@ final class MypageView: BaseViewController<MypageViewModel> {
2523 }
2624
2725 private let titleLabel = UILabel ( )
28- private let settingButton = UIButton ( )
26+ private let settingButton = UIBarButtonItem ( )
2927 private let profileImageView = UIImageView ( )
3028 private let nicknameLabel = UILabel ( )
3129 private let dividerView = UIView ( )
@@ -41,19 +39,16 @@ final class MypageView: BaseViewController<MypageViewModel> {
4139 fatalError ( " init(coder:) has not been implemented " )
4240 }
4341
44- override func viewDidLoad( ) {
45- super. viewDidLoad ( )
46- }
47-
4842 override func configureAttribute( ) {
4943 view. backgroundColor = . white
44+ navigationItem. rightBarButtonItem = settingButton
45+ title = " 마이페이지 "
5046
51- titleLabel. text = " 마이페이지 "
52- titleLabel. font = BitnagilFont ( style: . title3, weight: . semiBold) . font
53- titleLabel. textAlignment = . center
54- titleLabel. textColor = . black
55-
56- settingButton. setImage ( BitnagilIcon . settingIcon, for: . normal)
47+ settingButton. action = #selector( settingButtonTapped)
48+ settingButton. tintColor = . black
49+ settingButton. image = BitnagilIcon
50+ . settingIcon?
51+ . withRenderingMode ( . alwaysTemplate)
5752
5853 profileImageView. layer. cornerRadius = Layout . profileImageViewCornerRadius
5954 profileImageView. layer. masksToBounds = true
@@ -73,26 +68,13 @@ final class MypageView: BaseViewController<MypageViewModel> {
7368
7469 override func configureLayout( ) {
7570 let safeArea = view. safeAreaLayoutGuide
76- view. addSubview ( titleLabel)
77- view. addSubview ( settingButton)
7871 view. addSubview ( profileImageView)
7972 view. addSubview ( nicknameLabel)
8073 view. addSubview ( dividerView)
8174 view. addSubview ( tableView)
8275
83- titleLabel. snp. makeConstraints { make in
84- make. horizontalEdges. top. equalTo ( safeArea)
85- make. height. equalTo ( Layout . titleLabelHeight)
86- }
87-
88- settingButton. snp. makeConstraints { make in
89- make. centerY. equalTo ( titleLabel)
90- make. trailing. equalToSuperview ( ) . inset ( Layout . settingButtonTrailingSpacing)
91- make. size. equalTo ( Layout . settingButtonSize)
92- }
93-
9476 profileImageView. snp. makeConstraints { make in
95- make. top. equalTo ( titleLabel . snp. bottom ) . offset ( Layout . profileImageViewTopSpacing)
77+ make. top. equalTo ( safeArea . snp. top ) . offset ( Layout . profileImageViewTopSpacing)
9678 make. centerX. equalToSuperview ( )
9779 make. size. equalTo ( Layout . profileImageViewSize)
9880 }
@@ -124,11 +106,16 @@ final class MypageView: BaseViewController<MypageViewModel> {
124106 . store ( in: & cancellables)
125107
126108 viewModel. output. externalURLPublisher
127- . sink { url in
128- UIApplication . shared. open ( url)
109+ . sink { [ weak self] url in
110+ let safariView = SFSafariViewController ( url: url)
111+ self ? . present ( safariView, animated: true )
129112 }
130113 . store ( in: & cancellables)
131114 }
115+
116+ @objc private func settingButtonTapped( ) {
117+ // TODO: - 추후 설정 페이지 연결
118+ }
132119}
133120
134121extension MypageView : UITableViewDelegate {
@@ -145,9 +132,9 @@ extension MypageView: UITableViewDataSource {
145132 }
146133
147134 func tableView( _ tableView: UITableView , cellForRowAt indexPath: IndexPath ) -> UITableViewCell {
148- guard
149- let cell = tableView . dequeueReusableCell ( withIdentifier : MypageTableViewCell . className ) as? MypageTableViewCell
150- else { return . init ( ) }
135+ guard let cell = tableView . dequeueReusableCell ( withIdentifier : MypageTableViewCell . className ) as? MypageTableViewCell else {
136+ return . init ( )
137+ }
151138
152139 let title = MypageViewModel . MypageMenu
153140 . allCases [ indexPath. row]
0 commit comments