diff --git a/DATEROAD-iOS/DATEROAD-iOS/Presentation/AddSchedule/ViewModels/AddScheduleViewModel.swift b/DATEROAD-iOS/DATEROAD-iOS/Presentation/AddSchedule/ViewModels/AddScheduleViewModel.swift index 7b7d6202..9a6783e6 100644 --- a/DATEROAD-iOS/DATEROAD-iOS/Presentation/AddSchedule/ViewModels/AddScheduleViewModel.swift +++ b/DATEROAD-iOS/DATEROAD-iOS/Presentation/AddSchedule/ViewModels/AddScheduleViewModel.swift @@ -25,7 +25,72 @@ final class AddScheduleViewModel: Serviceable { lazy var addScheduleSecondViewModel: AddScheduleSecondViewModelInterface = AddScheduleSecondViewModel(addScheduleAmplitude: addScheduleAmplitude) - let addScheduleAmplitude: AddScheduleAmplitude = AddScheduleAmplitude() + var pastDatePlaces = [TimelineModel]() + + var selectedTagData: [String] = [] + + var pastDateTagIndex = [Int]() + + + //MARK: - AddFirstCourse 사용되는 ViewModel + + // 데이트 이름 유효성 판별 (true는 통과) + let dateName: ObservablePattern = ObservablePattern(nil) + + let isDateNameVaild: ObservablePattern = ObservablePattern(nil) + + private let minimumDateNameLength = 5 + + // 방문 일자 유효성 판별 (true는 통과) + let visitDate: ObservablePattern = ObservablePattern(nil) + + let isVisitDateVaild: ObservablePattern = ObservablePattern(nil) + + // 데이트 시작시간 유효성 판별 (self.count > 0 인지) + let dateStartAt: ObservablePattern = ObservablePattern(nil) + + let isDateStartAtVaild: ObservablePattern = ObservablePattern(nil) + + // 코스 등록 태그 생성 + var tagData: [ProfileTagModel] = [] + + // 선택된 태그 + let isOverCount: ObservablePattern = ObservablePattern(false) + + let isValidTag: ObservablePattern = ObservablePattern(nil) + + let tagCount: ObservablePattern = ObservablePattern(0) + + private let minTagCnt = 1 + + private let maxTagCnt = 3 + + // 코스 지역 유효성 판별 + let dateLocation: ObservablePattern = ObservablePattern(nil) + + let isDateLocationVaild: ObservablePattern = ObservablePattern(nil) + + // 기타 + var isTimePicker: Bool? + + var country = "" + + var city = "" + + + //MARK: - AddSecondView 전용 Viewmodel 변수 + + var addPlaceCollectionViewDataSource: [AddCoursePlaceModel] = [] + + let datePlace: ObservablePattern = ObservablePattern(nil) + + let timeRequire: ObservablePattern = ObservablePattern(nil) + + let isValidOfSecondNextBtn: ObservablePattern = ObservablePattern(false) + + let editBtnEnableState: ObservablePattern = ObservablePattern(false) + + var isChange: (() -> Void)? var isEditMode: Bool = false diff --git a/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/ViewModels/ProfileViewModel.swift b/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/ViewModels/ProfileViewModel.swift index 872f333c..cd8967dd 100644 --- a/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/ViewModels/ProfileViewModel.swift +++ b/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/ViewModels/ProfileViewModel.swift @@ -19,6 +19,12 @@ final class ProfileViewModel: Serviceable { var isDefaultImage: Bool = false + private var isUpdateTag: Bool = false + + private var isUpdateNickName: Bool = false + + var isUpdateProfileImage: ObservablePattern = ObservablePattern(false) + var profileImage: ObservablePattern var existingNickname: ObservablePattern @@ -35,6 +41,8 @@ final class ProfileViewModel: Serviceable { var isValidTag: ObservablePattern = ObservablePattern(false) + var isNotTagError: ObservablePattern = ObservablePattern(true) + var isValidRegistration: ObservablePattern = ObservablePattern(false) var is5orLess: ObservablePattern = ObservablePattern(false) @@ -52,7 +60,6 @@ final class ProfileViewModel: Serviceable { var onFailNetwork: ObservablePattern = ObservablePattern(false) var alertMessage: ObservablePattern = ObservablePattern(nil) - init(profileData: ProfileModel) { @@ -74,12 +81,27 @@ extension ProfileViewModel { tagData = TendencyTag.allCases.map { $0.tag } } + /// TODO: 기존 프사와 같은 이미지를 골랐음에도 flag 값이 false로 반환됨 + /// 추후 Image 비교 로직 구현해야함 + func isProfileImageChange(selectedImage: UIImage) -> Bool { + if let profileImage = profileImage.value { + let flag = profileImage.isEqual(selectedImage) + return !flag + } else { + return false + } + } + // 닉네임 글자 수 확인 => 유효카운트 여부 & 5자초과 여부 업데이트 - func checkValidNicknameCount() { + func checkValidNicknameCount(fromTagButton: Bool? = nil) { guard let nickname = self.nickname.value else { return } if nickname.count >= 2 && nickname.count <= 5 { self.isValidNicknameCount.value = true self.is5orLess.value = true + if fromTagButton == true { + return + } + self.isUpdateNickName = true } else { self.is5orLess.value = false if nickname.count < 2 { @@ -104,18 +126,42 @@ extension ProfileViewModel { func checkTagCount() { let count = selectedTagData.count self.tagCount.value = count + self.isUpdateTag = !isEqualTagData() - if count >= 1 && count <= 3 { - self.isValidTag.value = true - } else { - self.isValidTag.value = false + let isValidCount = (1...3).contains(count) + self.isNotTagError.value = isValidCount + self.isValidTag.value = isValidCount && isUpdateTag + } + + // 이전, 현재 tag 데이터 배열 순서 상관없이 비교 + func isEqualTagData() -> Bool { + guard let beforeData = profileData.value?.tags else { return true } + let currentDataSet = Set(selectedTagData) + let beforeDataSet = Set(beforeData) + return currentDataSet == beforeDataSet + } + + // Tag 외(프사, 닉네임) 변경 시 isValidTag.value 컨트롤하기 위해 함수 활용 + func outOfTagData(isRegistering: Bool? = nil) -> Bool { + let count = selectedTagData.count + let isValidCount = (1...3).contains(count) + if isRegistering == true { + return isValidCount } + isNotTagError.value = isValidCount + isValidTag.value = isValidCount + return false } func checkValidRegistration() { guard let isValidNickname = isValidNickname.value, - let isValidTag = isValidTag.value, - let is5CntVaild = is5orLess.value else { return } + var isValidTag = isValidTag.value, + let is5CntVaild = is5orLess.value, + let isUpdateProfileImage = isUpdateProfileImage.value else { return } + + if isUpdateProfileImage || isUpdateNickName { + isValidTag = outOfTagData(isRegistering: true) + } self.isValidRegistration.value = (isValidNickname && isValidTag && is5CntVaild) } diff --git a/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/Views/EditProfileViewController.swift b/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/Views/EditProfileViewController.swift index 308dc949..2a0eee57 100644 --- a/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/Views/EditProfileViewController.swift +++ b/DATEROAD-iOS/DATEROAD-iOS/Presentation/Profile/Views/EditProfileViewController.swift @@ -154,10 +154,11 @@ private extension EditProfileViewController { } } - self.profileViewModel.profileImage.bind { [weak self] image in + self.profileViewModel.isUpdateProfileImage.bind { [weak self] image in guard let initial = self?.initial else { return } if initial { self?.profileViewModel.checkValidNicknameCount() + _ = self?.profileViewModel.outOfTagData() } } @@ -204,16 +205,24 @@ private extension EditProfileViewController { } } - self.profileViewModel.isValidTag.bind { [weak self] isValid in - guard let isValid, let initial = self?.initial else { return } + self.profileViewModel.isValidTag.bind { [weak self] _ in + guard let initial = self?.initial else { return } if initial { - self?.profileView.updateTagErrLabel(isValid: isValid) self?.profileViewModel.checkValidRegistration() } } + self.profileViewModel.isNotTagError.bind { [weak self] isNotError in + guard let isNotError, let initial = self?.initial else { return } + + if initial { + self?.profileView.updateTagErrLabel(isValid: isNotError) + } + } + self.profileViewModel.nickname.bind { [weak self] nickname in guard let nickname else { return } + _ = self?.profileViewModel.outOfTagData() self?.profileViewModel.isValidNickname.value = false self?.profileViewModel.compareExistingNickname() self?.profileView.updateNicknameCount(count: nickname.count) @@ -294,7 +303,7 @@ private extension EditProfileViewController { self.profileViewModel.countSelectedTag(isSelected: sender.isSelected, tag: tag) } } - self.profileViewModel.checkValidNicknameCount() + self.profileViewModel.checkValidNicknameCount(fromTagButton: true) } @objc @@ -308,6 +317,7 @@ private extension EditProfileViewController { alertVC.dismissBottomSheet() profileView.updateProfileImage(image: UIImage(resource: .emptyProfileImg)) profileViewModel.profileImage.value = UIImage(resource: .emptyProfileImg) + self.profileViewModel.isUpdateProfileImage.value = true } @objc @@ -419,8 +429,13 @@ extension EditProfileViewController: ImagePickerDelegate { func didPickImages(_ images: [UIImage]) { let selectedImage = images[0] - profileView.updateProfileImage(image: selectedImage) - self.profileViewModel.profileImage.value = selectedImage + let falg = profileViewModel.isProfileImageChange(selectedImage: selectedImage) + + if falg { + profileView.updateProfileImage(image: selectedImage) + self.profileViewModel.profileImage.value = selectedImage + self.profileViewModel.isUpdateProfileImage.value = true + } } }