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/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..3f82e466 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 rootView.imgCount == 1 && answerText != text { rootView.confirmButton.updateType(.enabled) } else { rootView.confirmButton.updateType(.disabled) 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..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) } } @@ -285,11 +297,7 @@ extension WriteQuestionTypeQuestViewController: EditQuestProtocol { } extension WriteQuestionTypeQuestViewController: QuestCompleteProtocol { - func changeStyleWhenEditing(changedText: String) { - if answerText != changedText { - rootView.confirmButton.updateType(.enabled) - } else { - rootView.confirmButton.updateType(.disabled) - } + func updateButtonWhenWriting(text: String) { + 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..d127ffa0 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,9 @@ extension WriteQuestionTypeViewModel { } } } + + private func isValidText(previousText: String, changingText: String) { + let isValidText: Bool = isValidQuestAnswerUseCase.execute(previousText: previousText, changingText: changingText) + isValidTextSubject.send(isValidText) + } } 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 ) } 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 } }