Skip to content

Commit

Permalink
[iOS#421] 프로필 설정에서 이모티콘 입력 제한하기 (#445)
Browse files Browse the repository at this point in the history
* feat: 이모티콘 포함 불가 메시지 다국어 지원

* feat: 닉네임 이모티콘 포함 여부 검사 추가

* feat: 로직 적용 및 함수 분리
  • Loading branch information
ericKwon95 authored Dec 13, 2023
1 parent 8c6e141 commit 705c2a4
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -214,25 +214,31 @@ final class SignUpViewController: BaseViewController {
DispatchQueue.main.async {
switch state {
case .valid:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.approveGreen.color
self.doneButton.isEnabled = true
self.approveNickName()
case .lengthViolation:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
self.invalidNickName(state)
case .emptyViolation:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
self.invalidNickName(state)
case .duplicated:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
self.invalidNickName(state)
case .emojiContained:
self.invalidNickName(state)
}
}
}

private func approveNickName() {
self.nickNameValidationStateLabel.text = NickNameValidationState.valid.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.approveGreen.color
self.doneButton.isEnabled = true
}

private func invalidNickName(_ state: NickNameValidationState) {
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
}

private func showErrorAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: Constant.okTitle, style: .default))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,23 +104,3 @@ final class SignUpViewModel: SignUpViewModelProtocol {
.eraseToAnyPublisher()
}
}

enum NickNameValidationState {
case valid
case lengthViolation
case emptyViolation
case duplicated

var message: String {
switch self {
case .valid:
return NSLocalizedString("available", comment: "")
case .lengthViolation:
return NSLocalizedString("lengthViolation", comment: "")
case .emptyViolation:
return NSLocalizedString("emptyViolation", comment: "")
case .duplicated:
return NSLocalizedString("duplicated", comment: "")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -251,25 +251,31 @@ final class ProfileSettingsViewController: BaseViewController {
DispatchQueue.main.async {
switch state {
case .valid:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.approveGreen.color
self.doneButton.isEnabled = true
self.approveNickName()
case .lengthViolation:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
self.invalidNickName(state)
case .emptyViolation:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
self.invalidNickName(state)
case .duplicated:
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
self.invalidNickName(state)
case .emojiContained:
self.invalidNickName(state)
}
}
}

private func approveNickName() {
self.nickNameValidationStateLabel.text = NickNameValidationState.valid.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.approveGreen.color
self.doneButton.isEnabled = true
}

private func invalidNickName(_ state: NickNameValidationState) {
self.nickNameValidationStateLabel.text = state.message
self.nickNameValidationStateLabel.textColor = FlipMateColor.warningRed.color
self.doneButton.isEnabled = false
}

private func showErrorAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: Constant.okTitle, style: .default))
Expand Down Expand Up @@ -354,7 +360,7 @@ extension ProfileSettingsViewController: PHPickerViewControllerDelegate {
}
}
}

private func removedOrientationImage(_ image: UIImage) -> UIImage {
guard image.imageOrientation != .up else { return image }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ final class NickNameValidator: NickNameValidatable {
static let minLength = 2
}

if nickName.containsEmoji {
return NickNameValidationState.emojiContained
}

if nickName.count > Constant.maxLenght {
return NickNameValidationState.lengthViolation
}
Expand All @@ -30,3 +34,45 @@ final class NickNameValidator: NickNameValidatable {
return NickNameValidationState.valid
}
}

enum NickNameValidationState {
case valid
case lengthViolation
case emptyViolation
case duplicated
case emojiContained

var message: String {
switch self {
case .valid:
return NSLocalizedString("available", comment: "")
case .lengthViolation:
return NSLocalizedString("lengthViolation", comment: "")
case .emptyViolation:
return NSLocalizedString("emptyViolation", comment: "")
case .duplicated:
return NSLocalizedString("duplicated", comment: "")
case .emojiContained:
return NSLocalizedString("emojiContained", comment: "")
}
}
}

extension Character {
var isSimpleEmoji: Bool {
guard let firstScalar = unicodeScalars.first else {
return false
}
return firstScalar.properties.isEmoji && firstScalar.value > 0x238C
}
var isCombinedIntoEmoji: Bool {
unicodeScalars.count > 1 && unicodeScalars.first?.properties.isEmoji ?? false
}
var isEmoji: Bool { isSimpleEmoji || isCombinedIntoEmoji }
}

extension String {
var containsEmoji: Bool {
return contains { $0.isEmoji }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"lengthViolation" = "Nickname cannot exceed 10 characters.";
"emptyViolation" = "Nickname must contain at least 2 characters.";
"duplicated" = "Nickname has been duplicated.";
"emojiContained" = "Nickname cannot contain emojis.";

// MARK: - Friend Add Scene
"addFriend" = "Add Friend";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"lengthViolation" = "ニックネームが10文字を超えました。";
"emptyViolation" = "ニックネームは2文字以上入力する必要があります。";
"duplicated" = "重複したニックネームです。";
"emojiContained" = "ニックネームに絵文字を含めることはできません";

// MARK: - Friend Add Scene

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"lengthViolation" = "닉네임이 10자를 초과했습니다.";
"emptyViolation" = "닉네임은 2자 이상 입력해야 합니다.";
"duplicated" = "중복된 닉네임 입니다.";
"emojiContained" = "이모티콘을 포함할 수 없습니다.";

// MARK: - Friend Add Scene
"addFriend" = "친구 추가";
Expand Down

0 comments on commit 705c2a4

Please sign in to comment.