Skip to content

Commit 82a7dc0

Browse files
committed
[#234] 소속 설정 UILabel 추가
1 parent 4464188 commit 82a7dc0

File tree

4 files changed

+98
-61
lines changed

4 files changed

+98
-61
lines changed

EATSSU/App/Sources/Presentation/Auth/Enum/NIcknameTextFieldResultType.swift

+24-9
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,51 @@
77

88
import UIKit
99

10+
/// 닉네임 입력 필드의 상태를 나타내는 열거형입니다.
11+
/// 사용자가 닉네임을 입력할 때 발생할 수 있는 다양한 검증 결과를 정의합니다.
1012
enum NicknameTextFieldResultType {
11-
/// common
13+
/// 사용자가 입력 필드를 비워둔 경우
1214
case textFieldEmpty
13-
/// nickname
15+
16+
/// 닉네임이 허용된 길이를 초과한 경우 (예: 2~8자를 벗어남)
1417
case nicknameTextFieldOver
18+
19+
/// 닉네임이 중복된 경우 (이미 사용 중인 닉네임)
1520
case nicknameTextFieldDuplicated
21+
22+
/// 닉네임 중복 확인이 필요한 경우 (사용자가 중복 확인을 수행하지 않음)
1623
case nicknameTextFieldDoubleCheck
24+
25+
/// 사용 가능한 닉네임인 경우
1726
case nicknameTextFieldValid
1827

28+
/// 각 상태에 대한 안내 메시지를 반환합니다.
29+
///
30+
/// - Returns: 사용자가 해당 상태에서 확인할 수 있는 힌트 메시지
1931
var hintMessage: String {
2032
switch self {
2133
case .textFieldEmpty:
22-
"필수 입력 사항입니다"
34+
"필수 입력 사항입니다" // 닉네임 필드가 비어 있을 때 표시
2335
case .nicknameTextFieldOver:
24-
"2~8자내로 입력해주세요"
36+
"2~8자내로 입력해주세요" // 닉네임 길이 제한 초과 시 표시
2537
case .nicknameTextFieldDoubleCheck:
26-
"중복 확인을 진행해주세요"
38+
"중복 확인을 진행해주세요" // 중복 확인 필요할 때 표시
2739
case .nicknameTextFieldDuplicated:
28-
"이미 사용 중인 닉네임이에요"
40+
"이미 사용 중인 닉네임이에요" // 중복된 닉네임일 때 표시
2941
case .nicknameTextFieldValid:
30-
"사용가능한 닉네임이에요"
42+
"사용가능한 닉네임이에요" // 닉네임이 사용 가능할 때 표시
3143
}
3244
}
3345

46+
/// 각 상태에 따라 적용되는 텍스트 색상을 반환합니다.
47+
///
48+
/// - Returns: 상태별로 지정된 `UIColor`
3449
var textColor: UIColor {
3550
switch self {
3651
case .textFieldEmpty, .nicknameTextFieldOver, .nicknameTextFieldDuplicated, .nicknameTextFieldDoubleCheck:
37-
.primary
52+
.primary // 오류 및 확인 필요 상태에서 `primary` 색상 적용
3853
case .nicknameTextFieldValid:
39-
.gray700
54+
.gray700 // 유효한 닉네임일 때 `gray700` 색상 적용
4055
}
4156
}
4257
}

EATSSU/App/Sources/Presentation/MyPage/View/MyInfoView.swift

+52-40
Original file line numberDiff line numberDiff line change
@@ -20,90 +20,102 @@ final class MyInfoView: BaseUIView {
2020
// MARK: - UI Components
2121

2222
/// 닉네임 설정 안내 문구
23-
let nickNameLabel = UILabel().then {
23+
let nicknameSettingLabel = UILabel().then {
2424
$0.text = "EAT-SSU에서 사용할\n닉네임을 설정해 주세요"
2525
$0.numberOfLines = 2
2626
$0.font = EATSSUDesignFontFamily.Pretendard.bold.font(size: 18)
2727
}
2828

2929
/// 닉네임 입력 필드
30-
let inputNickNameTextField = ESTextField(placeholder: ESTextLiteral.Nickname.inputNickName)
30+
let nicknameTextField = ESTextField(placeholder: ESTextLiteral.Nickname.inputNickName)
3131

3232
/// 닉네임 중복 확인 버튼
33-
let nicknameDoubleCheckButton = ESButton(size: .small, title: "중복 확인").then {
33+
let nicknameCheckButton = ESButton(size: .small, title: "중복 확인").then {
3434
$0.isEnabled = false
3535
}
3636

3737
/// 닉네임 검증 결과 메시지를 표시하는 레이블
38-
let nicknameValidationMessageLabel = UILabel().then {
38+
let nicknameValidationLabel = UILabel().then {
3939
$0.text = ESTextLiteral.Nickname.hintInputNickName
4040
$0.textColor = EATSSUDesignAsset.Color.GrayScale.gray400.color
4141
$0.font = EATSSUDesignFontFamily.Pretendard.regular.font(size: 12)
4242
}
4343

4444
/// 닉네임 입력 필드 및 검증 메시지를 포함하는 StackView
45-
lazy var setNickNameStackView = UIStackView(arrangedSubviews: [
46-
inputNickNameTextField,
47-
nicknameValidationMessageLabel,
45+
lazy var nicknameStackView = UIStackView(arrangedSubviews: [
46+
nicknameTextField,
47+
nicknameValidationLabel,
4848
]).then {
4949
$0.axis = .vertical
5050
$0.spacing = 8.0
5151
}
5252

5353
/// 완료 버튼
54-
let completeSettingNickNameButton = ESButton(size: .big, title: "완료하기").then {
54+
let completeButton = ESButton(size: .big, title: ESTextLiteral.MyPage.complete).then {
5555
$0.isEnabled = false
5656
}
5757

58+
/// 소속 설정 UILabel
59+
let affiliationLabel = UILabel().then {
60+
$0.text = ESTextLiteral.MyPage.affiliationSetting
61+
$0.font = EATSSUDesignFontFamily.Pretendard.medium.font(size: 14)
62+
}
63+
5864
// MARK: - Initializer
5965

6066
override init(frame: CGRect) {
6167
super.init(frame: frame)
62-
setTextFieldDelegate()
68+
configureTextFieldDelegate()
6369
}
6470

6571
// MARK: - Functions
6672

6773
/// UI 구성 요소를 추가하는 메서드
6874
override func configureUI() {
6975
addSubviews(
70-
nickNameLabel,
71-
setNickNameStackView,
72-
completeSettingNickNameButton,
73-
nicknameDoubleCheckButton
76+
nicknameSettingLabel,
77+
nicknameStackView,
78+
completeButton,
79+
nicknameCheckButton,
80+
affiliationLabel
7481
)
7582
}
7683

7784
/// 레이아웃 설정 메서드
7885
override func setLayout() {
79-
nickNameLabel.snp.makeConstraints {
86+
affiliationLabel.snp.makeConstraints {
87+
$0.top.equalTo(nicknameStackView.snp.bottom).offset(40)
88+
$0.leading.equalTo(nicknameStackView.snp.leading)
89+
}
90+
91+
nicknameSettingLabel.snp.makeConstraints {
8092
$0.top.equalTo(safeAreaLayoutGuide).offset(20)
8193
$0.leading.equalToSuperview().inset(16)
8294
}
83-
setNickNameStackView.snp.makeConstraints {
84-
$0.top.equalTo(nickNameLabel.snp.bottom).offset(16)
95+
nicknameStackView.snp.makeConstraints {
96+
$0.top.equalTo(nicknameSettingLabel.snp.bottom).offset(16)
8597
$0.leading.equalToSuperview().inset(16)
86-
$0.trailing.equalTo(nicknameDoubleCheckButton.snp.leading).offset(-5)
98+
$0.trailing.equalTo(nicknameCheckButton.snp.leading).offset(-5)
8799
}
88-
nicknameDoubleCheckButton.snp.makeConstraints {
89-
$0.top.equalTo(inputNickNameTextField)
100+
nicknameCheckButton.snp.makeConstraints {
101+
$0.top.equalTo(nicknameTextField)
90102
$0.width.equalTo(75)
91103
$0.height.equalTo(48)
92104
$0.trailing.equalToSuperview().inset(16)
93105
}
94-
inputNickNameTextField.snp.makeConstraints {
106+
nicknameTextField.snp.makeConstraints {
95107
$0.height.equalTo(48)
96108
}
97-
completeSettingNickNameButton.snp.makeConstraints {
109+
completeButton.snp.makeConstraints {
98110
$0.horizontalEdges.equalToSuperview().inset(16)
99111
$0.bottom.equalTo(safeAreaLayoutGuide).inset(26)
100112
$0.height.equalTo(50)
101113
}
102114
}
103115

104116
/// 닉네임 입력 필드의 delegate 설정
105-
func setTextFieldDelegate() {
106-
inputNickNameTextField.delegate = self
117+
func configureTextFieldDelegate() {
118+
nicknameTextField.delegate = self
107119
}
108120
}
109121

@@ -121,16 +133,16 @@ extension MyInfoView: UITextFieldDelegate {
121133
guard let inputValue = textField.text?.trimmingCharacters(in: .whitespaces) else { return }
122134

123135
if inputValue.isEmpty {
124-
textFieldSettingWhenEmpty()
136+
updateTextFieldForEmptyState()
125137
return
126138
}
127-
checkNicknameValidation(textField)
139+
validateNickname(textField)
128140
}
129141

130142
/// 입력 필드를 초기화할 때 호출 (버튼 비활성화)
131143
func textFieldShouldClear(_: UITextField) -> Bool {
132-
nicknameDoubleCheckButton.isEnabled = false
133-
completeSettingNickNameButton.isEnabled = false
144+
nicknameCheckButton.isEnabled = false
145+
completeButton.isEnabled = false
134146
return true
135147
}
136148
}
@@ -139,20 +151,20 @@ extension MyInfoView: UITextFieldDelegate {
139151

140152
private extension MyInfoView {
141153
/// 닉네임 입력 값이 없을 때 기본 메시지를 표시
142-
func textFieldSettingWhenEmpty() {
143-
nicknameValidationMessageLabel.text = NicknameTextFieldResultType.textFieldEmpty.hintMessage
144-
nicknameValidationMessageLabel.textColor = NicknameTextFieldResultType.textFieldEmpty.textColor
154+
func updateTextFieldForEmptyState() {
155+
nicknameValidationLabel.text = NicknameTextFieldResultType.textFieldEmpty.hintMessage
156+
nicknameValidationLabel.textColor = NicknameTextFieldResultType.textFieldEmpty.textColor
145157
}
146158

147159
/// 닉네임 유효성 검사
148-
func checkNicknameValidation(_ textField: UITextField) {
160+
func validateNickname(_ textField: UITextField) {
149161
if let userNickname = textField.text {
150-
if nicknameInputChanged(nickname: userNickname) {
151-
nicknameValidationMessageLabel.text = NicknameTextFieldResultType.nicknameTextFieldDoubleCheck.hintMessage
152-
nicknameValidationMessageLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldDoubleCheck.textColor
162+
if isNicknameValid(userNickname) {
163+
nicknameValidationLabel.text = NicknameTextFieldResultType.nicknameTextFieldDoubleCheck.hintMessage
164+
nicknameValidationLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldDoubleCheck.textColor
153165
} else {
154-
nicknameValidationMessageLabel.text = NicknameTextFieldResultType.nicknameTextFieldOver.hintMessage
155-
nicknameValidationMessageLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldOver.textColor
166+
nicknameValidationLabel.text = NicknameTextFieldResultType.nicknameTextFieldOver.hintMessage
167+
nicknameValidationLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldOver.textColor
156168
}
157169
}
158170
}
@@ -163,14 +175,14 @@ private extension MyInfoView {
163175
- Parameter nickname: 사용자가 입력한 닉네임
164176
- Returns: 닉네임이 유효한 경우 `true`, 그렇지 않으면 `false`
165177
*/
166-
func nicknameInputChanged(nickname: String) -> Bool {
167-
completeSettingNickNameButton.isEnabled = false
178+
func isNicknameValid(_ nickname: String) -> Bool {
179+
completeButton.isEnabled = false
168180

169181
if nickname.count > 1, nickname.count < 9 {
170-
nicknameDoubleCheckButton.isEnabled = true
182+
nicknameCheckButton.isEnabled = true
171183
return true
172184
} else {
173-
nicknameDoubleCheckButton.isEnabled = false
185+
nicknameCheckButton.isEnabled = false
174186
return false
175187
}
176188
}

EATSSU/App/Sources/Presentation/MyPage/ViewController/MyInfoViewController.swift

+14-12
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,22 @@ final class MyInfoViewController: BaseViewController {
5858
}
5959

6060
override func setButtonEvent() {
61-
myInfoView.completeSettingNickNameButton.addTarget(self, action: #selector(tappedCompleteNickNameButton), for: .touchUpInside)
62-
myInfoView.nicknameDoubleCheckButton.addTarget(self, action: #selector(tappedCheckButton), for: .touchUpInside)
61+
myInfoView.completeButton.addTarget(self, action: #selector(tappedCompleteNickNameButton), for: .touchUpInside)
62+
myInfoView.nicknameCheckButton.addTarget(self, action: #selector(tappedCheckButton), for: .touchUpInside)
6363
}
6464

6565
// MARK: - 닉네임 설정 이벤트
6666

6767
/// "닉네임 설정 완료" 버튼을 눌렀을 때 호출됩니다.
6868
@objc
6969
func tappedCompleteNickNameButton() {
70-
setUserNickname(nickname: myInfoView.inputNickNameTextField.text ?? "")
70+
setUserNickname(nickname: myInfoView.nicknameTextField.text ?? "")
7171
}
7272

7373
/// "중복 확인" 버튼을 눌렀을 때 호출됩니다.
7474
@objc
7575
func tappedCheckButton() {
76-
checkNickname(nickname: myInfoView.inputNickNameTextField.text ?? "")
76+
checkNickname(nickname: myInfoView.nicknameTextField.text ?? "")
7777
}
7878

7979
// MARK: - 키보드 감지
@@ -107,7 +107,7 @@ final class MyInfoViewController: BaseViewController {
107107
let updateKeyboardHeight = keyboardSize.height
108108
let difference = updateKeyboardHeight - currentKeyboardHeight
109109

110-
myInfoView.completeSettingNickNameButton.frame.origin.y -= difference
110+
myInfoView.completeButton.frame.origin.y -= difference
111111
currentKeyboardHeight = updateKeyboardHeight
112112
}
113113
}
@@ -116,7 +116,7 @@ final class MyInfoViewController: BaseViewController {
116116
@objc
117117
func keyboardWillHide(_ notification: Notification) {
118118
if ((notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
119-
myInfoView.completeSettingNickNameButton.frame.origin.y += currentKeyboardHeight
119+
myInfoView.completeButton.frame.origin.y += currentKeyboardHeight
120120
currentKeyboardHeight = 0.0
121121
}
122122
}
@@ -166,14 +166,16 @@ extension MyInfoViewController {
166166
let isSuccess = responseData.result
167167
if isSuccess {
168168
self.view.showToast(message: "사용 가능한 닉네임이에요")
169-
self.myInfoView.completeSettingNickNameButton.isEnabled = true
170-
self.myInfoView.nicknameValidationMessageLabel.text = NicknameTextFieldResultType.nicknameTextFieldValid.hintMessage
171-
self.myInfoView.nicknameValidationMessageLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldValid.textColor
169+
self.myInfoView.completeButton.isEnabled = true
170+
self.myInfoView.nicknameValidationLabel.text = NicknameTextFieldResultType.nicknameTextFieldValid.hintMessage
171+
self.myInfoView.nicknameValidationLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldValid.textColor
172172
} else {
173173
self.view.showToast(message: "이미 사용 중인 닉네임이에요")
174-
self.myInfoView.completeSettingNickNameButton.isEnabled = false
175-
self.myInfoView.nicknameValidationMessageLabel.text = NicknameTextFieldResultType.nicknameTextFieldDuplicated.hintMessage
176-
self.myInfoView.nicknameValidationMessageLabel.textColor = NicknameTextFieldResultType.nicknameTextFieldDuplicated.textColor
174+
self.myInfoView.completeButton.isEnabled = false
175+
self.myInfoView.nicknameValidationLabel.text =
176+
NicknameTextFieldResultType.nicknameTextFieldDuplicated.hintMessage
177+
self.myInfoView.nicknameValidationLabel.textColor =
178+
NicknameTextFieldResultType.nicknameTextFieldDuplicated.textColor
177179
}
178180
} catch let err {
179181
print(err.localizedDescription)

EATSSU/App/Sources/Utility/Literal/ESTextLiteral.swift

+8
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,14 @@ enum ESTextLiteral {
172172
// MARK: - MyPage
173173

174174
enum MyPage {
175+
/// 완료하기 값입니다.
176+
/// - Note: "완료하기"
177+
static let complete: String = "완료하기"
178+
179+
/// 소속설정 UILabel의 값입니다.
180+
/// - Note: "소속 설정"
181+
static let affiliationSetting: String = "소속 설정"
182+
175183
/// 알림 수신 권한 설정을 요청하는 메시지 텍스트입니다.
176184
/// - Note: "설정에서 알림수신을 동의해주세요!"
177185
static let authorizeNotificationSettingMessage: String = "설정에서 알림수신을 동의해주세요!"

0 commit comments

Comments
 (0)