Skip to content

Commit

Permalink
Merge pull request #390 from OMZigak/refactor/#388-promise
Browse files Browse the repository at this point in the history
  • Loading branch information
youz2me committed Sep 20, 2024
2 parents 762cc7b + 8b87375 commit 1974e03
Show file tree
Hide file tree
Showing 17 changed files with 637 additions and 903 deletions.
8 changes: 4 additions & 4 deletions KkuMulKum.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@
DD43937C2C412F4500EC1799 /* InviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393742C412F4500EC1799 /* InviteCodeViewController.swift */; };
DD43937D2C412F4500EC1799 /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */; };
DD43937F2C41357800EC1799 /* InviteCodeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */; };
DD4909962C440CDC003ED304 /* ArriveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4909952C440CDC003ED304 /* ArriveView.swift */; };
DD4909962C440CDC003ED304 /* NoTardyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4909952C440CDC003ED304 /* NoTardyView.swift */; };
DD8626612C4606A300E4F980 /* SetReadyInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8626522C4606A300E4F980 /* SetReadyInfoViewModel.swift */; };
DD8626632C4606A300E4F980 /* EnterReadyInfoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8626552C4606A300E4F980 /* EnterReadyInfoButtonView.swift */; };
DD8626642C4606A300E4F980 /* ReadyPlanInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8626562C4606A300E4F980 /* ReadyPlanInfoView.swift */; };
Expand Down Expand Up @@ -371,7 +371,7 @@
DD4393742C412F4500EC1799 /* InviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteCodeViewController.swift; sourceTree = "<group>"; };
DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = "<group>"; };
DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeViewModel.swift; sourceTree = "<group>"; };
DD4909952C440CDC003ED304 /* ArriveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArriveView.swift; sourceTree = "<group>"; };
DD4909952C440CDC003ED304 /* NoTardyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoTardyView.swift; sourceTree = "<group>"; };
DD8626522C4606A300E4F980 /* SetReadyInfoViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetReadyInfoViewModel.swift; sourceTree = "<group>"; };
DD8626552C4606A300E4F980 /* EnterReadyInfoButtonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterReadyInfoButtonView.swift; sourceTree = "<group>"; };
DD8626562C4606A300E4F980 /* ReadyPlanInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyPlanInfoView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -803,7 +803,7 @@
DD41BEF92C41D4160095A068 /* TardyView.swift */,
DD41BEFB2C41D54D0095A068 /* TardyPenaltyView.swift */,
DD41BEFE2C41DAA40095A068 /* TardyEmptyView.swift */,
DD4909952C440CDC003ED304 /* ArriveView.swift */,
DD4909952C440CDC003ED304 /* NoTardyView.swift */,
);
path = View;
sourceTree = "<group>";
Expand Down Expand Up @@ -2039,7 +2039,7 @@
DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */,
DE0137D32C43C5E50088C777 /* MyPageView.swift in Sources */,
DE558C592C45954B008DAC4A /* SelectMemberViewController.swift in Sources */,
DD4909962C440CDC003ED304 /* ArriveView.swift in Sources */,
DD4909962C440CDC003ED304 /* NoTardyView.swift in Sources */,
789196342C486F6B00FF8CDF /* KeychainAccessible.swift in Sources */,
DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */,
DD43937B2C412F4500EC1799 /* CreateMeetingViewController.swift in Sources */,
Expand Down
12 changes: 0 additions & 12 deletions KkuMulKum/Resource/ObservablePattern/ObservablePattern.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,13 @@ class ObservablePattern<T> {

func bind(_ listener: @escaping (T) -> Void) {
listeners.append(listener)

listener(value)
}

func bind<Object: AnyObject>(with object: Object, _ listener: @escaping (Object, T) -> Void) {
listeners.append { [weak object] value in
guard let object else { return }
listener(object, value)
}

listener(object, value)
}

func bindOnMain(_ listener: @escaping (T) -> Void) {
Expand All @@ -49,10 +45,6 @@ class ObservablePattern<T> {
listener(value)
}
}

DispatchQueue.main.async {
listener(self.value)
}
}

func bindOnMain<Object: AnyObject>(with object: Object, _ listener: @escaping (Object, T) -> Void) {
Expand All @@ -62,9 +54,5 @@ class ObservablePattern<T> {
listener(object, value)
}
}

DispatchQueue.main.async {
listener(object, self.value)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ class CreateMeetingViewController: BaseViewController {
)
)
}

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


Expand All @@ -91,8 +95,12 @@ private extension CreateMeetingViewController {
switch state {
case .valid:
owner.rootView.presentButton.isEnabled = true
owner.rootView.nameTextField.layer.borderColor = UIColor.maincolor.cgColor
owner.rootView.characterLabel.textColor = .maincolor
case .invalid:
owner.rootView.errorLabel.isHidden = false
owner.rootView.nameTextField.layer.borderColor = UIColor.mainred.cgColor
owner.rootView.characterLabel.textColor = .mainred
case .empty:
break
}
Expand Down Expand Up @@ -178,3 +186,14 @@ private extension CreateMeetingViewController {
}
}
}

extension CreateMeetingViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.layer.borderColor = UIColor.maincolor.cgColor
}

func textFieldDidEndEditing(_ textField: UITextField) {
rootView.characterLabel.textColor = .gray3
rootView.nameTextField.layer.borderColor = UIColor.gray3.cgColor
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,14 @@ private extension ChooseContentViewController {
})

viewModel.isSuccess.bindOnMain(with: self) { owner, success in
let viewController = AddPromiseCompleteViewController(promiseID: self.viewModel.promiseID)

viewController.setupNavigationBarTitle(with: "약속 수정하기")
viewController.rootView.titleLabel.text = "약속이 수정되었어요!"

self.navigationController?.pushViewController(viewController, animated: true)
if success {
let viewController = AddPromiseCompleteViewController(promiseID: owner.viewModel.promiseID)

viewController.setupNavigationBarTitle(with: "약속 수정하기")
viewController.rootView.titleLabel.text = "약속이 수정되었어요!"

self.navigationController?.pushViewController(viewController, animated: true)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private extension EditPromiseViewController {
return
}

rootView.datePicker.minimumDate = .none
rootView.datePicker.minimumDate = .now
rootView.datePicker.date = date
rootView.timePicker.date = date
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,9 @@ class PromiseViewController: BaseViewController {
transitionStyle: .scroll,
navigationOrientation: .vertical
)

private var removePromiseViewContoller: RemovePromiseViewController = RemovePromiseViewController(promiseName: "")
private var promiseViewControllerList: [BaseViewController] = []

private lazy var promiseSegmentedControl = PagePromiseSegmentedControl(
items: ["약속 정보", "준비 현황", "지각 꾸물이"]
)
private lazy var promiseSegmentedControl = PagePromiseSegmentedControl(items: ["약속 정보", "준비 현황", "지각 꾸물이"])


// MARK: - LifeCycle
Expand Down Expand Up @@ -57,8 +53,7 @@ class PromiseViewController: BaseViewController {
super.viewDidLoad()

setupNavigationBarBackButton()
setupPromiseEditButton(isHidden: false)
setupBindings()
setupBinding()
}

override func viewWillAppear(_ animated: Bool) {
Expand All @@ -75,16 +70,13 @@ class PromiseViewController: BaseViewController {


// MARK: - Setup

override func setupView() {
view.backgroundColor = .white

addChild(promisePageViewController)

view.addSubviews(
promiseSegmentedControl,
promisePageViewController.view
)
view.addSubviews(promiseSegmentedControl, promisePageViewController.view)

promisePageViewController.setViewControllers(
[promiseViewControllerList[0]],
Expand All @@ -95,7 +87,7 @@ class PromiseViewController: BaseViewController {
promiseSegmentedControl.snp.makeConstraints {
$0.top.equalTo(view.safeAreaLayoutGuide)
$0.leading.trailing.equalToSuperview().inset(-6)
$0.height.equalTo(60)
$0.height.equalTo(Screen.height(60))
}

promisePageViewController.view.snp.makeConstraints {
Expand All @@ -111,13 +103,7 @@ class PromiseViewController: BaseViewController {
for: .valueChanged
)

promiseTardyViewController.tardyView.finishMeetingButton.addTarget(
self,
action: #selector(finishMeetingButtonDidTap),
for: .touchUpInside
)

promiseTardyViewController.arriveView.finishMeetingButton.addTarget(
promiseTardyViewController.rootView.finishMeetingButton.addTarget(
self,
action: #selector(finishMeetingButtonDidTap),
for: .touchUpInside
Expand Down Expand Up @@ -147,58 +133,42 @@ class PromiseViewController: BaseViewController {
// MARK: - Extension

private extension PromiseViewController {
func setupBindings() {
func setupBinding() {
viewModel.promiseInfo.bindOnMain(with: self) { owner, info in
owner.setupNavigationBarTitle(with: info?.promiseName ?? "", isBorderHidden: true)
owner.promiseInfoViewController.setupContent()
owner.promiseInfoViewController.setUpTimeContent()
owner.removePromiseViewContoller.promiseNameLabel.text = info?.promiseName ?? ""
guard let info else { return }

guard let isParticipant = info?.isParticipant else { return }
let moreButton = UIBarButtonItem(
image: .imgMore.withRenderingMode(.alwaysOriginal),
style: .plain,
target: owner,
action: #selector(owner.moreButtonDidTap)
)

owner.setupPromiseEditButton(isHidden: !isParticipant)
owner.promiseInfoViewController.rootView.editButton.isHidden = !isParticipant
owner.navigationItem.rightBarButtonItem = info.isParticipant ? moreButton : nil
owner.removePromiseViewContoller.promiseNameLabel.text = info.promiseName
owner.setupNavigationBarTitle(with: info.promiseName, isBorderHidden: true)
}
}

func setupPromiseEditButton(isHidden: Bool) {
let moreButton = UIBarButtonItem(
image: .imgMore.withRenderingMode(.alwaysOriginal),
style: .plain,
target: self,
action: #selector(self.moreButtonDidTap)
)

navigationItem.rightBarButtonItem = isHidden ? nil : moreButton
}

@objc
func didSegmentedControlIndexUpdated() {
let condition = viewModel.currentPageIndex.value <= promiseSegmentedControl.selectedSegmentIndex
let direction: UIPageViewController.NavigationDirection = condition ? .forward : .reverse
let (width, count, selectedIndex) = (
promiseSegmentedControl.bounds.width,
promiseSegmentedControl.numberOfSegments,
promiseSegmentedControl.selectedSegmentIndex
)

promiseSegmentedControl.selectedUnderLineView.snp.updateConstraints {
$0.leading.equalToSuperview().offset((width / CGFloat(count)) * CGFloat(selectedIndex))
viewModel.currentPageIndex.bindOnMain(with: self) { owner, index in
let direction: UIPageViewController.NavigationDirection = owner.viewModel.pageControlDirection ? .forward : .reverse
let (width, count) = (
owner.promiseSegmentedControl.bounds.width,
owner.promiseSegmentedControl.numberOfSegments
)

owner.promiseSegmentedControl.selectedUnderLineView.snp.updateConstraints {
$0.leading.equalToSuperview().offset((width / CGFloat(count)) * CGFloat(index))
}

owner.promisePageViewController.setViewControllers([
owner.promiseViewControllerList[index]
], direction: direction, animated: false)
}

viewModel.segmentIndexDidChange(
index: promiseSegmentedControl.selectedSegmentIndex
)

promisePageViewController.setViewControllers([
promiseViewControllerList[viewModel.currentPageIndex.value]
], direction: direction, animated: false)
}

@objc
func finishMeetingButtonDidTap() {
promiseTardyViewController.viewModel.updatePromiseCompletion {
DispatchQueue.main.async {
viewModel.isFinishSuccess.bindOnMain(with: self) { owner, isSuccess in
guard let isSuccess else { return }

if isSuccess {
self.navigationController?.popViewController(animated: true)

if let viewController = self.navigationController?.viewControllers.last {
Expand All @@ -207,6 +177,32 @@ private extension PromiseViewController {
}
}
}

viewModel.errorMessage.bindOnMain(with: self) { owner, message in
guard let message else { return }
let toast = Toast()

toast.show(message: message, view: owner.view, position: .bottom, inset: 100)
}

viewModel.isExitSuccess.bindOnMain(with: self) { owner, isSuccess in
owner.navigationController?.popViewController(animated: true)
}

viewModel.isDeleteSuccess.bindOnMain(with: self) { owner, isSuccess in
owner.navigationController?.popViewController(animated: true)
}
}

@objc
func didSegmentedControlIndexUpdated() {
viewModel.pageControlDirection = viewModel.currentPageIndex.value <= promiseSegmentedControl.selectedSegmentIndex
viewModel.currentPageIndex.value = promiseSegmentedControl.selectedSegmentIndex
}

@objc
func finishMeetingButtonDidTap() {
viewModel.updatePromiseCompletion()
}

@objc
Expand Down Expand Up @@ -238,22 +234,13 @@ private extension PromiseViewController {
extension PromiseViewController: CustomActionSheetDelegate {
func actionButtonDidTap(for kind: ActionSheetKind) {
if kind == .deletePromise {
dismiss(animated: false)
viewModel.deletePromise()

viewModel.deletePromise() {
DispatchQueue.main.async {
self.navigationController?.popViewController(animated: true)
}
}
}
else {
dismiss(animated: false)
} else {
viewModel.exitPromise()

viewModel.exitPromise() {
DispatchQueue.main.async {
self.navigationController?.popViewController(animated: true)
}
}
dismiss(animated: false)
}
}
}
Expand Down
Loading

0 comments on commit 1974e03

Please sign in to comment.