Skip to content

Commit

Permalink
Merge pull request #400 from OMZigak/refactor/#399-add-promise-simpli…
Browse files Browse the repository at this point in the history
…fy-data

[refactor] 약속 추가 플로우 데이터 전달 간소화
  • Loading branch information
JinUng41 authored Nov 3, 2024
2 parents 7cb61c0 + 02d2ae1 commit a74cd88
Show file tree
Hide file tree
Showing 8 changed files with 245 additions and 176 deletions.
12 changes: 12 additions & 0 deletions KkuMulKum.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@
DE159D332C406E1600425101 /* MyPageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2B2C406E1600425101 /* MyPageContentView.swift */; };
DE159D342C406E1600425101 /* MyPageEtcSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2C2C406E1600425101 /* MyPageEtcSettingView.swift */; };
DE159D362C406E1600425101 /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2F2C406E1600425101 /* MyPageViewController.swift */; };
DE1917772CCB6B7300279D91 /* AddPromiseRequestModelBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1917762CCB6B7300279D91 /* AddPromiseRequestModelBuilder.swift */; };
DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA72C3118EA00A4015E /* UIView+.swift */; };
DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA92C31190E00A4015E /* UIStackView+.swift */; };
DE254AAC2C31192400A4015E /* UILabel+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AAB2C31192400A4015E /* UILabel+.swift */; };
Expand Down Expand Up @@ -405,6 +406,7 @@
DE159D2B2C406E1600425101 /* MyPageContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageContentView.swift; sourceTree = "<group>"; };
DE159D2C2C406E1600425101 /* MyPageEtcSettingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageEtcSettingView.swift; sourceTree = "<group>"; };
DE159D2F2C406E1600425101 /* MyPageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageViewController.swift; sourceTree = "<group>"; };
DE1917762CCB6B7300279D91 /* AddPromiseRequestModelBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddPromiseRequestModelBuilder.swift; sourceTree = "<group>"; };
DE254AA72C3118EA00A4015E /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = "<group>"; };
DE254AA92C31190E00A4015E /* UIStackView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+.swift"; sourceTree = "<group>"; };
DE254AAB2C31192400A4015E /* UILabel+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1352,6 +1354,14 @@
path = MyPage;
sourceTree = "<group>";
};
DE1917752CCB6B6000279D91 /* Model */ = {
isa = PBXGroup;
children = (
DE1917762CCB6B7300279D91 /* AddPromiseRequestModelBuilder.swift */,
);
path = Model;
sourceTree = "<group>";
};
DE254AA12C31106700A4015E /* Application */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -1651,6 +1661,7 @@
DECB844E2C43FB200022A003 /* AddPromise */ = {
isa = PBXGroup;
children = (
DE1917752CCB6B6000279D91 /* Model */,
DECB84522C43FB510022A003 /* ServiceType */,
DECB84512C43FB400022A003 /* ViewModel */,
DECB844F2C43FB300022A003 /* ViewController */,
Expand Down Expand Up @@ -1929,6 +1940,7 @@
782B40822C3E4925008B0CA7 /* NicknameViewModel.swift in Sources */,
A3FB18592C3BF77D001483E5 /* MeetingInfoResponseModel.swift in Sources */,
DD3466532C7B044F00E62284 /* ChooseMemberViewController.swift in Sources */,
DE1917772CCB6B7300279D91 /* AddPromiseRequestModelBuilder.swift in Sources */,
DEA932182C3F180800FDF637 /* MeetingPromisesModel.swift in Sources */,
DE159D342C406E1600425101 /* MyPageEtcSettingView.swift in Sources */,
DE9E18842C3BA84500DB76B4 /* CustomTextField.swift in Sources */,
Expand Down
101 changes: 101 additions & 0 deletions KkuMulKum/Source/AddPromise/Model/AddPromiseRequestModelBuilder.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
//
// AddPromiseRequestModelBuilder.swift
// KkuMulKum
//
// Created by 김진웅 on 10/25/24.
//

import Foundation

extension AddPromiseRequestModel {
final class Builder {
private(set) var id = 0
private var name = ""
private var placeName = ""
private var address = ""
private var roadAddress = ""
private var time = ""
private var dressUpLevel = ""
private var penalty = ""
private var x = 0.0
private var y = 0.0
private var participants = [Int]()

@discardableResult
func setName(_ name: String) -> Self {
self.name = name
return self
}

@discardableResult
func setPlaceName(_ placeName: String) -> Self {
self.placeName = placeName
return self
}

@discardableResult
func setAddress(_ address: String) -> Self {
self.address = address
return self
}

@discardableResult
func setRoadAddress(_ roadAddress: String) -> Self {
self.roadAddress = roadAddress
return self
}

@discardableResult
func setTime(_ time: String) -> Self {
self.time = time
return self
}

@discardableResult
func setDressUpLevel(_ dressUpLevel: String) -> Self {
self.dressUpLevel = dressUpLevel
return self
}

@discardableResult
func setPenalty(_ penalty: String) -> Self {
self.penalty = penalty
return self
}

@discardableResult
func setCoordinates(x: Double, y: Double) -> Self {
self.x = x
self.y = y
return self
}

@discardableResult
func setId(_ id: Int) -> Self {
self.id = id
return self
}

@discardableResult
func setParticipants(_ participants: [Int]) -> Self {
self.participants = participants
return self
}

func build() -> AddPromiseRequestModel {
return AddPromiseRequestModel(
name: name,
placeName: placeName,
address: address,
roadAddress: roadAddress,
time: time,
dressUpLevel: dressUpLevel,
penalty: penalty,
x: x,
y: y,
id: id,
participants: participants
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,13 @@ import UIKit

import RxCocoa
import RxSwift
import SnapKit
import Then

final class AddPromiseViewController: BaseViewController {
let rootView = AddPromiseView()
private let viewModel: AddPromiseViewModel
private let disposeBag = DisposeBag()
private let promiseNameTextFieldEndEditingRelay = PublishRelay<Void>()
private let searchPlaceCompleted = PublishRelay<Place>()
private let disposeBag = DisposeBag()
private let rootView = AddPromiseView()


// MARK: - Intializer
Expand Down Expand Up @@ -93,24 +91,6 @@ final class AddPromiseViewController: BaseViewController {
owner.navigationController?.pushViewController(viewController, animated: true)
}
.disposed(by: disposeBag)

rootView.confirmButton.rx.tap
.map { _ in }
.subscribe(with: self) { owner, _ in
guard let place = owner.viewModel.place else { return }

let viewController = SelectMemberViewController(
viewModel: SelectMemberViewModel(
meetingID: owner.viewModel.meetingID,
name: owner.viewModel.name,
place: place,
promiseDateString: owner.viewModel.combinedDateTime,
service: PromiseService()
)
)
owner.navigationController?.pushViewController(viewController, animated: true)
}
.disposed(by: disposeBag)
}

override func setupDelegate() {
Expand All @@ -132,7 +112,6 @@ extension AddPromiseViewController: FindPlaceViewControllerDelegate {
// MARK: - UITextFieldDelegate

extension AddPromiseViewController: UITextFieldDelegate {
/// done을 눌렀을 때
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == rootView.promiseNameTextField {
textField.resignFirstResponder()
Expand All @@ -154,7 +133,8 @@ private extension AddPromiseViewController {
promiseTextFieldEndEditing: promiseTextFieldEndEditing,
date: rootView.datePicker.rx.date.asObservable(),
time: rootView.timePicker.rx.date.asObservable(),
place: searchPlaceCompleted
place: searchPlaceCompleted.asObservable(),
confirmButtonDidTap: rootView.confirmButton.rx.tap.asObservable()
)

let output = viewModel.transform(input: input, disposeBag: disposeBag)
Expand All @@ -176,6 +156,18 @@ private extension AddPromiseViewController {
owner.rootView.datePicker.date = date
}
.disposed(by: disposeBag)

output.navigateToSelectMember
.subscribe(with: self) { owner, builder in
let viewController = SelectMemberViewController(
viewModel: SelectMemberViewModel(
builder: builder,
service: PromiseService()
)
)
owner.navigationController?.pushViewController(viewController, animated: true)
}
.disposed(by: disposeBag)
}

func configurePromiseName(result: TextFieldVailidationResult) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,9 @@ import RxSwift

final class SelectMemberViewController: BaseViewController {
private let viewModel: SelectMemberViewModel
private let viewWillAppearRelay = PublishRelay<Void>()
private let disposeBag = DisposeBag()
private let rootView = SelectMemberView()
private let viewWillAppearRelay = PublishRelay<Void>()
private let memberSelected = PublishSubject<Member>()
private let memberDeselected = PublishSubject<Member>()


// MARK: - Initializer
Expand Down Expand Up @@ -46,51 +44,20 @@ final class SelectMemberViewController: BaseViewController {

bindViewModel()
}

override func setupAction() {
rootView.confirmButton.rx.tap
.subscribe(with: self) { owner, _ in
let viewController = SelectPenaltyViewController(
viewModel: SelectPenaltyViewModel(
meetingID: owner.viewModel.meetingID,
name: owner.viewModel.name,
place: owner.viewModel.place,
dateString: owner.viewModel.promiseDateString,
members: owner.viewModel.selectedMembers,
service: PromiseService()
)
)
owner.navigationController?.pushViewController(viewController, animated: true)
}
.disposed(by: disposeBag)
}

override func setupDelegate() {
rootView.memberListView.delegate = self
}
}


// MARK: - UICollectionViewDelegate

extension SelectMemberViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let selectedMember = viewModel.members[indexPath.item]
memberSelected.onNext(selectedMember)
}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let deselectedMember = viewModel.members[indexPath.item]
memberDeselected.onNext(deselectedMember)
}
}

private extension SelectMemberViewController {
func bindViewModel() {
let memberSelected = rootView.memberListView.rx.itemSelected
.map { $0.item }
let memberDeselected = rootView.memberListView.rx.itemDeselected
.map { $0.item }

let input = SelectMemberViewModel.Input(
viewDidLoad: .just(()),
memberSelected: memberSelected.asObservable(),
memberDeselected: memberDeselected.asObservable()
memberDeselected: memberDeselected.asObservable(),
confirmButtonDidTap: rootView.confirmButton.rx.tap.asObservable()
)

let output = viewModel.transform(input: input, disposeBag: disposeBag)
Expand All @@ -111,5 +78,17 @@ private extension SelectMemberViewController {
owner.rootView.emptyContentView.isHidden = !flag
}
.disposed(by: disposeBag)

output.navigateToSelectPenalty
.subscribe(with: self) { owner, builder in
let viewController = SelectPenaltyViewController(
viewModel: SelectPenaltyViewModel(
builder: builder,
service: PromiseService()
)
)
owner.navigationController?.pushViewController(viewController, animated: true)
}
.disposed(by: disposeBag)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import RxSwift

final class SelectPenaltyViewController: BaseViewController {
private let viewModel: SelectPenaltyViewModel
private let disposeBag = DisposeBag()
private let rootView = SelectPenaltyView()
private let selectedLevelButtonRelay = BehaviorRelay(value: "")
private let selectedPenaltyButtonRelay = BehaviorRelay(value: "")
private let disposeBag = DisposeBag()
private let rootView = SelectPenaltyView()


// MARK: - Initializer
Expand Down Expand Up @@ -88,10 +88,10 @@ private extension SelectPenaltyViewController {
.disposed(by: disposeBag)

output.isSucceedToCreate
.drive(with: self) { owner, result in
let (flag, promiseID) = result
guard flag else { return }
let viewController = AddPromiseCompleteViewController(promiseID: promiseID ?? 0)
.drive(with: self) { owner, promiseID in
guard promiseID > 0 else { return }

let viewController = AddPromiseCompleteViewController(promiseID: promiseID)
owner.navigationController?.pushViewController(viewController, animated: true)
}
.disposed(by: disposeBag)
Expand Down
Loading

0 comments on commit a74cd88

Please sign in to comment.