From 84e70c255f9838c212b96641e89fcc41cfbee3b3 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 16:19:46 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[feat]=20QuestView=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DailyQuest/DailyQuest.xcodeproj/project.pbxproj | 12 ++++++++++++ .../Presentation/Home/View/QuestView.swift | 8 ++++++++ 2 files changed, 20 insertions(+) create mode 100644 DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index ede479a..1509705 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -44,6 +44,7 @@ 34ACC364291DEF6100741371 /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC363291DEF6100741371 /* FirebaseFirestore */; }; 34ACC366291DEF6100741371 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC365291DEF6100741371 /* FirebaseStorage */; }; 34ACC36C291DF0DD00741371 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */; }; + 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; }; A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */; }; A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */; }; @@ -115,6 +116,7 @@ 34ACC34D291DE9C100741371 /* DailyQuestUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyQuestUITests.swift; sourceTree = ""; }; 34ACC34F291DE9C100741371 /* DailyQuestUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyQuestUITestsLaunchTests.swift; sourceTree = ""; }; 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = ""; }; A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStorage.swift; sourceTree = ""; }; A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEntity.swift; sourceTree = ""; }; @@ -230,6 +232,7 @@ 34995519292332A9007AB99E /* Home */ = { isa = PBXGroup; children = ( + 34EE6EB52924C657005AF583 /* View */, 34A529DE29247F13001BAD34 /* ViewModel */, 34A529DD29247F0C001BAD34 /* ViewController */, 34A529D629247A52001BAD34 /* Flow */, @@ -418,6 +421,14 @@ path = Data; sourceTree = ""; }; + 34EE6EB52924C657005AF583 /* View */ = { + isa = PBXGroup; + children = ( + 34EE6EB62924C674005AF583 /* QuestView.swift */, + ); + path = View; + sourceTree = ""; + }; A51189C029226DF7008A9D33 /* RealmStorage */ = { isa = PBXGroup; children = ( @@ -710,6 +721,7 @@ B50078D629222F3F0070AFC4 /* CircleCheckView.swift in Sources */, 3499552729235D1E007AB99E /* BrowseItemViewModel.swift in Sources */, 349955292923600A007AB99E /* BrowseViewController.swift in Sources */, + 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */, B58DFC0A29227DA800C68A4B /* CalendarCell.swift in Sources */, 3499551529232533007AB99E /* UIColor+.swift in Sources */, 34A529DA29247B9C001BAD34 /* AppDIContainer.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift b/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift new file mode 100644 index 0000000..023a39e --- /dev/null +++ b/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift @@ -0,0 +1,8 @@ +// +// QuestView.swift +// DailyQuest +// +// Created by jinwoong Kim on 2022/11/16. +// + +import Foundation From 571493942b9d4a0b3ad2b0d07dbf7d13ff0ad7ab Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:49:12 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[fix]=20QuestCell=20identifier=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DailyQuest/Presentation/Common/Cells/QuestCell.swift | 2 +- .../Presentation/Home/View/QuestViewHeader.swift | 8 ++++++++ .../Home/ViewController/AddQuestsViewController.swift | 8 ++++++++ .../Presentation/Home/ViewModel/QuestViewModel.swift | 8 ++++++++ DailyQuest/DailyQuest/Utils/UIButton+.swift | 8 ++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift create mode 100644 DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift create mode 100644 DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift create mode 100644 DailyQuest/DailyQuest/Utils/UIButton+.swift diff --git a/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift b/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift index bd7c7b7..2979b03 100644 --- a/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift +++ b/DailyQuest/DailyQuest/Presentation/Common/Cells/QuestCell.swift @@ -11,7 +11,7 @@ import SnapKit final class QuestCell: UITableViewCell { /// dequeuResusable을 위한 아이덴티파이어입니다. - static let reuseIdentifier = "UserInfoCell" + static let reuseIdentifier = "QuestCell" // MARK: - Components /** diff --git a/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift b/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift new file mode 100644 index 0000000..22bd035 --- /dev/null +++ b/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift @@ -0,0 +1,8 @@ +// +// QuestViewHeader.swift +// DailyQuest +// +// Created by jinwoong Kim on 2022/11/16. +// + +import Foundation diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift new file mode 100644 index 0000000..3e42aae --- /dev/null +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift @@ -0,0 +1,8 @@ +// +// AddQuestsViewController.swift +// DailyQuest +// +// Created by jinwoong Kim on 2022/11/16. +// + +import Foundation diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift new file mode 100644 index 0000000..1eb0c3b --- /dev/null +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift @@ -0,0 +1,8 @@ +// +// QuestViewModel.swift +// DailyQuest +// +// Created by jinwoong Kim on 2022/11/16. +// + +import Foundation diff --git a/DailyQuest/DailyQuest/Utils/UIButton+.swift b/DailyQuest/DailyQuest/Utils/UIButton+.swift new file mode 100644 index 0000000..27b26b3 --- /dev/null +++ b/DailyQuest/DailyQuest/Utils/UIButton+.swift @@ -0,0 +1,8 @@ +// +// UIButton+.swift +// DailyQuest +// +// Created by jinwoong Kim on 2022/11/16. +// + +import Foundation From 646863a07e01adeab19a0e18d125a5066d7963f5 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:49:28 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[feat]=20QuestViewHeader=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/View/QuestViewHeader.swift | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift b/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift index 22bd035..f46c408 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift @@ -5,4 +5,57 @@ // Created by jinwoong Kim on 2022/11/16. // -import Foundation +import UIKit + +import RxSwift +import RxCocoa +import SnapKit + +final class QuestViewHeader: UIStackView { + private var disposableBag = DisposeBag() + var buttonDidClick = PublishSubject() + + // MARK: - Components + private lazy var titleLabel: UILabel = { + let titleLabel = UILabel() + titleLabel.text = "Today Quest" + titleLabel.textColor = .maxViolet + titleLabel.font = UIFont.boldSystemFont(ofSize: 32) + + return titleLabel + }() + + private lazy var plusButton: UIButton = { + var config = UIButton.Configuration.maxStyle() + let plusButton = UIButton(configuration: config) + + return plusButton + }() + + // MARK: - Methods + convenience init() { + self.init(frame: .zero) + + axis = .horizontal + alignment = .center + distribution = .equalSpacing + isLayoutMarginsRelativeArrangement = true + layoutMargins = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) + + configureUI() + bind() + } + + private func configureUI() { + addArrangedSubview(titleLabel) + addArrangedSubview(plusButton) + } + + private func bind() { + plusButton.rx.tap + .subscribe(onNext: { [weak self] _ in + self?.buttonDidClick.onNext(()) + }) + .disposed(by: disposableBag) + } +} From 0f8ebbabb201c9b68341dd478ed583979615348c Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:49:46 +0900 Subject: [PATCH 04/11] =?UTF-8?q?[feat]=20QuestView=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Home/View/QuestView.swift | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift b/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift index 023a39e..30f8df3 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift @@ -5,4 +5,62 @@ // Created by jinwoong Kim on 2022/11/16. // -import Foundation +import UIKit + +import RxSwift +import RxCocoa + +final class QuestView: UITableView { + private var viewModel: QuestViewModel! + private var disposableBag = DisposeBag() + + override init(frame: CGRect, style: UITableView.Style) { + super.init(frame: frame, style: style) + + rowHeight = 75 + + register(QuestCell.self, forCellReuseIdentifier: QuestCell.reuseIdentifier) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setup(with viewModel: QuestViewModel) { + self.viewModel = viewModel + + bind() + } + + private func bind() { + viewModel + .data + .bind(to: rx.items(cellIdentifier: QuestCell.reuseIdentifier, cellType: QuestCell.self)) { row, item, cell in + cell.setup(with: item) + cell.backgroundColor = .white + } + .disposed(by: disposableBag) + } +} + +final class QuestViewDelegate: NSObject, UITableViewDelegate { + private let header: QuestViewHeader + + init(header: QuestViewHeader) { + self.header = header + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + print("here") + return 75 + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + return header + } + + deinit { + print("deinit") + } +} + From cac964e3b4e0036c64c1c7a35b179e89d40b5421 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:50:06 +0900 Subject: [PATCH 05/11] =?UTF-8?q?[feat]=20PlusButton=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DailyQuest/DailyQuest/Utils/UIButton+.swift | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest/Utils/UIButton+.swift b/DailyQuest/DailyQuest/Utils/UIButton+.swift index 27b26b3..6e02ffd 100644 --- a/DailyQuest/DailyQuest/Utils/UIButton+.swift +++ b/DailyQuest/DailyQuest/Utils/UIButton+.swift @@ -5,4 +5,16 @@ // Created by jinwoong Kim on 2022/11/16. // -import Foundation +import UIKit + +extension UIButton.Configuration { + public static func maxStyle() -> UIButton.Configuration { + var style = UIButton.Configuration.plain() + style.image = UIImage(systemName: "plus") + style.baseForegroundColor = .maxViolet + style.background.backgroundColor = .maxLightYellow + style.cornerStyle = .capsule + + return style + } +} From d3abf0711c635ec20a7059e8e04bb5e26f7aeb09 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:51:13 +0900 Subject: [PATCH 06/11] =?UTF-8?q?[feat]=20HomeView=EC=97=90=EC=84=9C=20que?= =?UTF-8?q?st=20view=EC=99=80=20hedaer=EB=A5=BC=20=EC=B6=94=EA=B0=80.=20de?= =?UTF-8?q?legate=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/HomeViewController.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift index f302d2f..1805110 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift @@ -9,6 +9,16 @@ import UIKit final class HomeViewController: UIViewController { + private lazy var questView: QuestView = { + let questView = QuestView() + questView.setup(with: QuestViewModel()) + + return questView + }() + + private lazy var questViewHeader: QuestViewHeader = { + return QuestViewHeader() + }() // MARK: - Life Cycle // static func create(with viewModel: HomeViewModel) @@ -18,6 +28,15 @@ final class HomeViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .blue + questViewDelegate = QuestViewDelegate(header: questViewHeader) + + view.backgroundColor = .white + + view.addSubview(questView) + + questView.delegate = questViewDelegate + questView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } } } From a92e4ddc1181af1b2bf978108bb597739d220e2b Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:51:44 +0900 Subject: [PATCH 07/11] =?UTF-8?q?[feat]=20rx=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=ED=97=A4=EB=8D=94=EC=9D=98=20plus=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=EC=9D=B4=20=EB=88=8C=EB=A6=AC=EB=A9=B4=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=EB=A5=BC=20emit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/HomeViewController.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift index 1805110..6ef4de2 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift @@ -7,7 +7,19 @@ import UIKit +import RxSwift +import RxCocoa +import SnapKit + final class HomeViewController: UIViewController { + enum Event { + case showAddQuestsFlow + } + + var coordinatorPublisher = PublishSubject() + + private var disposableBag = DisposeBag() + private var questViewDelegate: QuestViewDelegate? private lazy var questView: QuestView = { let questView = QuestView() @@ -38,5 +50,16 @@ final class HomeViewController: UIViewController { questView.snp.makeConstraints { make in make.edges.equalToSuperview() } + + bind() + } + + private func bind() { + questViewHeader + .buttonDidClick + .bind(onNext: { [weak self] _ in + self?.coordinatorPublisher.onNext(.showAddQuestsFlow) + }) + .disposed(by: disposableBag) } } From aa9bb2d7334aa0f39852453c4c3e32fcad56440f Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:52:22 +0900 Subject: [PATCH 08/11] =?UTF-8?q?[feat]=20event=EB=B3=84=EB=A1=9C=20swift?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EC=96=B4=EB=96=A4=20flow?= =?UTF-8?q?=EB=A5=BC=20=EC=8B=A4=ED=96=89=ED=95=A0=EC=A7=80=20=EA=B2=B0?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/Flow/HomeCoordinator.swift | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest/Presentation/Home/Flow/HomeCoordinator.swift b/DailyQuest/DailyQuest/Presentation/Home/Flow/HomeCoordinator.swift index 051d835..dc4dac2 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/Flow/HomeCoordinator.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/Flow/HomeCoordinator.swift @@ -7,6 +7,8 @@ import UIKit +import RxSwift + protocol HomeCoordinator: Coordinator { func showProfileFlow() func showAddQuestFlow() @@ -14,6 +16,8 @@ protocol HomeCoordinator: Coordinator { } final class DefaultHomeCoordinator: HomeCoordinator { + private var disposableBag = DisposeBag() + var finishDelegate: CoordinatorFinishDelegate? var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController @@ -28,6 +32,16 @@ final class DefaultHomeCoordinator: HomeCoordinator { func start() { let homeViewController = homeSceneDIContainer.makeHomeViewController() navigationController.pushViewController(homeViewController, animated: false) + + homeViewController + .coordinatorPublisher + .bind(onNext: { [weak self] event in + switch event { + case .showAddQuestsFlow: + self?.showAddQuestFlow() + } + }) + .disposed(by: disposableBag) } func showProfileFlow() { @@ -35,7 +49,8 @@ final class DefaultHomeCoordinator: HomeCoordinator { } func showAddQuestFlow() { - + let addQuestsViewController = AddQuestsViewController() + navigationController.present(addQuestsViewController, animated: true) } func showAddFriendsFlow() { From 193f6c9b361cb82645e454966ee95565e068d862 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:52:58 +0900 Subject: [PATCH 09/11] =?UTF-8?q?[feat]=20=EC=A0=95=EC=83=81=EB=8F=99?= =?UTF-8?q?=EC=9E=91=EC=9D=B4=20=EB=90=98=EB=8A=94=EC=A7=80=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=A0=20AddQuestsViewController=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DailyQuest.xcodeproj/project.pbxproj | 16 ++++++++++ .../AddQuestsViewController.swift | 30 ++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj index 1509705..b1cd041 100644 --- a/DailyQuest/DailyQuest.xcodeproj/project.pbxproj +++ b/DailyQuest/DailyQuest.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ 3449AD5B2922164B00B87619 /* Quest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5A2922164B00B87619 /* Quest.swift */; }; 3449AD5D2922197000B87619 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5C2922197000B87619 /* User.swift */; }; 3449AD6029222B3900B87619 /* UserInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449AD5F29222B3900B87619 /* UserInfoCell.swift */; }; + 34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34874A9F292509A4000570DF /* QuestViewHeader.swift */; }; + 34874AA229250C43000570DF /* UIButton+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34874AA129250C43000570DF /* UIButton+.swift */; }; + 34874AA629252088000570DF /* AddQuestsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34874AA529252088000570DF /* AddQuestsViewController.swift */; }; 349955122923220E007AB99E /* SwiftUIPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349955112923220E007AB99E /* SwiftUIPreview.swift */; }; 3499551529232533007AB99E /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3499551429232533007AB99E /* UIColor+.swift */; }; 3499551E29233DEF007AB99E /* QuestCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3499551D29233DEF007AB99E /* QuestCell.swift */; }; @@ -45,6 +48,7 @@ 34ACC366291DEF6100741371 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 34ACC365291DEF6100741371 /* FirebaseStorage */; }; 34ACC36C291DF0DD00741371 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */; }; 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB62924C674005AF583 /* QuestView.swift */; }; + 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */; }; A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */; }; A51F01C82923392F0031ECA2 /* UserInfoStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */; }; A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */; }; @@ -85,6 +89,9 @@ 3449AD5A2922164B00B87619 /* Quest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Quest.swift; sourceTree = ""; }; 3449AD5C2922197000B87619 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; }; 3449AD5F29222B3900B87619 /* UserInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoCell.swift; sourceTree = ""; }; + 34874A9F292509A4000570DF /* QuestViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewHeader.swift; sourceTree = ""; }; + 34874AA129250C43000570DF /* UIButton+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+.swift"; sourceTree = ""; }; + 34874AA529252088000570DF /* AddQuestsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddQuestsViewController.swift; sourceTree = ""; }; 349955112923220E007AB99E /* SwiftUIPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIPreview.swift; sourceTree = ""; }; 3499551429232533007AB99E /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; 3499551D29233DEF007AB99E /* QuestCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestCell.swift; sourceTree = ""; }; @@ -117,6 +124,7 @@ 34ACC34F291DE9C100741371 /* DailyQuestUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyQuestUITestsLaunchTests.swift; sourceTree = ""; }; 34ACC36B291DF0DD00741371 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 34EE6EB62924C674005AF583 /* QuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestView.swift; sourceTree = ""; }; + 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestViewModel.swift; sourceTree = ""; }; A51189C229226E66008A9D33 /* UserQuestEntity+Mapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserQuestEntity+Mapping.swift"; sourceTree = ""; }; A51F01C72923392F0031ECA2 /* UserInfoStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStorage.swift; sourceTree = ""; }; A51F01C92923397E0031ECA2 /* UserInfoEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoEntity.swift; sourceTree = ""; }; @@ -192,6 +200,7 @@ children = ( 349955112923220E007AB99E /* SwiftUIPreview.swift */, 3499551429232533007AB99E /* UIColor+.swift */, + 34874AA129250C43000570DF /* UIButton+.swift */, ); path = Utils; sourceTree = ""; @@ -306,6 +315,7 @@ isa = PBXGroup; children = ( 34A529DF29247F1F001BAD34 /* HomeViewController.swift */, + 34874AA529252088000570DF /* AddQuestsViewController.swift */, ); path = ViewController; sourceTree = ""; @@ -313,6 +323,7 @@ 34A529DE29247F13001BAD34 /* ViewModel */ = { isa = PBXGroup; children = ( + 34EE6EB82924CAA1005AF583 /* QuestViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -425,6 +436,7 @@ isa = PBXGroup; children = ( 34EE6EB62924C674005AF583 /* QuestView.swift */, + 34874A9F292509A4000570DF /* QuestViewHeader.swift */, ); path = View; sourceTree = ""; @@ -707,8 +719,10 @@ 3499552329234D5F007AB99E /* BrowseCell.swift in Sources */, 3499551E29233DEF007AB99E /* QuestCell.swift in Sources */, 34A529DC29247BB6001BAD34 /* HomeSceneDIContainer.swift in Sources */, + 34874AA229250C43000570DF /* UIButton+.swift in Sources */, 34A529E7292481E1001BAD34 /* BrowseCoordinator.swift in Sources */, 34A529D329247903001BAD34 /* TabCoordinator.swift in Sources */, + 34EE6EB92924CAA1005AF583 /* QuestViewModel.swift in Sources */, 3449AD5D2922197000B87619 /* User.swift in Sources */, A51F01CD29233ABB0031ECA2 /* RealmUserInfoStorage.swift in Sources */, A51F01DA292345990031ECA2 /* BrowseQuest.swift in Sources */, @@ -720,6 +734,7 @@ 34A529D529247932001BAD34 /* AppCoordinator.swift in Sources */, B50078D629222F3F0070AFC4 /* CircleCheckView.swift in Sources */, 3499552729235D1E007AB99E /* BrowseItemViewModel.swift in Sources */, + 34874AA629252088000570DF /* AddQuestsViewController.swift in Sources */, 349955292923600A007AB99E /* BrowseViewController.swift in Sources */, 34EE6EB72924C674005AF583 /* QuestView.swift in Sources */, B58DFC0A29227DA800C68A4B /* CalendarCell.swift in Sources */, @@ -729,6 +744,7 @@ A5AC96D929223648003B7637 /* RealmStorage.swift in Sources */, A51189C329226E66008A9D33 /* UserQuestEntity+Mapping.swift in Sources */, A51F01D3292340360031ECA2 /* BrowseQuestsStorage.swift in Sources */, + 34874AA0292509A4000570DF /* QuestViewHeader.swift in Sources */, A51F01CA2923397E0031ECA2 /* UserInfoEntity.swift in Sources */, A51F01D8292343A80031ECA2 /* RealmBrowseQuestsStorage.swift in Sources */, A51F01DD2923468F0031ECA2 /* BrowseQuestEntity+Mapping.swift in Sources */, diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift index 3e42aae..8484447 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewController/AddQuestsViewController.swift @@ -5,4 +5,32 @@ // Created by jinwoong Kim on 2022/11/16. // -import Foundation +import UIKit + +import SnapKit + +final class AddQuestsViewController: UIViewController { + + private lazy var indicateMessage: UILabel = { + let indicateMessage = UILabel() + indicateMessage.text = "여기서 새로운 퀘스트를 추가합니다." + + return indicateMessage + }() + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .systemGray + + configureUI() + } + + private func configureUI() { + view.addSubview(indicateMessage) + + indicateMessage.snp.makeConstraints { make in + make.center.equalToSuperview() + } + } +} From 200de9d5f96505037f30d922056ff0e1d3ecb534 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 22:53:21 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[feat]=20QuestView=EA=B0=80=20=EC=A0=95?= =?UTF-8?q?=EC=83=81=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=82=98=EC=98=A4?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=A0=20=EA=B0=80?= =?UTF-8?q?=EC=A7=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A1=9C=20=EC=B1=84?= =?UTF-8?q?=EC=9B=8C=EC=A7=84=20View=20Model=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/ViewModel/QuestViewModel.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift index 1eb0c3b..f06a5db 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewModel/QuestViewModel.swift @@ -6,3 +6,20 @@ // import Foundation + +import RxSwift + +final class QuestViewModel { + let quests = [ + Quest(uuid: UUID(), title: "물마시기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 5), + Quest(uuid: UUID(), title: "책읽기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 9, totalCount: 20), + Quest(uuid: UUID(), title: "달리기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 4, totalCount: 9), + Quest(uuid: UUID(), title: "잠자기", startDay: Date(), endDay: Date(), repeat: 1, currentCount: 1, totalCount: 1) + ] + + let data: Observable<[Quest]> + + init() { + self.data = .just(quests) + } +} From c9739a4cc0539a40bad8d8e82b0fddc6f0ce9452 Mon Sep 17 00:00:00 2001 From: jjinwoong Date: Wed, 16 Nov 2022 23:08:30 +0900 Subject: [PATCH 11/11] =?UTF-8?q?[style]=20=EB=B6=80=EC=97=B0=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DailyQuest/Presentation/Home/View/QuestView.swift | 5 ++++- .../Presentation/Home/View/QuestViewHeader.swift | 4 ++++ .../Home/ViewController/HomeViewController.swift | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift b/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift index 30f8df3..2a3f28f 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/View/QuestView.swift @@ -43,6 +43,10 @@ final class QuestView: UITableView { } } +/** + `QuestView`의 델리게이트 역할을 수행할 클래스입니다. + 생성자를 통해 header 정보를 받는 이유는, `func tableView(_:viewForHeaderInSection)`메서드에서 헤더를 지정해주기 때문입니다. + */ final class QuestViewDelegate: NSObject, UITableViewDelegate { private let header: QuestViewHeader @@ -51,7 +55,6 @@ final class QuestViewDelegate: NSObject, UITableViewDelegate { } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - print("here") return 75 } diff --git a/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift b/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift index f46c408..e533fc2 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/View/QuestViewHeader.swift @@ -51,6 +51,10 @@ final class QuestViewHeader: UIStackView { addArrangedSubview(plusButton) } + /** + 버튼이 클릭되면 `buttonDidClick` subject가 이벤트를 방출합니다. + 눌려졌다는 정보만 있으면 되므로, output type은 Void입니다. + */ private func bind() { plusButton.rx.tap .subscribe(onNext: { [weak self] _ in diff --git a/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift b/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift index 6ef4de2..ba4d261 100644 --- a/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift +++ b/DailyQuest/DailyQuest/Presentation/Home/ViewController/HomeViewController.swift @@ -55,6 +55,13 @@ final class HomeViewController: UIViewController { } private func bind() { + /** + Header에서 버튼이 눌려졌는지를 수신하고 있습니다. + 버튼이 눌러지면 bind내의 클로저가 실행되고, 이는 다시 coordinatorPublisher가 이벤트를 방출하게 합니다. + 이 버튼이 눌러졌을 때에는 퀘스트를 추가하는 화면이 띄워져야 하므로, 이벤트의 종류는 .`showAddQuestsFlow`입니다. + Note. Combine에서는 `assign(to:)` 오퍼레이터 메서드를 사용하면 이 위치에서 cancellable을 반환하지 않고(rx에서는 disposable) + 이벤트를 연계해줄 수 있지만, rx에서는 동일한 역할을 해주는 오퍼레이터가 없어서 disposableBag에 `Disposable`을 담아주는 것에 유념해주세요. + */ questViewHeader .buttonDidClick .bind(onNext: { [weak self] _ in