Skip to content

Commit

Permalink
[Refactor] '방문일자, 데이트시작시간' 관련 코드 리펙토링 (#282)
Browse files Browse the repository at this point in the history
로직 리펙토링 및 코드 정리(줄바꿈, 삭제)
  • Loading branch information
ParkSY0919 committed Dec 28, 2024
1 parent 4ffb9f9 commit 68d113d
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 100 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,10 @@
//

import Foundation

enum DatePickerMode {

case date
case time

}
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,6 @@ final class AddScheduleViewModel: Serviceable {

let isDateLocationVaild: ObservablePattern<Bool> = ObservablePattern(nil)

// 기타
var isTimePicker: Bool?

var country = ""

var city = ""
Expand Down Expand Up @@ -124,8 +121,16 @@ final class AddScheduleViewModel: Serviceable {
fetchTagData()
}

// tag 세팅 함수
func fetchTagData() {
tagData = TendencyTag.allCases.map { $0.tag }
}

}


//MARK: - AddScheduleViewModel: Amplitude

extension AddScheduleViewModel {

func initAmplitudeVar() {
Expand Down Expand Up @@ -172,12 +177,14 @@ extension AddScheduleViewModel {
)
}

func getTagIndices(from tags: [String]) -> [Int] {
return tags.compactMap { tag in
TendencyTag.allCases.firstIndex { $0.tag.english == tag }
}
}
}


//MARK: - AddScheduleViewModel: PastDateSetting

extension AddScheduleViewModel {

// 일정등록(불러오기) 시 데이터 세팅 함수
func fetchPastDate() {
viewedDateCourseByMeData?.isSuccessGetData.bind { [weak self] isSuccess in
guard let self = self else { return }
Expand Down Expand Up @@ -224,32 +231,24 @@ extension AddScheduleViewModel {
}
}

//불러온 데이터에 선택된 tag index 값 넣어주는 함수
func getTagIndices(from tags: [String]) -> [Int] {
return tags.compactMap { tag in
TendencyTag.allCases.firstIndex { $0.tag.english == tag }
}
}

//MARK: - AddSchedule First 함수
}


//MARK: - viewModel: AddScheduleFirstVC 함수

extension AddScheduleViewModel {

func satisfyDateName(str: String) {
isDateNameVaild.value = str.count >= minimumDateNameLength
}

func isFutureDate(date: Date, dateType: String) {
if dateType == "date" {
let formattedDate = DateFormatterManager.shared.dateFormatter.string(from: date)
visitDate.value = formattedDate
self.isVisitDateVaild.value = true
} else {
var formattedDate = DateFormatterManager.shared.timeFormatter.string(from: date)
formattedDate = formattedDate
.replacingOccurrences(of: "오전", with: "AM")
.replacingOccurrences(of: "오후", with: "PM")
dateStartAt.value = formattedDate
self.isDateStartAtVaild.value = !(dateStartAt.value?.isEmpty ?? true)
}
}

func fetchTagData() {
tagData = TendencyTag.allCases.map { $0.tag }
}

func countSelectedTag(isSelected: Bool, tag: String) {
if isSelected {
if !selectedTagData.contains(tag) {
Expand All @@ -263,6 +262,21 @@ extension AddScheduleViewModel {
checkTagCount(min: minTagCnt, max: maxTagCnt)
}

func setVisitDate(_ date: Date) {
let formattedDate = DateFormatterManager.shared.dateFormatter.string(from: date)
visitDate.value = formattedDate
isVisitDateVaild.value = !(visitDate.value?.isEmpty ?? true)
}

func setDateStartAt(_ time: Date) {
var formattedTime = DateFormatterManager.shared.timeFormatter.string(from: time)
formattedTime = formattedTime
.replacingOccurrences(of: "오전", with: "AM")
.replacingOccurrences(of: "오후", with: "PM")
dateStartAt.value = formattedTime
isDateStartAtVaild.value = !(dateStartAt.value?.isEmpty ?? true)
}

func checkTagCount(min: Int, max: Int) {
let count = selectedTagData.count
self.tagCount.value = count
Expand Down Expand Up @@ -300,8 +314,12 @@ extension AddScheduleViewModel {
return true
}


//MARK: - AddSecondView 전용 func
}


//MARK: - viewModel: AddScheduleSecondVC 함수

extension AddScheduleViewModel {

func updatePlaceCollectionView() {
print(addPlaceCollectionViewDataSource)
Expand Down Expand Up @@ -332,7 +350,7 @@ extension AddScheduleViewModel {
self.isChange?()
}

/// dataSource 개수 >= 2 라면 (다음 2/3) 버튼 활성화
/// dataSource 개수 >= 2 라면 '확인' 버튼 활성화
func isSourceMoreThanOne() {
let cnt = addPlaceCollectionViewDataSource.count
self.dateCourseNum = cnt
Expand Down Expand Up @@ -385,12 +403,12 @@ extension AddScheduleViewModel {
let postAddScheduleTags = selectedTagData.map { PostAddScheduleTag(tag: $0) }

NetworkService.shared.addScheduleService.postAddSchedule(course: PostAddScheduleRequest(title: dateName,
date: visitDate,
startAt: dateStartAt,
tags: postAddScheduleTags,
country: country,
city: city,
places: places)) { result in
date: visitDate,
startAt: dateStartAt,
tags: postAddScheduleTags,
country: country,
city: city,
places: places)) { result in
switch result {
case .success(let response):
print("Success: \(response)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,19 +125,12 @@ private extension AddScheduleFirstViewController {
guard let onLoading, let onFailNetwork = self?.viewModel.onFailNetwork.value else { return }
// getData 중이거나, 에러 발생 X라면
if onFailNetwork == false || onLoading == false {
// self?.loadingView.isHidden = !onLoading
self?.hideLoadingView()
self?.addScheduleFirstView.isHidden = onLoading
self?.tabBarController?.tabBar.isHidden = onLoading
}
}

// viewModel.ispastDateVaild.bind { [weak self] isValid in
// guard let self = self else { return }
// self.viewModel.fetchPastDate()
// AmplitudeManager.shared.trackEventWithProperties(StringLiterals.Amplitude.EventName.viewAddBringcourse, properties: [StringLiterals.Amplitude.Property.viewPath: viewPath])
// }

viewModel.isDateNameVaild.bind { date in
guard let date else {return}
self.addScheduleFirstView.updateDateNameTextField(isPassValid: date)
Expand Down Expand Up @@ -229,35 +222,55 @@ private extension AddScheduleFirstViewController {
addScheduleFirstView.inAddScheduleFirstView.datePlaceContainer.isUserInteractionEnabled = true
}

/// 일정등록 시 '불러오기' 여부 분기처리
func pastDateBindViewModel() {
if !viewModel.isBroughtData {
setRightBtnStyle()
setRightButtonAction(target: self, action: #selector(didTapNavRightBtn))
} else {
self.showLoadingView(type: StringLiterals.AddCourseOrSchedule.addScheduleTitle)
self.viewModel.fetchPastDate()
AmplitudeManager.shared.trackEventWithProperties(StringLiterals.Amplitude.EventName.viewAddBringcourse, properties: [StringLiterals.Amplitude.Property.viewPath: viewModel.viewPath])
}
}

/// 우측 상단 '불러오기' 버튼 함수
@objc
func didTapNavRightBtn() {
let vc = NavViewedCourseViewController(viewedCourseViewModel: MyCourseListViewModel())
AmplitudeManager.shared.trackEvent(StringLiterals.Amplitude.EventName.clickBringCourse)
self.navigationController?.pushViewController(vc, animated: false)
}

}


//MARK: - AddScheduleFirstViewController: BaseNavBarViewController

extension AddScheduleFirstViewController {

/// BaseNavBarViewController에서 backButtonTapped() 오버라이드
@objc
func visitDate() {
addSheetView.datePickerMode(isDatePicker: true)
viewModel.isTimePicker = false
alertVC.delegate = self
addScheduleFirstView.inAddScheduleFirstView.dateNameTextField.resignFirstResponder()
DispatchQueue.main.async {
self.alertVC.presentBottomSheet(in: self)
}
override func backButtonTapped() {
viewModel.schedule1BackAmplitude()
super.backButtonTapped()
}

@objc
func dateStartAt() {
addSheetView.datePickerMode(isDatePicker: false)
viewModel.isTimePicker = true
}

//MARK: - AddScheduleFirstViewController: '일정등록 뷰1 프로퍼티' 관련 함수

private extension AddScheduleFirstViewController {

/// DatePicker 관련
func presentDatePicker(mode: DatePickerMode) {
addSheetView.datePickerMode(isDatePicker: mode == .date)
alertVC.delegate = self
addScheduleFirstView.inAddScheduleFirstView.dateNameTextField.resignFirstResponder()
DispatchQueue.main.async {
self.alertVC.presentBottomSheet(in: self)
}
alertVC.presentBottomSheet(in: self)
}

/// '데이트 이름' 관련
@objc
func textFieldDidChanacge(_ textField: UITextField) {
guard let text = textField.text else {return}
Expand All @@ -266,6 +279,19 @@ private extension AddScheduleFirstViewController {
self.viewModel.dateTitle = !text.isEmpty ? true : false
}

/// '방문일자' 관련
@objc
func visitDate() {
presentDatePicker(mode: .date)
}

/// '데이트 시작 시간' 관련
@objc
func dateStartAt() {
presentDatePicker(mode: .time)
}

/// dateTag 관련
@objc
func didTapTagButton(_ sender: UIButton) {
guard let tag = TendencyTag(rawValue: sender.tag)?.tag.english else { return }
Expand All @@ -286,18 +312,7 @@ private extension AddScheduleFirstViewController {
}
}

@objc
func broughtTagBtn(_ sender: UIButton) {
self.addScheduleFirstView.inAddScheduleFirstView.updateTag(button: sender, buttonType: SelectedButton())
self.viewModel.isValidTag.value = true
}

@objc
func sixCheckBtnTapped() {
let secondVC = AddScheduleSecondViewController(viewModel: self.viewModel)
navigationController?.pushViewController(secondVC, animated: false)
}

/// datePlace 관련
@objc
func datePlaceContainerTapped() {
locationFilterVC.isAddType = true
Expand All @@ -307,26 +322,11 @@ private extension AddScheduleFirstViewController {
}
}

}

extension AddScheduleFirstViewController {

func pastDateBindViewModel() {
if !viewModel.isBroughtData {
setRightBtnStyle()
setRightButtonAction(target: self, action: #selector(didTapNavRightBtn))
} else {
self.showLoadingView(type: StringLiterals.AddCourseOrSchedule.addScheduleTitle)
self.viewModel.fetchPastDate()
AmplitudeManager.shared.trackEventWithProperties(StringLiterals.Amplitude.EventName.viewAddBringcourse, properties: [StringLiterals.Amplitude.Property.viewPath: viewModel.viewPath])
}
}

/// BaseNavBarViewController에서 backButtonTapped() 오버라이드
/// 일정등록 뷰1 '다음' 버튼 관련
@objc
override func backButtonTapped() {
viewModel.schedule1BackAmplitude()
super.backButtonTapped()
func sixCheckBtnTapped() {
let secondVC = AddScheduleSecondViewController(viewModel: self.viewModel)
navigationController?.pushViewController(secondVC, animated: false)
}

}
Expand Down Expand Up @@ -404,19 +404,23 @@ extension AddScheduleFirstViewController: UITextFieldDelegate {
extension AddScheduleFirstViewController: DRBottomSheetDelegate {

func didTapBottomButton() {
let selectedDate = addSheetView.datePicker.date
alertVC.dismissBottomSheet()
updateTextField()
}

func updateTextField() {
let isTimePickerFlag = viewModel.isTimePicker ?? false

if !isTimePickerFlag {
let selectedDate = addSheetView.datePicker.date
viewModel.isFutureDate(date: selectedDate, dateType: "date")
if addSheetView.datePicker.datePickerMode == .date {
updateTextField(selectedDate: selectedDate, mode: .date)
} else {
let formattedDate = addSheetView.datePicker.date
viewModel.isFutureDate(date: formattedDate, dateType: "time")
updateTextField(selectedDate: selectedDate, mode: .time)
}
}

//'방문일자', '시작시간' 업데이트 함수
func updateTextField(selectedDate: Date, mode: DatePickerMode) {
switch mode {
case .date:
viewModel.setVisitDate(selectedDate)
case .time:
viewModel.setDateStartAt(selectedDate)
}
}

Expand Down

0 comments on commit 68d113d

Please sign in to comment.