From 773369566677a70c4063603d66bd80a4705e1ca7 Mon Sep 17 00:00:00 2001 From: yeonee Date: Wed, 3 Dec 2025 00:21:22 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20#336=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=86=A0=EC=BD=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WriteQuest/Common/QuestTextField.swift | 3 +-- .../WriteActiveTypeQuestView.swift | 8 -------- .../WriteQuestionTypeQuestView.swift | 16 ---------------- .../WriteActiveTypeQuestViewController.swift | 12 +++++++++--- .../Protocol/QuestCompleteProtocol.swift | 7 +++---- 5 files changed, 13 insertions(+), 33 deletions(-) diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/Common/QuestTextField.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/Common/QuestTextField.swift index 6826f3c4..9256f430 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/Common/QuestTextField.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/Common/QuestTextField.swift @@ -104,7 +104,6 @@ extension QuestTextField: UITextViewDelegate { } count = textView.text.count textCount.text = "(\(count)/\(limitCount))" - delegate?.changeStyle(count: count) - delegate?.changeStyleWhenEditing(changedText: textView.text) + delegate?.updateButtonWhenWriting(text: textView.text) } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/ActivationType/WriteActiveTypeQuestView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/ActivationType/WriteActiveTypeQuestView.swift index 3f214468..d7cf248c 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/ActivationType/WriteActiveTypeQuestView.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/ActivationType/WriteActiveTypeQuestView.swift @@ -183,11 +183,3 @@ extension WriteActiveTypeQuestView { ) } } - -extension WriteActiveTypeQuestView: QuestCompleteProtocol { - func changeStyle(count: Int) { - if count == 1 { - confirmButton.updateType(.enabled) - } - } -} diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/QuestionType/WriteQuestionTypeQuestView.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/QuestionType/WriteQuestionTypeQuestView.swift index e22a846d..ba62b380 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/QuestionType/WriteQuestionTypeQuestView.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/View/QuestionType/WriteQuestionTypeQuestView.swift @@ -35,7 +35,6 @@ final class WriteQuestionTypeQuestView: BaseView { errorIcon, descriptionLabel ) - setDelegate() } override func setStyle() { @@ -59,10 +58,6 @@ final class WriteQuestionTypeQuestView: BaseView { } } - private func setDelegate() { - questTextField.delegate = self - } - override func touchesBegan(_ touches: Set, with event: UIEvent?) { self.endEditing(true) } @@ -108,14 +103,3 @@ extension WriteQuestionTypeQuestView { ) } } - -extension WriteQuestionTypeQuestView: QuestCompleteProtocol { - func changeStyle(count: Int) { - if (count >= 10) && - (!questTextField.textView.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) { - confirmButton.updateType(.enabled) - } else { - confirmButton.updateType(.disabled) - } - } -} diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift index da3451f2..c7771e73 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift @@ -319,7 +319,7 @@ extension WriteActiveTypeQuestViewController: UIImagePickerControllerDelegate, U rootView.imageContainer.changeIconHidden() rootView.imgCount = 1 rootView.updateImageCountLabel(count: rootView.imgCount) - rootView.changeStyle(count: rootView.imgCount) + changeCount(count: rootView.imgCount) self.image = image isImageChanged = questMode == .edit ? true : false } @@ -399,8 +399,14 @@ extension WriteActiveTypeQuestViewController: EditQuestProtocol { } extension WriteActiveTypeQuestViewController: QuestCompleteProtocol { - func changeStyleWhenEditing(changedText: String) { - if answerText != changedText { + func changeCount(count: Int) { + if count == 1 { + rootView.confirmButton.updateType(.enabled) + } + } + + func updateButtonWhenWriting(text: String) { + if answerText != text { rootView.confirmButton.updateType(.enabled) } else { rootView.confirmButton.updateType(.disabled) diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Protocol/QuestCompleteProtocol.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Protocol/QuestCompleteProtocol.swift index b5464897..f1b5afe8 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Protocol/QuestCompleteProtocol.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Protocol/QuestCompleteProtocol.swift @@ -6,11 +6,10 @@ // protocol QuestCompleteProtocol: AnyObject { - func changeStyle(count: Int) - func changeStyleWhenEditing(changedText: String) + func changeCount(count: Int) + func updateButtonWhenWriting(text: String) } extension QuestCompleteProtocol { - func changeStyle(count: Int) { return } - func changeStyleWhenEditing(changedText: String) { return } + func changeCount(count: Int) { return } } From 9b288ded304e8b4e37bfedcf46023b3c4a286a12 Mon Sep 17 00:00:00 2001 From: yeonee Date: Wed, 3 Dec 2025 00:21:41 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fiix:=20#336=2010=EC=9E=90=20=EC=9D=B4?= =?UTF-8?q?=EC=83=81=20=EC=9E=91=EC=84=B1=EC=8B=9C=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?Enabled=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...WriteQuestionTypeQuestViewController.swift | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift index 78b23ea8..5508871c 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift @@ -285,11 +285,32 @@ extension WriteQuestionTypeQuestViewController: EditQuestProtocol { } extension WriteQuestionTypeQuestViewController: QuestCompleteProtocol { - func changeStyleWhenEditing(changedText: String) { - if answerText != changedText { - rootView.confirmButton.updateType(.enabled) + func updateButtonWhenWriting(text: String) { + switch questMode { + case .write: + if isValidAnswerText(text: text){ + rootView.confirmButton.updateType(.enabled) + } else { + rootView.confirmButton.updateType(.disabled) + } + + case .edit: + if answerText != text && isValidAnswerText(text: text) { + rootView.confirmButton.updateType(.enabled) + } else { + rootView.confirmButton.updateType(.disabled) + } + } + } +} + +extension WriteQuestionTypeQuestViewController { + private func isValidAnswerText(text: String) -> Bool { + if (text.count >= 10) && + (!rootView.questTextField.textView.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) { + return true } else { - rootView.confirmButton.updateType(.disabled) + return false } } } From 0cafc655b1d84a2364f03a4105ea8014135a2163 Mon Sep 17 00:00:00 2001 From: yeonee Date: Wed, 3 Dec 2025 00:28:32 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20#336=20=ED=96=89=EB=8F=99=ED=98=95?= =?UTF-8?q?=20=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EC=97=86=EC=9D=B4=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=8B=9C=20=20enable=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/WriteActiveTypeQuestViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift index c7771e73..3f82e466 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteActiveTypeQuestViewController.swift @@ -406,7 +406,7 @@ extension WriteActiveTypeQuestViewController: QuestCompleteProtocol { } func updateButtonWhenWriting(text: String) { - if answerText != text { + if rootView.imgCount == 1 && answerText != text { rootView.confirmButton.updateType(.enabled) } else { rootView.confirmButton.updateType(.disabled) From 3bd1fcec1d5320430d492acd205866894700eb07 Mon Sep 17 00:00:00 2001 From: yeonee Date: Thu, 4 Dec 2025 00:48:39 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20#336=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/DomainDependencyAssembler.swift | 4 ++ .../UseCase/isValidQuestAnswerUseCase.swift | 38 ++++++++++++++++++ ...WriteQuestionTypeQuestViewController.swift | 39 +++++++------------ .../ViewModel/WriteQuestTypeViewModel.swift | 21 +++++++++- .../PresentationDependencyAssembler.swift | 6 ++- 5 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/isValidQuestAnswerUseCase.swift diff --git a/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift b/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift index 66a926d7..31fb6cdc 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Domain/DomainDependencyAssembler.swift @@ -152,6 +152,10 @@ struct DomainDependencyAssembler: DependencyAssembler { return DefaultCheckHasEnterMyPageUseCase(repository: userRepository) } + DIContainer.shared.register(type: IsValidQuestAnswerUseCase.self) { _ in + return DefaultIsValidQuestAnswerUseCase() + } + DIContainer.shared.register(type: CheckAlarmEnabledUseCase.self) { _ in return DefaultCheckAlarmEnabledUseCase(repository: userRepository) } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/isValidQuestAnswerUseCase.swift b/ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/isValidQuestAnswerUseCase.swift new file mode 100644 index 00000000..5112138f --- /dev/null +++ b/ByeBoo-iOS/ByeBoo-iOS/Domain/UseCase/isValidQuestAnswerUseCase.swift @@ -0,0 +1,38 @@ +// +// isValidQuestAnswerUseCase.swift +// ByeBoo-iOS +// +// Created by 이나연 on 12/4/25. +// + +import Foundation + +protocol IsValidQuestAnswerUseCase { + func execute(previousText: String, changingText: String) -> Bool +} + +struct DefaultIsValidQuestAnswerUseCase: IsValidQuestAnswerUseCase { + func execute(previousText: String, changingText: String) -> Bool { + if previousText.isEmpty { + if isValidAnswerText(text: changingText) { + return true + } else { + return false + } + } else { + if previousText != changingText && isValidAnswerText(text: changingText) { + return true + } else { + return false + } + } + } + + private func isValidAnswerText(text: String) -> Bool { + if (text.count >= 10) && !text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + return true + } else { + return false + } + } +} diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift index 5508871c..07f587ab 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewController/WriteQuestionTypeQuestViewController.swift @@ -221,6 +221,18 @@ extension WriteQuestionTypeQuestViewController: ToastPresentable, ToastErrorHand } } .store(in: &cancellables) + + viewModel.output.isValidTextPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] result in + switch result { + case true: + self?.rootView.confirmButton.updateType(.enabled) + case false: + self?.rootView.confirmButton.updateType(.disabled) + } + } + .store(in: &cancellables) } } @@ -286,31 +298,6 @@ extension WriteQuestionTypeQuestViewController: EditQuestProtocol { extension WriteQuestionTypeQuestViewController: QuestCompleteProtocol { func updateButtonWhenWriting(text: String) { - switch questMode { - case .write: - if isValidAnswerText(text: text){ - rootView.confirmButton.updateType(.enabled) - } else { - rootView.confirmButton.updateType(.disabled) - } - - case .edit: - if answerText != text && isValidAnswerText(text: text) { - rootView.confirmButton.updateType(.enabled) - } else { - rootView.confirmButton.updateType(.disabled) - } - } - } -} - -extension WriteQuestionTypeQuestViewController { - private func isValidAnswerText(text: String) -> Bool { - if (text.count >= 10) && - (!rootView.questTextField.textView.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) { - return true - } else { - return false - } + viewModel.action(.textFieldEditing(answerText: self.answerText, text: text)) } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift index 2d607845..3f28e97b 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift @@ -17,27 +17,32 @@ struct WriteQuestionTypeViewModel: ViewModelType { private let saveQuestTypeUseCase: SaveQuestTypeUseCase private let getQuestInfoUseCase: GetQuestInfoUseCase private let editQuestTypeUseCase: EditQuestTypeUseCase + private let isValidQuestAnswerUseCase: IsValidQuestAnswerUseCase private let questInfoResultSubject: PassthroughSubject, Never> = .init() private let questInfoWhenEditModeSubject: PassthroughSubject, Never> = .init() private let didSuccessPostSubject: PassthroughSubject, Never> = .init() private let didSuccessEditSubject: PassthroughSubject, Never> = .init() + private let isValidTextSubject: PassthroughSubject = .init() init( saveQuestTypeUseCase: SaveQuestTypeUseCase, getQuestInfoUseCase: GetQuestInfoUseCase, - editQuestTypeUseCase: EditQuestTypeUseCase + editQuestTypeUseCase: EditQuestTypeUseCase, + isValidQuestAnswerUseCase: IsValidQuestAnswerUseCase ){ self.saveQuestTypeUseCase = saveQuestTypeUseCase self.getQuestInfoUseCase = getQuestInfoUseCase self.editQuestTypeUseCase = editQuestTypeUseCase + self.isValidQuestAnswerUseCase = isValidQuestAnswerUseCase output = Output( questInfoResultPublisher: questInfoResultSubject.eraseToAnyPublisher(), didSuccessPostPublisher: didSuccessPostSubject.eraseToAnyPublisher(), questInfoWhenEditModeResultPublisher: questInfoWhenEditModeSubject.eraseToAnyPublisher(), - didSuccessEditPublisher: didSuccessEditSubject.eraseToAnyPublisher() + didSuccessEditPublisher: didSuccessEditSubject.eraseToAnyPublisher(), + isValidTextPublisher: isValidTextSubject.eraseToAnyPublisher() ) } } @@ -47,6 +52,7 @@ extension WriteQuestionTypeViewModel { case viewDidLoad(quesetID: Int) case presentCompleteView(questID: Int, answer: String, emotionState: String?, isEdit: Bool) case viewDidLoadWhenEditMode(questID: Int) + case textFieldEditing(answerText: String, text: String) } struct Output { @@ -54,6 +60,7 @@ extension WriteQuestionTypeViewModel { let didSuccessPostPublisher: AnyPublisher, Never> let questInfoWhenEditModeResultPublisher: AnyPublisher, Never> let didSuccessEditPublisher: AnyPublisher, Never> + let isValidTextPublisher: AnyPublisher } func action(_ trigger: Input) { @@ -72,6 +79,8 @@ extension WriteQuestionTypeViewModel { guard let emotionState = emotionState else { return } postQuestType(questID: questID, answer: answer, emotionState: emotionState) } + case .textFieldEditing(let answerText, let text): + isValidText(previousText: answerText, changingText: text) } } } @@ -120,4 +129,12 @@ extension WriteQuestionTypeViewModel { } } } + + private func isValidText(previousText: String, changingText: String) { + if isValidQuestAnswerUseCase.execute(previousText: previousText, changingText: changingText) { + isValidTextSubject.send(true) + } else { + isValidTextSubject.send(false) + } + } } diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift index b0dc887d..618a7acb 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/PresentationDependencyAssembler.swift @@ -33,14 +33,16 @@ struct PresentationDependencyAssembler: DependencyAssembler { DIContainer.shared.register(type: WriteQuestionTypeViewModel.self) { container in guard let getQuestInfoUseCase = container.resolve(type: GetQuestInfoUseCase.self), let saveQuestTypeUseCase = container.resolve(type: SaveQuestTypeUseCase.self), - let editQuestTypeUseCase = container.resolve(type: EditQuestTypeUseCase.self) else { + let editQuestTypeUseCase = container.resolve(type: EditQuestTypeUseCase.self), + let isValidQuestAnswerUseCase = container.resolve(type: IsValidQuestAnswerUseCase.self) else { ByeBooLogger.error(ByeBooError.DIFailedError) return } return WriteQuestionTypeViewModel( saveQuestTypeUseCase: saveQuestTypeUseCase, getQuestInfoUseCase: getQuestInfoUseCase, - editQuestTypeUseCase: editQuestTypeUseCase + editQuestTypeUseCase: editQuestTypeUseCase, + isValidQuestAnswerUseCase: isValidQuestAnswerUseCase ) } From e0a6fbc327596e8eb5508c7a06717a993b12671e Mon Sep 17 00:00:00 2001 From: yeonee Date: Thu, 4 Dec 2025 11:26:07 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20#336=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WriteQuest/ViewModel/WriteQuestTypeViewModel.swift | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift index 3f28e97b..d127ffa0 100644 --- a/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift +++ b/ByeBoo-iOS/ByeBoo-iOS/Presentation/Feature/WriteQuest/ViewModel/WriteQuestTypeViewModel.swift @@ -131,10 +131,7 @@ extension WriteQuestionTypeViewModel { } private func isValidText(previousText: String, changingText: String) { - if isValidQuestAnswerUseCase.execute(previousText: previousText, changingText: changingText) { - isValidTextSubject.send(true) - } else { - isValidTextSubject.send(false) - } + let isValidText: Bool = isValidQuestAnswerUseCase.execute(previousText: previousText, changingText: changingText) + isValidTextSubject.send(isValidText) } }