From 9719dfb36795cc66a01bec4f5206ec494e39138a Mon Sep 17 00:00:00 2001 From: youz2me Date: Thu, 11 Jul 2024 03:25:52 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat/#155=20JoinButtonView=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 16 +++++++ .../CheckInviteCodeViewController.swift | 17 +++++++ .../Source/GroupCreate/JoinButtonView.swift | 48 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift create mode 100644 KkuMulKum/Source/GroupCreate/JoinButtonView.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 31b47e41..da33af23 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -86,6 +86,8 @@ DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */; }; DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */; }; DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */; }; + DDDEDDD72C3F031F0094681A /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */; }; + DDDEDDD92C3F03CF0094681A /* JoinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */; }; DE254AA52C31131600A4015E /* Color.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE254AA42C31131600A4015E /* Color.xcassets */; }; DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA72C3118EA00A4015E /* UIView+.swift */; }; DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA92C31190E00A4015E /* UIStackView+.swift */; }; @@ -168,6 +170,8 @@ DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TardyViewController.swift; sourceTree = ""; }; DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseInfoViewController.swift; sourceTree = ""; }; DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseViewController.swift; sourceTree = ""; }; + DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = ""; }; + DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinButtonView.swift; sourceTree = ""; }; DE254AA42C31131600A4015E /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = ""; }; DE254AA72C3118EA00A4015E /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; DE254AA92C31190E00A4015E /* UIStackView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+.swift"; sourceTree = ""; }; @@ -414,6 +418,15 @@ path = Promise; sourceTree = ""; }; + DDDEDDD52C3F028B0094681A /* GroupCreate */ = { + isa = PBXGroup; + children = ( + DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */, + DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */, + ); + path = GroupCreate; + sourceTree = ""; + }; DE254AA12C31106700A4015E /* Application */ = { isa = PBXGroup; children = ( @@ -428,6 +441,7 @@ children = ( DDA2EE7E2C3860B2007C6059 /* Core */, DDA2EE7B2C386078007C6059 /* Home */, + DDDEDDD52C3F028B0094681A /* GroupCreate */, DDA2EE7C2C38607F007C6059 /* GroupList */, DDA2EE7D2C386087007C6059 /* MyPage */, DD865B652C3920F600C351A2 /* Onboarding */, @@ -780,6 +794,7 @@ DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */, A3FB184D2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift in Sources */, DEBA03312C3C2972002ED8F2 /* ViewController.swift in Sources */, + DDDEDDD92C3F03CF0094681A /* JoinButtonView.swift in Sources */, DD931B742C3DAB9A00526452 /* ReadyPlanInfoView.swift in Sources */, 789873342C3D1A7B00435E96 /* LoginView.swift in Sources */, A3FB18592C3BF77D001483E5 /* MeetingInfoResponseModel.swift in Sources */, @@ -824,6 +839,7 @@ DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */, DD931B762C3DC16100526452 /* PromiseInfoView.swift in Sources */, DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */, + DDDEDDD72C3F031F0094681A /* CheckInviteCodeViewController.swift in Sources */, 789873332C3D1A7B00435E96 /* LoginViewModel.swift in Sources */, DED5DBEE2C34529A006ECE7E /* BaseView.swift in Sources */, DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */, diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift new file mode 100644 index 00000000..77f5ae17 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift @@ -0,0 +1,17 @@ +// +// CheckInviteCodeViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/11/24. +// + +import UIKit + +class CheckInviteCodeViewController: BaseViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } +} diff --git a/KkuMulKum/Source/GroupCreate/JoinButtonView.swift b/KkuMulKum/Source/GroupCreate/JoinButtonView.swift new file mode 100644 index 00000000..28e4b4ed --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/JoinButtonView.swift @@ -0,0 +1,48 @@ +// +// JoinButtonView.swift +// KkuMulKum +// +// Created by YOUJIM on 7/11/24. +// + +import UIKit + +class JoinButtonView: BaseView { + private let subTitleLabel: UILabel = UILabel().then { + $0.setText("초대 코드를 받았다면", style: .caption02) + } + + private let mainTitleLabel: UILabel = UILabel().then { + $0.setText("초대 코드 입력하기", style: .body03) + } + + private let chevronImageView: UIImageView = UIImageView().then { + $0.image = .iconRight + $0.contentMode = .scaleAspectFit + } + + override func setupView() { + self.backgroundColor = .green1 + + self.addSubviews(subTitleLabel, mainTitleLabel, chevronImageView) + } + + override func setupAutoLayout() { + subTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(18) + $0.leading.equalToSuperview().offset(20) + } + + mainTitleLabel.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(18) + $0.top.equalTo(subTitleLabel).offset(14) + } + + chevronImageView.snp.makeConstraints { + $0.trailing.equalToSuperview().inset(17) + $0.centerY.equalToSuperview() + $0.height.equalTo(Screen.height(24)) + $0.width.equalTo(chevronImageView.snp.height) + } + } +} From 00189400a844d279c837bdca53f52c1e4d6cbfbe Mon Sep 17 00:00:00 2001 From: youz2me Date: Thu, 11 Jul 2024 03:51:04 +0900 Subject: [PATCH 02/14] =?UTF-8?q?feat/#157=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=20=EC=BD=94=EB=93=9C=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 4 ++ .../GroupCreate/CheckInviteCodeView.swift | 43 +++++++++++++++++++ .../CheckInviteCodeViewController.swift | 17 +++++--- .../Source/GroupCreate/JoinButtonView.swift | 20 +++++++-- .../GroupList/GroupListViewController.swift | 2 +- 5 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index da33af23..6725cd40 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -88,6 +88,7 @@ DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */; }; DDDEDDD72C3F031F0094681A /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */; }; DDDEDDD92C3F03CF0094681A /* JoinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */; }; + DDDEDDDB2C3F09DC0094681A /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */; }; DE254AA52C31131600A4015E /* Color.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE254AA42C31131600A4015E /* Color.xcassets */; }; DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA72C3118EA00A4015E /* UIView+.swift */; }; DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA92C31190E00A4015E /* UIStackView+.swift */; }; @@ -172,6 +173,7 @@ DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseViewController.swift; sourceTree = ""; }; DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = ""; }; DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinButtonView.swift; sourceTree = ""; }; + DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; DE254AA42C31131600A4015E /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = ""; }; DE254AA72C3118EA00A4015E /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; DE254AA92C31190E00A4015E /* UIStackView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+.swift"; sourceTree = ""; }; @@ -422,6 +424,7 @@ isa = PBXGroup; children = ( DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */, + DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */, DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */, ); path = GroupCreate; @@ -813,6 +816,7 @@ DE32D1D42C3BFB56006848DF /* UpdateProfileNameModel.swift in Sources */, DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */, DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */, + DDDEDDDB2C3F09DC0094681A /* CheckInviteCodeView.swift in Sources */, DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */, DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */, DE9E189A2C3BCCBE00DB76B4 /* UtilsTemp.swift in Sources */, diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift new file mode 100644 index 00000000..4d3e3ee8 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift @@ -0,0 +1,43 @@ +// +// CheckInviteCodeView.swift +// KkuMulKum +// +// Created by YOUJIM on 7/11/24. +// + +import UIKit + +class CheckInviteCodeView: BaseView { + private let checkInviteLabel: UILabel = UILabel().then { + $0.setText("친구에게 받은\n모임 초대 코드가 있으신가요?", style: .head01, color: .gray8) + } + + let enterInviteCodeView: JoinButtonView = JoinButtonView().then { + $0.setJoinButtonViewStatus(isReceived: true) + } + + let createGroupView: JoinButtonView = JoinButtonView().then { + $0.setJoinButtonViewStatus(isReceived: false) + } + + override func setupView() { + self.addSubviews(checkInviteLabel, enterInviteCodeView, createGroupView) + } + + override func setupAutoLayout() { + checkInviteLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(32) + $0.leading.equalToSuperview().offset(20) + } + + enterInviteCodeView.snp.makeConstraints { + $0.top.equalTo(checkInviteLabel.snp.bottom).offset(24) + $0.leading.trailing.equalToSuperview().inset(20) + } + + createGroupView.snp.makeConstraints { + $0.top.equalTo(enterInviteCodeView.snp.bottom).offset(12) + $0.leading.trailing.equalToSuperview().inset(20) + } + } +} diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift index 77f5ae17..8474ea21 100644 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift @@ -8,10 +8,17 @@ import UIKit class CheckInviteCodeViewController: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. + private let checkInviteCodeView: CheckInviteCodeView = CheckInviteCodeView() + + override func setupView() { + view.backgroundColor = .white + self.navigationItem.title = "내 모임 추가하기" + self.tabBarController?.tabBar.isHidden = true + + view.addSubview(checkInviteCodeView) + + checkInviteCodeView.snp.makeConstraints { + $0.edges.equalTo(view.safeAreaLayoutGuide) + } } } diff --git a/KkuMulKum/Source/GroupCreate/JoinButtonView.swift b/KkuMulKum/Source/GroupCreate/JoinButtonView.swift index 28e4b4ed..f61a1163 100644 --- a/KkuMulKum/Source/GroupCreate/JoinButtonView.swift +++ b/KkuMulKum/Source/GroupCreate/JoinButtonView.swift @@ -9,15 +9,15 @@ import UIKit class JoinButtonView: BaseView { private let subTitleLabel: UILabel = UILabel().then { - $0.setText("초대 코드를 받았다면", style: .caption02) + $0.setText("subTitleLabel", style: .caption02, color: .gray5) } private let mainTitleLabel: UILabel = UILabel().then { - $0.setText("초대 코드 입력하기", style: .body03) + $0.setText("mainTitleLabel", style: .body03, color: .gray8) } private let chevronImageView: UIImageView = UIImageView().then { - $0.image = .iconRight + $0.image = .iconRight.withTintColor(.gray3) $0.contentMode = .scaleAspectFit } @@ -35,7 +35,8 @@ class JoinButtonView: BaseView { mainTitleLabel.snp.makeConstraints { $0.bottom.equalToSuperview().inset(18) - $0.top.equalTo(subTitleLabel).offset(14) + $0.leading.equalToSuperview().offset(20) + $0.top.equalTo(subTitleLabel.snp.bottom).offset(8) } chevronImageView.snp.makeConstraints { @@ -45,4 +46,15 @@ class JoinButtonView: BaseView { $0.width.equalTo(chevronImageView.snp.height) } } + + func setJoinButtonViewStatus(isReceived: Bool) { + if isReceived { + subTitleLabel.setText("초대 코드를 받았다면", style: .caption02, color: .gray5) + mainTitleLabel.setText("초대 코드 입력하기", style: .body03, color: .gray8) + } + else { + subTitleLabel.setText("초대 코드가 없다면", style: .caption02, color: .gray5) + mainTitleLabel.setText("직접 모임 추가하기", style: .body03, color: .gray8) + } + } } diff --git a/KkuMulKum/Source/GroupList/GroupListViewController.swift b/KkuMulKum/Source/GroupList/GroupListViewController.swift index b6e04122..d31f19ac 100644 --- a/KkuMulKum/Source/GroupList/GroupListViewController.swift +++ b/KkuMulKum/Source/GroupList/GroupListViewController.swift @@ -28,7 +28,7 @@ class GroupListViewController: BaseViewController { } @objc private func didAddScheduleButtonTapped() { - let scheduleViewController = PromiseViewController() + let scheduleViewController = CheckInviteCodeViewController() self.navigationController?.pushViewController(scheduleViewController, animated: true) } From ac89386e806c1e3042eb43c5fbaf7b3e2ee5fcca Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 12 Jul 2024 17:46:11 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat/#157=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=B4=88=EB=8C=80=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=85=EB=A0=A5=20VC=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=ED=99=94=EB=A9=B4=20=EC=A0=84=ED=99=98=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 38 +++++++++++-- .../Resource/Base/BaseViewController.swift | 35 ++++++++++++ .../CheckInviteCodeViewController.swift | 24 --------- .../{ => View}/CheckInviteCodeView.swift | 4 +- .../GroupCreate/View/CreateGroupView.swift | 20 +++++++ .../View/EnterInviteCodeView.swift | 46 ++++++++++++++++ .../{ => View}/JoinButtonView.swift | 0 .../CheckInviteCodeViewController.swift | 53 +++++++++++++++++++ .../CreateGroupViewController.swift | 23 ++++++++ .../EnterInviteCodeViewController.swift | 21 ++++++++ 10 files changed, 236 insertions(+), 28 deletions(-) delete mode 100644 KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift rename KkuMulKum/Source/GroupCreate/{ => View}/CheckInviteCodeView.swift (92%) create mode 100644 KkuMulKum/Source/GroupCreate/View/CreateGroupView.swift create mode 100644 KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift rename KkuMulKum/Source/GroupCreate/{ => View}/JoinButtonView.swift (100%) create mode 100644 KkuMulKum/Source/GroupCreate/ViewController/CheckInviteCodeViewController.swift create mode 100644 KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift create mode 100644 KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 6725cd40..13335c01 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -67,6 +67,10 @@ DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */; }; DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */; }; DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; + DD43935F2C4049F800EC1799 /* EnterInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */; }; + DD4393612C404A8E00EC1799 /* EnterInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */; }; + DD4393652C41230800EC1799 /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393642C41230800EC1799 /* CreateGroupViewController.swift */; }; + DD4393672C4123A000EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393662C4123A000EC1799 /* CreateGroupView.swift */; }; DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */; }; DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */; }; DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */; }; @@ -155,6 +159,10 @@ DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPromiseReadyInfoRequestModel.swift; sourceTree = ""; }; DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseLateInfoResponseModel.swift; sourceTree = ""; }; DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; + DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeViewController.swift; sourceTree = ""; }; + DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeView.swift; sourceTree = ""; }; + DD4393642C41230800EC1799 /* CreateGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewController.swift; sourceTree = ""; }; + DD4393662C4123A000EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadyStatusView.swift; sourceTree = ""; }; DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantCollectionViewCell.swift; sourceTree = ""; }; DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterReadyInfoButtonView.swift; sourceTree = ""; }; @@ -312,6 +320,27 @@ path = KkuMulKum; sourceTree = ""; }; + DD4393622C407C1700EC1799 /* ViewController */ = { + isa = PBXGroup; + children = ( + DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */, + DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */, + DD4393642C41230800EC1799 /* CreateGroupViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + DD4393632C407C2500EC1799 /* View */ = { + isa = PBXGroup; + children = ( + DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */, + DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */, + DD4393662C4123A000EC1799 /* CreateGroupView.swift */, + DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */, + ); + path = View; + sourceTree = ""; + }; DD865B652C3920F600C351A2 /* Onboarding */ = { isa = PBXGroup; children = ( @@ -423,9 +452,8 @@ DDDEDDD52C3F028B0094681A /* GroupCreate */ = { isa = PBXGroup; children = ( - DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */, - DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */, - DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */, + DD4393622C407C1700EC1799 /* ViewController */, + DD4393632C407C2500EC1799 /* View */, ); path = GroupCreate; sourceTree = ""; @@ -806,6 +834,7 @@ DE254AAC2C31192400A4015E /* UILabel+.swift in Sources */, DE254AB72C3119D000A4015E /* ReuseIdentifiable.swift in Sources */, DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */, + DD4393672C4123A000EC1799 /* CreateGroupView.swift in Sources */, DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */, DE254AB42C31199B00A4015E /* UITextField+.swift in Sources */, DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */, @@ -815,6 +844,7 @@ DED5DBF02C345317006ECE7E /* BaseCollectionViewCell.swift in Sources */, DE32D1D42C3BFB56006848DF /* UpdateProfileNameModel.swift in Sources */, DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */, + DD4393612C404A8E00EC1799 /* EnterInviteCodeView.swift in Sources */, DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */, DDDEDDDB2C3F09DC0094681A /* CheckInviteCodeView.swift in Sources */, DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */, @@ -834,6 +864,7 @@ A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */, DD3072222C3C0DA300416D9F /* PromiseParticipantListResponseModel.swift in Sources */, 789873322C3D1A7B00435E96 /* LoginViewController.swift in Sources */, + DD4393652C41230800EC1799 /* CreateGroupViewController.swift in Sources */, DDAF1C8F2C3D6E3D008A37D3 /* PromiseSegmentedControl.swift in Sources */, DE32D1D22C3BF703006848DF /* LoginUserResponseModel.swift in Sources */, DE9E18892C3BC91000DB76B4 /* ResponseBodyDTO.swift in Sources */, @@ -850,6 +881,7 @@ DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */, DE8247FD2C36E7C7000601BC /* MoyaLoggingPlugin.swift in Sources */, DDAF1C842C3D5D19008A37D3 /* ViewModelType.swift in Sources */, + DD43935F2C4049F800EC1799 /* EnterInviteCodeViewController.swift in Sources */, DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */, DE254AB92C311AB300A4015E /* Screen.swift in Sources */, ); diff --git a/KkuMulKum/Resource/Base/BaseViewController.swift b/KkuMulKum/Resource/Base/BaseViewController.swift index f2d67b10..3e99294d 100644 --- a/KkuMulKum/Resource/Base/BaseViewController.swift +++ b/KkuMulKum/Resource/Base/BaseViewController.swift @@ -11,6 +11,8 @@ class BaseViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = .white + setupView() setupAction() setupDelegate() @@ -25,3 +27,36 @@ class BaseViewController: UIViewController { /// RootView 또는 ViewController 자체로부터 Delegate, DateSource 등 설정 func setupDelegate() {} } + +extension BaseViewController { + /// 네비게이션 바 타이틀 설정 + final func setupNavigationBarTitle(with string: String) { + title = string + + navigationController?.navigationBar.titleTextAttributes = [ + .foregroundColor: UIColor.gray8, + .font: UIFont.pretendard(.body03) + ] + } + + /// 네비게이션 바 BackButton 구성 + final func setupNavigationBarBackButton() { + let backButton = UIBarButtonItem( + image: .iconBack, + style: .plain, + target: self, + action: #selector(backButtonDidTap) + ).then { + $0.tintColor = .black + } + + navigationItem.leftBarButtonItem = backButton + } +} + +private extension BaseViewController { + @objc + func backButtonDidTap() { + navigationController?.popViewController(animated: true) + } +} diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift deleted file mode 100644 index 8474ea21..00000000 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCodeViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// CheckInviteCodeViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/11/24. -// - -import UIKit - -class CheckInviteCodeViewController: BaseViewController { - private let checkInviteCodeView: CheckInviteCodeView = CheckInviteCodeView() - - override func setupView() { - view.backgroundColor = .white - self.navigationItem.title = "내 모임 추가하기" - self.tabBarController?.tabBar.isHidden = true - - view.addSubview(checkInviteCodeView) - - checkInviteCodeView.snp.makeConstraints { - $0.edges.equalTo(view.safeAreaLayoutGuide) - } - } -} diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift b/KkuMulKum/Source/GroupCreate/View/CheckInviteCodeView.swift similarity index 92% rename from KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift rename to KkuMulKum/Source/GroupCreate/View/CheckInviteCodeView.swift index 4d3e3ee8..a28b5820 100644 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCodeView.swift +++ b/KkuMulKum/Source/GroupCreate/View/CheckInviteCodeView.swift @@ -25,8 +25,10 @@ class CheckInviteCodeView: BaseView { } override func setupAutoLayout() { + let safeArea = safeAreaLayoutGuide + checkInviteLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(32) + $0.top.equalTo(safeArea).offset(32) $0.leading.equalToSuperview().offset(20) } diff --git a/KkuMulKum/Source/GroupCreate/View/CreateGroupView.swift b/KkuMulKum/Source/GroupCreate/View/CreateGroupView.swift new file mode 100644 index 00000000..3f747c57 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/View/CreateGroupView.swift @@ -0,0 +1,20 @@ +// +// CreateGroupView.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import UIKit + +class CreateGroupView: BaseView { + private let mainTitleLabel: UILabel = UILabel().then { + $0.setText("모임 이름을\n입력해 주세요", style: .head01) + } + + private let inviteCodeTextField: CustomTextField = CustomTextField( + placeHolder: "모임 이름을 입력해 주세요" + ) + + let presentButton: CustomButton = CustomButton(title: "다음", isEnabled: false) +} diff --git a/KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift b/KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift new file mode 100644 index 00000000..511b33e2 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift @@ -0,0 +1,46 @@ +// +// EnterInviteCodeView.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import UIKit + +class EnterInviteCodeView: BaseView { + private let mainTitleLabel: UILabel = UILabel().then { + $0.setText("모임 초대 코드를\n입력해 주세요", style: .head01) + } + + private let inviteCodeTextField: CustomTextField = CustomTextField( + placeHolder: "모임 초대 코드를 입력해 주세요" + ) + + let presentButton: CustomButton = CustomButton(title: "모임 가입하기", isEnabled: false) + + override func setupView() { + addSubviews(mainTitleLabel, inviteCodeTextField, presentButton) + } + + override func setupAutoLayout() { + let safeArea = safeAreaLayoutGuide + + mainTitleLabel.snp.makeConstraints { + $0.top.equalTo(safeArea).offset(32) + $0.leading.equalToSuperview().offset(20) + } + + inviteCodeTextField.snp.makeConstraints { + $0.top.equalTo(mainTitleLabel.snp.bottom).offset(24) + $0.width.equalTo(CustomTextField.defaultWidth) + $0.height.equalTo(CustomTextField.defaultHeight) + $0.leading.equalTo(mainTitleLabel) + } + + presentButton.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(50) + $0.horizontalEdges.equalToSuperview().inset(14) + $0.height.equalTo(Screen.height(50)) + } + } +} diff --git a/KkuMulKum/Source/GroupCreate/JoinButtonView.swift b/KkuMulKum/Source/GroupCreate/View/JoinButtonView.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/JoinButtonView.swift rename to KkuMulKum/Source/GroupCreate/View/JoinButtonView.swift diff --git a/KkuMulKum/Source/GroupCreate/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/ViewController/CheckInviteCodeViewController.swift new file mode 100644 index 00000000..3328ec0c --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/ViewController/CheckInviteCodeViewController.swift @@ -0,0 +1,53 @@ +// +// CheckInviteCodeViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/11/24. +// + +import UIKit + +class CheckInviteCodeViewController: BaseViewController { + private let checkInviteCodeView: CheckInviteCodeView = CheckInviteCodeView() + + override func loadView() { + view = checkInviteCodeView + } + + override func setupView() { + view.backgroundColor = .white + self.tabBarController?.tabBar.isHidden = true + + setupNavigationBarTitle(with: "내 모임 추가하기") + setupNavigationBarBackButton() + } + + override func setupAction() { + checkInviteCodeView.enterInviteCodeView.addGestureRecognizer(UITapGestureRecognizer( + target: self, + action: #selector(enterInviteCodeViewDidTap) + )) + checkInviteCodeView.createGroupView.addGestureRecognizer(UITapGestureRecognizer( + target: self, + action: #selector(createGroupViewDidTap) + )) + } + + @objc private func enterInviteCodeViewDidTap() { + let enterInviteCodeViewController = EnterInviteCodeViewController() + + enterInviteCodeViewController.modalTransitionStyle = .crossDissolve + enterInviteCodeViewController.modalPresentationStyle = .fullScreen + + navigationController?.pushViewController(enterInviteCodeViewController, animated: true) + } + + @objc private func createGroupViewDidTap() { + let createGroupViewController = CreateGroupViewController() + + createGroupViewController.modalTransitionStyle = .crossDissolve + createGroupViewController.modalPresentationStyle = .fullScreen + + navigationController?.pushViewController(createGroupViewController, animated: true) + } +} diff --git a/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift new file mode 100644 index 00000000..959cdea8 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift @@ -0,0 +1,23 @@ +// +// CreateGroupViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import UIKit + +class CreateGroupViewController: BaseViewController { + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift new file mode 100644 index 00000000..15799193 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift @@ -0,0 +1,21 @@ +// +// EnterInviteCodeViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import UIKit + +class EnterInviteCodeViewController: BaseViewController { + private let enterInviteCodeView: EnterInviteCodeView = EnterInviteCodeView() + + override func loadView() { + view = enterInviteCodeView + } + + override func setupView() { + setupNavigationBarTitle(with: "내 모임 추가하기") + setupNavigationBarBackButton() + } +} From 780d684a7ab1516feeb38575370df6d022a93fa8 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 12 Jul 2024 18:23:25 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat/#157=20=EA=B7=B8=EB=A3=B9=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=83=9D=EC=84=B1=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20VC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 4 ++ .../img_create_group.imageset/Contents.json | 12 ++++ .../img_create_group.svg | 36 +++++++++++ .../CreateGroupViewController.swift | 18 +++--- .../FinishCreateViewController.swift | 64 +++++++++++++++++++ 5 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/img_create_group.svg create mode 100644 KkuMulKum/Source/GroupCreate/ViewController/FinishCreateViewController.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 13335c01..2c461ed3 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -71,6 +71,7 @@ DD4393612C404A8E00EC1799 /* EnterInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */; }; DD4393652C41230800EC1799 /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393642C41230800EC1799 /* CreateGroupViewController.swift */; }; DD4393672C4123A000EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393662C4123A000EC1799 /* CreateGroupView.swift */; }; + DD4393692C41250C00EC1799 /* FinishCreateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393682C41250C00EC1799 /* FinishCreateViewController.swift */; }; DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */; }; DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */; }; DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */; }; @@ -163,6 +164,7 @@ DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeView.swift; sourceTree = ""; }; DD4393642C41230800EC1799 /* CreateGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewController.swift; sourceTree = ""; }; DD4393662C4123A000EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; + DD4393682C41250C00EC1799 /* FinishCreateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateViewController.swift; sourceTree = ""; }; DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadyStatusView.swift; sourceTree = ""; }; DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantCollectionViewCell.swift; sourceTree = ""; }; DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterReadyInfoButtonView.swift; sourceTree = ""; }; @@ -326,6 +328,7 @@ DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */, DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */, DD4393642C41230800EC1799 /* CreateGroupViewController.swift */, + DD4393682C41250C00EC1799 /* FinishCreateViewController.swift */, ); path = ViewController; sourceTree = ""; @@ -819,6 +822,7 @@ DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */, DD30721E2C3C0CC800416D9F /* PromiseInfoResponseModel.swift in Sources */, DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */, + DD4393692C41250C00EC1799 /* FinishCreateViewController.swift in Sources */, A3FB18512C3BF531001483E5 /* RegisterMeetingsResponseModel.swift in Sources */, 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */, DE9E188B2C3BC92500DB76B4 /* EmptyModel.swift in Sources */, diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/Contents.json new file mode 100644 index 00000000..4b2bf8b8 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "img_create_group.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/img_create_group.svg b/KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/img_create_group.svg new file mode 100644 index 00000000..356cb536 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_create_group.imageset/img_create_group.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift index 959cdea8..969003ba 100644 --- a/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift +++ b/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift @@ -8,16 +8,14 @@ import UIKit class CreateGroupViewController: BaseViewController { + private let createGroupView: CreateGroupView = CreateGroupView() - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. + override func loadView() { + view = createGroupView + } + + override func setupView() { + setupNavigationBarTitle(with: "내 모임 추가하기") + setupNavigationBarBackButton() } - */ - } diff --git a/KkuMulKum/Source/GroupCreate/ViewController/FinishCreateViewController.swift b/KkuMulKum/Source/GroupCreate/ViewController/FinishCreateViewController.swift new file mode 100644 index 00000000..ea35b547 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/ViewController/FinishCreateViewController.swift @@ -0,0 +1,64 @@ +// +// FinishCreateViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import UIKit + +class FinishCreateViewController: BaseViewController { + private let peopleImageView: UIImageView = UIImageView().then { + $0.image = .imgCreateGroup + $0.contentMode = .scaleAspectFit + } + + private let mainTitleLabel: UILabel = UILabel().then { + $0.setText("모임이 생성되었어요!", style: .head01, color: .gray8) + } + + private let subTitleLabel: UILabel = UILabel().then { + $0.setText("모임 내에서 약속과 인원을\n추가해보세요", style: .body06, color: .gray6) + } + + private let confirmButton: CustomButton = CustomButton(title: "확인", isEnabled: true).then { + $0.backgroundColor = .maincolor + } + + override func setupView() { + view.backgroundColor = .green1 + + setupNavigationBarTitle(with: "내 모임 추가하기") + + view.addSubviews( + peopleImageView, + mainTitleLabel, + subTitleLabel, + confirmButton + ) + + peopleImageView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide).offset(184) + $0.centerX.equalToSuperview() + $0.height.equalTo(Screen.height(127)) + $0.width.equalTo(Screen.width(241)) + } + + mainTitleLabel.snp.makeConstraints { + $0.top.equalTo(peopleImageView.snp.bottom).offset(36) + $0.centerX.equalToSuperview() + } + + subTitleLabel.snp.makeConstraints { + $0.top.equalTo(mainTitleLabel.snp.bottom).offset(16) + $0.centerX.equalToSuperview() + } + + confirmButton.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(Screen.height(64)) + $0.height.equalTo(CustomButton.defaultHeight) + $0.width.equalTo(CustomButton.defaultWidth) + $0.centerX.equalToSuperview() + } + } +} From 2d3f4284764805f21f7242624f40eaa6c4076e48 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 12 Jul 2024 18:32:15 +0900 Subject: [PATCH 05/14] =?UTF-8?q?fix/#157=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- File.swift | 8 - KkuMulKum.xcodeproj/project.pbxproj | 356 +++++++++++++++--- .../xcshareddata/swiftpm/Package.resolved | 3 +- KkuMulKum/Application/AppDelegate.swift | 2 + KkuMulKum/Application/SceneDelegate.swift | 2 +- .../Model/Promises/MeetingPromisesModel.swift | 21 ++ .../Image/img_edit.imageset/Contents.json | 21 ++ .../Image/img_edit.imageset/edit.png | Bin 0 -> 660 bytes .../Contents.json | 23 ++ .../meetingInfoBanner.png | Bin 0 -> 2147 bytes .../meetingInfoBanner@2x.png | Bin 0 -> 4898 bytes .../meetingInfoBanner@3x.png | Bin 0 -> 5813 bytes .../Image/img_profile.imageset/Contents.json | 15 +- .../Image/img_profile.imageset/Mask group.svg | 13 + .../img_profile.imageset/ic_profilebasic.png | Bin 1244 -> 0 bytes .../ic_profilebasic@2x.png | Bin 2664 -> 0 bytes .../ic_profilebasic@3x.png | Bin 4272 -> 0 bytes .../Splash.imageset/Contents.json | 23 ++ .../Splash.imageset/Splash 1.png | Bin 0 -> 97967 bytes .../Splash.imageset/Splash 2.png | Bin 0 -> 97967 bytes .../Splash.imageset/Splash.png | Bin 0 -> 97967 bytes .../Base.lproj/LaunchScreen.storyboard | 32 +- KkuMulKum/Resource/Extension/UIFont+.swift | 6 + KkuMulKum/Resource/Info.plist | 4 + KkuMulKum/Resource/Util/Toast.swift | 79 ++++ .../Service/MeetingInfoService.swift | 237 ++++++++++++ .../View/InvitationCodePopUpView.swift | 126 +++++++ .../View/MeetingInfoBannerView.swift | 79 ++++ .../MeetingInfo/View/MeetingInfoView.swift | 185 +++++++++ .../MeetingInfo/View/MeetingMemberCell.swift | 119 ++++++ .../MeetingInfo/View/MeetingPromiseCell.swift | 103 +++++ .../InvitationCodePopUpViewController.swift | 84 +++++ .../MeetingInfoViewController.swift | 179 +++++++++ .../ViewModel/MeetingInfoViewModel.swift | 106 ++++++ .../Source/MyPage/MyPageViewController.swift | 29 -- .../MyPage/View/MyPageAlarmSettingView.swift | 80 ++++ .../MyPage/View/MyPageContentView.swift | 84 +++++ .../MyPage/View/MyPageEtcSettingView.swift | 106 ++++++ .../MyPage/View/MyPageNavigationView.swift | 43 +++ .../ViewController/MyPageViewController.swift | 56 +++ .../Login/VIewModel/LoginViewModel.swift | 11 +- .../Nickname/NicknameView/NicknameView.swift | 107 ++++++ .../NicknameViewController.swift | 93 +++++ .../ViewModel/NicknameViewModel.swift | 43 +++ .../ProfileViewController.swift | 96 +++++ .../Onboarding/Profile/View/ProfileView.swift | 114 ++++++ .../Profile/ViewModel/ProfileViewModel.swift | 23 ++ .../Onboarding/Welcome/View/WelcomeView.swift | 58 +++ .../WelcomeViewController.swift | 53 +++ .../Welcome/ViewModel/WelcomeViewModel.swift | 16 + 50 files changed, 2726 insertions(+), 112 deletions(-) delete mode 100644 File.swift create mode 100644 KkuMulKum/Network/DTO/Model/Promises/MeetingPromisesModel.swift create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_meetingInfoBanner.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_meetingInfoBanner.imageset/meetingInfoBanner.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_meetingInfoBanner.imageset/meetingInfoBanner@2x.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_meetingInfoBanner.imageset/meetingInfoBanner@3x.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Mask group.svg delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/ic_profilebasic.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/ic_profilebasic@2x.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/ic_profilebasic@3x.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash 1.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash 2.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash.png create mode 100644 KkuMulKum/Resource/Util/Toast.swift create mode 100644 KkuMulKum/Source/MeetingInfo/Service/MeetingInfoService.swift create mode 100644 KkuMulKum/Source/MeetingInfo/View/InvitationCodePopUpView.swift create mode 100644 KkuMulKum/Source/MeetingInfo/View/MeetingInfoBannerView.swift create mode 100644 KkuMulKum/Source/MeetingInfo/View/MeetingInfoView.swift create mode 100644 KkuMulKum/Source/MeetingInfo/View/MeetingMemberCell.swift create mode 100644 KkuMulKum/Source/MeetingInfo/View/MeetingPromiseCell.swift create mode 100644 KkuMulKum/Source/MeetingInfo/ViewController/InvitationCodePopUpViewController.swift create mode 100644 KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift create mode 100644 KkuMulKum/Source/MeetingInfo/ViewModel/MeetingInfoViewModel.swift delete mode 100644 KkuMulKum/Source/MyPage/MyPageViewController.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageContentView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift create mode 100644 KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift create mode 100644 KkuMulKum/Source/Onboarding/Nickname/NicknameView/NicknameView.swift create mode 100644 KkuMulKum/Source/Onboarding/Nickname/ViewController/NicknameViewController.swift create mode 100644 KkuMulKum/Source/Onboarding/Nickname/ViewModel/NicknameViewModel.swift create mode 100644 KkuMulKum/Source/Onboarding/Profile/VIewController/ProfileViewController.swift create mode 100644 KkuMulKum/Source/Onboarding/Profile/View/ProfileView.swift create mode 100644 KkuMulKum/Source/Onboarding/Profile/ViewModel/ProfileViewModel.swift create mode 100644 KkuMulKum/Source/Onboarding/Welcome/View/WelcomeView.swift create mode 100644 KkuMulKum/Source/Onboarding/Welcome/ViewController/WelcomeViewController.swift create mode 100644 KkuMulKum/Source/Onboarding/Welcome/ViewModel/WelcomeViewModel.swift diff --git a/File.swift b/File.swift deleted file mode 100644 index a624f34a..00000000 --- a/File.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// File.swift -// KkuMulKum -// -// Created by 이지훈 on 7/9/24. -// - -import Foundation diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 2c461ed3..f9d0d405 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 782B406F2C3DBF93008B0CA7 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B406E2C3DBF93008B0CA7 /* ProfileViewController.swift */; }; + 782B40722C3DBFA3008B0CA7 /* ProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B40712C3DBFA3008B0CA7 /* ProfileViewModel.swift */; }; + 782B40752C3DBFBA008B0CA7 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B40742C3DBFBA008B0CA7 /* ProfileView.swift */; }; + 782B407B2C3E395A008B0CA7 /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B407A2C3E395A008B0CA7 /* WelcomeView.swift */; }; + 782B407D2C3E3984008B0CA7 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B407C2C3E3984008B0CA7 /* WelcomeViewController.swift */; }; + 782B407F2C3E44B7008B0CA7 /* WelcomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B407E2C3E44B7008B0CA7 /* WelcomeViewModel.swift */; }; + 782B40822C3E4925008B0CA7 /* NicknameViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782B40812C3E4925008B0CA7 /* NicknameViewModel.swift */; }; 784E4D942C3B1C7F00BC943C /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D932C3B1C7F00BC943C /* KakaoSDK */; }; 784E4D962C3B1C7F00BC943C /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D952C3B1C7F00BC943C /* KakaoSDKAuth */; }; 784E4D992C3B95A900BC943C /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D982C3B95A900BC943C /* KeychainAccess */; }; @@ -48,6 +55,8 @@ 789873342C3D1A7B00435E96 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789873312C3D1A7B00435E96 /* LoginView.swift */; }; 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */; }; 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */; }; + 78AED1342C3D951F000AD80A /* NicknameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED1332C3D951F000AD80A /* NicknameViewController.swift */; }; + 78AED1372C3D98D1000AD80A /* NicknameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED1362C3D98D1000AD80A /* NicknameView.swift */; }; 78B9286C2C29402C006D9942 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286B2C29402C006D9942 /* AppDelegate.swift */; }; 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286D2C29402C006D9942 /* SceneDelegate.swift */; }; 78B928752C29402E006D9942 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 78B928742C29402E006D9942 /* Assets.xcassets */; }; @@ -67,11 +76,14 @@ DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */; }; DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */; }; DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; - DD43935F2C4049F800EC1799 /* EnterInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */; }; - DD4393612C404A8E00EC1799 /* EnterInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */; }; - DD4393652C41230800EC1799 /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393642C41230800EC1799 /* CreateGroupViewController.swift */; }; - DD4393672C4123A000EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393662C4123A000EC1799 /* CreateGroupView.swift */; }; - DD4393692C41250C00EC1799 /* FinishCreateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393682C41250C00EC1799 /* FinishCreateViewController.swift */; }; + DD4393762C412F4500EC1799 /* EnterInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936D2C412F4500EC1799 /* EnterInviteCodeView.swift */; }; + DD4393772C412F4500EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936E2C412F4500EC1799 /* CreateGroupView.swift */; }; + DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */; }; + DD4393792C412F4500EC1799 /* JoinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393702C412F4500EC1799 /* JoinButtonView.swift */; }; + DD43937A2C412F4500EC1799 /* FinishCreateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */; }; + DD43937B2C412F4500EC1799 /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */; }; + DD43937C2C412F4500EC1799 /* EnterInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */; }; + DD43937D2C412F4500EC1799 /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */; }; DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */; }; DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */; }; DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */; }; @@ -80,7 +92,6 @@ DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */; }; DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE742C385FB1007C6059 /* HomeViewController.swift */; }; DDA2EE772C385FC3007C6059 /* GroupListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */; }; - DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */; }; DDAF1C7C2C3D5B86008A37D3 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7B2C3D5B86008A37D3 /* RxCocoa */; }; DDAF1C7E2C3D5B86008A37D3 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7D2C3D5B86008A37D3 /* RxRelay */; }; DDAF1C812C3D5BD5008A37D3 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C802C3D5BD5008A37D3 /* Kingfisher */; }; @@ -91,9 +102,11 @@ DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */; }; DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */; }; DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */; }; - DDDEDDD72C3F031F0094681A /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */; }; - DDDEDDD92C3F03CF0094681A /* JoinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */; }; - DDDEDDDB2C3F09DC0094681A /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */; }; + DE159D322C406E1600425101 /* MyPageAlarmSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2A2C406E1600425101 /* MyPageAlarmSettingView.swift */; }; + DE159D332C406E1600425101 /* MyPageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2B2C406E1600425101 /* MyPageContentView.swift */; }; + DE159D342C406E1600425101 /* MyPageEtcSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2C2C406E1600425101 /* MyPageEtcSettingView.swift */; }; + DE159D352C406E1600425101 /* MyPageNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2D2C406E1600425101 /* MyPageNavigationView.swift */; }; + DE159D362C406E1600425101 /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE159D2F2C406E1600425101 /* MyPageViewController.swift */; }; DE254AA52C31131600A4015E /* Color.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE254AA42C31131600A4015E /* Color.xcassets */; }; DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA72C3118EA00A4015E /* UIView+.swift */; }; DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA92C31190E00A4015E /* UIStackView+.swift */; }; @@ -115,6 +128,15 @@ DE254ACC2C311DC200A4015E /* Pretendard-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = DE254AC32C311DC200A4015E /* Pretendard-Thin.otf */; }; DE32D1D22C3BF703006848DF /* LoginUserResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE32D1D12C3BF703006848DF /* LoginUserResponseModel.swift */; }; DE32D1D42C3BFB56006848DF /* UpdateProfileNameModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE32D1D32C3BFB56006848DF /* UpdateProfileNameModel.swift */; }; + DE6D4D0F2C3F14D80005584B /* MeetingInfoService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D012C3F14D80005584B /* MeetingInfoService.swift */; }; + DE6D4D102C3F14D80005584B /* InvitationCodePopUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D032C3F14D80005584B /* InvitationCodePopUpView.swift */; }; + DE6D4D112C3F14D80005584B /* MeetingInfoBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D042C3F14D80005584B /* MeetingInfoBannerView.swift */; }; + DE6D4D122C3F14D80005584B /* MeetingInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D052C3F14D80005584B /* MeetingInfoView.swift */; }; + DE6D4D132C3F14D80005584B /* MeetingMemberCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D062C3F14D80005584B /* MeetingMemberCell.swift */; }; + DE6D4D142C3F14D80005584B /* MeetingPromiseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D072C3F14D80005584B /* MeetingPromiseCell.swift */; }; + DE6D4D152C3F14D80005584B /* InvitationCodePopUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D092C3F14D80005584B /* InvitationCodePopUpViewController.swift */; }; + DE6D4D162C3F14D80005584B /* MeetingInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D0A2C3F14D80005584B /* MeetingInfoViewController.swift */; }; + DE6D4D172C3F14D80005584B /* MeetingInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE6D4D0C2C3F14D80005584B /* MeetingInfoViewModel.swift */; }; DE8247FD2C36E7C7000601BC /* MoyaLoggingPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8247FC2C36E7C7000601BC /* MoyaLoggingPlugin.swift */; }; DE8248002C36E857000601BC /* ObservablePattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8247FF2C36E857000601BC /* ObservablePattern.swift */; }; DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9E187F2C3BA4AA00DB76B4 /* CustomButton.swift */; }; @@ -123,6 +145,7 @@ DE9E188B2C3BC92500DB76B4 /* EmptyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9E188A2C3BC92500DB76B4 /* EmptyModel.swift */; }; DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9E18912C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift */; }; DE9E189A2C3BCCBE00DB76B4 /* UtilsTemp.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9E18992C3BCCBE00DB76B4 /* UtilsTemp.swift */; }; + DEA932182C3F180800FDF637 /* MeetingPromisesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEA932172C3F180800FDF637 /* MeetingPromisesModel.swift */; }; DEBA032F2C3C24F2002ED8F2 /* ModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBA032E2C3C24F2002ED8F2 /* ModelType.swift */; }; DEBA03312C3C2972002ED8F2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEBA03302C3C2972002ED8F2 /* ViewController.swift */; }; DED5DBEC2C345210006ECE7E /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED5DBEB2C345210006ECE7E /* BaseViewController.swift */; }; @@ -130,15 +153,26 @@ DED5DBF02C345317006ECE7E /* BaseCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED5DBEF2C345317006ECE7E /* BaseCollectionViewCell.swift */; }; DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED5DBF12C34534A006ECE7E /* BaseCollectionReusableView.swift */; }; DED5DBF42C34539A006ECE7E /* BaseTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED5DBF32C34539A006ECE7E /* BaseTableViewCell.swift */; }; + DEF725DB2C3F3BBF008C87C7 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF725DA2C3F3BBF008C87C7 /* Toast.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 782B406E2C3DBF93008B0CA7 /* ProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; + 782B40712C3DBFA3008B0CA7 /* ProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewModel.swift; sourceTree = ""; }; + 782B40742C3DBFBA008B0CA7 /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = ""; }; + 782B407A2C3E395A008B0CA7 /* WelcomeView.swift */ = {isa = PBXFileReference; indentWidth = 5; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; }; + 782B407C2C3E3984008B0CA7 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; }; + 782B407E2C3E44B7008B0CA7 /* WelcomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewModel.swift; sourceTree = ""; }; + 782B40812C3E4925008B0CA7 /* NicknameViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameViewModel.swift; sourceTree = ""; }; 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PrivacyInfo.plist; sourceTree = ""; }; 7898732F2C3D1A7B00435E96 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; 789873302C3D1A7B00435E96 /* LoginViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; 789873312C3D1A7B00435E96 /* LoginView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginResponseModel.swift; sourceTree = ""; }; 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResissueResponseModel.swift; sourceTree = ""; }; + 78AED1312C3D94F2000AD80A /* KkuMulKum.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = KkuMulKum.entitlements; sourceTree = ""; }; + 78AED1332C3D951F000AD80A /* NicknameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameViewController.swift; sourceTree = ""; }; + 78AED1362C3D98D1000AD80A /* NicknameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameView.swift; sourceTree = ""; }; 78B928682C29402C006D9942 /* KkuMulKum.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KkuMulKum.app; sourceTree = BUILT_PRODUCTS_DIR; }; 78B9286B2C29402C006D9942 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78B9286D2C29402C006D9942 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -160,11 +194,14 @@ DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPromiseReadyInfoRequestModel.swift; sourceTree = ""; }; DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseLateInfoResponseModel.swift; sourceTree = ""; }; DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; - DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeViewController.swift; sourceTree = ""; }; - DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeView.swift; sourceTree = ""; }; - DD4393642C41230800EC1799 /* CreateGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewController.swift; sourceTree = ""; }; - DD4393662C4123A000EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; - DD4393682C41250C00EC1799 /* FinishCreateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateViewController.swift; sourceTree = ""; }; + DD43936D2C412F4500EC1799 /* EnterInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeView.swift; sourceTree = ""; }; + DD43936E2C412F4500EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; + DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; + DD4393702C412F4500EC1799 /* JoinButtonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinButtonView.swift; sourceTree = ""; }; + DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FinishCreateViewController.swift; sourceTree = ""; }; + DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupViewController.swift; sourceTree = ""; }; + DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeViewController.swift; sourceTree = ""; }; + DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = ""; }; DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadyStatusView.swift; sourceTree = ""; }; DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantCollectionViewCell.swift; sourceTree = ""; }; DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterReadyInfoButtonView.swift; sourceTree = ""; }; @@ -173,7 +210,6 @@ DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; DDA2EE742C385FB1007C6059 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupListViewController.swift; sourceTree = ""; }; - DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageViewController.swift; sourceTree = ""; }; DDAF1C832C3D5D19008A37D3 /* ViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelType.swift; sourceTree = ""; }; DDAF1C882C3D6E3D008A37D3 /* ReadyStatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusViewController.swift; sourceTree = ""; }; DDAF1C892C3D6E3D008A37D3 /* PromiseSegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseSegmentedControl.swift; sourceTree = ""; }; @@ -181,9 +217,11 @@ DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TardyViewController.swift; sourceTree = ""; }; DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseInfoViewController.swift; sourceTree = ""; }; DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseViewController.swift; sourceTree = ""; }; - DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = ""; }; - DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinButtonView.swift; sourceTree = ""; }; - DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; + DE159D2A2C406E1600425101 /* MyPageAlarmSettingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageAlarmSettingView.swift; sourceTree = ""; }; + DE159D2B2C406E1600425101 /* MyPageContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageContentView.swift; sourceTree = ""; }; + DE159D2C2C406E1600425101 /* MyPageEtcSettingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageEtcSettingView.swift; sourceTree = ""; }; + DE159D2D2C406E1600425101 /* MyPageNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageNavigationView.swift; sourceTree = ""; }; + DE159D2F2C406E1600425101 /* MyPageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageViewController.swift; sourceTree = ""; }; DE254AA42C31131600A4015E /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = ""; }; DE254AA72C3118EA00A4015E /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; DE254AA92C31190E00A4015E /* UIStackView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+.swift"; sourceTree = ""; }; @@ -205,6 +243,15 @@ DE254AC32C311DC200A4015E /* Pretendard-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Thin.otf"; sourceTree = ""; }; DE32D1D12C3BF703006848DF /* LoginUserResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginUserResponseModel.swift; sourceTree = ""; }; DE32D1D32C3BFB56006848DF /* UpdateProfileNameModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateProfileNameModel.swift; sourceTree = ""; }; + DE6D4D012C3F14D80005584B /* MeetingInfoService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingInfoService.swift; sourceTree = ""; }; + DE6D4D032C3F14D80005584B /* InvitationCodePopUpView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InvitationCodePopUpView.swift; sourceTree = ""; }; + DE6D4D042C3F14D80005584B /* MeetingInfoBannerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingInfoBannerView.swift; sourceTree = ""; }; + DE6D4D052C3F14D80005584B /* MeetingInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingInfoView.swift; sourceTree = ""; }; + DE6D4D062C3F14D80005584B /* MeetingMemberCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingMemberCell.swift; sourceTree = ""; }; + DE6D4D072C3F14D80005584B /* MeetingPromiseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingPromiseCell.swift; sourceTree = ""; }; + DE6D4D092C3F14D80005584B /* InvitationCodePopUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InvitationCodePopUpViewController.swift; sourceTree = ""; }; + DE6D4D0A2C3F14D80005584B /* MeetingInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingInfoViewController.swift; sourceTree = ""; }; + DE6D4D0C2C3F14D80005584B /* MeetingInfoViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingInfoViewModel.swift; sourceTree = ""; }; DE8247FC2C36E7C7000601BC /* MoyaLoggingPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoyaLoggingPlugin.swift; sourceTree = ""; }; DE8247FF2C36E857000601BC /* ObservablePattern.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObservablePattern.swift; sourceTree = ""; }; DE9E187F2C3BA4AA00DB76B4 /* CustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomButton.swift; sourceTree = ""; }; @@ -213,6 +260,7 @@ DE9E188A2C3BC92500DB76B4 /* EmptyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyModel.swift; sourceTree = ""; }; DE9E18912C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginRequestModel.swift; sourceTree = ""; }; DE9E18992C3BCCBE00DB76B4 /* UtilsTemp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilsTemp.swift; sourceTree = ""; }; + DEA932172C3F180800FDF637 /* MeetingPromisesModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingPromisesModel.swift; sourceTree = ""; }; DEBA032E2C3C24F2002ED8F2 /* ModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelType.swift; sourceTree = ""; }; DEBA03302C3C2972002ED8F2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; DED5DBEB2C345210006ECE7E /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; @@ -220,6 +268,7 @@ DED5DBEF2C345317006ECE7E /* BaseCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCollectionViewCell.swift; sourceTree = ""; }; DED5DBF12C34534A006ECE7E /* BaseCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCollectionReusableView.swift; sourceTree = ""; }; DED5DBF32C34539A006ECE7E /* BaseTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTableViewCell.swift; sourceTree = ""; }; + DEF725DA2C3F3BBF008C87C7 /* Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -271,6 +320,82 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 782B406C2C3DBF72008B0CA7 /* Profile */ = { + isa = PBXGroup; + children = ( + 782B40732C3DBFA8008B0CA7 /* View */, + 782B40702C3DBF97008B0CA7 /* ViewModel */, + 782B406D2C3DBF7C008B0CA7 /* VIewController */, + ); + path = Profile; + sourceTree = ""; + }; + 782B406D2C3DBF7C008B0CA7 /* VIewController */ = { + isa = PBXGroup; + children = ( + 782B406E2C3DBF93008B0CA7 /* ProfileViewController.swift */, + ); + path = VIewController; + sourceTree = ""; + }; + 782B40702C3DBF97008B0CA7 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 782B40712C3DBFA3008B0CA7 /* ProfileViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 782B40732C3DBFA8008B0CA7 /* View */ = { + isa = PBXGroup; + children = ( + 782B40742C3DBFBA008B0CA7 /* ProfileView.swift */, + ); + path = View; + sourceTree = ""; + }; + 782B40762C3E389F008B0CA7 /* Welcome */ = { + isa = PBXGroup; + children = ( + 782B40792C3E38C3008B0CA7 /* ViewController */, + 782B40782C3E38BC008B0CA7 /* ViewModel */, + 782B40772C3E38B5008B0CA7 /* View */, + ); + path = Welcome; + sourceTree = ""; + }; + 782B40772C3E38B5008B0CA7 /* View */ = { + isa = PBXGroup; + children = ( + 782B407A2C3E395A008B0CA7 /* WelcomeView.swift */, + ); + path = View; + sourceTree = ""; + }; + 782B40782C3E38BC008B0CA7 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 782B407E2C3E44B7008B0CA7 /* WelcomeViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 782B40792C3E38C3008B0CA7 /* ViewController */ = { + isa = PBXGroup; + children = ( + 782B407C2C3E3984008B0CA7 /* WelcomeViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 782B40802C3E48BD008B0CA7 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 782B40812C3E4925008B0CA7 /* NicknameViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; 789873352C3D1B3000435E96 /* View */ = { isa = PBXGroup; children = ( @@ -295,6 +420,32 @@ path = ViewController; sourceTree = ""; }; + 78AED1322C3D9514000AD80A /* Nickname */ = { + isa = PBXGroup; + children = ( + 782B40802C3E48BD008B0CA7 /* ViewModel */, + 78AED1382C3D98DB000AD80A /* ViewController */, + 78AED1352C3D98C1000AD80A /* NicknameView */, + ); + path = Nickname; + sourceTree = ""; + }; + 78AED1352C3D98C1000AD80A /* NicknameView */ = { + isa = PBXGroup; + children = ( + 78AED1362C3D98D1000AD80A /* NicknameView.swift */, + ); + path = NicknameView; + sourceTree = ""; + }; + 78AED1382C3D98DB000AD80A /* ViewController */ = { + isa = PBXGroup; + children = ( + 78AED1332C3D951F000AD80A /* NicknameViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; 78B9285F2C29402C006D9942 = { isa = PBXGroup; children = ( @@ -314,6 +465,7 @@ 78B9286A2C29402C006D9942 /* KkuMulKum */ = { isa = PBXGroup; children = ( + 78AED1312C3D94F2000AD80A /* KkuMulKum.entitlements */, DE254AA12C31106700A4015E /* Application */, DE254AA22C31107700A4015E /* Source */, DE254AA32C31107C00A4015E /* Resource */, @@ -322,31 +474,43 @@ path = KkuMulKum; sourceTree = ""; }; - DD4393622C407C1700EC1799 /* ViewController */ = { + DD43936B2C412F4500EC1799 /* GroupCreate */ = { isa = PBXGroup; children = ( - DDDEDDD62C3F031F0094681A /* CheckInviteCodeViewController.swift */, - DD43935E2C4049F800EC1799 /* EnterInviteCodeViewController.swift */, - DD4393642C41230800EC1799 /* CreateGroupViewController.swift */, - DD4393682C41250C00EC1799 /* FinishCreateViewController.swift */, + DD43936C2C412F4500EC1799 /* View */, + DD4393712C412F4500EC1799 /* ViewController */, ); - path = ViewController; + path = GroupCreate; sourceTree = ""; }; - DD4393632C407C2500EC1799 /* View */ = { + DD43936C2C412F4500EC1799 /* View */ = { isa = PBXGroup; children = ( - DDDEDDDA2C3F09DC0094681A /* CheckInviteCodeView.swift */, - DD4393602C404A8E00EC1799 /* EnterInviteCodeView.swift */, - DD4393662C4123A000EC1799 /* CreateGroupView.swift */, - DDDEDDD82C3F03CF0094681A /* JoinButtonView.swift */, + DD43936D2C412F4500EC1799 /* EnterInviteCodeView.swift */, + DD43936E2C412F4500EC1799 /* CreateGroupView.swift */, + DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */, + DD4393702C412F4500EC1799 /* JoinButtonView.swift */, ); path = View; sourceTree = ""; }; + DD4393712C412F4500EC1799 /* ViewController */ = { + isa = PBXGroup; + children = ( + DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */, + DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */, + DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */, + DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; DD865B652C3920F600C351A2 /* Onboarding */ = { isa = PBXGroup; children = ( + 782B40762C3E389F008B0CA7 /* Welcome */, + 782B406C2C3DBF72008B0CA7 /* Profile */, + 78AED1322C3D9514000AD80A /* Nickname */, DD865B662C39210E00C351A2 /* Login */, ); path = Onboarding; @@ -417,14 +581,6 @@ path = GroupList; sourceTree = ""; }; - DDA2EE7D2C386087007C6059 /* MyPage */ = { - isa = PBXGroup; - children = ( - DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */, - ); - path = MyPage; - sourceTree = ""; - }; DDA2EE7E2C3860B2007C6059 /* Core */ = { isa = PBXGroup; children = ( @@ -452,13 +608,32 @@ path = Promise; sourceTree = ""; }; - DDDEDDD52C3F028B0094681A /* GroupCreate */ = { + DE159D2E2C406E1600425101 /* View */ = { isa = PBXGroup; children = ( - DD4393622C407C1700EC1799 /* ViewController */, - DD4393632C407C2500EC1799 /* View */, + DE159D2A2C406E1600425101 /* MyPageAlarmSettingView.swift */, + DE159D2B2C406E1600425101 /* MyPageContentView.swift */, + DE159D2C2C406E1600425101 /* MyPageEtcSettingView.swift */, + DE159D2D2C406E1600425101 /* MyPageNavigationView.swift */, ); - path = GroupCreate; + path = View; + sourceTree = ""; + }; + DE159D302C406E1600425101 /* ViewController */ = { + isa = PBXGroup; + children = ( + DE159D2F2C406E1600425101 /* MyPageViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + DE159D312C406E1600425101 /* MyPage */ = { + isa = PBXGroup; + children = ( + DE159D2E2C406E1600425101 /* View */, + DE159D302C406E1600425101 /* ViewController */, + ); + path = MyPage; sourceTree = ""; }; DE254AA12C31106700A4015E /* Application */ = { @@ -475,9 +650,10 @@ children = ( DDA2EE7E2C3860B2007C6059 /* Core */, DDA2EE7B2C386078007C6059 /* Home */, - DDDEDDD52C3F028B0094681A /* GroupCreate */, + DD43936B2C412F4500EC1799 /* GroupCreate */, DDA2EE7C2C38607F007C6059 /* GroupList */, - DDA2EE7D2C386087007C6059 /* MyPage */, + DE159D312C406E1600425101 /* MyPage */, + DE6D4D0E2C3F14D80005584B /* MeetingInfo */, DD865B652C3920F600C351A2 /* Onboarding */, DDAF1C872C3D6E3D008A37D3 /* Promise */, ); @@ -523,6 +699,7 @@ children = ( DE254AB62C3119D000A4015E /* ReuseIdentifiable.swift */, DE254AB82C311AB300A4015E /* Screen.swift */, + DEF725DA2C3F3BBF008C87C7 /* Toast.swift */, ); path = Util; sourceTree = ""; @@ -543,6 +720,54 @@ path = Font; sourceTree = ""; }; + DE6D4D022C3F14D80005584B /* Service */ = { + isa = PBXGroup; + children = ( + DE6D4D012C3F14D80005584B /* MeetingInfoService.swift */, + ); + path = Service; + sourceTree = ""; + }; + DE6D4D082C3F14D80005584B /* View */ = { + isa = PBXGroup; + children = ( + DE6D4D032C3F14D80005584B /* InvitationCodePopUpView.swift */, + DE6D4D042C3F14D80005584B /* MeetingInfoBannerView.swift */, + DE6D4D052C3F14D80005584B /* MeetingInfoView.swift */, + DE6D4D062C3F14D80005584B /* MeetingMemberCell.swift */, + DE6D4D072C3F14D80005584B /* MeetingPromiseCell.swift */, + ); + path = View; + sourceTree = ""; + }; + DE6D4D0B2C3F14D80005584B /* ViewController */ = { + isa = PBXGroup; + children = ( + DE6D4D092C3F14D80005584B /* InvitationCodePopUpViewController.swift */, + DE6D4D0A2C3F14D80005584B /* MeetingInfoViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + DE6D4D0D2C3F14D80005584B /* ViewModel */ = { + isa = PBXGroup; + children = ( + DE6D4D0C2C3F14D80005584B /* MeetingInfoViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + DE6D4D0E2C3F14D80005584B /* MeetingInfo */ = { + isa = PBXGroup; + children = ( + DE6D4D022C3F14D80005584B /* Service */, + DE6D4D082C3F14D80005584B /* View */, + DE6D4D0B2C3F14D80005584B /* ViewController */, + DE6D4D0D2C3F14D80005584B /* ViewModel */, + ); + path = MeetingInfo; + sourceTree = ""; + }; DE8247FB2C36E7BB000601BC /* Network */ = { isa = PBXGroup; children = ( @@ -635,6 +860,7 @@ DE9E188F2C3BCC7600DB76B4 /* Promises */ = { isa = PBXGroup; children = ( + DEA932172C3F180800FDF637 /* MeetingPromisesModel.swift */, DD3072132C3BF87A00416D9F /* NearestPromiseResponseModel.swift */, DD3072152C3BFE4E00416D9F /* UpcomingPromiseListResponseModel.swift */, DD3072192C3C011600416D9F /* AddPromiseRequestModel.swift */, @@ -819,56 +1045,80 @@ DDAF1C8E2C3D6E3D008A37D3 /* ReadyStatusViewController.swift in Sources */, DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, DED5DBEC2C345210006ECE7E /* BaseViewController.swift in Sources */, + DE6D4D142C3F14D80005584B /* MeetingPromiseCell.swift in Sources */, + DD43937C2C412F4500EC1799 /* EnterInviteCodeViewController.swift in Sources */, + DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */, + DE6D4D102C3F14D80005584B /* InvitationCodePopUpView.swift in Sources */, DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */, + DE159D332C406E1600425101 /* MyPageContentView.swift in Sources */, + DE6D4D112C3F14D80005584B /* MeetingInfoBannerView.swift in Sources */, + DE6D4D122C3F14D80005584B /* MeetingInfoView.swift in Sources */, DD30721E2C3C0CC800416D9F /* PromiseInfoResponseModel.swift in Sources */, DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */, - DD4393692C41250C00EC1799 /* FinishCreateViewController.swift in Sources */, A3FB18512C3BF531001483E5 /* RegisterMeetingsResponseModel.swift in Sources */, 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */, + DE159D352C406E1600425101 /* MyPageNavigationView.swift in Sources */, DE9E188B2C3BC92500DB76B4 /* EmptyModel.swift in Sources */, DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */, A3FB184D2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift in Sources */, DEBA03312C3C2972002ED8F2 /* ViewController.swift in Sources */, - DDDEDDD92C3F03CF0094681A /* JoinButtonView.swift in Sources */, + DD43937D2C412F4500EC1799 /* CheckInviteCodeViewController.swift in Sources */, DD931B742C3DAB9A00526452 /* ReadyPlanInfoView.swift in Sources */, + DD4393772C412F4500EC1799 /* CreateGroupView.swift in Sources */, 789873342C3D1A7B00435E96 /* LoginView.swift in Sources */, + 782B40822C3E4925008B0CA7 /* NicknameViewModel.swift in Sources */, + 782B406F2C3DBF93008B0CA7 /* ProfileViewController.swift in Sources */, A3FB18592C3BF77D001483E5 /* MeetingInfoResponseModel.swift in Sources */, + DEA932182C3F180800FDF637 /* MeetingPromisesModel.swift in Sources */, + DE159D342C406E1600425101 /* MyPageEtcSettingView.swift in Sources */, DE9E18842C3BA84500DB76B4 /* CustomTextField.swift in Sources */, A3FB184F2C3BF4BC001483E5 /* MakeMeetingsResponseModel.swift in Sources */, + DEF725DB2C3F3BBF008C87C7 /* Toast.swift in Sources */, + DD43937A2C412F4500EC1799 /* FinishCreateViewController.swift in Sources */, DE254AAC2C31192400A4015E /* UILabel+.swift in Sources */, DE254AB72C3119D000A4015E /* ReuseIdentifiable.swift in Sources */, DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */, - DD4393672C4123A000EC1799 /* CreateGroupView.swift in Sources */, DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */, + 78AED1342C3D951F000AD80A /* NicknameViewController.swift in Sources */, DE254AB42C31199B00A4015E /* UITextField+.swift in Sources */, DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */, + 782B407D2C3E3984008B0CA7 /* WelcomeViewController.swift in Sources */, DE8248002C36E857000601BC /* ObservablePattern.swift in Sources */, DDAF1C902C3D6E3D008A37D3 /* PromiseViewModel.swift in Sources */, DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */, + DE159D362C406E1600425101 /* MyPageViewController.swift in Sources */, + DD4393762C412F4500EC1799 /* EnterInviteCodeView.swift in Sources */, DED5DBF02C345317006ECE7E /* BaseCollectionViewCell.swift in Sources */, DE32D1D42C3BFB56006848DF /* UpdateProfileNameModel.swift in Sources */, + DE6D4D132C3F14D80005584B /* MeetingMemberCell.swift in Sources */, DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */, - DD4393612C404A8E00EC1799 /* EnterInviteCodeView.swift in Sources */, DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */, - DDDEDDDB2C3F09DC0094681A /* CheckInviteCodeView.swift in Sources */, DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */, DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */, + DE6D4D152C3F14D80005584B /* InvitationCodePopUpViewController.swift in Sources */, + DD4393792C412F4500EC1799 /* JoinButtonView.swift in Sources */, DE9E189A2C3BCCBE00DB76B4 /* UtilsTemp.swift in Sources */, + 782B407B2C3E395A008B0CA7 /* WelcomeView.swift in Sources */, DD3072142C3BF87A00416D9F /* NearestPromiseResponseModel.swift in Sources */, + 782B407F2C3E44B7008B0CA7 /* WelcomeViewModel.swift in Sources */, DD3072162C3BFE4E00416D9F /* UpcomingPromiseListResponseModel.swift in Sources */, A3FB18572C3BF704001483E5 /* MeetingListResponseModel.swift in Sources */, DE254AB22C31197B00A4015E /* UIButton+.swift in Sources */, + DE6D4D162C3F14D80005584B /* MeetingInfoViewController.swift in Sources */, + DE159D322C406E1600425101 /* MyPageAlarmSettingView.swift in Sources */, DDA2EE772C385FC3007C6059 /* GroupListViewController.swift in Sources */, 78B9286C2C29402C006D9942 /* AppDelegate.swift in Sources */, DEBA032F2C3C24F2002ED8F2 /* ModelType.swift in Sources */, 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */, + DE6D4D0F2C3F14D80005584B /* MeetingInfoService.swift in Sources */, DED5DBF42C34539A006ECE7E /* BaseTableViewCell.swift in Sources */, 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, - DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */, + DE6D4D172C3F14D80005584B /* MeetingInfoViewModel.swift in Sources */, + 78AED1372C3D98D1000AD80A /* NicknameView.swift in Sources */, A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */, DD3072222C3C0DA300416D9F /* PromiseParticipantListResponseModel.swift in Sources */, 789873322C3D1A7B00435E96 /* LoginViewController.swift in Sources */, - DD4393652C41230800EC1799 /* CreateGroupViewController.swift in Sources */, + 782B40722C3DBFA3008B0CA7 /* ProfileViewModel.swift in Sources */, DDAF1C8F2C3D6E3D008A37D3 /* PromiseSegmentedControl.swift in Sources */, DE32D1D22C3BF703006848DF /* LoginUserResponseModel.swift in Sources */, DE9E18892C3BC91000DB76B4 /* ResponseBodyDTO.swift in Sources */, @@ -878,14 +1128,14 @@ DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */, DD931B762C3DC16100526452 /* PromiseInfoView.swift in Sources */, DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */, - DDDEDDD72C3F031F0094681A /* CheckInviteCodeViewController.swift in Sources */, 789873332C3D1A7B00435E96 /* LoginViewModel.swift in Sources */, + 782B40752C3DBFBA008B0CA7 /* ProfileView.swift in Sources */, DED5DBEE2C34529A006ECE7E /* BaseView.swift in Sources */, DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */, DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */, + DD43937B2C412F4500EC1799 /* CreateGroupViewController.swift in Sources */, DE8247FD2C36E7C7000601BC /* MoyaLoggingPlugin.swift in Sources */, DDAF1C842C3D5D19008A37D3 /* ViewModelType.swift in Sources */, - DD43935F2C4049F800EC1799 /* EnterInviteCodeViewController.swift in Sources */, DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */, DE254AB92C311AB300A4015E /* Screen.swift in Sources */, ); @@ -1029,6 +1279,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = KkuMulKum/KkuMulKum.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; @@ -1062,6 +1313,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = KkuMulKum/KkuMulKum.entitlements; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; diff --git a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 45b79d88..e1e5105d 100644 --- a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "9a47217a5c175e3de895c155c13de64f1d563d13e297ec224a467854897a75be", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -208,5 +209,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/KkuMulKum/Application/AppDelegate.swift b/KkuMulKum/Application/AppDelegate.swift index 00e72fe0..e2d166b5 100644 --- a/KkuMulKum/Application/AppDelegate.swift +++ b/KkuMulKum/Application/AppDelegate.swift @@ -16,6 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + + // sleep(1) // KakaoSDK 초기화 과정에서 앱 키를 동적으로 불러오기 if let kakaoAppKey = fetchKakaoAppKeyFromPrivacyInfo() { KakaoSDK.initSDK(appKey: kakaoAppKey) diff --git a/KkuMulKum/Application/SceneDelegate.swift b/KkuMulKum/Application/SceneDelegate.swift index 11d514e9..e75269f7 100644 --- a/KkuMulKum/Application/SceneDelegate.swift +++ b/KkuMulKum/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: windowScene) - self.window?.rootViewController = MainTabBarController() + self.window?.rootViewController = NicknameViewController() self.window?.makeKeyAndVisible() } diff --git a/KkuMulKum/Network/DTO/Model/Promises/MeetingPromisesModel.swift b/KkuMulKum/Network/DTO/Model/Promises/MeetingPromisesModel.swift new file mode 100644 index 00000000..c0a492e7 --- /dev/null +++ b/KkuMulKum/Network/DTO/Model/Promises/MeetingPromisesModel.swift @@ -0,0 +1,21 @@ +// +// MeetingPromisesModel.swift +// KkuMulKum +// +// Created by 김진웅 on 7/10/24. +// + +import Foundation + +struct MeetingPromisesModel: ResponseModelType { + let promises: [MeetingPromise] +} + +struct MeetingPromise: Codable { + let id: Int + let name: String + let dDay: Int + let date: String + let time: String + let placeName: String +} diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json new file mode 100644 index 00000000..c9c7d7d5 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "edit.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fcd1770733d077204f8db07adcf8248c3785d3 GIT binary patch literal 660 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 K+Lc-l!~PG1))Ywq literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_meetingInfoBanner.imageset/meetingInfoBanner@3x.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_meetingInfoBanner.imageset/meetingInfoBanner@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..42ad3f9172207a6993b59037f5e3fea9cb720722 GIT binary patch literal 5813 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 GhyMfCU&%HA literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json index 165fd2cc..a00d154d 100644 --- a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json @@ -1,19 +1,8 @@ { "images" : [ { - "filename" : "ic_profilebasic.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "ic_profilebasic@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "ic_profilebasic@3x.png", - "idiom" : "universal", - "scale" : "3x" + "filename" : "Mask group.svg", + "idiom" : "universal" } ], "info" : { diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Mask group.svg b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Mask group.svg new file mode 100644 index 00000000..fceab80b --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Mask group.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/ic_profilebasic.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/ic_profilebasic.png deleted file mode 100644 index 085ccad573a0e89a4b075d11bf5a9dab02df0eb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1244 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 S*G8oP0000XN( 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 z%0A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≫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 literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash 2.png b/KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash 2.png new file mode 100644 index 0000000000000000000000000000000000000000..6d90a30c956a1d8035a976ca16a6749e166fec4d GIT binary patch literal 97967 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 z%0ALNHs*xiGePB?yIY4YqR-Dd_<2HwPjGQtL?6gr_&!UQ9!9LKLil9B$hIY;-6nX2 zbe`Rx!o<>*3C1>1h6+;R^&;n`{I=5vQwNh0N+`|s5HmNB%TbW^)XFjnk)b+67u3Et z+p0L%rg`E_l7@K#p&-e@Vm0{0mgg^A`1h_=Rmf@ZIv##=v$ysPA$mg8#Q zWGkB->8b9ILV^TqpCG6e``U44|NCj)K2&DLX#tnFLSEd+W1~J!TWP^d+22doHW^%! zA^T`0w=oZi3_jJZE2kS8@+;1eKKP9}I>cg5gM-g{sJdad zWO>g$75W4|%NZ75v-yfBVGnhKq)4EQZJpESc|#Dl*{}5EJO{PY=hNrH=IB}K~IeKG^`!^B%k5vBbnj?|`((jKtjM=aYs z)Y6z0Lw62Yadr4$mcfB{1CwS+oD7_)WI34}LGo*ULQGuq%$e|ErjQ`iieK9B2 zt~Wj~2buYH=|-)Qz;^m%)ggZv?X71N%i7L=5H6Vh$$-;_jklnYRzt?{nBHZ50%1{S z-)rRf>8xJd+l|46?nO3|gIfCU6E`^G@RfYO8wZCIFj-NZo>+1y@PLUNuy8;;YVDyG zV1?E@Nv(Uh+mQ{T!K0zMq!E3UQ)F!Yw0BRlYQd4_zV>w${#GGkJ8#c!hcA8`j$@M( zRB63r%gNviE4@k7SF{2UlBcXQZE*jz`Dy*&@NyBJ*IHsy9ynFzQQp3H_BAfIa8T*n zWO>kex!b0q?^74^$$re?GNB#A^JSGVdv5$ylF$@Tyz6bj+#b*2KM3Q`I^WzRNE3ta znCR%yY?Ks}tT)C6w~4uuEw_30!WF*_@&D4EC7|n1?ulN)PsB#&=fNbE4z;J(f~;ak zOQmcQ;u!0ZtO>rr86jpgpRE1HQ9*^^-i>%TQz>1p0m|5WA1M5-rIoN#t{H30=l@Ne zab)H+Pph_5k83_@g5joDxxfLwU~YaTC?KZa->PMmir81JhHKeL99R)`NQ9UT>FwV7 zeAZJ6T!IlRO!~^*XUC*X@b9BiQtpER4pp^T8n1lqdn?F7GQELNmY3^iV?2>Hx?WJS zp9R|xTHTGexK zqdsa!i|8)<;#W-G!CNWHI~8{={Go_5?oF8{lYBn)n;XE6KM*@~h(uVaXap8J8KpV? z(^Dfb*ZnPI{z+`i0<@i zJALJ7x-w~9t3KP_qF*odQdI~*=g)Ux2z!Tp=0RZk{72L%6v@A7s6itr55aL9A4J_YD}GP z%d4sr*u;0gyv*%VI=qd zuw`+)SNPY~TVtn-se)oy=sHQEn|tv>I4f>JP;7j8s@OvAN*{tC8QYVAlfK&MO_qH zF+r>Pus5A1?8<@N8)N(M-aPCNmyFeu2q#;5iY?kZa)OFwgP*n-H<)}ZGo6|9l6b<` z>V-H8)r$)A91w0?q~38U*bpEhg2s!la(3#KKWcyOv+sNhX2{O_balwJgyBBWSHIl9 z&WV5O{A%lXsT)?)JXMsQFeF{?`y>>XqXn~>0aiO7UjfX~U4ZE1?WcU$?GF*1>jYWa zK)Z)8xvT-|fhWK7|Hv3-ywDc*%WKp0rhZvpZ8r5&RRqA{gv`-?$auSSl4Z>&BzC1j`Gg}m5!ki|2a@u)6VrycLK^(5J$qIXgf8*;;TKFT+*d^HL?? zQf|YKXr~QOCgl=YDZ=%^yK~CZ&h1)q;$LZ3GThgRTTC4RJHG;)@F%{Jdc@u+8Gw(!!6L5Ib zFtK(S4RCW~D~&pfwUDhal6&RdgcqubHO2Fb^h`;!n~;5}JlGz(IFQh#IR`TjEAk^CD(yHbypNCxny+Um0Ur>1;VhN}B5nB2lsA!Vycp zSn1J_c8gQvWJ4EoWTBp1vFNCT7=NYCcz3s+^X<;~QOV|MMc-`*ULJ(fVaqsvKv#m} zk;Se!I_vW1C-KGGbD9g^fy+gW_!`2i+_H1@l#Zk^?sXrH=(zp00!`wk7$KO15V66t zE#1sET&gBGz%z~m@Gyed)x0Bo&dU#8AMo$}+=ge88qG|gBt)ENQ+d+ClKNc`79~e6 zuaA|`E&CN@2a;>-z7ZAlri_xBmeBA~Mb);6Y;&CkL&w1<#vC0LguaL?LmM7ouQyKj z4NSO&S>exa3cWO7j9Za-QQ|b~hBYLB>J3eGeeVo4Y05jH+&VT3u=7UhQ3hcdov;=3 zuHJhzb7NW=#C^B(YUuCD_c4f@{wK+I0Xm2LPXVH1galMm8e5%lu%B5l#XLHrW~oQkK9X?B{pnkHeRPG67LU-u0l9uuYkM$`%4v|q z7~d^6osVo@b!y2w7&G%}Zy6WJaNRgC6trjn!fwYkWZbLEdX114b~&4s$~gN?tg~V9 zvJ8OlaE=S!4S-KEx#`!^L84k1S&x7u=@gPNa$2$U5ug>{%IB_+jz$xsYqzfyc#ZehUg zz-(ei1q$|BW%cx14j{gAn0nzSLD@+{R}{X-9{bbdk4FOrWy06dt_j*k-K=v}bv zP3@M3;p1g4&u?$j-vefh#Wihukf=z@gr2V+sxcjjZLFRpH|lF8P$0jp3m~|*I1Bvd zHs@lb`uxaK%1K2=f~+7TCdg^p*>c4rr?adv)Ln$R`~H;!X&7@nb_VoVq{{#6)xX{N z*}J=z4Fv4${#<|qdhe&FoAj|!`O28CbIRIPhLF&1Q-t(Z*;fl}O`dbv-pfHFaCDb9 zS}11YdjA-rUoTsKE_xj$yI~N&V_h<;q5h$Jy(lQAo=$VOo1fgDHxF&pzz9CutMd%q zl_yR<;bQW*;e++V&AH{3^WpkrlL9FQa8uEhn-%HLOUWVf{<-OsLTy+Dy?1zhyn&$erXB?p?Jv2PdU z1`-iM@k08)E5%2tCy3o+=*-JN5YjrkwbtUj@+%rlwJ5fjPkOSw?Er0d9?>atViTv0 zE4Psn1eJcivm2Bi90K1hP(5(_kKZ?mRoG_O1n>e zJt%*gw)|9v9E*5fH<^q=%4b#fMAEcO?d3;bsko-77;4+RAV-jxF zLb9^P8DrP{B{ue&Oyd)Z5LqesHL$=5g4ip=3){C`0*J;F-RSGvraftDP^~K^wUdZU`0w|Qv>?jE1l0$3KYZBV;?(8*&x z)Ay4&x!;mqll^V3@8FYW2`l(k4=|*NR8$;gbaRG2hYfKuHy6apZcs5)TsmxL{nSE`1xWL{kV{gz;JUN_O6?m|ZY4`eXm_7pt5zj$`0wN|T@*|IlLHSF|zOT&oQi&mkC#TrH(6P-O%vg{4gx=N%Iu?=ZP!%?<%*tKan zAzF_4;YIMnKCfXi^ZDL$+5PA+0F_PQwiCP35EQr4Hl(-Gi=^9_4keplEDlJ~k%rj1 zXTME`z58PTp^yzi>U!2rUsz4tk8I{+LWxriZOwr_s!bKA4gJ@p8``1jj^n;}7@m_e z8fulKu2!UvmTKz9GCcC`7MjNvoPT3DLeQPIFqDfrW4e#W?Q8}6b75!vJ5`E)l^bR@ z#cro9VCT@|QSzJsx6(HKlWHHM}rZn2#MH zU07|iIUMR#tiHR%vNRBf)Nn*#kMx4k=6yv|Gc4?_{l1YeopYjv&U7NKybd`8LgrqD zCCYlA)QB~CN&()WwUXX~`{!~=W>ReNA(JL+S(5Ge4M>o_xvrtspGyuOQC6aKS6{qg zfAO3_J@M-L7h8oiA7!7(=%=je(~ofPRg4>DCsVp8ygtZ{k`g}K^~G9!Oc8e~zVwmu z#q)clZ@QH40_dM7jLSiSx)}#Yr{wIb8ocZim@ z1UQAekASgT?nS%s_V3j^QM8!KX7@cB!OIe1MY)XIK0mtz0zl$2*-t)k@3}D5xKD8U z_Vop6bMi3S|5B%YqQz^*_u%eGB}KzE{^I#ywC^!|4a-72i3gAZ{e3Y$z-g|gO@mn) zWM{V7lznrUT)_9sEO{i&OMQsPwvH7Y13zh3aDmB!agD{tktlw1-SVqH_IcQ+Dj1(B z9oO0#WP~m8WIUc|Zw-tO-9Bi#d-1Pxr2oEbFLnR@-CgN5Y#vQh)8_F#Rl9X)iiF%E zC*31|=bO3A!UU|1FT)Lw%(a;%WZJhMRyBpT{m21_{V3rD9 z!M|Q_1dM6exE^uMHGRs~#M>U^VLKVNzQ5&t@yh=j;4NZ60svaQ-kDU#Ii^^Nt8NHc zE(uO}t;%v{ATzV7V8cV}qG;B#Q$=d6W5zHjS`ZjS0r>!&S;AY{Sf<_d zjA;xV7aF7T$7r41q0w=?vpVX-7Y|ehlzM_IlkEmem-f*yS<#VVob-)b)Xu7FS&e1< zh_4oNvw8DgXKt5?HhizUM(nKu-jpouqoj{}rt0TDkjraWwE%`XZC%?tpD7O_(sk%! zpHvwl99DKKhO$ONpDG-Q&Q{EKcnQX9N(N;vII5bG8aK-r-!&{TJiAV<+k7I}{)1{g zI_?fAXrRjB*|4!h*yamPrm(KW*jr~ZP2z0CaRE}2|2g!DjMu>v$ocOxPNx7AYeaqA z?fW4nq$ypZH^B6X?t%~FacB54H3T{10OF;FTVs7a_t-mz@rpH9`RWk*trRvf-CGvD zBoQGajhtg(#k`*jaQSItg?hhN%u%(K8A0*&3DC@><*VsqDU#fIw8<#8v3+HJajDI3 z2N+l92;mD;X0QIeX2EUX?sN$9NOGM|Yd$A++th2dKcJ@->H|q-^C%o$aPi-M+p-tK zqaWj^8Sf0Ed{^0x(MRHw1~T`lqJAc?ejB#~>6TaCrl~SnX~{h~{amN3sL2n4u02dF z)zC-lE950-7vJi$R#{K>c2$(C_HtC{OY6~O(0=8l@hb4Q(jV?j$vx?`t_y}p>HY<$ zS)io7C?OZ3XsUUhl{739GL;+oe&S)d9hp_a{Dg_p?48mN^yBaHwQ;u6CYO4hRX&UI zz9_1&w#iHgyOp2w=k8SGY2*IVa#i#2SIfcUK_0K$+yY8#dNmtdzYHq}wDC7dcSdhk z774Yz{DQOA4r!Wmap?1jN|P9e94XDeFkn#bOz~DJL)K?z49Ef_h6v29yIVf*&Vw&( z%%MFryiX)hT%fCeYRA?dTkWN6vYWkM@2d#_$*RKo?iDA$D63nrNCs8*zmVtsVaGhw z^bU92-t^JsXRz>1f|@Z|)niAFUm|A7h1;=1_EEdQ{DqFgt~}Aiz0U?=T=;bbntVU7 zfWm17p*n@?W&X?A^51q3Z?-!p$GaqxhzAs-BVq3$tMXD9BLOn!7Y&iNISDx(FX#Ps z$o^yYrN7Lk7q~jjEEAIMmY|zz!o}IHqgQjOwOKD|zcrR7;)6l>rjq6AmxiA)J0>v< zY@i;~cs?2s0@74XPlO$~h8=vOXTureji1KCOl!gRJ zK3!u|OW`LE6(*HCS02#o|9YNMHbyfZPMhXC5AqxwXD9ech^>A0bWMlfdHk39V}Gyu z@L<&pl$-ZHkZ2J76kn&e6~)4~PG~rin2V;l!m=LzHKj03m0z9}4sxWs z!Ot_^c;yi5RA#kd2)8@ge)=I%CW* zWsG}R>55XK{wE=w$5gqN-7@u}c0Eay%jAZX(QdN8$lPkyT(nZFl_IIlStu00KH{vG zNXvTr^~X0a9{OVc28LAz2Fs!{-48sjyJ-T|zlXlz<~%(VqKjFxkC%Ub+!M?ue8$=xwHpTPqR@>PU4^6V5ULeqwr{)WYt2$*!U#@gqf6?1@ z?deh7aR{Dos?Sh2`1ZW>VQGSC&A%eFu<4qI#G|Q3yf;K@!!yTl>^m@_ZPmW-{JE<;J_y?i ztPF?-Wmmy{alwrg@84yX0e)~dDdgltc-r#_Sa{qh{fWU#o}2Ic9TvFa(z}%VzrO;K z$I*Rzscd1->9AL*^csHZhepe4KH8=;Ogna)-dFFdqsZqpWC`Zm&){rq?~tto8q?#X z)w!^m%1?xeAy4_wqN`Jl)iYIn7!(h#xQHJf(t z~U+OOlv(bPgP^5kc^Yz5gpfs9^ zX`D7q)l+i4C^Q^#TnM9j4Yr_B0+sIGH zmhI)x@Mgby*F1?#DBi^M_C}wjaHUe=e6>jZiI8gUMsT|3;uCbwDoJ2XnU^D5WzCO~ z5?Ba{sr9RDh4GIGj~i^Y$Vwu(VwuGQ(=qOY*DnkcCH<@Q1rOfUkms}q9Fl&ZpC2Q5 z)DI4DVnYHRXcRi?kyR@FjP@So%H;EG)6Q!cR_)iu_GM3= zdY)Z0cpqzsP}NV=6z`UJ!JZr&`-^V=>t1z=Xa?;wr9U9g?E0n@aeaL!Q7UOywv`*= zKT1Po9}lxr)*j7>EzQ@IK#*?>dH?o z%QqRP9wm1*9#bie-ct%ACUV7is~Stg%r=!@I4FiQ!zb)16J#Ta44*%NE^@9OQ#DqNgV$%P| zk7&tEM#w#N1<|VmLYaXn6@JT(^zPCXoHoUd z-wkER+=QHY)~?(L&--AZf|Xx5SjzrcKUVeC*Y*R8Btm#1-Vkce&5)IxLT@e4lGESe z4$8$apRr#|bHV<<75pA{a+a>CC!RRX2IUi!6r-FPRg1W@q4ByN9^sWTN|}?rtK_+S zHQ6SPke$>%=X+vPk}1Z9vRV7aFtw4$9NvNNXQUiFmSDeB(Q3;9i~~Kr<}86)77TKY z=?x{`>GCG??`2=#wcDH96q+1FJILQpKDlLuYJK+l)w(M|mz&Zv9}n?HtFF&R-ydhS z3~^F?tXY9>ttKC9W!E@4<)>qH;xbZ$|0!;sQtW>fcpy5O@KVd91j)%g%2!%zYLIQX zR_N~*>OCkK6aq^4>q5c*LOdENGBk1{6)a;Sz^$g2FD|-d|JL zXs59+eDgc}{<|hvmCxY3@`!`}(i2*sMiUdF9nRG9Z{M!@B7x&h!?bR zkeTSV@KbCDY>pgGicSY*(z)^CD*6@n+eu(?yJ~*%ZO=y#vCtBsL4DxZU8>Zm+AKQ+ z$I9fMn=awkkNwx#^x9>=wG-5D6bBEezGBfoeGwao$K+5rT@3$?>EssiwmB=|wr*K^ ztm@3`A%Z1x{z%v2svcy(XLXr@*tMAddNy-zex@5KkQh~@m!J>-MPY|_ItpG8Hk_NgaA3sQBWXli|JRiI8PavciVU3#j^ z>9OSb1E5B{1MyrT(THY>LmJ{)>F-W{1A9vc)akDVuZEgcd9tRNQKZ90HA*_-J&LMk zTYHqa?^EQ5X0+Vlb`c^o)vY&y>pMQ=zFP5>-o*L)UNBWzSYe6k!)UuGwtRL;uP>FH z9fG=wX*?kPs8_ygDns#q22#UezdF0Qt0!g(gXk*-5Y&!70@|G=rlGDN(Q3hKL|fi0 z|CJIe;kDqG{H_?DBDz;<@udYPoEz@xmPTxkM_uS%pmpwo>ixFIQVzwa5+^C5SZ@^@ zCgZjRYrVUng{<`T^+o#1sKLi^${p>8LWZ~Nh5HXQS9%!M(3@(0u@!c95p+0T%?SFz zJCe1i0>QtFFYa$leal#DEb#%=!C@-&Ryf>D61xr6wS12;4F%7{>Twza#f)EEr_-E@ z^)er2`3CQ=eJ}esH*Pug!Kduk3HKA$J0Qrx$yUYPNAc9x%c2jGOXrH6;<(FaUxk?z z_-ZFqIE~R18CxEs;jy`;_x+csZ~Dazf2!!+Qj<5XcmnemE!lh0*n8m+xBn90^1z&- zKh(Kt-kv;`5%0Aqva72@Y^hX$4(5o8{^pOGaT7bWT1b8^_@{4jKN{wIO6`lj)?_}F z7EU)br+9KpvuXBIakgSuZ)??eiuZNmt74~1UPfgtB89yBa1J@RhK?@x#P4;qh+=_w z5ijJ{jP*sPBzpO;x{bGggD7ycyWXVEyUse&aE-bogyE3`4-b1j@A|_gw!8`s9Z8eC z`p(>vEK=KhQS{R$tb;tsw-&<_zq%K`&P%c>6D^xCn6PWSuF*!Dy!{Dj7 zCbBWrAo#{@Zb62XMdhI#DP#3b4mov*W6iv~cwi3E0)U6q-(;=A`ubYVd{&&~Q;k1& zQ{LfK@7(Adv~+M$s9~3RSwy2653@d*|5jV zxVDR(tx(E_Tjua~)8Yh+hZMO4H+7kM)A3%pL!)-nLc zs!$K9E(=54@z38nd&3XnA4z}s*~FIb>wAL6{gCoMwuVPO?TYMUA6+&Cb(AGKtrhRJ z@^y!?&d)Yj3v2_M*=rbtD+!Mo!4LsYU}2Sh@KSH4VvZDFr&W8!w*<)ONRKR7$qDB*|GQ z4JaC!2OlR+^{W{J^9-)XxNn^~@!wUiZ%-MpzOqi~y+765Bwk=j|F?|zUh}^J;fr8@ zIc@vsrD;#IBLnHgPPg7p$aD(xnV&G%_?ZB zoH3sC({$*E$YF8ppEHt+I01O@{Li?bA6p>ew3aheX*}8wv#pmOF!QQb+)2}|4b_Pi zvS@feE5lZ`F|8s!iyKWH$69;Zt58Q5hFLIzBRbk;=3{;bp7Gvd+hD~LUxQFqbGqqB zUB~VTQO`#*JaRGB-wGqPRQ7ui`d&5U% z?Br}T`{mTe8^Jk2Wih!qh#mG0${YNNz8Yx0LhVM_C_+PR*9#G|H)m@8kt~BZ#V5mf z@u%Sju^8n%YMKmZaXrl^r1nqT7h9vQjlE zL*TQS04!Pj?0gn4p7p}FxBoBF8wZablh(1-x?J65moR-LLv6}l{y|7pVX zE1+?odG_}5?-z8X#k8srV2~GOeSvi=OJBZi^ZfKENb%MPcAvZZ2w~5wFleV!rbXHA zP==SvMU?e^xLBJ%{=MYX>OOI4rY&jD?)X`01hPIw9T5pYS357;%T|W=mqw-NkvbDm;$_Sb0wFq z%s0>7#uG{t^xV;m85On}R|{rWvqnC@<#vm3*MiLpnC8!`uhOk0w)y>Cs}q{(hxRvffA~jC>|}QgYG8^SF1I zN=1b9Nn-@~S!4Gen~s2KU(yYoE4Cd>C3gnIu60KXnx!In6vul%EC2asSMkD8_-k_5 zlj9r<D~zPDVNk`_F~GAhJdx;yrmk_M<%G~x}3V9rT# z!#QLivfp!dx33b7Bx3u&eCEN~kICZzwbkd}qPz8?0Sd^Qn{)G=g`f9R^S6!6(gwAA zeavZmtpUEZ^v&Kpx2ijG$Rj?B6>zl6Pl>tWN+M}ngR9;6p-m_%U|+q9KU0yuY?6S= zm66v)X+F@5o3HoTE8Y6@F=|=DK*1ttv0tIWZA9j`|_hje& z3sulMYWobc>N876e_0O(`1|YRRh$7e=akS&5Et*p@bq1L-J67iQtIHn zay_J~>HfQt#&3TfSV~|rti=3~nJO>}i`c|I;Tx{}x(tn{J;~RHDM#o$L7YAEmDK@V zo*8lKFXd0i9?xsxycM`5s8mb6Km9+Nt}-C1uIm~oA_@pdNOyyD2}pNIw{(Ma4kO*& zF?6SNgLKz`bVxIF3^l}jgU|c@nxAveKIiVU*4k_D8(ky<$lBB|zc$-od!&QC<2~P% z>b9OfRsdBmedWVFpDEzz8UC|*`#Pv$!b5UN;2$FSi}#NpY4*9kqi?TUFC_o)s^(b< z$Y^$3XU04=3e(I_l;u+$Q%&=9DN6Fxcm1OMgM>G`>Bq_}KgBv44=oG}^n&Q!rekLl z-7hcb8jM;MLm{%P19??({pw6Tmwi~K-1{kKZ6uooKQ106G`t1n852#E{oBVpKg(`s z)P4l?^L2l(Zpe+%BC&FmIMC=h5l-OczkiD0_x~i(a-%_s`8u(WS#0aw^-!)yw6#|O z-#`VLVIe)Xv&kC)en0r+O*G({tDH#DnX@J;0SO)`Wl}v6b`r(g4mz|UVp%Qei{$TA zRtnUATN?0ZT40RQ|K>?7mLk-CiRff%Mf7<(fTP!x=Kc;V*r@Di$u2XPGKT_5x?nB6 zuDOi(Xm2Hs2JGY3y|t-O)%t>6ipIHg{z3fz1W8Tl1OX%RKElZ$-sd?lFt=2YrYW@_ z#a#MuQ82<*&QW_|aE1G3>(A)a!AtfOwQ^+MLd1_cYd?UnLYqyG2up;glrxWfQ5$NJ%+U3#&i0^X z>dcR4bLsDG#I?#OC$q!pr$CCt_w9d=oBIym&57waYikU6i7-@E9K3exB;?r~i3m3R zDV;PhpQ70^(L%HvcY`(URWav$Cn|&DDj#YYQ8US5I@GIPaForPUiekqWm7pHkRB-E z@FKFBH(d75%Pb+z8WQwix~QU?4s^uB@w~ksL0m0=rP>(Tk%#%lanjqfJCY27yu<;O z{W4qgBSzZO6&laa3EQ}meGqfRsXc%V1J*?%a`Sd&-Iv@gwLEK2GT$bk>9pE-UsUpepHR&}w(* zH);0@M-xE|2o^cLwdD;U{4)UYNY8j){|9zhUngS%2!w(`m?&>RHaHGlr8vC#%yujd z{-ZIR5OUwk;sWOhxyvnTogj<)PuTt2kNFLY7pFY=XO9bbYB&p^=`iHmYKlLgkIKDf zmC(#@(~WzM!@aDQ+?O15kd(;n+-%)h6WDacp~}^Hl$>7(l*ZcS75>$PWSvW?ARAkK zYGL$8VGB>9*$h4!IfJJI7xljiP)rB@Tq=Xg*Yp~bT)L08k%bhiy}@-drlDcX17i#6 zv^0{6R)%GaF=JjB+M{1iX-1i<*}Jr8-w5bVy+3e&9n|ERH(GO~S-lN*FD^o*(#jn) z)CX%qb=7$)kf;PABXzFMo#OR}mizMoa^0_$y?ACxNR}k!bW!zM1P?Nuw|f_G%|*=Z z@yXP0N$uJ*Zh6U7o;W5CTKN-P{7&@^z+S1Yo*Mp6=dMPY?=yK|9TF0WdYL10<*r$~ z{%1nfX5m;15C#`#-S^-07A_CY5m{=OQaxy8f+3q0rZN2QnQ!WLxboN2XA0Y-iT0Lk zQsSs6R{HteUzrFhEM=fB{ITkl68WG{inV_me?)gy1F@P?q)nnMnozM`w;UHJ;upZM zz`38hTagCc0)VBz)`t%uCYCciRGT;l#6sybJ(AFI`! z4aLrtAE=&p?RX?elhtoHCS3DPQxc_%190dMm^|_g>s*!f;$1x@^J_3T0UQ0(8KWPO zqdzZ5Y{F>dSY%2=uw)os>7OFiDJvZSnCC}3`e!+T>|w zzh)ojQAzp!6eeMUBN$s}mRu2VWl>YRtfrdpq`UFJxnAAQ3@R(v=7HHU1UCZ#iSn1K zRCpi2js+lmW2avmK3Yds`AR=*$Ud6JspWT)eBjvORLj*rGWh`@S5{fIgF z2H!i39#o+gC@5s4D=YH*NC0WM^w)jAmUP9GSbtTZ)kr06krn?w9es1D8lU|ULiFd7 ziDn=n#`C~NAG>_`H{k=uf!A82sPt4>BV#M!0=uBoP~6+dkmPW)>zAyOEtyJXiG{@p z{RAWGGHn5=({6=ls=&hV0?q0=kV=)AU z14N)T9me%xh}z-viIW_{`H&T*x2KljLW885IRlpdU}z(4J;!WIxONwNvt+RMwzar| zQC-$5f+X1|m>THfx$dFkuKYr$_G5vo=GuI!EoTwH8t~Uyxt8jB(Z`0(1$^2WFAU>t z5qt{W7^>@2iv1NP9Mha_O~A}Walql$qu{cST>C0(C`LpcE4wmm$5?sO8U>5C_4?8_ zta-LE=`ev)XkP0Og|3BCj5E#o*f>pv~ zd|XTaizXj#t-7eRRIEf!AXlk5EfYI-L$3Gy!RuNJPSDcXDPV1Gb@xdJxY2%vn1=Fn zkt-O)wTEwO``#}8XdHiMk*Mu-PFKDXVQx`ss_vKdJj;VD^17fL_j|5fk!h1M+wH8L zNt3cUC-}OQxojKRGBM&Ha=ajoq0RZybD}3}_t>Rmcy4=EK3;|}eu$hJBoUd(Ydya8 zWhjQOwtz|W-*-D^{}bxzgZ>`GRc?ligNCg&_KK&y%T{eemT}L_j&_awE8;yjW&&^<7~=-qoG02jqs2~4 z>Uef7j*D(DNQD=?6;iY}>j@o3Dqy$LBP0xB@-#=qv85%=8cl=jqJ^VLXIW2K^SAbC z6+*Z|a6PQ#%t4pOAaB1hRAn?}Thq{Cu|e>X-A5o^XH{~|(V{`P29Hf1D+57NKd+^( zed=};5q!Ch6elsd@R@k-1UqDD(0x;Tg+}~*?>b)ng*92efP$GJc{r)Je|pk@59U< zC{BMNN`y>4PZ;O7veeR{h;o(X%CEj1UaOSkzeQ>aozZOHXDuiPuIc_n)2IeRvulL3 z3HZ&vDNcPFrvDQDQ7pmBr|d+6lbq^r-AKq}4IW)x=~z(*bB*UAi12aR@gi|3`Uwei zko~7=e-w>zXEhtnXV(i9PfXR%uRk0BYYkB+rDIyLu!#85l1+2N$-n6t1kLGPMP6&p zokspGvbZV{OR7hpZf!wa=AgL3iBqffZ2I`6?aS-Ii>eMTh<9uyUcAi@l?a=8U0UU2 z12Tz11ucQKAN1UB*lwbqa`bnB`6sOOoBoO;oNcH4o3M$`S{lW)(ks5?QpZo7@k(^R zY#ioS@0_yk2p?t?A1DD3RQpL;mQIlgA-Ck!>n?O~J7QFb2`QOR%gG(!Qy7On=LAm| zqCnnBpFhyu)vRtH)*UIBQFJX=C2gnaQPkx=#ZPr+q*qwi6Thb3cJ#cJ?XqZy*g@AU zPyxJDP+}{0P6wbvU!c?v`{?3)H4#I{UP*VMM)Kq7;LIWaw`(FM2D1sNwMaInX)ngv z9z^Z?m&2Sjkh_*!zFy`2N@Gx~T|<4?QhcOtb<9}_chvh`3*P<_7 zxUP}eKCn_^u-JqIHjrT%Ul4 zu3ojcUGsXL{(b(itaz^nOYMYT@1Z{^!g&BtW0Iny;?Xar{iCeqLwH)4GTM4>@#!Jh z$j5afzUZ#8$u53!rul*-2d@UqhA=F5)&H0cg|b~3+SDvnI#*d6vj6xlGZ}j5?7hBV z$r^}5nID*5WBsU*R0NSt`Tb;|Dt`sHLYz&_K8zm%2_p`lRCwb>w6t!_^gwb9DX-5= zZh4WSzaS4EzU4Sbs2!?3jFKDkfyf%S3FomHDKpL;Q z5d7(LxMP@$H1zf|kF|=2qB=KGV7;UqH|<;r12lovXpck?+D0c}F)n?ltS(ABk3)Ye z^z2_XjtA|3lmxBZAk3*FY!(e0$P8dBaQ&tz%n-e4$UHb3Ebp5rP4P3~{ z{b2NDykzv=R8KH;C*2<07e6rl=OKafhlh)ch3wvTvVQKwH^+Rq%ar zWtr$<{Xfwvwq=%Va*I$$atIJ(cA% zCqq}s)yBK@Y89vVT}wod)8|mqF~oK~`%a|!gkXPLWgb=y)SE){F^O7}_Z&iAw7!kh zl5_646Qy+nxVO@%;}re%^5SU)8M{@+D@ME&W4;=-_c=EAN%Pspg`=EZQVBG>i)i>i zb80U#fX@^SjHXUs)cW((7D@XU^6~QKbl&yAUjeSKAGkap$89&1R^EJiAI<-8S{@>n zoES_PJX+KgGRl-!3p5K2)W@>*O78TosCBtKF~}#&$FQ#GW<(^V^o; z8T}e?TzF>`2&D!SzGZJ1Rkgt|ZtyN~Bylh0GAWL*N81?6nIRq3J#pK-QzqF9W0%4E zTe4zsXWl6iP5dSM&JFzqs-oeoS&y@ahp<6Q8zt;Kd7x$&+1D(k0cxG~h^gHsG8(DW^IC0{>-K&nI6Bm^Qsvhjn%xnmTckvJTJh2NhSoelOLacj zDw;1jw}|dzS&Fi7<}Z??LL7*rUsmKmkIgWI3#<1FC^tcOUqWv6Ub8+rt>{7oP9^Uzm!vi?x7^36ooUYgB^^!{#% zn9#6cUAs3|%n*}{8>L4-XyH=;_FoxpYqEy=*5V*q<{>I@xx+ zlMG?cf-?$uI7%l+lT1}To(olABJa!P&^<#x@y|aKjDXV+2+zvOo@hpXs3<=YTxK@k zot@X1`yq?;w>08NlFZRagJyNk(+|r;+inhR%um!ut(7R$lG@J4#)~+o*_(1bA+|?r zyjnbtG#)9oxZSe#)^jWJSoZUnER3JOZ*OJN%bl=xLSz8Oq9ca&${b zxnFtb>YH}?6+1d&NK}>}6;nxZhX14u!f{KNT|A420svvYwJwfi4;UQB=tA%n#Rp^0 zi;7_AY~BF!nQ2;3{rdUDUw1~8pZp4)Jb3u7<}fdzM>k2bQq7rF%4mx9g5`J~%N)(q zc6Mn@>44NENXk74oJJG_)im~e2Mi?M_1&ip_YrvSs99#Ow2bqP+ zl(X(P}wh+ zD#e3WwqP+Ow$+nRG<}5CvYbVT6wXx8$M4J)Xa;OALN@S@CpOTXEE2rXTC{6)-ks$Y zXaQzrdL5&IvNEPFn0@1K*BvaSHvUwJ;PoDkIlQjUoE%F$Ivb}Gh6<37@{Cwj7Z zF^wM=qt%&&s}_a4;OYtr_bPQ|V9yuqsRv%*CD@cu?dG4yM;>035B_>1POiMQDKV^On%5?CgJQHXd~*KIDjnt?Nv%@B!p`r~t*UDMgD=|c=-#YU}eQ*m=4U(*OsPPcdxKn9KB7zir zr$E^nG4S3bwUK-MI(BC&j|N&&HZi>u$ufCtB1^MGWXq+qNZhdnbo7um;0fVL4xSr1 zIB0VXs+ZdD09mVPDL;2^hg4s=4~E@tBzK4bH-%tuu;RnbT27fix=z~c0Z*%o1PN?# zV6X9U6__b_+HpN)*UE_&8q4z{IGPkEa$Z+<^SA8hMHzf7aUKT1-&&q;3^m<)_~IDk zY$72a#gf#smHnC9^Hm~W*%!DlR)1HCjIX5swx8@`z(XrauQe2TbxW=7lYnKk#F495 z1ovmEzO0=mh8@{p%alC$BEs|R>%Wre&p%%htXt*{R8m1oA_ow)gs(ZZbly09F}Ah# zb#YrD%ukL0-r6PIcO_KFhC2Zp8Q6RwOaz{f1#Xl66F|ETzLnn?H)vX)adGFI`$V~h z?M9#Bxte`y9LUsIY3F;xUgQsm`cm&1>#DeIsCqqEC{)M~fZnh^oJQY&e#j$vP;P1e z=s8hVHF*o6696LS85Q5M0bov91zETDK)=UF;6o#1v-7fXisZrIG1Nb#ZpclqMs)Ub zvMR%TQp=f0{k9L79Sjam)B%Gmb;P|(wqK_U)b_irO_*_;6v4c2@<^eM{^ZF2wc*}_Ky$B0N5 zcDO4j3Eu`nllRWo(>I+9x@K<|@Ik}@sTu|zp@PuI>uG*{cSA<__2YOnIQn65E&l+J zreJ1@M8=TRtiZ7Qr;g$%9q^H2KE|?d&6J)+f>{b2@mMWbY4XEE|2l9Gm90-ht<5ml zADJs0tB!Fn-<&I|%8{CpTRTZrq?q%8PAz7i*TO4TP}C*X5@dZ4&P+^^!2Uh1MWm9( ze5&8%W$2Y^gUq9q$c!RXP(R~17$26zeS(6KY+ z*03!uNAe>`*73XU;b6g=3TPlV$s}&a%}-+VgSx}2qIx5DO&03Dh905t_`zyLe0JPq z6`b{@pdaMoaWTF2;@6Ca^jBM zzWXN`V&f(QgiJgjL+2j%4aUe-h8(Mp2KbGuhh3&bl+UZB_|;>it8A>K=KWIc{#>t} z^hvBy5&1o&u@#dNT7G;Y6SXOO{)9_YdK4nA>OXFL{ zkAn0+m**}+TE;NqfZ>gfp)4}{gXSX$E&UU@{Eq)mZbmSoh3Hg#Or%{gb*U*{96k(? z>!+mqKY+L8)-shZT4!avEjp`78s>;`9#=?2daBMygKHs zSc@P+A6I@pfj6Ya=e<4{#>|i|9dyVLLTG7g$;6qZ5|A%yx%_?i=;7c7yAXn3Ku6$P zyAas9AF-f!cx7eP-to~=@Eso59j$}t*h+KL>`jz`_gP<0ZBt>^U7tZt=OZrs#lzzo z9ND6F`e1)vkO5EQDb;Cav`JlT|cAUOwhcjDDw8qFLgTu{(r zOAh|&BzgiLSDYN8buVsck7vLRb}a_%%?(6DXngJm_Sicgt)bm3OUBd_eZo8&{+}-x zG&G!jTt&=9uSWl_nz6&UZI&NqdnBQ=yKC8<*XWPW0TcF*%+qZ*kK|~*EDRC}p5GQo zoyy|GOKE3z|LQWL)TIV+t4GhTj+uleE^ge@|w(|U^ZIHd&OW(MNZ8BMlPf0(Yzxr!lkN>;S=!pqWd zmVbKb_Wb_|z3NVMcm97J)TCKM5q);W5q^+hy%7Bx^4`7xBR1aNI`#5>_MVv}A|bL) z*8w-5jn=)FB=>(4sK~zT`q}hr0I;r-&H+y$e!MP(atWmGt^zazYr8Dj7{YO<-{I0`M5gy*I|amOlYJc7hHm0>TvB zXpBEUHo`C9TcqTA@i@v>vAMKTxx-3-*-BclGibtIC1${JZsjNS)fXs~JNhHQjFZE+A z!`VSag|#+qT+|Ta9YwfsYV#QXV!5*Zld$}cvilx;>0p z??gwZQKxB?+|NX1Lm?V9y4`eBwR5|BGDUKO3x6Zf+>~2(FyatvkaKW$_b|5pFaxF* zZ>-B=CltJjjRptZXNn9VS8mR$Gp6Ar$!kAP{0^JSlY}n#53;@a(0XL2yK6SGR8tH7 z9B4UjxW6AqEa)CCczMgc2RjcN9}h0k(19&vJ!rw|6@iOeyn7l9+%s&#n6x;Q@ze)f z@ASTLe{N*Hh*t=|3B$dW$qMJk!YgppI5fZD3Aa4~@Uw*zjyU>{H^!be@P0YI{;o)A z4D6>w+E&zW?~wb>ka!d;*u%DFFua8i9l7%swB7vYp%DMyOLa+x;q@hqO%PgyiHvMe z7+fsXn1mv;BQ_j->L-f*b^iyz3&Tv)z7_BWuM_TeuK@Fhca!7-mZm-CIdVCarE44AcowG9G zvr`K#Kt|u|(y@?Bo~5X$;c^Dtu)Efk1DiwYyPSm;|JC zwLmVSGacK^xvLh56b33`iFXwR@nARE_o2iRx85C+SKHR)IWon-PR}udqKFj!45Uon z_&|PC^`8;QC*#&yh;ZM%<3-c!7< zdc+1mM(n}B`(*fAfdzxfwmc}F37W%B9UT1KT6FDh3CIuF;1{$ivdX8D8GZQWRdkXh z@6o=g{5F+D&{Jw|Zf;YXE$e=!$g*{1a%IVF@3Fnr`R+c#j>t!1Nt9H8h4_4LgOrdc zpa3yt|L3ar>5lNA2l#NJBV=+s?(EXbwB@5TckbQr4vDzW51kq(^Kz+})hHI}neWUm zVzjIN#j7aqswI zVmb>p2j}Elu#@~iDa#EKc4Nebr&=SI8ASZXAN`Lwe^$4{3sucNXdlG<4BOR!LE7hIqPGlBikZ!5CKCtq`|g6s$V--h+yP}>I97ASAK_TYWgDL z22J-l9S`0MCV^uDu3${sgD?N7#U;XabcoRWdB^bUT`Jo)!FAA9cAPHM0qf(5OPTXD zuZ_fT?=P+qabEs$FGJ4<&`G|~o&9|}6b^&md%#vYPk>SrE3MpS+3%JN*F2ATVY~2C zlHAUlxyMiK*PtpD{T44l||VDv29DGg5~xx{D&-q2Lb3w`vp1} zzO_2A2cWq|@nA=sh_CPd6@3Z&dLB#{@Pna^r%@0i7v`!$Hk&^qd=){o@@o4E-9z~A z^r0APrMgQ|1Q*0x`5uv|nM)*vZvco}Cl|g1e^@I3-k?7|@&GKpW0(qFr3-S|`PX#u|L#)5rpNHbKb8_n^{lEb$h_TJGF0hL11c_N=P5XKh%pB?1 zwOJ-;Y{nT;4Wt;k6=8k?6%sHB{0fRTN+79Z3o2w2QMOg45fP9O=%&@o`~0w202!04TqiV$-aLCIuC0mTnbB=gz7H%9X8E3?yNgBeL$ zM3`RiPaESG*0~v7F@EhBt|wHChCPoDw4=IH_}dl&w?KE`?iCZPMBS)nU~$ImN#OH;QHVT?tPqSj~8->s?JEOa8hpBJnKE1O$d za%tw0q22Afn-Wky`l0Jvu9l8^XV%$3U5(M>`c@j87oNM?l(FXEQj=9SPsgw3&3nq^ z;a9`Yr$6yhN5)fT->?#?>5vKFV+{<;Y>EBiyk?W3OAwqYfWJ^v^rq-(KT)&p!MP9( zn&Tikz1m3-^m+UQI6S=&YK5b~&^w{%5IFo47g9tF?5|LKY83Ex`d@d-mt}*=Q-N!< zjOPSMwz68!Het-is>5-tuH>zl^DbI1oQTHP`bKyHAuRY~9-EDVtc16CJp_6{o~ooiMm?HUPy4Lyro9EU$$ zHtBQ-^a5`3sOZ@aA3Yl6T2Ur=frT$fc@ibJJ1rwG);1 zsCbmmZQ!TPhnJ>14ayK0&(8gtokA&auE-hXM|6HFcHFc>g*xttpxo%)qwte1gun~D zKY+Rer4jM@&CT$ykV4p}(-S4m#+aKvo{&8w%_dJNOTZ_lc3_UTLh%Muqdv!4mq0Wim(BQD;U5M~3xB&;I0?1=P%+kI23yo$Np@Z->(kKeTIy=6 z$kw*jbk^9cNq^{5l8j+Y_2G;eCTYGVfCzaV;O?<_LyGoJ1Yui- zqoPkJ|8(p>AHO6kGn9Ym`DXR%dco>8Rpv7jF2|wgmvt-bt=*+(WBw1oDsNSUClB_mMMSUD0 zA*PhZFA24I+-@iD1@2}QHJrySCdtq%ugGrqZTTqykX<|Jbo|e6q%`J+aBZvT>Jwi_ zv``<`io$ZklEuXg27^o%NI3f>VN@lwI7HGi+TX$hA95CFmOI|V9r^Zt z&I;9~$8z>Ou!743%X?3BO@`$5#tj@F9!`f!%|uJse{xrSQh6nkJm&@TUAt_Bj92Jf zh@%|*_|xJ;tQI}7n`hqB|5}67q~5vVUHTm3%YBF)>XMQdy;lA=3)tnkFH}+qTJGg~ z;F92;6IVZ$W)` z81Sm#r09ePczKGuu@Fg)IO%__@&9>Xc*53o4i6j*C)TqtSUx8dD7vTzWw8lwvUT=w z-`(-PG^yk^f1Y12yl-2ux%?i4Od47KF|$@K>iz1#B!6)sfSHr$8&@%QJZw=HFz*YA zew-4LfR9B#;5~p@?#Yi7n2XvnMd3DF>DBX1Kld*`_et+3vu?i1d^v!+5QcDz3 z3X9wh?IuadfV6(|(xtu4{?l*C`_>!ki>$3l3)&knVO75L+23JvV5qU~lqJTys!EI2 zg{aNs6uqeUdJgDZ*%CjrY8j3MxUO)UGPpk%D(r;)HQ&3KLmvPQA>#AXUbSHtxZ(Cl z^3<)WImFP)552Po60B@!&MA^{FrehWEs=P>PG5z~p0s1+tF`o&pjc71Ga}-as;G`x zx^7TJMUM^TIiF;=VyTrvjZy9}tJ@720lOO8;4h)kKIbG;=7JAep3tp0VuOUN@DTxl z=C=H@14B20TwDXM#K%$i@ml`csV%}8tWzRayN{4W=L>+%NcG|E}pzi zXCOP5E@vrf0+u+}{J!nmT(?-qtF4^sV#;L?vmI>H^B|@JGfgnbGyb3*77Djzd4pe4 zb?NZXplM{Vu)Sq66r zba_J9HjSE>FX`KN?9WQjGAM*x)culdOV3+MvBO0PPCQP$Aa0LNLQ+|eheZ$#;L+UP z`4CnOQIE5ykHocsx9?*l@L(;Mg}*; zm^Qn~fw=G+ED=^l3UQcnFEA!igb-`tyfJGncg%Hkm9&&y*1Jk$D~Q198H44dXjTv} zTc+0+aVJO3>Y7hs>R2g%LVexXM`rhiqy1y{SeuuzWO2j+ zW4pCmw9f#@J_kLkL$1^P_H}zTkjK8`se#yg^FLy%+*a2v5Bz)8IJKgju>N^er_uWu z!^R*AD>aT(Szq=;<1K3iy6!Hii~e^P*xE1glc<)GH-BR1e{#}-^6{uqnB>&S6$9@b zTSRpx*1R%(u1{{;p|NXFBIv?|caqPg2GB*HUZTH*5O{6?pN0bOJMXjhT7|Aa&Ym@S zxt1Q=A(7;)Z|MC`YnF6za;TVy%YjX*ApIgI(SG^^({^2O|v-R1|j;#L|n zPDd3^A`xb=^A{N;$|e7TkuN!eRN`{{V_S3_Oen<;3SlIhBTYXlLBCXxSEppSY>6($?fQUBXa&G4@M+s6GR%&ou+uFySAiMe|f6ttfL)a(TZ{x3{@X z)Rxc3BZANNLbj8LYdiGbQyR7c<+WIl2Io|aG!V3I3_EN6F=$(%6#d4OTskq&WBNlA z*%FB7cK49N8efQ>w)>rr!tQ>B=6Vl!(S1Dy|2uoP2Z!~q<-)I~iuPC=CK2TA^!@*! zsDlTFX{ILtS$b_JE9Ma0_fLZjtH4`SExpgm*4!LB&22ZMFQv8E{9|UY;(6YLFG$hr zk5BCueyV@gGo!WQ@A6DHT&zc%a6$+Oyl3?lWC^@4f%;_nI4`6II+iaRN-uB{_WVyfI0yNoVgyEXAxt=)^kIg?-SFu^ZaIZrF=5GxBxRNk^6qP{9zH^!NqpARAU zYq$9=vhjCjImSwubjwhRQnP*m3o;zdX!MeFkkBXSjMYSY`&IgM0`;2iW|CW5&Pn^F zKJ41yfeeOffbir4z0VNaGl%|E{<`t}uX>T!#1pWB8`m4Due6*QV9#qRo_x`0%F}s$a+($lM z?uj9~*dk4mnreIjuMl8Bt;h;szn+hYb;2X-iEoQrx$#z+ecdYIxF>kn!6}$axmph4 zU2*-P9;V?k)In;P^#Hz!TvL?rJo=@RTgYk$#z4D|X>hn0O0Pp7&q99i9;r@J^+uD+ z`w-SY#aQkzlz?BfGDJCQ6FhR)WB#Kjf$uxmoTttHf%KB7y}>K$u@`ksl!VtS@Ue&G zK@^sb4vZx>Ci{+9zCqEy+SU*3x!`99j_-at_VTP7L5{Ht+2(wM`rN9vNr?wf1w0oD zOy7_%*sPbOeX|Xf5-nd)6p0wsV#{UNXT&?${l@cYRiemF2-T>P<8`sFhanP4gP-V; zG;8ya-)Lr&GP7geN0@A0VR2j15Nzurhy@Mq%Nh~SP7zQ&6ccL0^?Le6g|>AsojqN_Ix!KOIKzwit~nr@d{0i;`p30F>8<1f{BZ0ZfuZC0Zo z?8aS|Uq-V;GU=Vxwnu-(fzelQp8@V5vd-{GCl~{|PZ058_3V?`w@PUC@To8RnMn{M z;vVAG8K&#!+R2QNoAOF-(7g#6pBKV3zyMz;)bH7*bHpOKY0 zA9n>+9+or3<4z}98qQk2BuDd>Gas}e()YoY4AM)CBUPEhxy~y~a)JP~Vcf5dm5VD) zD{VwAbgg$1NJx4c82{0Ep@o-`ixd%-i zewXa?^AV)sgFuX=lQwpreGu#XSw%hgUv3j^f||?^^R4F!hAIw>2Bs*YbuFUkjchtd zX1zBLG=e!esHehmXwr&*Ya@Htey$aIBP6FYUHM*8%YecZ8%Ma=5nZiBE91cBM@W%c)Mc3f3u=RE z@UCgXe$WA+nQ=etmRQiH&Y{8;dianeR0_Ze_M=`{fhDaFQrwE3B zF_1NyC*6BfFg24-KM%te?Bp#%AmgP0qV-461Y84(rReiCBjRTj?mvZ+Crnlb^`Vpy zg^6AX`T$I~>{>Gfg)TX}c!;Mzyt3t%OCK{^{$rljZ4#J@ErcF%OG-|KIf_Ud_wOHs zWAJNC6;_oS8j@yQhhzp_O9t7g;*FS3{ycLcv38_lTqHcW!?YcE)oH`9^N5p%l)A33 zhOe;hy4M<@|Ht-jSKDuIIOxM(p>Fz-a7uI1(&o;RbW#aT)T`H@oQs<9lnX#dnDuQ} zUD6QUeWu>@ftOyLi(-Hi+qnG!s48W&?)B*Xg_K`(aRiAv{uj^TY^SbqYE=rO$}F4I z*3|Gl&djUYm(zNObifTwQ{+(9aFwNcAFC1sL2SvQs^)&>=Y?ha7n#`G3#CuHZ-*i7ZF{B(50+8s|jI?|yn`bq1PQ6^`_WnIUPq9D^g;G5|8AIw>O8QzZUv& zzQF^6T(0QB+&XXEAXCIkW(W_<&Eo%ZJ|0&CfP5O7f|;MZ=bA`KR=`#AI|5zg-O2IP zc05B%ho@BQ3hAiLfLt2c-%kx8%(ic0F;!pJTWC(Yy?JJdZH&f+wlS5d0D&F`iayBO zrPXi5X=(QO*Ny&icj7LDJsO}$F}*V7X~l17CqBuNX?QOQj;pu+^KwOkR{_A(qF;-Z zU_k+q9%||zCH-^+>0K~T^mNriO;I$9t!N2u04*!mFrrCcd|y}tgU)F3GXBgxuupQC zpY@|EWWWj^P)29_1eS_9>viJ!P1nLbSK}RI!d-NnYR!An*!*YtX7Hdr@5hWeQN%4z zt;&}1oJ>Dk37y!E?*Sd)t&o65DEtvDlnr#fr1~dNs{iYiLrj-xf`l#tLdTN&Rg^4} zcCtx(GdhpC*Echm*i8lw(a49l`%naY4%nS*J}!bXA~!}QP}uu(4==hq?))(*g6#)b zn2AYV{2^NLd<4`jfLi&=?@58d3qw-Czm=p8>^KETcBX$u=S+saQ&^Nx0k;>F&B zj&l5*TeDH-n8LU;g|@ND3E1-OINpAyDMFaJM(G4RPwC=l3_h_l zDY(+qE!Yi|$n&-uFHf0bm@-55VPTb-UvkTO&W`Utwp?`Ip}QW}QT?1}l`%Y6Tuw0; zu6m`_)Y}(3BzwcO^?%CyPR zaOKy-mcEhuWjp%427dr#TuF8$212J6B#-R*VYcE-Y}Q=wDxwkEnstXEkYo*O6oThL z83t3H^cT+m#o@w4U&So!xr-7>z>kV1E%6d6VwKbv$eXPz_yX7WUXcBL#6f|+7I24( zd!BA9f*;SjgtHgMRN^Yp=c@LG;>p-|5?0R;Q(hWR+U4A`fJdaOHlCTh&xQGiOXcFi zcMe|>aR^e}1kH`y0#MW<+2R%4p9fkLIGa^Ey64}SF9x;hUziBe_-Dn_)-rO)caC=V z*UH4;ChB3RWz=WX3p4a)SSss|YZ2@Wi`3GU^@sU_=bA=i5zb_CncHQ}RuT0Wd|8JD z`Jt+f9@QG1{neO0JE9iTlbRKGbydx9)*-@h*s`2aOlD1Q?G&58bh&xM&@qzL-gEm3BpBxtsjbRXm3K#* zA1DoG&M5)lZLIqf>0i(kl7upGh>YILqa zGVwfrkI2_XiZJkj?w5Ce%V;G2{ro#4skcV8QX*zL8|%OCyhjCoO!yPNliV%1A535p zbskBkWQd7PGb?GRj*xi&KbS?w^%MufE{y$mxe;QxW+|yjt`27|GTTPRb?lwzW{duo zjYNf9pvfa0x4mPh>%G;LJLocKcMrN{f@z|As1wJ4sFqxRFc&~SVs7uFLO{)E3jV0W%pLv>G?)V7m}Krwy;I30nv>Ktda2D2KTvN zx#CLm2b?kHqGc%;^lA&s0y0fLW#78kc?m_2K{LR7YHZ2U57=<6DT;ZSGDt_m{}@I* zi#JPqQ@c1~?Z4;V{wLFp6(Fgwt159H|I9A}xW6LpItD1TNIy6DU=D@`ozd5pOh|JL z`6;Xfpdnm0Tu96c`I9Zf_85-4Cd!OF5^_9g97F+aO8HbTE~(#aOt)h8(|cI?)R`4A z(G7>%4MCZ>i91TuC&F+?R2|eBlj5zc)ljN%ZBbt7Xu4el7EZ;pbriF}D5s=L zYriG#oB|xAQ5jJ~Eeko%jeGUBVX77r4MMyLeV^3yblU-*r)F~4WK=|0mRdh7kzyFs zw*IWF3wglUWo2vMTf9h-mWc5n%A41h zkWLahdeFBu4IXa#@X;LiPGp;tJN^=rVMc2E#4*^KF0{5O$?tLXnaywP!DnEbbk)$h z9eLtZ!Z~dR9b*8BcpbPV<@(!gynY{Q3EP~NvqL38(>}XHe|v7qW_`%+b28x|)!_gH zE4gnIi~jiGE;apq{yOu*%LC=DK{|VgLED`&Ecw_68D#%CoCL9p8YKULs2!2Y5;^rr zve}3?C2HKs{)&m~MjbAS)5%~VjSN3q7f@JC-WKTX6uGEi5xZpyd0$8=iO=sMDt;nso{j% z_lQWm`_$CO4>P_NlpqoEibSjp!Giw1jLRWBZDR($@p|)tM-Dxi%*Rzbbh4reoK|cE zH07hMD_arxQGgLiSI4lC_t|@BPP7#+VJ(h-Y*ybkt-Tsx=cfohxuXgtaVq?YvXMG7 zLv8;%YtFC(-HEPpA{UA5n@_^w>xGe~*_g@D+O9}0&s4hlM!9miQ(A8+)3w#IM89E9 zeY&&&DzWzwv-5vd$FpV{F0}>Z__(G0_|!GQt|5b_%1k|F6SY=6EaSGTPB?1u7HRs^ z?I|TnT7aplgjb)g^9R)^EthkAav_)Ptq92Pb%_w0vf9J{EfVK{8OIE*&4#gnLWygN zTJ2KP)?AVpQ#5MmuvN=sZsw#kJP3Pkk@%K(>0;? z?KzA{hLDs#6&dr@4Jc-1oR{N&pIbB_*Yn7TlyT?3%OUFn6F@}2ob zE+GAvO25K_sdarsY#*zAld`});|*~tTNW6`5&NviF6Sdi*@&?bX^Pj{v_gM=R&7Dv za3gol!#CuJeP%jhIE0>8TOw>o<=li=Ti;LGr9R&@`o7hTC?Hknw%fj7iGT&?38EU{ z|3~xEG6HjRwcCj*&ENLxQj6NwdC?<}$ypKTZ%2nSuI#X=(B()xMtoyhMtm&REP|9$ zd~1F2`xG^ptm^H_og50OFDWO|v3Xr5G26E*<1#)SDootMY-gd)YrF7UgV1Wz4)cn0 zyuN|Dl3KUQ>$$q*qpsPcd8Cy~>j1R5z;Db6I8%k=(&m9Mzc5H5)MiH12r_~#K|Qpf zm2j7{-C9;6gI)Lm_vlBVzUhj4XcIOj?-&JDmA` z!%+gCN}+JXT~=n>E}={84Vi}jF!w6UAb1qLLALMAdc0{@oFsblR7LN2`#-ftl-9}h zO}TCF7Q3AHGcgl38t0XId=8seagHq?zQ_WMhA|x^%1E`4J7G(Akih`AZyW9oOa*>i z1peyC)3Z*)!lmz7)M(rPkEySWinD2=j6f0~2@+g`I|O$K?(T!@;I4xt!QE|ecXxLk z+}+*XB|AypZ+CyqIrFQlyPxW+x>ffshi3LwCs?5f?=)@*$K12m$QMOC6sO)a-Uu?EmGmwpL*47|95V6HV8& zOs41+0s94n;dh$fP4fg}e#aKc`+baD#(*pa3(ly#8kx3*KdmI-E!|-sBwDtL*{>98 zRoyf@uClNmzfKi-ZP-Sz8YAp^8I!A|`hN3fAAA%qqM<0)#MWVlE@{j__WUt(==x>t z_f1%%GvT8Xq!XF$c`&#oa~OBAsN>mWK+>eZNCM0;DUP=8>_OSUE#F|_OQ|FrQoeB% zwyBuODb*-@%^u+7gmQ3n(@pn7G+9j0i14JjNO8U~F!TLjCMk*Z zqx_`5f=f~zL}o-qF?oXN(o2exx@s=Vd)t9dXLZzT==z!hX9Z*|u1N z9ALIJH<(vY@=-%E)+9ykIU>kJw}&t=c!Y0)f*c}n5`9pJ_Kj+8W~~`EvTnk7Ww1yb zU3O<*VrZKOJgWULtTLqM5gQ~|&?mT5?n)dQbu`%2N-rJ2@RAz+cvZ&xJE@}eZ}>>@ zpT%)(SDl3IH`Uwl!ng*02}cp>3lrA{_2MZqYD;10X_U6?kVX52$$bjH1U#@vWVTNg z;CH`%lvs&%KBXin0e=%i;J3-gmVv1G@WX!1$!V5JW9LO$)FK@D17#V?3wh=Oid3r* zind|u0#?J6Po=m3dDrpEw)wp(l2E`6cVAB|#YBHVWIdo@sP*Eq7D63N?T1lX;P}e+x;kYgKSuNFy}rXl}W&wz&^2KZVH;?9oxU>H4tMo_^m>$P>u9tSuv~+YPwzo;ozmXdD z^CFR{!$gJvxv%wrI56DGL0c9+~QD{xPb(RUwWma}vWiQg6vf zAdw#|ap}T2aPk1E)FGuMOWT|}t;#p>xOBCw1zP3>Jf@v8X^AgAUUf-0&_K0BR&sw| zKd(yATU$Xf=~rj5{|g8e9(7ih-~={N65__HeUct>KsxhOC_!>^{soCsh6|r92ZLVO zTYfO}2GH|w+jG9t1X>vlzG!&H6IRSe;`&4swS;u`N0bnG%P}G_Y@y!|Bb#!5#!2nL zfQo8or>WNun9oTOjlDd4g=lJxr&^EST&=A0u?H!TF5{>WX`YC&j&l&uqM^>!**iRQ z4Ej7?4=bzhmPHeK6)AW$PPiobAl-b5e)%pW$WS*Rnq5(nDJ35@&(>r=o48{ZDG4xO z#+;xHR&0nf?7fPdRNd2Qe3V~ccwvIh9=9(dzSR7Min^w9W}Te-fgkpCD|`&dDtQ&$ zDHLgxxL0X-Vhs;^AOaKRS-GRQ#~F+aZ9zdXlZ|Y$Riw2r!`YV;P`7&$Pv<)ac#iEQX2eWpq0Po5jV++?o`7GqYjJM~JFsY-1wzZ`l@5qnj)Qq;)g zI1d)Wq}~5|j@;!HAXsjZ`s0Zg|09k*FJ0CG+2$!eN>72wsq=G;C_nzh$mID9xk$Wd zUNBp3j})_Me{e)cb2knsb{w4EmqdaFt-CcG9OS$nk#zLFboBU>)8((uUKq=+qtG`~ z7PyYK) zHcm}k8OQUI4y1K^8yn;N-&`4`O|fAUi%g#}8dx>dfEgkVD#I&Bg(Q!a&}oFLkMj(( zP?4350piB`g|U+vbH!Sj6NK8^joC2Miz`HG=hNg;hvFWpCc}lMq?xR$9`>se5`Qs= zIJ+6Kvx+kwu+P}O(_1}%ODoAa0<$4jk%Y>2r^CY~m@*Vx>f5E=`S=0qfqJ@1f%391 z2n>x^Q*FZO_pKVIxw6S^GJnr^APoBRGxj46_K(?lE>YoC|DV}m?;)8vrk^5EcpEd< zXP?QwnHOR$AUTH(+)q$Det8O=tJ?og5FD;*y&-lI-#S#joPuJlolPE|Ku6HR-*lYn zL=Ma{shqcV14u+ZlC(s1wO_ z&deQ}Onef%9QYEE+#}Y)2ijDhm#4;?E?q8V!;wA@QdK%|e`DBi3z#<@ACYn`R5%T! z_w>mc<=Cz;tV!Ok@eiq4bJAH{$>Doh>e~a-@rvrq@%`;9IsWIU{!pPx6D+l`6Xc{% zz6;V$H-%@687}r#)n3!iAEmopQ;%l!PL?8GsEgWWBp;W0BYi;R=;=P1Q`{1b61-sX z`iB+goCT|c)1z?XQp$L=e_CE}F#Y7fK$y(C4&x@C>N>o^t)=&EXGJ9Ax{%Zi=ts=k zEOpqYsi{4-b7jQYcFAeU#ucx%-ovhf1*J&GsUoS4EfpsNt-hGP z>+-IEcTnHIZR)Lod-tN75UTHJyJXe*LV3mo@D=jAr0As z!J_XOc7j-er|chiPqV5n-MVqKZ_A?@g)L5=$%Mef${3O;N^xd+RaIyOk~>l{Vn|Gm z(_fB_Q@cCmlm#{}BKzeKTvZ|{(nhqiqRTg*$7a2$rrl_}vqwi4fXh#YO|PT3$RGFV zHe?hr&GBX8v=^3h`P_FG_eJr4GxFq8|4AoO|6`Ka*h0#N-u6QWe_2TU0hL0C0E9CE zfCa))CMwKDD2AuEzmK9VZ;Y}J6>KUou>EBYU=&*T#2xz`IU%Xa()gE=Hucui(+Ph- z0~6h=r?YjOs~rqaFspz0<<^#upAUHX#sQLy)dMyyoVc!^zTUnAx!Q`mzfk?Dk$$c{ z2{jrN;gq`n&Us5jNiE7Z;CKPRa+J#LtBi{h`k+cvj&h5`70I9#p|6-2TlG+zpe*=| ztm)*INfRY@1U3asc!x`bYYA6MQk^kmqeq9=K{ry>)8v03^D z9Mt?>QJO-O(4%+S^v2n9hjXFEZ?JS5{1Ve*4l9^2F{xdtGBVRk`-T(k=bo4iw|Z=EApTohg?UM%5UyY%_1={N%dTb1>+f0pz>w|SuY{$wupF(7IVI`GA6 zJ$~ABU2;_wZ$0+5;Vbkatf~LUw6fCBA_;W~>Cpzp3K4m4dH9TU^`}XQX@{~meLLNS z*wa`d8d9z|Bupb!ro}&Hmz^J{ID0Vg(3XGaE zGXuQJ;S6jV%Ix9)S8s6JReT_|&10uNA+D{>RVBQa;I|{bz z5|aI{Hz7ztHQv2!LR&RO6m!D%$X1g2v6d&qd)4vq?bR&73-|N0q~YM755HFT?@)J< z%kBvWX!}g@i-*B7qAtexxGe^n`}u-OkI9?94~#PsA?N`|3+T2UZ9L8p6NV1E_oYh3 z4!oxDB}1QB#o_j!cWgY7bZZyafm|{`Y)`+GM8C~pV-#Z-bp1IjJ&)a`5#Iiw2xLMB z2DlNHApvc={$dAZ&8>vTI`n-wD_a|fo?^Fy@OFl(^ zf(k6LIA?f-`H+W=AY9{DRZ`yjq*k(o5)ksx+EYBHE?-``jqrVkn$uqO56~0#OE*tw zbcmPTW!lEsL1FIIBc7b7Ox35}PY*I>0BufR2#@W^tGYMQMy4Bj?6p{5F_)tLtg2!& zE(xe?`9_-Eofb1Q>DMyZ?X6T5E01f-5pnDlB3O=~EQOI4`#j?1C)uL@u~%`_-w zLgO%ZT{0Z*LwK#6bw~;KMc#1rGH*+Fu7G!?yfGWLPdwYM{h zufWSgWW(a{I;Q$ePc#%8<)F2*AmAi&&oiG-$Iu4IRr5U+WQ?$-yzX=i(J(Jz-KwsZIneIDdQjQcLzGt(XX+;ouD+-f6^*H@kA& z<1!`Alp{R>615|CpEoqNeY|$1#(Ac0kFI@f;bll}cxVON z->^?J7;}b;(D&lqxNJtcAv6D$B@(RR-1MKAs@q;Dzg+73ym3`^kMk!nlKMAG-5;E! zab-zCRw<6HC-_kuE!!#^fK)nA5io3oLHmm#WTwvRq5}k8Fi9=Q(tr@?8 zB4);s`MJ$NqF2&z6}BVyGtf3CfR;*8|3$pxR>Y_;fjdqq{1}aTK?q+8FO3KFb1DZ; zLHoPQ%$Rp0Sgbkk(bKfIBWcNt4gi#0!6p-+tp>4YpCh+|kywT2aDV1v^nuO=yXQQv zqXym!g3L^D`4Mr~n*9wxWwd&S(PDJ`6ZXqy{7|0wFyv zHjfDveVtqk`MyEDx{9(l5+0;=x(b*|)S2E^IE}mFGE3;6F2X_LvlG*)OGZpgntb~* z=pJbg?y|Ku?>I4SN#TU3*K(K;9t^Yu6OTaEu;^MYpk`nnw|;K#1?#lIHTd>p`mr){d~w3S~8Kx|T7{t(N; z4cHJL@XVjFk;g(#X4F>59kQ{C_Oho_OuTX@{jFC8V`d-@oV5s+n|&* zI_j(bHYy=hXDxN9k4H=|-t>Dwt74wuoc+q2d78lAq0OmGW3xc0x_tsKbU)M1?)@aL=vWt@`{_(PoZot(Tr5* zDY;|>CH1jlLaAedEfjaxZN`3a^p8v?YnC6?V3SoXv+VcisH;m6Nlzts9G>vOk%PJ^ z;J$0J3KedAtfJ(4ByR>iP}Z;lsF0K8&gWm38_mR+vce$ zEjJxJiW35Hn`)qVqF#d-wMFr&tmFLXXE!}D<9|KH70iGL10TN&t-dlsR&Qo-lo>i; zy1br|?ytX`JLUGEPZ|6h#RFgeJ4o%hjUWA%HM=$#Uw1A}T zACfpl;>B6j0+9Kx%e_FXAX0;KV1O--&6KJXSC07}|nWuqo8Ee5}w^Vl$G#FnuxW)ht<_RNYMtjm|i zE9*z$5iNTs4?dt7iKS3}ZuIMpOC5pp*t&}CTJ7Hb)4=C~{@0_78L7$cJd@K$JZrb1 zGXOd^9D0M^k@XW+>P#Ox{A^v2*Xz8Po=2e^qhAqUQ@r6I7q*cdWT2g!CAB8WU!>ED zHzG0%CN3#o)*RSCD7vLP1J1r_x)ytLxUF1_(bzQ)N33vU{wtSzOAOy6km!c|{iQ!} z;6L#?mNu6FkDViGz`7+91{f#m?ZwNu(sv!K2P{+M7P-GGBo|T7v&^ z(L1<~p16W+?X5Q5eIrHy_ra#oLzj#g!YS21Tu{xf&EPKoQ1#E$=4y!KpnD_J`=VHDbJAO z6w^oav+Xr3dmi_~8bh&pCJF|cdN_z#eremqrLl0L6+cUIcJqjR?uCNjKH|#yljX{| zb6TsX3lAaGyfxFmacBBKdDu|jh)!1YK^g*@NmA8in23bSc!vRe)Iu~-es=-gFWuvX zbOEatI8#YfDN3ZxCrj=k7V+*`=MIga+F74-p723g8k}l#^wmCXbS=KxNCzL>a?bOf zm>i-pu@NP4s@RALBu;$E0!4KUoE_28l{q-+VgWwE$;o~BgXOY%OM^yBI#b*k(3r7$ zlJHP$YuZvdMXBbf%phH)4mzhRK*F|51^bPwZa%^h`fuqC8T0qK=lHJMcqa0cretiw zKeog?&@WixX+>3R@O#@uWwdj-VE!^KPX48^`W{_19L8Jk7O6l%ZvQj0wYBu196?vb zLxTscx@=~z@PIRUh=Hk28daWH_<;56tRkS2GPitac>JAPid?DCWSqs=GTi)i=w3@@ z&EAAdX#+tw{%r*oA}4(|OcUqVF!!@(!QLHt6JH^vxRCr-`(@Qz*2ol2wEJDmqogCE zypLm3I9a0J6kl^t-`9pGRE0ALJzrYca_u=RC|^Ht#W8dM~Q* ziG@&oPcQT0mRdH0)7?sYaU}!M^7L=DulnCtx79OD3sw1-^{z@%VBhk1;V z@r-{L4J&$Uof7#Cs9PMgNczZjT5OSIRB$S1hU}{ap0*;8w{yrdH;8?jhEFSy(O9c_ zw*>11-1*8I{MBedjq<>rNr18&O$#FtXP+bx&o~sD6se*_wGE?bT`^Dkx3-E4rIJFp zg3i1uEwA17+s9Shx@;ZC<>Fc8n%v!-I>AxZ1VJ~IyDHM&He$RErTEDj17vy%`h$9u z`G-x(GBC@{^^-Fpn=3nesuxiEPrB-L@>K%X@0~Ims*TBhL zH(A#Ay4I0k_I4d)21U6QzeA42pX`v+amViYjWv(Lp^0cn1M{>1=mbOr^#nfYXmiw`ld*f=s(<@C^vdL{vr6`CjDDg_xZ>_>E?X9U;L0q z1WW7YXz^A$g)q7}2g+_Leo$7wd0X%xz+7nQr)N!$K1d`wVVt|SJZC90D#n@(1MU;2 zIfQdgunl~rf8rTRUO2ncBVFVZ8aa}H2jM}f6NX__O6>k zW~6mzHCe9$P2n6$PAe7p5=FtNopu06Y!ENDDZ_#(dGQ>E3TsVlDE+!a$c1b45i3`c zX@&_sQdH$QNJ23#q`04Pd~@9M-7|36gtBn5`s*yJ;m$>7-!Dd@OWT7>rG1_zx2uaC z)<5y3?AyO@9wAiZbk*hI;!Z+YuCPsTmX9(ZD3@Bj!Y^JaE^E`ew3#uK9wsm)Vi;x@ z}qasP8$8vC9vaq_`x%IbKPS@Gb9H@ zB}^iIS_Py{tu&Yi^22oM+7xDc3q6}ZTSDk?#t0u2LbF5p7-7hL!-f9|*9aYr^My#g+i>Cna7i;&w1_>b;%LFXhnwIl}*R_aYvX>>uKmJuW7{*xB@# zwA*!B7Y=4KaaXe_4z!|xvFOYxf2qLRm`<}@)RZG5NGa-?2pXm~k-*lOdkyc+xSz(n z)FF(^U@`5(JJZzaO@=|l5>7k#Zl?k_r=l(RMX$_?%hirabC`y}y!##Kw7Gn#A4Nla zEjR~I0Nfk3v~aQ%zj_QmO_$d(76l6@N2L!>gliinj5OBxsO97g87nrphbpKBN3v4P z4znn6!DuX6tjx>C5crw;Y z?o>8T%S-y_{mcF9N|7!mZdh9k+=3lo6rEU+3u_yXh18BQ6Bp5x+!v?;8r5%lDAI8= zl=sN8evTM_ErJoq4|bg z)~Hgi*_CnO)#A;}L#fX7vzUwD@Fmu0KfIA{F>eu`0t_tmM78@ERmx2QmopRXRnmo+ zL#aRdXwZj^DI8%}EAB(W8fI+I?u2|PtqC5?x!J?{^5-Kk*N{FDmVEZ_?r@yZ+S}zW zm3V^;k)0#HYm;gF)Z9RM#t2~ir{IiLkK5a2^V1=uC?j#zBh5 zO3JPBE={VwcaVM^-51z@eo_f~)x8qa&|>iR9FRWN!n=}Uvek{-@q+HH1gw|%ntd9G+AcRZmBASn1 zT7#)2LpQOP>B*YNX}hB_w$>qr2Z7AO#_+9@KZf#v8KOH|k>6l)4bHrNxdIeYbsDma z2**HZJT#7-pP=o2O1T9}COn7?U@FjqJSB1s!#rxFL6aO-6&n=jX9J)5N`hBDB;`sJ zAP?Rsf)wKm7Rk0nF5D!3^tg{CD#ade446qZ@O|xCR9wIl0yq7^LY7efV((Obcu+y+ zExZG%>T64S)J@|+mq6X;aYA3%Cw8(&JfT19#Z5ae%`~p>Zwr>-4 zvGEZc#dKB5K?*TMk6lM`)IO~jLBQD_dIA`^&cOl{(SHpE9~h2@N);|S|qD8tKDfv}jOnulOr73}7EA^p+Pm-C8nS#(wpmRTYR5^3KtX&V7 zx2PerF!vk_gId&>UvwZ2Y}ba2)O=Az;tv_)?~_Vg)(3fY+S+gKxE7Ne4>g?W_5W&c zvHdF@LDeM{K^|-#k3|<`Vd$?UzE1w8^T^KTnkt6Rv@8%_E%d8mu-QgQwpN_akV{G4>r&CgT~ham z^Un4dCVe}!$aGXN4T**m=kJG|&&w!JuyTPyX%O-9)p_iw5&Bo(M-@eRz{u-^8 z`NqC(`g&>G+(`of85twf*j4zJ@>C@Y@L!Q=p%`~Az~s@_1GMA@oBO(Lin&6>k zz?n6a>~itFze$b!B+@BHy7ZeYOBOZ;Tpeka*mt(lrA0F+B1WRTehgi{Au`R-`mCXT zT2-cVt&xa8W|3+SnaMYgX{s!tP?w-<2gYAS<%slF08Jez8U20@s(OI2#l01xR zQnu>}c*16>L0pM0kU6Eay`p*l+OOo;>GQ}i!zSU<8x1c`N%N0z;9_dqvfLBT>YGmf z2v^g8T)4x3VVm}EG#8I6$2^=Yi_MMcZY-52?%871g>(<)xKH4pEy1`R!q|N@B`6kA zRBCDHiV&C)+lZ!zi|>FTgkQ-cs>-KCz@6TkOBh=8x|3Y8n}+*xH}<3&iAw z!>k!;BZ?2mBS#?gLM4&uDd%rKvxHqXOari*DhSsTrDgf3Fq#uMEpL7e$ViyYKu#Uv zq-ebNiQdS1$uNTI!cdrJT<=eKhn>^i95DRkckCV& zQKw&f>)yBOXJfAo7oQSiQYhqRIpFQT@suG8a_s9rsHFA)q$WY#YFW+Zku}dZU+sH; zS_%UVBDjhw&9e>Zw#=z)WN2}BWe1Qb*X!`UHh4_Pa(~Xg2A5-m?*W`t<|*X*jNWXA z#4Xt-S1A`${?NG=>Ja-{>`0UXM|{aTYovv(y=h&UWTkN=(9VXHV=m&al(r5CVF2Va z_ogkJEU46}GkV_Tj$RD#w|l}({%OovLi%SJ(BIl)wWURJJn;+qKE8d{3{}1J2^nGP zXRc{V)l6l3FlX~=8M6K$%}td2cPl!JV&PqbD*&A6E5(w9h>@!^kD3#Fiw$x3xD+Iz z8YKf-niP3D@iL*`1q<^MMm$MbBBjb-LcZ@VPM$vRs_YJQ69uA?C(d#vp!bRxIckOD z;r(jQR8WU}h*D-X4_0x%!XO`>y8kMSDgF7#MY8O|@(<8u^^cFo&z?8Kd4vnva-*&P zYoS909≫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 literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash.png b/KkuMulKum/Resource/Assets.xcassets/Splash.imageset/Splash.png new file mode 100644 index 0000000000000000000000000000000000000000..6d90a30c956a1d8035a976ca16a6749e166fec4d GIT binary patch literal 97967 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 z%0A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≫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 literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Base.lproj/LaunchScreen.storyboard b/KkuMulKum/Resource/Base.lproj/LaunchScreen.storyboard index 865e9329..03ad235a 100644 --- a/KkuMulKum/Resource/Base.lproj/LaunchScreen.storyboard +++ b/KkuMulKum/Resource/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,11 @@ - - + + + - + + + @@ -11,15 +14,32 @@ - + - + + + + + + + + + + + + - + + + + + + + diff --git a/KkuMulKum/Resource/Extension/UIFont+.swift b/KkuMulKum/Resource/Extension/UIFont+.swift index 11355a14..8f736d26 100644 --- a/KkuMulKum/Resource/Extension/UIFont+.swift +++ b/KkuMulKum/Resource/Extension/UIFont+.swift @@ -13,6 +13,8 @@ extension UIFont { } enum Pretendard { + private static let scaleRatio: CGFloat = max(Screen.height(1), Screen.width(1)) + case title00, title01, title02 case head01, head02 case body01, body02, body03, body04, body05, body06 @@ -31,6 +33,10 @@ extension UIFont { } var size: CGFloat { + return defaultSize * Pretendard.scaleRatio + } + + private var defaultSize: CGFloat { switch self { case .title00, .title01, .title02: 24 case .head01, .head02: 22 diff --git a/KkuMulKum/Resource/Info.plist b/KkuMulKum/Resource/Info.plist index baa28139..b4103525 100644 --- a/KkuMulKum/Resource/Info.plist +++ b/KkuMulKum/Resource/Info.plist @@ -2,6 +2,10 @@ + NSPhotoLibraryAddUsageDescription + 정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진! + NSCameraUsageDescription + 정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진!정혜진! UIUserInterfaceStyle Light CFBundleURLTypes diff --git a/KkuMulKum/Resource/Util/Toast.swift b/KkuMulKum/Resource/Util/Toast.swift new file mode 100644 index 00000000..68a7a14e --- /dev/null +++ b/KkuMulKum/Resource/Util/Toast.swift @@ -0,0 +1,79 @@ +// +// Toast.swift +// KkuMulKum +// +// Created by 김진웅 on 7/11/24. +// + +import UIKit + +import SnapKit + +final class Toast: UIView { + enum Position { + case top, bottom + } + + func show(message: String, view: UIView, position: Position, inset: CGFloat) { + setupToastAppearance() + + let toastLabel = setupToastLabel(with: message) + + view.addSubview(self) + addSubview(toastLabel) + + setPositionConstraints(position: position, inset: inset) + + toastLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(24) + $0.verticalEdges.equalToSuperview().inset(12) + } + + animateToast() + } +} + +private extension Toast { + func setupToastLabel(with message: String) -> UILabel { + let toastLabel = UILabel().then { + $0.textColor = .white + $0.textAlignment = .center + $0.text = message + $0.font = .pretendard(.body02) + $0.clipsToBounds = true + $0.numberOfLines = 0 + $0.sizeToFit() + } + return toastLabel + } + + func setupToastAppearance() { + layer.cornerRadius = 20 + backgroundColor = .black.withAlphaComponent(0.4) + isUserInteractionEnabled = false + } + + func setPositionConstraints(position: Position, inset: CGFloat) { + self.snp.makeConstraints { + $0.centerX.equalToSuperview() + switch position { + case .top: + $0.top.equalToSuperview().inset(inset) + case .bottom: + $0.bottom.equalToSuperview().inset(inset) + } + } + } + + func animateToast() { + UIView.animate(withDuration: 0.4, delay: 0.0, options: .curveEaseIn, animations: { + self.alpha = 1.0 + }, completion: { _ in + UIView.animate(withDuration: 1, delay: 1.8, options: .curveEaseOut, animations: { + self.alpha = 0.0 + }, completion: { _ in + self.removeFromSuperview() + }) + }) + } +} diff --git a/KkuMulKum/Source/MeetingInfo/Service/MeetingInfoService.swift b/KkuMulKum/Source/MeetingInfo/Service/MeetingInfoService.swift new file mode 100644 index 00000000..c4bec7e6 --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/Service/MeetingInfoService.swift @@ -0,0 +1,237 @@ +// +// MeetingInfoService.swift +// KkuMulKum +// +// Created by 김진웅 on 7/9/24. +// + +import Foundation + +protocol MeetingInfoServiceType { + func fetchMeetingInfo(with meetingID: Int) -> MeetingInfoModel? + func fetchMeetingMemberList(with meetingID: Int) -> MeetingMembersModel? + func fetchMeetingPromiseList(with meetingID: Int) -> MeetingPromisesModel? +} + +final class MockMeetingInfoService: MeetingInfoServiceType { + func fetchMeetingInfo(with meetingID: Int) -> MeetingInfoModel? { + let mockData = MeetingInfoModel( + id: 1, + name: "웅웅난진웅", + createdAt: "2024.06.08", + metCount: 3, + invitationCode: "WD56CQ" + ) + + return mockData + } + + func fetchMeetingMemberList(with meetingID: Int) -> MeetingMembersModel? { + let mockData = MeetingMembersModel( + memberCount: 14, + members: [ + Member( + id: 1, + name: "김진웅", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 2, + name: "김수연", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 3, + name: "이지훈", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 4, + name: "이유진", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 5, + name: "이승현", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 6, + name: "허준혁", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 7, + name: "배차은우", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 8, + name: "김윤서", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 9, + name: "정혜진", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 10, + name: "주효은", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 11, + name: "박상준", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 12, + name: "김채원", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 13, + name: "류희재", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ), + Member( + id: 14, + name: "김민지", + profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg" + ) + ] + ) + + return mockData + } + + func fetchMeetingPromiseList(with meetingID: Int) -> MeetingPromisesModel? { + let mockData = MeetingPromisesModel( + promises: [ + MeetingPromise( + id: 1, + name: "꾸물 리프레시 데이", + dDay: 0, + date: "2024.07.20", + time: "PM 2:00", + placeName: "DMC역" + ), + MeetingPromise( + id: 2, + name: "꾸물 잼얘 나이트", + dDay: 10, + date: "2024.07.30", + time: "PM 6:00", + placeName: "홍대입구" + ), + MeetingPromise( + id: 3, + name: "친구 생일 파티", + dDay: 5, + date: "2024.07.25", + time: "PM 7:00", + placeName: "강남역" + ), + MeetingPromise( + id: 4, + name: "주말 산책", + dDay: 3, + date: "2024.07.23", + time: "AM 10:00", + placeName: "서울숲" + ), + MeetingPromise( + id: 5, + name: "프로젝트 미팅", + dDay: 1, + date: "2024.07.21", + time: "AM 9:00", + placeName: "삼성역" + ), + MeetingPromise( + id: 6, + name: "독서 모임", + dDay: 7, + date: "2024.07.27", + time: "PM 3:00", + placeName: "합정역" + ), + MeetingPromise( + id: 7, + name: "헬스클럽 모임", + dDay: 2, + date: "2024.07.22", + time: "AM 8:00", + placeName: "신촌역" + ), + MeetingPromise( + id: 8, + name: "영화 관람", + dDay: 4, + date: "2024.07.24", + time: "PM 8:00", + placeName: "잠실역" + ), + MeetingPromise( + id: 9, + name: "저녁 식사", + dDay: 6, + date: "2024.07.26", + time: "PM 7:30", + placeName: "이태원역" + ), + MeetingPromise( + id: 10, + name: "아침 조깅", + dDay: 14, + date: "2024.08.03", + time: "AM 6:00", + placeName: "한강공원" + ), + MeetingPromise( + id: 11, + name: "커피 브레이크", + dDay: 8, + date: "2024.07.28", + time: "PM 4:00", + placeName: "을지로입구" + ), + MeetingPromise( + id: 12, + name: "스터디 그룹", + dDay: 12, + date: "2024.08.01", + time: "PM 5:00", + placeName: "강남역" + ), + MeetingPromise( + id: 13, + name: "뮤직 페스티벌", + dDay: 9, + date: "2024.07.29", + time: "PM 2:00", + placeName: "난지공원" + ), + MeetingPromise( + id: 14, + name: "낚시 여행", + dDay: 11, + date: "2024.07.31", + time: "AM 5:00", + placeName: "속초항" + ), + MeetingPromise( + id: 15, + name: "가족 모임", + dDay: 13, + date: "2024.08.02", + time: "PM 1:00", + placeName: "광화문역" + ) + ] + ) + + return mockData + } +} diff --git a/KkuMulKum/Source/MeetingInfo/View/InvitationCodePopUpView.swift b/KkuMulKum/Source/MeetingInfo/View/InvitationCodePopUpView.swift new file mode 100644 index 00000000..9caf2b2f --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/View/InvitationCodePopUpView.swift @@ -0,0 +1,126 @@ +// +// InvitationCodePopUpView.swift +// KkuMulKum +// +// Created by 김진웅 on 7/11/24. +// + +import UIKit + +import RxCocoa +import RxSwift +import SnapKit +import Then + +final class InvitationCodePopUpView: BaseView { + private let contentView = UIView(backgroundColor: .white).then { + $0.layer.cornerRadius = 8 + } + + private let titleLabel = UILabel().then { + $0.setText("친구 초대하기", style: .body01, color: .gray8) + } + + private let subtitleLabel = UILabel().then { + $0.setText( + "초대 코드를 공유해 함께할 꾸물이를 추가해 보세요", + style: .caption02, + color: .gray6 + ) + } + + private let innerContentView = UIView(backgroundColor: .gray0).then { + $0.layer.cornerRadius = 4 + } + + private let descriptionLabel = UILabel().then { + $0.setText("초대코드", style: .body06, color: .gray8) + } + + private let invitationCodeLabel = UILabel() + + private let inviteLaterButton = UIButton(backgroundColor: .gray3).then { + $0.setTitle("나중에 초대하기", style: .body05, color: .white) + $0.layer.cornerRadius = 8 + $0.layer.maskedCorners = [.layerMinXMaxYCorner] + } + + private let copyButton = UIButton(backgroundColor: .gray7).then { + $0.setTitle("복사하기", style: .body05, color: .white) + $0.backgroundColor = .gray7 + $0.layer.cornerRadius = 8 + $0.layer.maskedCorners = [.layerMaxXMaxYCorner] + } + + private let buttonStackView = UIStackView(axis: .horizontal).then { + $0.distribution = .fillEqually + $0.layer.cornerRadius = 8 + $0.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] + } + + override func setupView() { + backgroundColor = .black.withAlphaComponent(0.7) + + innerContentView.addSubviews(descriptionLabel, invitationCodeLabel) + buttonStackView.addArrangedSubviews(inviteLaterButton, copyButton) + contentView.addSubviews(titleLabel, subtitleLabel, innerContentView, buttonStackView) + addSubview(contentView) + } + + override func setupAutoLayout() { + let safeArea = safeAreaLayoutGuide + + contentView.snp.makeConstraints { + $0.center.equalTo(safeArea) + $0.width.equalTo(310) + } + + titleLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(26) + $0.centerX.equalToSuperview() + } + + subtitleLabel.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(5) + $0.centerX.equalToSuperview() + } + + innerContentView.snp.makeConstraints { + $0.top.equalTo(subtitleLabel.snp.bottom).offset(20) + $0.leading.equalToSuperview().offset(35) + $0.trailing.equalToSuperview().offset(-35) + } + + descriptionLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(12) + $0.centerX.equalToSuperview() + } + + invitationCodeLabel.snp.makeConstraints { + $0.top.equalTo(descriptionLabel.snp.bottom).offset(5) + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview().offset(-12) + } + + buttonStackView.snp.makeConstraints { + $0.top.equalTo(innerContentView.snp.bottom).offset(32) + $0.leading.equalToSuperview() + $0.trailing.equalToSuperview() + $0.bottom.equalToSuperview() + $0.height.equalTo(52) + } + } +} + +extension InvitationCodePopUpView { + var inviteLaterButtonDidTap: Observable { inviteLaterButton.rx.tap.asObservable() } + var copyButtonDidTap: Observable { copyButton.rx.tap.asObservable() } + + func isBackgroundViewDidTap(with location: CGPoint) -> Bool { + return !contentView.frame.contains(location) + } + + func setInvitationCodeText(_ invitationCode: String) { + invitationCodeLabel.setText(invitationCode, style: .body01, color: .maincolor) + } +} diff --git a/KkuMulKum/Source/MeetingInfo/View/MeetingInfoBannerView.swift b/KkuMulKum/Source/MeetingInfo/View/MeetingInfoBannerView.swift new file mode 100644 index 00000000..d0dfed8a --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/View/MeetingInfoBannerView.swift @@ -0,0 +1,79 @@ +// +// MeetingInfoBannerView.swift +// KkuMulKum +// +// Created by 김진웅 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +final class MeetingInfoBannerView: BaseView { + private let explanationLabel = UILabel().then { + $0.setText("모임 생성일", style: .label01, color: .gray4) + } + + private let divider = UIView(backgroundColor: .gray4) + + private let createdAtLabel = UILabel().then { + $0.setText("2024.06.01", style: .label01, color: .gray4) + } + + private let horizontalStackView = UIStackView(axis: .horizontal).then { + $0.spacing = 12 + } + + private let metCountLabel = UILabel().then { + $0.setText("이 모임의 꾸물이들은 ?번 만났어요!", style: .body03, color: .gray8) + $0.setHighlightText("?번", style: .body03, color: .maincolor) + } + + private let backgroundImageView = UIImageView().then { + $0.image = .imgMeetingInfoBanner + $0.contentMode = .scaleAspectFill + $0.layer.cornerRadius = 8 + } + + override func setupView() { + backgroundColor = .lightGreen + layer.cornerRadius = 8 + + horizontalStackView.addArrangedSubviews(explanationLabel, divider, createdAtLabel) + backgroundImageView.addSubviews(horizontalStackView, metCountLabel) + addSubviews(backgroundImageView) + } + + override func setupAutoLayout() { + divider.snp.makeConstraints { + $0.width.equalTo(1) + } + + horizontalStackView.snp.makeConstraints { + $0.top.equalToSuperview().offset(20) + $0.leading.equalToSuperview().offset(16) + } + + metCountLabel.snp.makeConstraints { + $0.top.equalTo(horizontalStackView.snp.bottom).offset(2) + $0.leading.equalTo(horizontalStackView) + $0.bottom.equalToSuperview().offset(-20) + } + + backgroundImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } +} + +extension MeetingInfoBannerView { + func configure(createdAt: String, metCount: Int) { + createdAtLabel.setText(createdAt, style: .label01, color: .gray4) + + metCountLabel.do { + $0.setText("이 모임의 꾸물이들은 \(metCount)번 만났어요!", style: .body03, color: .gray8) + $0.setHighlightText("\(metCount)번", style: .body03, color: .maincolor) + } + } +} diff --git a/KkuMulKum/Source/MeetingInfo/View/MeetingInfoView.swift b/KkuMulKum/Source/MeetingInfo/View/MeetingInfoView.swift new file mode 100644 index 00000000..882bfdf6 --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/View/MeetingInfoView.swift @@ -0,0 +1,185 @@ +// +// MeetingInfoView.swift +// KkuMulKum +// +// Created by 김진웅 on 7/9/24. +// + +import UIKit + +import RxCocoa +import RxSwift +import SnapKit +import Then + +final class MeetingInfoView: BaseView { + + + // MARK: - Component + + let memberListView = UICollectionView( + frame: .zero, + collectionViewLayout: UICollectionViewFlowLayout().then { + $0.scrollDirection = .horizontal + $0.minimumInteritemSpacing = 12 + $0.estimatedItemSize = .init(width: Screen.width(68), height: Screen.height(88)) + $0.sectionInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + } + ).then { + $0.backgroundColor = .white + $0.showsHorizontalScrollIndicator = false + $0.register( + MeetingMemberCell.self, + forCellWithReuseIdentifier: MeetingMemberCell.reuseIdentifier + ) + } + + let promiseListView = UICollectionView( + frame: .zero, + collectionViewLayout: UICollectionViewFlowLayout().then { + $0.scrollDirection = .horizontal + $0.minimumInteritemSpacing = 12 + $0.itemSize = .init(width: Screen.width(200), height: Screen.height(188)) + $0.sectionInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + } + ).then { + $0.backgroundColor = .clear + $0.showsHorizontalScrollIndicator = false + $0.register( + MeetingPromiseCell.self, + forCellWithReuseIdentifier: MeetingPromiseCell.reuseIdentifier + ) + } + + private let infoBanner = MeetingInfoBannerView() + + private let memberCountLabel = UILabel().then { + $0.setText("모임 참여 인원 0명", style: .body01, color: .gray8) + } + + private let arrowButton = UIButton().then { + let image = UIImage(resource: .iconRight).withTintColor(.gray4) + $0.setImage(image, for: .normal) + $0.contentMode = .scaleAspectFill + } + + private let createPromiseButton = UIButton(backgroundColor: .maincolor).then { + $0.setTitle("+ 약속추가", style: .body01, color: .white) + $0.layer.cornerRadius = Screen.height(52) / 2 + $0.clipsToBounds = true + } + + private let grayBackgroundView = UIView(backgroundColor: .gray0).then { + $0.roundCorners( + cornerRadius: 18, + maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner] + ) + } + + private let promiseDescriptionLabel = UILabel().then { + $0.setText("남은 약속을 확인해보세요", style: .body01, color: .gray7) + } + + private let emptyDescriptionView = UIView(backgroundColor: .white).then { + $0.layer.cornerRadius = 8 + $0.layer.borderColor = UIColor.gray2.cgColor + $0.layer.borderWidth = 1 + } + + private let emptyDescriptionLabel = UILabel().then { + $0.setText("아직 약속이 없네요!\n약속을 추가해 보세요!", style: .body05, color: .gray3) + $0.setHighlightText("약속을 추가", style: .body05, color: .maincolor) + $0.textAlignment = .center + } + + override func setupView() { + backgroundColor = .white + + grayBackgroundView.addSubviews( + promiseDescriptionLabel, emptyDescriptionView, promiseListView + ) + emptyDescriptionView.addSubviews(emptyDescriptionLabel) + addSubviews( + infoBanner, memberCountLabel, arrowButton, memberListView, createPromiseButton, + grayBackgroundView + ) + bringSubviewToFront(createPromiseButton) + } + + override func setupAutoLayout() { + let safeArea = safeAreaLayoutGuide + + infoBanner.snp.makeConstraints { + $0.top.equalTo(safeArea).offset(24) + $0.horizontalEdges.equalTo(safeArea).inset(20) + } + + memberCountLabel.snp.makeConstraints { + $0.top.equalTo(infoBanner.snp.bottom).offset(20) + $0.leading.equalTo(infoBanner) + } + + arrowButton.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(-20) + $0.centerY.equalTo(memberCountLabel) + } + + memberListView.snp.makeConstraints { + $0.top.equalTo(memberCountLabel.snp.bottom).offset(20) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(Screen.height(88)) + } + + grayBackgroundView.snp.makeConstraints { + $0.top.equalTo(memberListView.snp.bottom).offset(35) + $0.horizontalEdges.bottom.equalToSuperview() + } + + promiseDescriptionLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(22) + $0.horizontalEdges.equalToSuperview().inset(20) + } + + promiseListView.snp.makeConstraints { + $0.top.equalTo(promiseDescriptionLabel.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(Screen.height(188)) + } + + createPromiseButton.snp.makeConstraints { + $0.top.equalTo(promiseListView.snp.bottom).offset(45) + $0.trailing.equalTo(safeArea).offset(-16) + $0.width.equalTo(Screen.width(136)) + $0.height.equalTo(Screen.height(52)) + } + + emptyDescriptionView.snp.makeConstraints { + $0.top.equalTo(promiseDescriptionLabel.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview().inset(20) + } + + emptyDescriptionLabel.snp.makeConstraints { + $0.verticalEdges.equalToSuperview().inset(48) + $0.horizontalEdges.equalToSuperview().inset(109) + } + } +} + +extension MeetingInfoView { + var createPromiseButtonDidTap: Observable { createPromiseButton.rx.tap.asObservable() } + + func configureInfo(createdAt: String, metCount: Int) { + infoBanner.configure(createdAt: createdAt, metCount: metCount) + } + + func configureMemberCount(_ memberCount: Int) { + memberCountLabel.do { + $0.setText("모임 참여 인원 \(memberCount)명", style: .body01, color: .gray8) + $0.setHighlightText("\(memberCount)명", style: .body01, color: .maincolor) + } + } + + func configureEmptyView(with flag: Bool) { + emptyDescriptionView.isHidden = !flag + } +} diff --git a/KkuMulKum/Source/MeetingInfo/View/MeetingMemberCell.swift b/KkuMulKum/Source/MeetingInfo/View/MeetingMemberCell.swift new file mode 100644 index 00000000..0c00e7fe --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/View/MeetingMemberCell.swift @@ -0,0 +1,119 @@ +// +// MeetingMemberCell.swift +// KkuMulKum +// +// Created by 김진웅 on 7/9/24. +// + +import UIKit + +import Kingfisher +import SnapKit +import Then + +protocol MeetingMemberCellDelegate: AnyObject { + func profileImageButtonDidTap() +} + +final class MeetingMemberCell: BaseCollectionViewCell { + private let profileImageButton = UIButton().then { + $0.backgroundColor = .gray2 + $0.layer.cornerRadius = Screen.height(64) / 2 + $0.isEnabled = false + $0.clipsToBounds = true + } + + private let nameLabel = UILabel().then { + $0.setText("", style: .caption02, color: .gray6) + $0.textAlignment = .center + } + + private weak var delegate: MeetingMemberCellDelegate? + + override func prepareForReuse() { + super.prepareForReuse() + + profileImageButton.do { + $0.imageView?.image = nil + $0.backgroundColor = .gray2 + $0.isEnabled = false + } + + nameLabel.setText("", style: .caption02, color: .gray6) + } + + override func setupView() { + contentView.addSubviews(profileImageButton, nameLabel) + } + + override func setupAutoLayout() { + profileImageButton.snp.makeConstraints { + $0.top.centerX.equalToSuperview() + $0.height.equalTo(Screen.height(64)) + $0.width.equalTo(profileImageButton.snp.height) + } + + nameLabel.snp.makeConstraints { + $0.top.equalTo(profileImageButton.snp.bottom).offset(4) + $0.centerX.equalTo(profileImageButton) + $0.bottom.equalToSuperview() + } + } + + override func setupAction() { + profileImageButton.addTarget( + self, + action: #selector(profileImageButtonDidTap(_:)), + for: .touchUpInside + ) + } +} + +extension MeetingMemberCell { + enum CellState { + case add(delegate: MeetingMemberCellDelegate) + case profile(member: Member) + } + + func configure(with state: CellState) { + switch state { + case .add(let delegate): + configureForAdd(with: delegate) + case .profile(let member): + configureForProfile(with: member) + } + } +} + +private extension MeetingMemberCell { + func configureForAdd(with delegate: MeetingMemberCellDelegate) { + self.delegate = delegate + + profileImageButton.do { + $0.backgroundColor = .gray1 + $0.setImage(.iconPlus, for: .normal) + $0.isEnabled = true + } + + nameLabel.setText(" ", style: .caption02, color: .gray6) + } + + func configureForProfile(with member: Member) { + let name = member.name + let imageURL = member.profileImageURL + + nameLabel.setText(name, style: .caption02, color: .gray6) + setProfileImage(urlString: imageURL) + } + + func setProfileImage(urlString: String) { + guard let url = URL(string: urlString) else { return } + + profileImageButton.kf.setImage(with: url, for: .normal) + } + + @objc + func profileImageButtonDidTap(_ sender: UIButton) { + delegate?.profileImageButtonDidTap() + } +} diff --git a/KkuMulKum/Source/MeetingInfo/View/MeetingPromiseCell.swift b/KkuMulKum/Source/MeetingInfo/View/MeetingPromiseCell.swift new file mode 100644 index 00000000..470ada19 --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/View/MeetingPromiseCell.swift @@ -0,0 +1,103 @@ +// +// MeetingPromiseCell.swift +// KkuMulKum +// +// Created by 김진웅 on 7/10/24. +// + +import UIKit + +import SnapKit +import Then + +final class MeetingPromiseCell: BaseCollectionViewCell { + private let dDayLabel = UILabel().then { + $0.setText("", style: .body05, color: .mainorange) + } + + private let nameLabel = UILabel().then { + $0.setText("약속명", style: .body03, color: .gray8) + } + + private let dateIconView = UIImageView().then { + let image = UIImage(resource: .iconDate).withTintColor(.gray2) + $0.image = image + $0.contentMode = .scaleAspectFill + } + + private let dateLabel = UILabel().then { + $0.setText("", style: .body06, color: .gray7) + } + + private let dateStackView = UIStackView(axis: .horizontal).then { + $0.spacing = 8 + } + + private let timeIconView = UIImageView().then { + let image = UIImage(resource: .iconTime).withTintColor(.gray2) + $0.image = image + $0.contentMode = .scaleAspectFill + } + + private let timeLabel = UILabel().then { + $0.setText("", style: .body06, color: .gray7) + } + + private let timeStackView = UIStackView(axis: .horizontal).then { + $0.spacing = 8 + } + + private let placeIconView = UIImageView().then { + let image = UIImage(resource: .iconPin).withTintColor(.gray2) + $0.image = image + $0.contentMode = .scaleAspectFill + } + + private let placeLabel = UILabel().then { + $0.setText("", style: .body06, color: .gray7) + } + + private let placeStackView = UIStackView(axis: .horizontal).then { + $0.spacing = 8 + } + + private let contentStackView = UIStackView(axis: .vertical).then { + $0.spacing = 8 + $0.distribution = .equalSpacing + } + + override func setupView() { + contentView.do { + $0.backgroundColor = .white + $0.layer.cornerRadius = 8 + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor.gray2.cgColor + } + + dateStackView.addArrangedSubviews(dateIconView, dateLabel) + timeStackView.addArrangedSubviews(timeIconView, timeLabel) + placeStackView.addArrangedSubviews(placeIconView, placeLabel) + contentStackView.addArrangedSubviews( + dDayLabel, nameLabel, dateStackView, timeStackView, placeStackView + ) + contentView.addSubviews(contentStackView) + } + + override func setupAutoLayout() { + contentStackView.snp.makeConstraints { + $0.verticalEdges.equalToSuperview().inset(18) + $0.horizontalEdges.equalToSuperview().inset(16) + } + } +} + +extension MeetingPromiseCell { + func configure(dDay: Int, name: String, date: String, time: String, place: String) { + let dDayText = dDay == 0 ? "day" : "\(dDay)" + dDayLabel.setText("D-\(dDayText)", style: .body05, color: dDay == 0 ? .mainorange : .gray5) + nameLabel.setText(name, style: .body03, color: .gray8) + dateLabel.setText(date, style: .body06, color: .gray7) + timeLabel.setText(time, style: .body06, color: .gray7) + placeLabel.setText(place, style: .body06, color: .gray7) + } +} diff --git a/KkuMulKum/Source/MeetingInfo/ViewController/InvitationCodePopUpViewController.swift b/KkuMulKum/Source/MeetingInfo/ViewController/InvitationCodePopUpViewController.swift new file mode 100644 index 00000000..8784e263 --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/ViewController/InvitationCodePopUpViewController.swift @@ -0,0 +1,84 @@ +// +// InvitationCodePopUpViewController.swift +// KkuMulKum +// +// Created by 김진웅 on 7/10/24. +// + +import UIKit + +import RxCocoa +import RxSwift +import SnapKit +import Then + +final class InvitationCodePopUpViewController: BaseViewController { + private let invitationCode: String + private let disposeBag = DisposeBag() + private let rootView = InvitationCodePopUpView() + + + // MARK: - Initializer + + init(invitationCode: String) { + self.invitationCode = invitationCode + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + // MARK: - Life Cycle + + override func loadView() { + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + + rootView.setInvitationCodeText(invitationCode) + } + + override func setupAction() { + let tapGesture = UITapGestureRecognizer() + view.addGestureRecognizer(tapGesture) + + tapGesture.rx.event + .bind(with: self, onNext: { owner, tapGesture in + let location = tapGesture.location(in: owner.view) + if owner.rootView.isBackgroundViewDidTap(with: location) { + owner.dismiss(animated: true) + } + }) + .disposed(by: disposeBag) + + rootView.inviteLaterButtonDidTap + .subscribe(with: self) { owner, _ in + owner.dismiss(animated: true) + } + .disposed(by: disposeBag) + + rootView.copyButtonDidTap + .subscribe(with: self) { owner, _ in + UIPasteboard.general.string = owner.invitationCode + + let toast = Toast() + toast.show( + message: "클립보드에 복사되었슈", + view: owner.view, + position: .bottom, + inset: 100 + ) + } + .disposed(by: disposeBag) + } +} + +private extension InvitationCodePopUpViewController { + func copyInvitationCode() { + UIPasteboard.general.string = invitationCode + } +} diff --git a/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift b/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift new file mode 100644 index 00000000..7e5486db --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift @@ -0,0 +1,179 @@ +// +// MeetingInfoViewController.swift +// KkuMulKum +// +// Created by 김진웅 on 7/9/24. +// + +import UIKit + +import RxCocoa +import RxSwift +import Then + +final class MeetingInfoViewController: BaseViewController { + + + // MARK: - Property + + private let viewModel: MeetingInfoViewModel + + private let viewWillAppearRelay = PublishRelay() + private let disposeBag = DisposeBag() + private let rootView = MeetingInfoView() + + + // MARK: - Initializer + + init(viewModel: MeetingInfoViewModel) { + self.viewModel = viewModel + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + // MARK: - Life Cycle + + override func loadView() { + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + + bindViewModel() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + viewWillAppearRelay.accept(()) + } + + override func setupView() { + setupNavigationBar() + } +} + +private extension MeetingInfoViewController { + func bindViewModel() { + let input = MeetingInfoViewModel.Input( + viewWillAppear: viewWillAppearRelay, + createPromiseButtonDidTap: rootView.createPromiseButtonDidTap + ) + + let output = viewModel.transform(input: input, disposeBag: disposeBag) + + output.info + .drive(with: self) { owner, meetingInfo in + guard let info = meetingInfo else { return } + + owner.title = info.name + owner.rootView.configureInfo( + createdAt: info.createdAt, + metCount: info.metCount + ) + } + .disposed(by: disposeBag) + + output.memberCount + .drive(with: self) { owner, count in + owner.rootView.configureMemberCount(count) + } + .disposed(by: disposeBag) + + output.members + .drive(rootView.memberListView.rx.items( + cellIdentifier: MeetingMemberCell.reuseIdentifier, + cellType: MeetingMemberCell.self + )) { index, member, cell in + if index == 0 { + cell.configure(with: .add(delegate: self)) + return + } + + cell.configure(with: .profile(member: member)) + } + .disposed(by: disposeBag) + + output.promises + .drive(rootView.promiseListView.rx.items( + cellIdentifier: MeetingPromiseCell.reuseIdentifier, + cellType: MeetingPromiseCell.self + )) { index, promise, cell in + cell.configure( + dDay: promise.dDay, + name: promise.name, + date: promise.date, + time: promise.time, + place: promise.placeName + ) + } + .disposed(by: disposeBag) + + output.isPossbleToCreatePromise + .drive(with: self) { owner, flag in + guard flag else { + let toast = Toast() + toast.show( + message: "모임에 구성원이 없어서 약속을 만들 수 없어요.", + view: owner.view, + position: .bottom, + inset: 100 + ) + return + } + // TODO: 약속 추가 화면으로 넘어가기 + } + .disposed(by: disposeBag) + + rootView.configureEmptyView(with: viewModel.meetingPromises.count == 0) + } +} + + +// MARK: - MeetingMemberCellDelegate + +extension MeetingInfoViewController: MeetingMemberCellDelegate { + func profileImageButtonDidTap() { + guard let code = viewModel.meetingInvitationCode else { return } + + let viewController = InvitationCodePopUpViewController( + invitationCode: code + ) + viewController.modalTransitionStyle = .crossDissolve + viewController.modalPresentationStyle = .overCurrentContext + present(viewController, animated: true) + } +} + +private extension MeetingInfoViewController { + func setupNavigationBar() { + title = "" + + navigationController?.navigationBar.titleTextAttributes = [ + .foregroundColor: UIColor.gray8, + .font: UIFont.pretendard(.body03) + ] + + let backButton = UIBarButtonItem( + image: .iconBack, + style: .plain, + target: self, + action: #selector(backButtonDidTap) + ).then { + $0.tintColor = .black + } + + navigationItem.leftBarButtonItem = backButton + } + + @objc + func backButtonDidTap() { + navigationController?.popViewController(animated: true) + } +} diff --git a/KkuMulKum/Source/MeetingInfo/ViewModel/MeetingInfoViewModel.swift b/KkuMulKum/Source/MeetingInfo/ViewModel/MeetingInfoViewModel.swift new file mode 100644 index 00000000..c9c142bb --- /dev/null +++ b/KkuMulKum/Source/MeetingInfo/ViewModel/MeetingInfoViewModel.swift @@ -0,0 +1,106 @@ +// +// MeetingInfoViewModel.swift +// KkuMulKum +// +// Created by 김진웅 on 7/9/24. +// + +import Foundation + +import RxCocoa +import RxSwift + +final class MeetingInfoViewModel { + var meetingInvitationCode: String? { infoRelay.value?.invitationCode } + var meetingPromises: [MeetingPromise] { meetingPromisesModelRelay.value?.promises ?? [] } + + private let service: MeetingInfoServiceType + private let infoRelay = BehaviorRelay(value: nil) + private let meetingMemberModelRelay = BehaviorRelay(value: nil) + private let meetingPromisesModelRelay = BehaviorRelay(value: nil) + + init(service: MeetingInfoServiceType) { + self.service = service + } +} + +extension MeetingInfoViewModel: ViewModelType { + struct Input { + let viewWillAppear: PublishRelay + let createPromiseButtonDidTap: Observable + } + + struct Output { + let info: Driver + let memberCount: Driver + let members: Driver<[Member]> + let promises: Driver<[MeetingPromise]> + let isPossbleToCreatePromise: Driver + } + + func transform(input: Input, disposeBag: DisposeBag) -> Output { + input.viewWillAppear + .map { [weak self] _ in + self?.service.fetchMeetingInfo(with: 1) + } + .bind(to: infoRelay) + .disposed(by: disposeBag) + + input.viewWillAppear + .map { [weak self] _ in + self?.service.fetchMeetingMemberList(with: 1) + } + .bind(to: meetingMemberModelRelay) + .disposed(by: disposeBag) + + input.viewWillAppear + .map { [weak self] _ in + self?.service.fetchMeetingPromiseList(with: 1) + } + .bind(to: meetingPromisesModelRelay) + .disposed(by: disposeBag) + + let info = infoRelay.asDriver(onErrorJustReturn: nil) + + let memberCount = meetingMemberModelRelay + .compactMap { $0?.memberCount } + .asDriver(onErrorJustReturn: 0) + + let members = meetingMemberModelRelay + .compactMap { $0?.members } + .map { members -> [Member] in + let mockData = Member(id: 0, name: "", profileImageURL: "") + var newMembers = members + newMembers.insert(mockData, at: 0) + return newMembers + } + .asDriver(onErrorJustReturn: []) + + let promises = meetingPromisesModelRelay + .compactMap { $0?.promises } + .map { $0.sorted { $0.dDay < $1.dDay }} + .asDriver(onErrorJustReturn: []) + + let isPossibleToCreatePromise = input.createPromiseButtonDidTap + .map { [weak self] _ in + guard let count = self?.meetingMemberModelRelay.value?.memberCount, + count != 0 + else { + return false + } + return true + } + .asDriver(onErrorJustReturn: false) + + + let output = Output( + info: info, + memberCount: memberCount, + members: members, + promises: promises, + isPossbleToCreatePromise: isPossibleToCreatePromise + ) + + return output + } +} diff --git a/KkuMulKum/Source/MyPage/MyPageViewController.swift b/KkuMulKum/Source/MyPage/MyPageViewController.swift deleted file mode 100644 index 73f1ea54..00000000 --- a/KkuMulKum/Source/MyPage/MyPageViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// MyPageViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/6/24. -// - -import UIKit - -class MyPageViewController: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .white - } - - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} diff --git a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift new file mode 100644 index 00000000..a44447f8 --- /dev/null +++ b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift @@ -0,0 +1,80 @@ +// +// MyPageAlarmSettingView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +class AlarmSettingView: BaseView { + private let containerView = UIView().then { + $0.backgroundColor = .white + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor.gray2.cgColor + $0.layer.cornerRadius = 8 + } + + private let stackView = UIStackView(axis: .vertical).then { + $0.spacing = 8 + $0.alignment = .fill + $0.distribution = .fill + } + + private let titleStackView = UIStackView(axis: .horizontal).then { + $0.alignment = .center + $0.distribution = .equalSpacing + } + + private let titleLabel = UILabel().then { + $0.setText("알림 설정", style: .body03, color: .black) + + } + + private let toggleSwitch = UISwitch().then { + $0.onTintColor = .green + } + + private let subtitleLabel = UILabel().then { + $0.setText("준비, 이동을 시작해야할 시간에\n푸시 알림을 받을 수 있습니다.", style: .caption02, color: .gray) + } + + override func setupView() { + super.setupView() + backgroundColor = .systemMint.withAlphaComponent(0.1) + + addSubview(containerView) + containerView.addSubview(stackView) + + titleStackView.addArrangedSubviews(titleLabel, toggleSwitch) + stackView.addArrangedSubviews(titleStackView, subtitleLabel) + } + + override func setupAutoLayout() { + super.setupAutoLayout() + + containerView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + stackView.snp.makeConstraints { + $0.edges.equalToSuperview().inset(15) + } + + titleStackView.snp.makeConstraints { + $0.height.greaterThanOrEqualTo(44) + } + + toggleSwitch.snp.makeConstraints { + $0.width.equalTo(51) + $0.height.equalTo(31) + } + + subtitleLabel.snp.makeConstraints { + $0.height.greaterThanOrEqualTo(40) // 최소 높이 설정 + } + } +} diff --git a/KkuMulKum/Source/MyPage/View/MyPageContentView.swift b/KkuMulKum/Source/MyPage/View/MyPageContentView.swift new file mode 100644 index 00000000..51d0cdca --- /dev/null +++ b/KkuMulKum/Source/MyPage/View/MyPageContentView.swift @@ -0,0 +1,84 @@ +// +// MyPageContentView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +class MyPageContentView: BaseView { + let profileStackView = UIStackView(axis: .vertical).then { + $0.spacing = 12 + $0.alignment = .center + } + + let profileImageView = UIImageView().then { + $0.image = UIImage(named: "img_profile") + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + } + + let nameLabel = UILabel().then { + $0.font = UIFont.pretendard(.body01) + $0.textColor = .gray8 + $0.text = "꾸물리안 님" + } + + let levelView = UIView().then { + $0.backgroundColor = .maincolor + $0.layer.cornerRadius = 20 + } + + let levelLabel = UILabel().then { + $0.textColor = .white + $0.font = UIFont.pretendard(.body02) + $0.text = "Lv. 1 지각대장 꾸물이" + } + + let separatorView = UIView().then { + $0.backgroundColor = .green2 + } + + override func setupView() { + backgroundColor = .clear + addSubviews(profileStackView,levelView,separatorView) + profileStackView.addArrangedSubviews(profileImageView, nameLabel) + levelView.addSubview(levelLabel) + } + + override func setupAutoLayout() { + profileStackView.snp.makeConstraints { + $0.top.equalToSuperview().offset(20) + $0.centerX.equalToSuperview() + } + + profileImageView.snp.makeConstraints { + $0.size.equalTo(100) + } + + nameLabel.snp.makeConstraints { + $0.top.equalTo(profileImageView.snp.bottom).offset(12) + } + + levelView.snp.makeConstraints { + $0.top.equalTo(nameLabel.snp.bottom).offset(12) + $0.height.equalTo(36) + $0.leading.trailing.equalToSuperview().inset(80) + } + + levelLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + + separatorView.snp.makeConstraints { + $0.height.equalTo(6) + $0.leading.trailing.equalToSuperview() + $0.top.equalTo(levelView.snp.bottom).offset(35) + $0.bottom.equalToSuperview().offset(-20) + } + } +} diff --git a/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift new file mode 100644 index 00000000..b444cfbb --- /dev/null +++ b/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift @@ -0,0 +1,106 @@ +// +// MyPageEtcSettingView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +class EtcSettingView: BaseView { + let containerView = UIView().then { + $0.backgroundColor = .white + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor.gray2.cgColor + $0.layer.cornerRadius = 12 + } + + let stackView = UIStackView().then { + $0.axis = .vertical + $0.spacing = 0 + $0.distribution = .fillEqually + } + + override func setupView() { + addSubview(containerView) + containerView.addSubview(stackView) + + let rows = [ + createRow(title: "버전정보", subtitle: "0.1.0"), + createRow(title: "이용약관"), + createRow(title: "로그아웃"), + createRow(title: "탈퇴하기") + ] + + rows.forEach { + stackView.addArrangedSubview($0) + $0.heightAnchor.constraint(equalToConstant: 50).isActive = true + } + } + + override func setupAutoLayout() { + containerView.snp.makeConstraints { + $0.edges.equalToSuperview().inset(16) + } + + stackView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + private func createRow(title: String, subtitle: String? = nil) -> UIView { + let rowView = UIView() + let titleLabel = UILabel().then { + $0.text = title + $0.font = UIFont.pretendard(.body01) + $0.textColor = .gray7 + } + rowView.addSubview(titleLabel) + + titleLabel.snp.makeConstraints { + $0.left.equalToSuperview().offset(16) + $0.centerY.equalToSuperview() + } + + if let subtitle = subtitle { + let subtitleLabel = UILabel().then { + $0.text = subtitle + $0.font = UIFont.pretendard(.body01) + $0.textColor = .gray8 + } + rowView.addSubview(subtitleLabel) + + subtitleLabel.snp.makeConstraints { + $0.right.equalToSuperview().offset(-16) + $0.centerY.equalToSuperview() + } + } + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(rowTapped(_:))) + rowView.addGestureRecognizer(tapGesture) + rowView.isUserInteractionEnabled = true + + return rowView + } + + @objc private func rowTapped(_ gesture: UITapGestureRecognizer) { + guard let tappedView = gesture.view else { return } + let index = stackView.arrangedSubviews.firstIndex(of: tappedView) + + switch index { + case 0: + print("버전정보 탭됨") + case 1: + print("이용약관 탭됨") + case 2: + print("로그아웃 탭됨") + case 3: + print("탈퇴하기 탭됨") + default: + break + } + } +} diff --git a/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift new file mode 100644 index 00000000..a929501d --- /dev/null +++ b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift @@ -0,0 +1,43 @@ +// +// MypageView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +class MyPageNavigationView: BaseView { + + let titleLabel = UILabel().then { + $0.text = "마이페이지" + $0.textAlignment = .center + $0.font = UIFont.pretendard(.body03) + $0.textColor = .black + } + + let separatorView = UIView().then { + $0.backgroundColor = .gray1 + } + + override func setupView() { + backgroundColor = .white + addSubview(titleLabel) + addSubview(separatorView) + } + + override func setupAutoLayout() { + titleLabel.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview().offset(-16) + } + + separatorView.snp.makeConstraints { + $0.height.equalTo(1) + $0.leading.trailing.bottom.equalToSuperview() + } + } +} diff --git a/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift b/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift new file mode 100644 index 00000000..db6ad7d4 --- /dev/null +++ b/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift @@ -0,0 +1,56 @@ +// +// MyPageViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/6/24. +// + +import UIKit + +class MyPageViewController: BaseViewController { + + private let navigationView = MyPageNavigationView() + private let myPageContentView = MyPageContentView() + private let alarmSettingView = AlarmSettingView() + private let etcSettingView = EtcSettingView() + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + setupAutoLayout() + } + + override func setupView() { + super.setupView() + view.backgroundColor = .green1 + view.addSubview(navigationView) + view.addSubview(myPageContentView) + view.addSubview(alarmSettingView) + view.addSubview(etcSettingView) + } + + private func setupAutoLayout() { + navigationView.snp.makeConstraints { + $0.top.equalTo(view) + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.height.equalTo(96) + } + + myPageContentView.snp.makeConstraints { + $0.top.equalTo(navigationView.snp.bottom) + $0.leading.trailing.equalToSuperview() + } + + alarmSettingView.snp.makeConstraints { + $0.top.equalTo(myPageContentView.snp.bottom).offset(20) + $0.leading.trailing.equalToSuperview().inset(20) + $0.height.greaterThanOrEqualTo(120) + } + + etcSettingView.snp.makeConstraints { + $0.top.equalTo(alarmSettingView.snp.bottom).offset(20) + $0.leading.trailing.equalToSuperview().inset(4) + $0.bottom.lessThanOrEqualTo(view.safeAreaLayoutGuide.snp.bottom).offset(-20) + } + } +} diff --git a/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift b/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift index 53127bf6..d7868a29 100644 --- a/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift +++ b/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift @@ -70,12 +70,19 @@ class LoginViewModel: NSObject { extension LoginViewModel: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { - guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { + guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential else { print("Authorization failed: Credential is not of type ASAuthorizationAppleIDCredential") return } - let userName = credential.fullName?.givenName ?? "Apple user" + + let userName = appleIDCredential.fullName?.givenName ?? "Apple user" loginState.value = .loggedIn(userInfo: "Apple user: \(userName)") + + // 액세스 토큰 출력 + if let identityToken = appleIDCredential.identityToken, + let tokenString = String(data: identityToken, encoding: .utf8) { + print("Apple Login Access Token: \(tokenString)") + } } func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { diff --git a/KkuMulKum/Source/Onboarding/Nickname/NicknameView/NicknameView.swift b/KkuMulKum/Source/Onboarding/Nickname/NicknameView/NicknameView.swift new file mode 100644 index 00000000..a56ba06f --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Nickname/NicknameView/NicknameView.swift @@ -0,0 +1,107 @@ +// +// NicknameView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +import SnapKit +import Then + +class NicknameView: BaseView { + + let navigationBar = UIView().then { + $0.backgroundColor = .white + } + + let titleLabel = UILabel().then { + $0.setText("프로필 설정", style: .body03, color: .black) + } + + let separatorLine = UIView().then { + $0.backgroundColor = .gray2 + } + + let subtitleLabel = UILabel().then { + $0.setText("이름을 설정해 주세요", style: .head01, color: .gray8) + } + + let nicknameTextField = CustomTextField(placeHolder: "이름을 입력해 주세요").then { + $0.layer.cornerRadius = 8 + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor.gray3.cgColor + } + + let characterCountLabel = UILabel().then { + $0.setText("0/5", style: .body06, color: .gray) + $0.textAlignment = .right + } + + let errorLabel = UILabel().then { + $0.setText("한글, 영문, 숫자만을 사용해 총 5자 이내로 입력해주세요.", style: .caption02, color: .red) + $0.isHidden = true + } + + let nextButton = UIButton().then { + $0.setTitle("다음", style: .body01, color: .white) + $0.backgroundColor = .gray2 + $0.setLayer(borderWidth: 0, borderColor: .clear, cornerRadius: 8) + $0.isEnabled = false + } + + override func setupView() { + backgroundColor = .white + + [navigationBar, separatorLine, subtitleLabel, nicknameTextField, errorLabel, nextButton].forEach { addSubview($0) } + navigationBar.addSubview(titleLabel) + nicknameTextField.addSubview(characterCountLabel) + } + + override func setupAutoLayout() { + navigationBar.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + $0.height.equalTo(92) + } + + titleLabel.snp.makeConstraints { + $0.centerX.equalTo(navigationBar.snp.centerX) + $0.bottom.equalTo(navigationBar.snp.bottom).offset(-12) + } + + separatorLine.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(1) + } + + subtitleLabel.snp.makeConstraints { + $0.top.equalTo(separatorLine.snp.bottom).offset(24) + $0.leading.trailing.equalToSuperview().inset(20) + } + + nicknameTextField.snp.makeConstraints { + $0.top.equalTo(subtitleLabel.snp.bottom).offset(22) + $0.leading.trailing.equalToSuperview().inset(20) + $0.height.equalTo(CustomTextField.defaultHeight) + } + + characterCountLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(12) + $0.width.equalTo(30) + } + + errorLabel.snp.makeConstraints { + $0.top.equalTo(nicknameTextField.snp.bottom).offset(8) + $0.leading.trailing.equalToSuperview().inset(20) + } + + nextButton.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.bottom.equalTo(safeAreaLayoutGuide).offset(-20) + $0.height.equalTo(52) + } + } +} diff --git a/KkuMulKum/Source/Onboarding/Nickname/ViewController/NicknameViewController.swift b/KkuMulKum/Source/Onboarding/Nickname/ViewController/NicknameViewController.swift new file mode 100644 index 00000000..5c15c511 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Nickname/ViewController/NicknameViewController.swift @@ -0,0 +1,93 @@ +// +// NicknameViewController.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +class NicknameViewController: BaseViewController { + + private let nicknameView = NicknameView() + private let viewModel = NicknameViewModel() + + override func loadView() { + view = nicknameView + } + + override func viewDidLoad() { + super.viewDidLoad() + setupBindings() + setupActions() + setupTextField() + setupTapGesture() + } + + private func setupBindings() { + viewModel.nicknameState.bind { [weak self] state in + switch state { + case .empty: + self?.nicknameView.nicknameTextField.layer.borderColor = UIColor.gray3.cgColor + self?.nicknameView.errorLabel.isHidden = true + case .valid: + self?.nicknameView.nicknameTextField.layer.borderColor = UIColor.maincolor.cgColor + self?.nicknameView.errorLabel.isHidden = true + case .invalid: + self?.nicknameView.nicknameTextField.layer.borderColor = UIColor.red.cgColor + self?.nicknameView.errorLabel.isHidden = false + } + } + + viewModel.errorMessage.bind { [weak self] errorMessage in + self?.nicknameView.errorLabel.text = errorMessage + } + + viewModel.isNextButtonEnabled.bind { [weak self] isEnabled in + self?.nicknameView.nextButton.isEnabled = isEnabled + self?.nicknameView.nextButton.backgroundColor = isEnabled ? .maincolor : .gray2 + } + + viewModel.characterCount.bind { [weak self] count in + self?.nicknameView.characterCountLabel.text = count + } + } + + private func setupActions() { + nicknameView.nicknameTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) + nicknameView.nextButton.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside) + } + + private func setupTextField() { + nicknameView.nicknameTextField.delegate = self + nicknameView.nicknameTextField.returnKeyType = .done + } + + private func setupTapGesture() { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) + view.addGestureRecognizer(tapGesture) + } + + @objc private func textFieldDidChange(_ textField: UITextField) { + viewModel.validateNickname(textField.text ?? "") + } + + @objc private func nextButtonTapped() { + let profileSetupVC = ProfileSetupViewController(viewModel: ProfileSetupViewModel(nickname: viewModel.nickname.value)) + profileSetupVC.modalPresentationStyle = .fullScreen + present(profileSetupVC, animated: true, completion: nil) + } + + @objc private func dismissKeyboard() { + view.endEditing(true) + nicknameView.nicknameTextField.layer.borderColor = UIColor.gray3.cgColor + } +} + +extension NicknameViewController: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + nicknameView.nicknameTextField.layer.borderColor = UIColor.gray3.cgColor + return true + } +} diff --git a/KkuMulKum/Source/Onboarding/Nickname/ViewModel/NicknameViewModel.swift b/KkuMulKum/Source/Onboarding/Nickname/ViewModel/NicknameViewModel.swift new file mode 100644 index 00000000..ef6d3b2d --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Nickname/ViewModel/NicknameViewModel.swift @@ -0,0 +1,43 @@ +// +// NicknameViewModel.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import Foundation + +enum NicknameState { + case empty + case valid + case invalid +} + +class NicknameViewModel { + let nickname = ObservablePattern("") + let nicknameState = ObservablePattern(.empty) + let errorMessage = ObservablePattern(nil) + let isNextButtonEnabled = ObservablePattern(false) + let characterCount = ObservablePattern("0/5") + + private let nicknameRegex = "^[가-힣a-zA-Z0-9]{1,5}$" + + func validateNickname(_ name: String) { + nickname.value = name + characterCount.value = "\(name.count)/5" + + if name.isEmpty { + nicknameState.value = .empty + errorMessage.value = nil + isNextButtonEnabled.value = false + } else if name.range(of: nicknameRegex, options: .regularExpression) != nil { + nicknameState.value = .valid + errorMessage.value = nil + isNextButtonEnabled.value = true + } else { + nicknameState.value = .invalid + errorMessage.value = "한글, 영문, 숫자만을 사용해 총 5자 이내로 입력해주세요." + isNextButtonEnabled.value = false + } + } +} diff --git a/KkuMulKum/Source/Onboarding/Profile/VIewController/ProfileViewController.swift b/KkuMulKum/Source/Onboarding/Profile/VIewController/ProfileViewController.swift new file mode 100644 index 00000000..ad6bafb7 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Profile/VIewController/ProfileViewController.swift @@ -0,0 +1,96 @@ +// +// ProfileViewController.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +class ProfileSetupViewController: BaseViewController { + private let rootView = ProfileSetupView() + private let viewModel: ProfileSetupViewModel + + init(viewModel: ProfileSetupViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + setupBindings() + setupAction() + } + + private func setupBindings() { + viewModel.profileImage.bind { [weak self] image in + self?.rootView.profileImageView.image = image + } + + viewModel.isConfirmButtonEnabled.bind { [weak self] isEnabled in + self?.rootView.confirmButton.isEnabled = isEnabled + self?.rootView.confirmButton.alpha = isEnabled ? 1.0 : 0.5 + } + } + + override func setupAction() { + rootView.confirmButton.addTarget(self, action: #selector(confirmButtonTapped), for: .touchUpInside) + rootView.skipButton.addTarget(self, action: #selector(skipButtonTapped), for: .touchUpInside) + rootView.cameraButton.addTarget(self, action: #selector(cameraButtonTapped), for: .touchUpInside) + } + + @objc private func confirmButtonTapped() { + let welcomeVC = WelcomeViewController(viewModel: WelcomeViewModel(nickname: viewModel.nickname)) + welcomeVC.modalPresentationStyle = .fullScreen + present(welcomeVC, animated: true, completion: nil) + } + + @objc private func skipButtonTapped() { + let welcomeVC = WelcomeViewController(viewModel: WelcomeViewModel(nickname: viewModel.nickname)) + welcomeVC.modalPresentationStyle = .fullScreen + present(welcomeVC, animated: true, completion: nil) + } + + @objc private func cameraButtonTapped() { + let imagePicker = UIImagePickerController() + imagePicker.delegate = self + imagePicker.sourceType = .photoLibrary + imagePicker.allowsEditing = true + present(imagePicker, animated: true) + } + + private func cropToCircle(image: UIImage) -> UIImage { + let shorterSide = min(image.size.width, image.size.height) + let imageBounds = CGRect(x: 0, y: 0, width: shorterSide, height: shorterSide) + UIGraphicsBeginImageContextWithOptions(imageBounds.size, false, UIScreen.main.scale) + let context = UIGraphicsGetCurrentContext()! + context.addEllipse(in: imageBounds) + context.clip() + image.draw(in: imageBounds) + let circleImage = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext() + return circleImage + } +} + +extension ProfileSetupViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { + if let editedImage = info[.editedImage] as? UIImage ?? info[.originalImage] as? UIImage { + let croppedImage = cropToCircle(image: editedImage) + viewModel.updateProfileImage(croppedImage) + } + dismiss(animated: true) + } + + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + dismiss(animated: true) + } +} diff --git a/KkuMulKum/Source/Onboarding/Profile/View/ProfileView.swift b/KkuMulKum/Source/Onboarding/Profile/View/ProfileView.swift new file mode 100644 index 00000000..84acd483 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Profile/View/ProfileView.swift @@ -0,0 +1,114 @@ +// +// ProfileVIew.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +import SnapKit +import Then + +class ProfileSetupView: BaseView { + + let navigationBar = UIView().then { + $0.backgroundColor = .white + } + + let titleLabel = UILabel().then { + $0.text = "프로필 설정" + $0.font = UIFont.pretendard(.body03) + $0.textAlignment = .center + } + + let separatorLine = UIView().then { + $0.backgroundColor = .gray2 + } + + let subtitleLabel = UILabel().then { + $0.text = "프로필을 설정해 주세요" + $0.font = UIFont.pretendard(.head01) + $0.textColor = .gray8 + $0.textAlignment = .center + } + + let profileImageView = UIImageView().then { + $0.image = UIImage.imgProfile + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + $0.layer.cornerRadius = 75 + $0.layer.borderWidth = 1 + $0.layer.borderColor = UIColor.gray3.cgColor + } + + let cameraButton = UIButton().then { + $0.setImage(UIImage.iconCamera, for: .normal) + $0.tintColor = .white + $0.layer.cornerRadius = 15 + } + + let skipButton = UIButton().then { + $0.setTitle("지금은 넘어가기", for: .normal) + $0.setTitleColor(.gray5, for: .normal) + $0.titleLabel?.font = UIFont.pretendard(.body05) + } + + let confirmButton = UIButton().then { + $0.setTitle("확인", for: .normal) + $0.backgroundColor = .maincolor + $0.layer.cornerRadius = 8 + $0.titleLabel?.font = UIFont.pretendard(.body03) + } + + override func setupView() { + backgroundColor = .white + [navigationBar, separatorLine, subtitleLabel, profileImageView, cameraButton, skipButton, confirmButton].forEach { addSubview($0) } + navigationBar.addSubview(titleLabel) + } + + override func setupAutoLayout() { + navigationBar.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + $0.height.equalTo(93) + } + + titleLabel.snp.makeConstraints { + $0.centerX.equalTo(navigationBar.snp.centerX) + $0.bottom.equalTo(navigationBar.snp.bottom).offset(-12) + } + + separatorLine.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(1) + } + + subtitleLabel.snp.makeConstraints { + $0.top.equalTo(separatorLine.snp.bottom).offset(24) + $0.leading.trailing.equalToSuperview().inset(20) + } + + profileImageView.snp.makeConstraints { + $0.top.equalTo(subtitleLabel.snp.bottom).offset(120) + $0.centerX.equalToSuperview() + $0.size.equalTo(150) + } + + cameraButton.snp.makeConstraints { + $0.bottom.trailing.equalTo(profileImageView) + $0.size.equalTo(42) + } + + skipButton.snp.makeConstraints { + $0.bottom.equalTo(confirmButton.snp.top).offset(-20) + $0.centerX.equalToSuperview() + } + + confirmButton.snp.makeConstraints { + $0.bottom.equalTo(safeAreaLayoutGuide).offset(-20) + $0.leading.trailing.equalToSuperview().inset(20) + $0.height.equalTo(50) + } + } +} diff --git a/KkuMulKum/Source/Onboarding/Profile/ViewModel/ProfileViewModel.swift b/KkuMulKum/Source/Onboarding/Profile/ViewModel/ProfileViewModel.swift new file mode 100644 index 00000000..4a2f9cc2 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Profile/ViewModel/ProfileViewModel.swift @@ -0,0 +1,23 @@ +// +// ProfileViewModel.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +class ProfileSetupViewModel { + let profileImage = ObservablePattern(UIImage.imgProfile) + let isConfirmButtonEnabled = ObservablePattern(false) + let nickname: String + + init(nickname: String) { + self.nickname = nickname + } + + func updateProfileImage(_ image: UIImage?) { + profileImage.value = image + isConfirmButtonEnabled.value = image != nil + } +} diff --git a/KkuMulKum/Source/Onboarding/Welcome/View/WelcomeView.swift b/KkuMulKum/Source/Onboarding/Welcome/View/WelcomeView.swift new file mode 100644 index 00000000..d065898d --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Welcome/View/WelcomeView.swift @@ -0,0 +1,58 @@ +// +// WelcomeVIew.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +import SnapKit +import Then + +class WelcomeView: BaseView { + let characterImageView = UIImageView().then { + $0.image = UIImage(named: "img_logo") + $0.contentMode = .scaleAspectFit + } + + let welcomeLabel = UILabel().then { + $0.textAlignment = .center + $0.font = .pretendard(.body01) + } + + let confirmButton = UIButton().then { + $0.setTitle("확인", for: .normal) + $0.setTitleColor(.white, for: .normal) + $0.backgroundColor = .maincolor + $0.layer.cornerRadius = 8 + } + + override func setupView() { + addSubviews(characterImageView, welcomeLabel,confirmButton) + + } + + override func setupAutoLayout() { + characterImageView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(200) + $0.centerX.equalToSuperview() + $0.height.width.equalTo(150) + } + + welcomeLabel.snp.makeConstraints { + $0.top.equalTo(characterImageView.snp.bottom).offset(20) + $0.centerX.equalToSuperview() + } + + confirmButton.snp.makeConstraints { + $0.bottom.equalTo(safeAreaLayoutGuide).offset(-20) + $0.leading.trailing.equalToSuperview().inset(20) + $0.height.equalTo(50) + } + } + + func configure(with nickname: String) { + welcomeLabel.text = "\(nickname)님 반가워요!" + } +} diff --git a/KkuMulKum/Source/Onboarding/Welcome/ViewController/WelcomeViewController.swift b/KkuMulKum/Source/Onboarding/Welcome/ViewController/WelcomeViewController.swift new file mode 100644 index 00000000..7a7cdcf6 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Welcome/ViewController/WelcomeViewController.swift @@ -0,0 +1,53 @@ +// +// WelcomeViewController.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import UIKit + +class WelcomeViewController: BaseViewController { + private let welcomeView = WelcomeView() + private let viewModel: WelcomeViewModel + + init(viewModel: WelcomeViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + modalPresentationStyle = .overFullScreen + modalTransitionStyle = .crossDissolve + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + view = welcomeView + } + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + setupActions() + updateWelcomeLabel() + } + + override func setupView() { + view.backgroundColor = .green2 + welcomeView.backgroundColor = .green1 + } + + private func setupActions() { + welcomeView.confirmButton.addTarget(self, action: #selector(confirmButtonTapped), for: .touchUpInside) + } + + private func updateWelcomeLabel() { + welcomeView.welcomeLabel.text = "\(viewModel.nickname.value)님 반가워요!" + } + + @objc private func confirmButtonTapped() { + // TODO: main화면으로 넘기기 + print("Confirm button tapped") + } +} diff --git a/KkuMulKum/Source/Onboarding/Welcome/ViewModel/WelcomeViewModel.swift b/KkuMulKum/Source/Onboarding/Welcome/ViewModel/WelcomeViewModel.swift new file mode 100644 index 00000000..25e13b59 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Welcome/ViewModel/WelcomeViewModel.swift @@ -0,0 +1,16 @@ +// +// WelcomeVIewModel.swift +// KkuMulKum +// +// Created by 이지훈 on 7/10/24. +// + +import Foundation + +class WelcomeViewModel { + let nickname: ObservablePattern + + init(nickname: String) { + self.nickname = ObservablePattern(nickname) + } +} From af28c01a219b3798aaba33458c4d32f24bf25a6e Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 12 Jul 2024 22:09:19 +0900 Subject: [PATCH 06/14] =?UTF-8?q?feat/#157=20=EC=A0=95=EA=B7=9C=EC=8B=9D?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=83=81=ED=83=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=ED=95=98=EB=8A=94=20ViewModel=20=EB=B0=94?= =?UTF-8?q?=EC=9D=B8=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 20 ++++- .../xcshareddata/swiftpm/Package.resolved | 3 +- KkuMulKum/Application/SceneDelegate.swift | 2 +- ...iteCodeView.swift => InviteCodeView.swift} | 33 +++++++- .../EnterInviteCodeViewController.swift | 78 ++++++++++++++++++- .../ViewModel/InviteCodeViewModel.swift | 42 ++++++++++ .../MeetingInfoViewController.swift | 29 +------ 7 files changed, 166 insertions(+), 41 deletions(-) rename KkuMulKum/Source/GroupCreate/View/{EnterInviteCodeView.swift => InviteCodeView.swift} (52%) create mode 100644 KkuMulKum/Source/GroupCreate/ViewModel/InviteCodeViewModel.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index f9d0d405..886f114b 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -76,7 +76,7 @@ DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */; }; DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */; }; DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; - DD4393762C412F4500EC1799 /* EnterInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936D2C412F4500EC1799 /* EnterInviteCodeView.swift */; }; + DD4393762C412F4500EC1799 /* InviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936D2C412F4500EC1799 /* InviteCodeView.swift */; }; DD4393772C412F4500EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936E2C412F4500EC1799 /* CreateGroupView.swift */; }; DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */; }; DD4393792C412F4500EC1799 /* JoinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393702C412F4500EC1799 /* JoinButtonView.swift */; }; @@ -84,6 +84,7 @@ DD43937B2C412F4500EC1799 /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */; }; DD43937C2C412F4500EC1799 /* EnterInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */; }; DD43937D2C412F4500EC1799 /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */; }; + DD43937F2C41357800EC1799 /* InviteCodeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */; }; DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */; }; DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */; }; DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */; }; @@ -194,7 +195,7 @@ DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPromiseReadyInfoRequestModel.swift; sourceTree = ""; }; DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseLateInfoResponseModel.swift; sourceTree = ""; }; DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; - DD43936D2C412F4500EC1799 /* EnterInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeView.swift; sourceTree = ""; }; + DD43936D2C412F4500EC1799 /* InviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteCodeView.swift; sourceTree = ""; }; DD43936E2C412F4500EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; DD4393702C412F4500EC1799 /* JoinButtonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinButtonView.swift; sourceTree = ""; }; @@ -202,6 +203,7 @@ DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupViewController.swift; sourceTree = ""; }; DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeViewController.swift; sourceTree = ""; }; DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = ""; }; + DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeViewModel.swift; sourceTree = ""; }; DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadyStatusView.swift; sourceTree = ""; }; DD931B6D2C3DA27F00526452 /* ParticipantCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParticipantCollectionViewCell.swift; sourceTree = ""; }; DD931B712C3DA92700526452 /* EnterReadyInfoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterReadyInfoButtonView.swift; sourceTree = ""; }; @@ -479,6 +481,7 @@ children = ( DD43936C2C412F4500EC1799 /* View */, DD4393712C412F4500EC1799 /* ViewController */, + DD4393802C41357D00EC1799 /* ViewModel */, ); path = GroupCreate; sourceTree = ""; @@ -486,7 +489,7 @@ DD43936C2C412F4500EC1799 /* View */ = { isa = PBXGroup; children = ( - DD43936D2C412F4500EC1799 /* EnterInviteCodeView.swift */, + DD43936D2C412F4500EC1799 /* InviteCodeView.swift */, DD43936E2C412F4500EC1799 /* CreateGroupView.swift */, DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */, DD4393702C412F4500EC1799 /* JoinButtonView.swift */, @@ -505,6 +508,14 @@ path = ViewController; sourceTree = ""; }; + DD4393802C41357D00EC1799 /* ViewModel */ = { + isa = PBXGroup; + children = ( + DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; DD865B652C3920F600C351A2 /* Onboarding */ = { isa = PBXGroup; children = ( @@ -1057,6 +1068,7 @@ DD931B722C3DA92700526452 /* EnterReadyInfoButtonView.swift in Sources */, A3FB18512C3BF531001483E5 /* RegisterMeetingsResponseModel.swift in Sources */, 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */, + DD43937F2C41357800EC1799 /* InviteCodeViewModel.swift in Sources */, DE159D352C406E1600425101 /* MyPageNavigationView.swift in Sources */, DE9E188B2C3BC92500DB76B4 /* EmptyModel.swift in Sources */, DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */, @@ -1087,7 +1099,7 @@ DDAF1C902C3D6E3D008A37D3 /* PromiseViewModel.swift in Sources */, DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */, DE159D362C406E1600425101 /* MyPageViewController.swift in Sources */, - DD4393762C412F4500EC1799 /* EnterInviteCodeView.swift in Sources */, + DD4393762C412F4500EC1799 /* InviteCodeView.swift in Sources */, DED5DBF02C345317006ECE7E /* BaseCollectionViewCell.swift in Sources */, DE32D1D42C3BFB56006848DF /* UpdateProfileNameModel.swift in Sources */, DE6D4D132C3F14D80005584B /* MeetingMemberCell.swift in Sources */, diff --git a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e1e5105d..45b79d88 100644 --- a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,4 @@ { - "originHash" : "9a47217a5c175e3de895c155c13de64f1d563d13e297ec224a467854897a75be", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -209,5 +208,5 @@ } } ], - "version" : 3 + "version" : 2 } diff --git a/KkuMulKum/Application/SceneDelegate.swift b/KkuMulKum/Application/SceneDelegate.swift index e75269f7..11d514e9 100644 --- a/KkuMulKum/Application/SceneDelegate.swift +++ b/KkuMulKum/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: windowScene) - self.window?.rootViewController = NicknameViewController() + self.window?.rootViewController = MainTabBarController() self.window?.makeKeyAndVisible() } diff --git a/KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift b/KkuMulKum/Source/GroupCreate/View/InviteCodeView.swift similarity index 52% rename from KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift rename to KkuMulKum/Source/GroupCreate/View/InviteCodeView.swift index 511b33e2..592fcc6a 100644 --- a/KkuMulKum/Source/GroupCreate/View/EnterInviteCodeView.swift +++ b/KkuMulKum/Source/GroupCreate/View/InviteCodeView.swift @@ -1,5 +1,5 @@ // -// EnterInviteCodeView.swift +// InviteCodeView.swift // KkuMulKum // // Created by YOUJIM on 7/12/24. @@ -7,19 +7,32 @@ import UIKit -class EnterInviteCodeView: BaseView { +class InviteCodeView: BaseView { private let mainTitleLabel: UILabel = UILabel().then { $0.setText("모임 초대 코드를\n입력해 주세요", style: .head01) } - private let inviteCodeTextField: CustomTextField = CustomTextField( + let inviteCodeTextField: CustomTextField = CustomTextField( placeHolder: "모임 초대 코드를 입력해 주세요" ) + let checkImageView: UIImageView = UIImageView().then { + $0.image = .iconCheck.withTintColor(.maincolor) + $0.contentMode = .scaleAspectFit + $0.isHidden = true + } + + let errorLabel: UILabel = UILabel().then { + $0.setText("모임 초대 코드를 다시 확인해주세요.", style: .caption02, color: .mainred) + $0.isHidden = true + } + let presentButton: CustomButton = CustomButton(title: "모임 가입하기", isEnabled: false) override func setupView() { - addSubviews(mainTitleLabel, inviteCodeTextField, presentButton) + backgroundColor = .white + + addSubviews(mainTitleLabel, inviteCodeTextField, checkImageView, errorLabel, presentButton) } override func setupAutoLayout() { @@ -37,6 +50,18 @@ class EnterInviteCodeView: BaseView { $0.leading.equalTo(mainTitleLabel) } + checkImageView.snp.makeConstraints { + $0.centerY.equalTo(inviteCodeTextField) + $0.trailing.equalTo(inviteCodeTextField.snp.trailing).inset(12) + $0.height.equalTo(Screen.height(24)) + $0.width.equalTo(checkImageView.snp.height) + } + + errorLabel.snp.makeConstraints { + $0.top.equalTo(inviteCodeTextField.snp.bottom).offset(8) + $0.leading.equalTo(inviteCodeTextField) + } + presentButton.snp.makeConstraints { $0.bottom.equalToSuperview().inset(50) $0.horizontalEdges.equalToSuperview().inset(14) diff --git a/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift index 15799193..2a7ff098 100644 --- a/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift @@ -8,14 +8,88 @@ import UIKit class EnterInviteCodeViewController: BaseViewController { - private let enterInviteCodeView: EnterInviteCodeView = EnterInviteCodeView() + private let inviteCodeViewModel: InviteCodeViewModel = InviteCodeViewModel() + + private let inviteCodeView: InviteCodeView = InviteCodeView() override func loadView() { - view = enterInviteCodeView + view = inviteCodeView + } + + override func viewDidLoad() { + setupBinding() + setupTapGesture() } override func setupView() { setupNavigationBarTitle(with: "내 모임 추가하기") setupNavigationBarBackButton() } + + private func setupBinding() { + inviteCodeViewModel.inviteCodeState.bind(with: self) { owner, state in + switch state { + case .empty: + self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + self.inviteCodeView.errorLabel.isHidden = true + self.inviteCodeView.checkImageView.isHidden = true + case.selected: + self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + self.inviteCodeView.errorLabel.isHidden = true + self.inviteCodeView.checkImageView.isHidden = true + case .invalid: + self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor + self.inviteCodeView.errorLabel.isHidden = false + self.inviteCodeView.checkImageView.isHidden = true + case .valid: + self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + self.inviteCodeView.errorLabel.isHidden = true + self.inviteCodeView.checkImageView.isHidden = false + } + } + } + + override func setupAction() { + inviteCodeView.inviteCodeTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) + inviteCodeView.presentButton.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside) + } + + override func setupDelegate() { + inviteCodeView.inviteCodeTextField.delegate = self + inviteCodeView.inviteCodeTextField.returnKeyType = .done + } + + private func setupTapGesture() { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) + + view.addGestureRecognizer(tapGesture) + } + + @objc private func nextButtonTapped() { + // TODO: 서버 연결할 때 데이터 바인딩해서 화면 전환 시키기 + let promiseViewController = PromiseViewController() + + promiseViewController.modalPresentationStyle = .fullScreen + + navigationController?.pushViewController(promiseViewController, animated: true) + } + + @objc private func textFieldDidChange(_ textField: UITextField) { + inviteCodeViewModel.validateCode(textField.text ?? "") + } + + @objc private func dismissKeyboard() { + view.endEditing(true) + inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + } } + +extension EnterInviteCodeViewController: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + + return true + } +} + diff --git a/KkuMulKum/Source/GroupCreate/ViewModel/InviteCodeViewModel.swift b/KkuMulKum/Source/GroupCreate/ViewModel/InviteCodeViewModel.swift new file mode 100644 index 00000000..366d578a --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/ViewModel/InviteCodeViewModel.swift @@ -0,0 +1,42 @@ +// +// InviteCodeViewModel.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import Foundation + +enum InviteCodeState { + case empty + case selected + case valid + case invalid +} + +class InviteCodeViewModel { + let inviteCode = ObservablePattern("") + let inviteCodeState = ObservablePattern(.empty) + let codeErrorMessage = ObservablePattern(nil) + let isNextButtonEnabled = ObservablePattern(false) + + private let codeRegex = "{1,5}$" + + func validateCode(_ code: String) { + inviteCode.value = code + + if code.isEmpty { + inviteCodeState.value = .empty + codeErrorMessage.value = nil + isNextButtonEnabled.value = false + } else if code.range(of: codeRegex, options: .regularExpression) != nil { + inviteCodeState.value = .valid + codeErrorMessage.value = nil + isNextButtonEnabled.value = true + } else { + inviteCodeState.value = .invalid + codeErrorMessage.value = "한글, 영문, 숫자만을 사용해 총 5자 이내로 입력해주세요." + isNextButtonEnabled.value = false + } + } +} diff --git a/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift b/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift index 7e5486db..7d2ac216 100644 --- a/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift +++ b/KkuMulKum/Source/MeetingInfo/ViewController/MeetingInfoViewController.swift @@ -55,7 +55,7 @@ final class MeetingInfoViewController: BaseViewController { } override func setupView() { - setupNavigationBar() + setupNavigationBarBackButton() } } @@ -150,30 +150,3 @@ extension MeetingInfoViewController: MeetingMemberCellDelegate { present(viewController, animated: true) } } - -private extension MeetingInfoViewController { - func setupNavigationBar() { - title = "" - - navigationController?.navigationBar.titleTextAttributes = [ - .foregroundColor: UIColor.gray8, - .font: UIFont.pretendard(.body03) - ] - - let backButton = UIBarButtonItem( - image: .iconBack, - style: .plain, - target: self, - action: #selector(backButtonDidTap) - ).then { - $0.tintColor = .black - } - - navigationItem.leftBarButtonItem = backButton - } - - @objc - func backButtonDidTap() { - navigationController?.popViewController(animated: true) - } -} From cc49aee28dfc792ae54ce1f5fb788fed367b278f Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 12 Jul 2024 22:16:24 +0900 Subject: [PATCH 07/14] =?UTF-8?q?chore/#157=20GroupCreate=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 92 ++++++++++++++++--- .../View/CheckInviteCodeView.swift | 0 .../View/JoinButtonView.swift | 0 .../CheckInviteCodeViewController.swift | 0 .../View/CreateGroupView.swift | 0 .../CreateGroupViewController.swift | 0 .../FinishCreateViewController.swift | 0 .../View/InviteCodeView.swift | 0 .../InviteCodeViewController.swift} | 6 +- .../ViewModel/InviteCodeViewModel.swift | 0 10 files changed, 81 insertions(+), 17 deletions(-) rename KkuMulKum/Source/GroupCreate/{ => CheckInviteCode}/View/CheckInviteCodeView.swift (100%) rename KkuMulKum/Source/GroupCreate/{ => CheckInviteCode}/View/JoinButtonView.swift (100%) rename KkuMulKum/Source/GroupCreate/{ => CheckInviteCode}/ViewController/CheckInviteCodeViewController.swift (100%) rename KkuMulKum/Source/GroupCreate/{ => CreateGroup}/View/CreateGroupView.swift (100%) rename KkuMulKum/Source/GroupCreate/{ => CreateGroup}/ViewController/CreateGroupViewController.swift (100%) rename KkuMulKum/Source/GroupCreate/{ViewController => FinishCreate}/FinishCreateViewController.swift (100%) rename KkuMulKum/Source/GroupCreate/{ => InviteCode}/View/InviteCodeView.swift (100%) rename KkuMulKum/Source/GroupCreate/{ViewController/EnterInviteCodeViewController.swift => InviteCode/ViewController/InviteCodeViewController.swift} (95%) rename KkuMulKum/Source/GroupCreate/{ => InviteCode}/ViewModel/InviteCodeViewModel.swift (100%) diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 886f114b..f95eff71 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -82,7 +82,7 @@ DD4393792C412F4500EC1799 /* JoinButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393702C412F4500EC1799 /* JoinButtonView.swift */; }; DD43937A2C412F4500EC1799 /* FinishCreateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */; }; DD43937B2C412F4500EC1799 /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */; }; - DD43937C2C412F4500EC1799 /* EnterInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */; }; + 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 */; }; DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */; }; @@ -201,7 +201,7 @@ DD4393702C412F4500EC1799 /* JoinButtonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinButtonView.swift; sourceTree = ""; }; DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FinishCreateViewController.swift; sourceTree = ""; }; DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupViewController.swift; sourceTree = ""; }; - DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnterInviteCodeViewController.swift; sourceTree = ""; }; + DD4393742C412F4500EC1799 /* InviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteCodeViewController.swift; sourceTree = ""; }; DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeViewController.swift; sourceTree = ""; }; DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeViewModel.swift; sourceTree = ""; }; DD931B6A2C3D9EBB00526452 /* ReadyStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadyStatusView.swift; sourceTree = ""; }; @@ -479,36 +479,100 @@ DD43936B2C412F4500EC1799 /* GroupCreate */ = { isa = PBXGroup; children = ( - DD43936C2C412F4500EC1799 /* View */, - DD4393712C412F4500EC1799 /* ViewController */, - DD4393802C41357D00EC1799 /* ViewModel */, + DD4393812C4162CA00EC1799 /* CheckInviteCode */, + DD4393842C41630200EC1799 /* CreateGroup */, + DD43936C2C412F4500EC1799 /* InviteCode */, + DD4393712C412F4500EC1799 /* FinishCreate */, ); path = GroupCreate; sourceTree = ""; }; - DD43936C2C412F4500EC1799 /* View */ = { + DD43936C2C412F4500EC1799 /* InviteCode */ = { + isa = PBXGroup; + children = ( + DD4393872C41637D00EC1799 /* ViewController */, + DD4393882C41638500EC1799 /* View */, + DD4393892C41638A00EC1799 /* ViewModel */, + ); + path = InviteCode; + sourceTree = ""; + }; + DD4393712C412F4500EC1799 /* FinishCreate */ = { + isa = PBXGroup; + children = ( + DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */, + ); + path = FinishCreate; + sourceTree = ""; + }; + DD4393812C4162CA00EC1799 /* CheckInviteCode */ = { + isa = PBXGroup; + children = ( + DD4393822C4162E600EC1799 /* ViewController */, + DD4393832C4162F400EC1799 /* View */, + ); + path = CheckInviteCode; + sourceTree = ""; + }; + DD4393822C4162E600EC1799 /* ViewController */ = { + isa = PBXGroup; + children = ( + DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + DD4393832C4162F400EC1799 /* View */ = { isa = PBXGroup; children = ( - DD43936D2C412F4500EC1799 /* InviteCodeView.swift */, - DD43936E2C412F4500EC1799 /* CreateGroupView.swift */, DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */, DD4393702C412F4500EC1799 /* JoinButtonView.swift */, ); path = View; sourceTree = ""; }; - DD4393712C412F4500EC1799 /* ViewController */ = { + DD4393842C41630200EC1799 /* CreateGroup */ = { + isa = PBXGroup; + children = ( + DD4393852C41632100EC1799 /* ViewController */, + DD4393862C41632800EC1799 /* View */, + ); + path = CreateGroup; + sourceTree = ""; + }; + DD4393852C41632100EC1799 /* ViewController */ = { isa = PBXGroup; children = ( - DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */, DD4393732C412F4500EC1799 /* CreateGroupViewController.swift */, - DD4393742C412F4500EC1799 /* EnterInviteCodeViewController.swift */, - DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */, ); path = ViewController; sourceTree = ""; }; - DD4393802C41357D00EC1799 /* ViewModel */ = { + DD4393862C41632800EC1799 /* View */ = { + isa = PBXGroup; + children = ( + DD43936E2C412F4500EC1799 /* CreateGroupView.swift */, + ); + path = View; + sourceTree = ""; + }; + DD4393872C41637D00EC1799 /* ViewController */ = { + isa = PBXGroup; + children = ( + DD4393742C412F4500EC1799 /* InviteCodeViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + DD4393882C41638500EC1799 /* View */ = { + isa = PBXGroup; + children = ( + DD43936D2C412F4500EC1799 /* InviteCodeView.swift */, + ); + path = View; + sourceTree = ""; + }; + DD4393892C41638A00EC1799 /* ViewModel */ = { isa = PBXGroup; children = ( DD43937E2C41357800EC1799 /* InviteCodeViewModel.swift */, @@ -1057,7 +1121,7 @@ DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, DED5DBEC2C345210006ECE7E /* BaseViewController.swift in Sources */, DE6D4D142C3F14D80005584B /* MeetingPromiseCell.swift in Sources */, - DD43937C2C412F4500EC1799 /* EnterInviteCodeViewController.swift in Sources */, + DD43937C2C412F4500EC1799 /* InviteCodeViewController.swift in Sources */, DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */, DE6D4D102C3F14D80005584B /* InvitationCodePopUpView.swift in Sources */, DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */, diff --git a/KkuMulKum/Source/GroupCreate/View/CheckInviteCodeView.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/CheckInviteCodeView.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/View/CheckInviteCodeView.swift rename to KkuMulKum/Source/GroupCreate/CheckInviteCode/View/CheckInviteCodeView.swift diff --git a/KkuMulKum/Source/GroupCreate/View/JoinButtonView.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/JoinButtonView.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/View/JoinButtonView.swift rename to KkuMulKum/Source/GroupCreate/CheckInviteCode/View/JoinButtonView.swift diff --git a/KkuMulKum/Source/GroupCreate/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/ViewController/CheckInviteCodeViewController.swift rename to KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift diff --git a/KkuMulKum/Source/GroupCreate/View/CreateGroupView.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/View/CreateGroupView.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/View/CreateGroupView.swift rename to KkuMulKum/Source/GroupCreate/CreateGroup/View/CreateGroupView.swift diff --git a/KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/ViewController/CreateGroupViewController.swift rename to KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift diff --git a/KkuMulKum/Source/GroupCreate/ViewController/FinishCreateViewController.swift b/KkuMulKum/Source/GroupCreate/FinishCreate/FinishCreateViewController.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/ViewController/FinishCreateViewController.swift rename to KkuMulKum/Source/GroupCreate/FinishCreate/FinishCreateViewController.swift diff --git a/KkuMulKum/Source/GroupCreate/View/InviteCodeView.swift b/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/View/InviteCodeView.swift rename to KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift diff --git a/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift similarity index 95% rename from KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift rename to KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift index 2a7ff098..1f9b7903 100644 --- a/KkuMulKum/Source/GroupCreate/ViewController/EnterInviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift @@ -1,5 +1,5 @@ // -// EnterInviteCodeViewController.swift +// InviteCodeViewController.swift // KkuMulKum // // Created by YOUJIM on 7/12/24. @@ -7,7 +7,7 @@ import UIKit -class EnterInviteCodeViewController: BaseViewController { +class InviteCodeViewController: BaseViewController { private let inviteCodeViewModel: InviteCodeViewModel = InviteCodeViewModel() private let inviteCodeView: InviteCodeView = InviteCodeView() @@ -84,7 +84,7 @@ class EnterInviteCodeViewController: BaseViewController { } } -extension EnterInviteCodeViewController: UITextFieldDelegate { +extension InviteCodeViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor diff --git a/KkuMulKum/Source/GroupCreate/ViewModel/InviteCodeViewModel.swift b/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift similarity index 100% rename from KkuMulKum/Source/GroupCreate/ViewModel/InviteCodeViewModel.swift rename to KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift From ec4185a557ca338332aaca665bce98ad43382812 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 12 Jul 2024 23:21:29 +0900 Subject: [PATCH 08/14] =?UTF-8?q?feat/#157=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=B4=88=EB=8C=80=20=EC=BD=94=EB=93=9C=20=EB=B7=B0=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=ED=95=84=EB=93=9C=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CheckInviteCodeViewController.swift | 2 +- .../InviteCode/View/InviteCodeView.swift | 2 +- .../InviteCodeViewController.swift | 29 ++++++++++++++----- .../ViewModel/InviteCodeViewModel.swift | 15 +++++----- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift index 3328ec0c..7aa97c6b 100644 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift @@ -34,7 +34,7 @@ class CheckInviteCodeViewController: BaseViewController { } @objc private func enterInviteCodeViewDidTap() { - let enterInviteCodeViewController = EnterInviteCodeViewController() + let enterInviteCodeViewController = InviteCodeViewController() enterInviteCodeViewController.modalTransitionStyle = .crossDissolve enterInviteCodeViewController.modalPresentationStyle = .fullScreen diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift b/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift index 592fcc6a..77f1f1b0 100644 --- a/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift @@ -17,7 +17,7 @@ class InviteCodeView: BaseView { ) let checkImageView: UIImageView = UIImageView().then { - $0.image = .iconCheck.withTintColor(.maincolor) + $0.image = .iconCheck $0.contentMode = .scaleAspectFit $0.isHidden = true } diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift index 1f9b7903..3ad9a770 100644 --- a/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/ViewController/InviteCodeViewController.swift @@ -17,6 +17,8 @@ class InviteCodeViewController: BaseViewController { } override func viewDidLoad() { + super.viewDidLoad() + setupBinding() setupTapGesture() } @@ -33,18 +35,19 @@ class InviteCodeViewController: BaseViewController { self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor self.inviteCodeView.errorLabel.isHidden = true self.inviteCodeView.checkImageView.isHidden = true - case.selected: - self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor - self.inviteCodeView.errorLabel.isHidden = true - self.inviteCodeView.checkImageView.isHidden = true case .invalid: self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor self.inviteCodeView.errorLabel.isHidden = false self.inviteCodeView.checkImageView.isHidden = true case .valid: + self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + self.inviteCodeView.errorLabel.isHidden = true + self.inviteCodeView.checkImageView.isHidden = true + case .success: self.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor self.inviteCodeView.errorLabel.isHidden = true self.inviteCodeView.checkImageView.isHidden = false + self.inviteCodeView.presentButton.isEnabled = true } } } @@ -85,9 +88,21 @@ class InviteCodeViewController: BaseViewController { } extension InviteCodeViewController: UITextFieldDelegate { - func textFieldShouldReturn(_ textField: UITextField) -> Bool { - textField.resignFirstResponder() - inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { + inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + + return true + } + + func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { + switch inviteCodeViewModel.inviteCodeState.value { + case .empty: + inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + case .valid, .success: + inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + case .invalid: + inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor + } return true } diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift b/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift index 366d578a..a46069bb 100644 --- a/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift @@ -9,7 +9,7 @@ import Foundation enum InviteCodeState { case empty - case selected + case success case valid case invalid } @@ -17,25 +17,24 @@ enum InviteCodeState { class InviteCodeViewModel { let inviteCode = ObservablePattern("") let inviteCodeState = ObservablePattern(.empty) - let codeErrorMessage = ObservablePattern(nil) let isNextButtonEnabled = ObservablePattern(false) - private let codeRegex = "{1,5}$" - func validateCode(_ code: String) { inviteCode.value = code if code.isEmpty { inviteCodeState.value = .empty - codeErrorMessage.value = nil isNextButtonEnabled.value = false - } else if code.range(of: codeRegex, options: .regularExpression) != nil { + } else if code.count == 6 && code != "eeeeee" { inviteCodeState.value = .valid - codeErrorMessage.value = nil + isNextButtonEnabled.value = true + } + // TODO: 서버 검증 성공했을 때 조건 변경 + else if code == "eeeeee" { + inviteCodeState.value = .success isNextButtonEnabled.value = true } else { inviteCodeState.value = .invalid - codeErrorMessage.value = "한글, 영문, 숫자만을 사용해 총 5자 이내로 입력해주세요." isNextButtonEnabled.value = false } } From 2b41213cc00daba380b7a342018d13ec1a042980 Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 13 Jul 2024 01:53:28 +0900 Subject: [PATCH 09/14] =?UTF-8?q?feat/#157=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8D=EC=8A=A4=ED=8A=B8=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 12 +++++ .../CreateGroup/View/CreateGroupView.swift | 45 +++++++++++++++- .../CreateGroupViewController.swift | 53 +++++++++++++++++++ .../ViewModel/CreateGroupViewModel.swift | 39 ++++++++++++++ 4 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index f95eff71..78468a39 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -76,6 +76,7 @@ DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */; }; DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */; }; DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; + DD3976682C41769400E2A4C4 /* CreateGroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */; }; DD4393762C412F4500EC1799 /* InviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936D2C412F4500EC1799 /* InviteCodeView.swift */; }; DD4393772C412F4500EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936E2C412F4500EC1799 /* CreateGroupView.swift */; }; DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */; }; @@ -195,6 +196,7 @@ DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPromiseReadyInfoRequestModel.swift; sourceTree = ""; }; DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseLateInfoResponseModel.swift; sourceTree = ""; }; DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; + DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewModel.swift; sourceTree = ""; }; DD43936D2C412F4500EC1799 /* InviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteCodeView.swift; sourceTree = ""; }; DD43936E2C412F4500EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; @@ -476,6 +478,14 @@ path = KkuMulKum; sourceTree = ""; }; + DD3976692C41769900E2A4C4 /* ViewModel */ = { + isa = PBXGroup; + children = ( + DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; DD43936B2C412F4500EC1799 /* GroupCreate */ = { isa = PBXGroup; children = ( @@ -536,6 +546,7 @@ children = ( DD4393852C41632100EC1799 /* ViewController */, DD4393862C41632800EC1799 /* View */, + DD3976692C41769900E2A4C4 /* ViewModel */, ); path = CreateGroup; sourceTree = ""; @@ -1199,6 +1210,7 @@ DE32D1D22C3BF703006848DF /* LoginUserResponseModel.swift in Sources */, DE9E18892C3BC91000DB76B4 /* ResponseBodyDTO.swift in Sources */, DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */, + DD3976682C41769400E2A4C4 /* CreateGroupViewModel.swift in Sources */, DD3072202C3C0D4500416D9F /* MyReadyStatusResponseModel.swift in Sources */, DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */, DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */, diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/View/CreateGroupView.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/View/CreateGroupView.swift index 3f747c57..ca0a3751 100644 --- a/KkuMulKum/Source/GroupCreate/CreateGroup/View/CreateGroupView.swift +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/View/CreateGroupView.swift @@ -12,9 +12,50 @@ class CreateGroupView: BaseView { $0.setText("모임 이름을\n입력해 주세요", style: .head01) } - private let inviteCodeTextField: CustomTextField = CustomTextField( + let nameTextField: CustomTextField = CustomTextField( placeHolder: "모임 이름을 입력해 주세요" ) - let presentButton: CustomButton = CustomButton(title: "다음", isEnabled: false) + let characterLabel: UILabel = UILabel().then { + $0.setText("0/10", style: .body06, color: .gray3) + } + + let presentButton: CustomButton = CustomButton( + title: "다음", + isEnabled: false + ) + + override func setupView() { + addSubviews( + mainTitleLabel, + nameTextField, + characterLabel, + presentButton + ) + } + + override func setupAutoLayout() { + mainTitleLabel.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(32) + $0.leading.equalToSuperview().offset(20) + } + + nameTextField.snp.makeConstraints { + $0.top.equalTo(mainTitleLabel.snp.bottom).offset(24) + $0.width.equalTo(CustomTextField.defaultWidth) + $0.height.equalTo(CustomTextField.defaultHeight) + $0.leading.equalTo(mainTitleLabel) + } + + characterLabel.snp.makeConstraints { + $0.centerY.equalTo(nameTextField) + $0.trailing.equalTo(nameTextField.snp.trailing).inset(12) + } + + presentButton.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(50) + $0.horizontalEdges.equalToSuperview().inset(14) + $0.height.equalTo(Screen.height(50)) + } + } } diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift index 969003ba..484d7466 100644 --- a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift @@ -8,14 +8,67 @@ import UIKit class CreateGroupViewController: BaseViewController { + private let createGroupViewModel: CreateGroupViewModel = CreateGroupViewModel() + private let createGroupView: CreateGroupView = CreateGroupView() override func loadView() { view = createGroupView } + override func viewDidLoad() { + super.viewDidLoad() + + setupBinding() + setupActions() + setupTapGesture() + } + override func setupView() { setupNavigationBarTitle(with: "내 모임 추가하기") setupNavigationBarBackButton() } + + private func setupBinding() { + createGroupViewModel.inviteCodeState.bind(with: self) { owner, state in + switch state { + case .empty, .invalid: + self.createGroupView.presentButton.isEnabled = false + case .valid: + self.createGroupView.presentButton.isEnabled = true + } + + self.createGroupViewModel.characterCount.bind(with: self) { owner, count in + self.createGroupView.characterLabel.text = count + } + } + } + + private func setupActions() { + createGroupView.nameTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) + createGroupView.presentButton.addTarget(self, action: #selector(presentButtonDidTapped), for: .touchUpInside) + } + + private func setupTapGesture() { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) + view.addGestureRecognizer(tapGesture) + } + + @objc private func textFieldDidChange(_ textField: UITextField) { + createGroupViewModel.validateName(textField.text ?? "") + } + + @objc private func dismissKeyboard() { + view.endEditing(true) + createGroupView.nameTextField.layer.borderColor = UIColor.gray3.cgColor + } + + @objc private func presentButtonDidTapped() { + // TODO: 서버 연결해서 초대 코드 받아올 수 있게 처리 + let inviteCodePopUpViewController = InvitationCodePopUpViewController(invitationCode: createGroupViewModel.inviteCode.value) + + inviteCodePopUpViewController.modalPresentationStyle = .fullScreen + + present(inviteCodePopUpViewController, animated: true, completion: nil) + } } diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift new file mode 100644 index 00000000..0e24c780 --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift @@ -0,0 +1,39 @@ +// +// CreateGroupViewModel.swift +// KkuMulKum +// +// Created by YOUJIM on 7/12/24. +// + +import Foundation + +enum GroupNameState { + case empty + case valid + case invalid +} + +class CreateGroupViewModel { + let groupName = ObservablePattern("") + let inviteCodeState = ObservablePattern(.empty) + let inviteCode = ObservablePattern("") + let isNextButtonEnabled = ObservablePattern(false) + let characterCount = ObservablePattern("0/5") + + func validateName(_ name: String) { + groupName.value = name + characterCount.value = "\(name.count)/10" + + if name.isEmpty { + inviteCodeState.value = .empty + isNextButtonEnabled.value = false + } else if name.count > 10 { + inviteCodeState.value = .invalid + isNextButtonEnabled.value = false + } else { + inviteCodeState.value = .valid + isNextButtonEnabled.value = true + } + } +} + From ce511e1354c828305c27f8d2fc45777c2cda1d45 Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 13 Jul 2024 02:33:57 +0900 Subject: [PATCH 10/14] =?UTF-8?q?feat/#157=20=EC=B5=9C=EC=A2=85=20?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 22 +++++++++++- .../CreateGroupViewController.swift | 4 ++- .../View/FinishCreateNavigationView.swift | 36 +++++++++++++++++++ .../FinishCreateViewController.swift | 14 ++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift rename KkuMulKum/Source/GroupCreate/FinishCreate/{ => ViewController}/FinishCreateViewController.swift (80%) diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 78468a39..5f1ae84b 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -77,6 +77,7 @@ DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */; }; DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; DD3976682C41769400E2A4C4 /* CreateGroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */; }; + DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */; }; DD4393762C412F4500EC1799 /* InviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936D2C412F4500EC1799 /* InviteCodeView.swift */; }; DD4393772C412F4500EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936E2C412F4500EC1799 /* CreateGroupView.swift */; }; DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */; }; @@ -197,6 +198,7 @@ DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseLateInfoResponseModel.swift; sourceTree = ""; }; DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewModel.swift; sourceTree = ""; }; + DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateNavigationView.swift; sourceTree = ""; }; DD43936D2C412F4500EC1799 /* InviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteCodeView.swift; sourceTree = ""; }; DD43936E2C412F4500EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; @@ -486,6 +488,22 @@ path = ViewModel; sourceTree = ""; }; + DD39766C2C4199BC00E2A4C4 /* View */ = { + isa = PBXGroup; + children = ( + DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */, + ); + path = View; + sourceTree = ""; + }; + DD39766D2C4199C100E2A4C4 /* ViewController */ = { + isa = PBXGroup; + children = ( + DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; DD43936B2C412F4500EC1799 /* GroupCreate */ = { isa = PBXGroup; children = ( @@ -510,7 +528,8 @@ DD4393712C412F4500EC1799 /* FinishCreate */ = { isa = PBXGroup; children = ( - DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */, + DD39766D2C4199C100E2A4C4 /* ViewController */, + DD39766C2C4199BC00E2A4C4 /* View */, ); path = FinishCreate; sourceTree = ""; @@ -1211,6 +1230,7 @@ DE9E18892C3BC91000DB76B4 /* ResponseBodyDTO.swift in Sources */, DD931B6B2C3D9EBB00526452 /* ReadyStatusView.swift in Sources */, DD3976682C41769400E2A4C4 /* CreateGroupViewModel.swift in Sources */, + DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */, DD3072202C3C0D4500416D9F /* MyReadyStatusResponseModel.swift in Sources */, DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */, DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */, diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift index 484d7466..626057bd 100644 --- a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift @@ -67,7 +67,9 @@ class CreateGroupViewController: BaseViewController { // TODO: 서버 연결해서 초대 코드 받아올 수 있게 처리 let inviteCodePopUpViewController = InvitationCodePopUpViewController(invitationCode: createGroupViewModel.inviteCode.value) - inviteCodePopUpViewController.modalPresentationStyle = .fullScreen + inviteCodePopUpViewController.modalPresentationStyle = .overFullScreen + inviteCodePopUpViewController.modalTransitionStyle = .crossDissolve + inviteCodePopUpViewController.view.backgroundColor = .black.withAlphaComponent(0.7) present(inviteCodePopUpViewController, animated: true, completion: nil) } diff --git a/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift b/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift new file mode 100644 index 00000000..b37db7fd --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift @@ -0,0 +1,36 @@ +// +// FinishCreateNavigationView.swift +// KkuMulKum +// +// Created by YOUJIM on 7/13/24. +// + +import UIKit + +class FinishCreateNavigationView: BaseView { + let titleLabel = UILabel().then { + $0.setText("내 모임 추가하기", style: .body03, color: .gray8) + } + + let separatorView = UIView().then { + $0.backgroundColor = .gray1 + } + + override func setupView() { + backgroundColor = .white + + addSubviews(titleLabel, separatorView) + } + + override func setupAutoLayout() { + titleLabel.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview().inset(16) + } + + separatorView.snp.makeConstraints { + $0.height.equalTo(1) + $0.leading.trailing.bottom.equalToSuperview() + } + } +} diff --git a/KkuMulKum/Source/GroupCreate/FinishCreate/FinishCreateViewController.swift b/KkuMulKum/Source/GroupCreate/FinishCreate/ViewController/FinishCreateViewController.swift similarity index 80% rename from KkuMulKum/Source/GroupCreate/FinishCreate/FinishCreateViewController.swift rename to KkuMulKum/Source/GroupCreate/FinishCreate/ViewController/FinishCreateViewController.swift index ea35b547..05fcbf3c 100644 --- a/KkuMulKum/Source/GroupCreate/FinishCreate/FinishCreateViewController.swift +++ b/KkuMulKum/Source/GroupCreate/FinishCreate/ViewController/FinishCreateViewController.swift @@ -61,4 +61,18 @@ class FinishCreateViewController: BaseViewController { $0.centerX.equalToSuperview() } } + + override func setupAction() { + confirmButton.addTarget( + self, + action: #selector(presentMeetingInfoViewControllerDidTapped), + for: .touchUpInside) + } + + @objc func presentMeetingInfoViewControllerDidTapped() { + // TODO: 모임 상세 화면 띄우기 +// let meetingInfoViewController = MeetingInfoViewController(viewModel: Mee) +// +// present(meetingInfoViewController, animated: true) + } } From 279650d803cad9a124370af041dda311e03dfe7c Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 13 Jul 2024 03:20:25 +0900 Subject: [PATCH 11/14] =?UTF-8?q?fix/#157=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CheckInviteCode/View/CheckInviteCodeView.swift | 6 +++++- .../CheckInviteCode/View/JoinButtonView.swift | 6 +++++- .../CheckInviteCodeViewController.swift | 12 ++++++------ .../View/FinishCreateNavigationView.swift | 9 +++++---- .../GroupCreate/InviteCode/View/InviteCodeView.swift | 8 +++++++- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/CheckInviteCodeView.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/CheckInviteCodeView.swift index a28b5820..67859761 100644 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/CheckInviteCodeView.swift +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/CheckInviteCodeView.swift @@ -21,7 +21,11 @@ class CheckInviteCodeView: BaseView { } override func setupView() { - self.addSubviews(checkInviteLabel, enterInviteCodeView, createGroupView) + self.addSubviews( + checkInviteLabel, + enterInviteCodeView, + createGroupView + ) } override func setupAutoLayout() { diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/JoinButtonView.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/JoinButtonView.swift index f61a1163..f048c6b1 100644 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/JoinButtonView.swift +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCode/View/JoinButtonView.swift @@ -24,7 +24,11 @@ class JoinButtonView: BaseView { override func setupView() { self.backgroundColor = .green1 - self.addSubviews(subTitleLabel, mainTitleLabel, chevronImageView) + self.addSubviews( + subTitleLabel, + mainTitleLabel, + chevronImageView + ) } override func setupAutoLayout() { diff --git a/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift index 7aa97c6b..a1a8ba51 100644 --- a/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift @@ -25,7 +25,7 @@ class CheckInviteCodeViewController: BaseViewController { override func setupAction() { checkInviteCodeView.enterInviteCodeView.addGestureRecognizer(UITapGestureRecognizer( target: self, - action: #selector(enterInviteCodeViewDidTap) + action: #selector(inviteCodeViewDidTap) )) checkInviteCodeView.createGroupView.addGestureRecognizer(UITapGestureRecognizer( target: self, @@ -33,13 +33,13 @@ class CheckInviteCodeViewController: BaseViewController { )) } - @objc private func enterInviteCodeViewDidTap() { - let enterInviteCodeViewController = InviteCodeViewController() + @objc private func inviteCodeViewDidTap() { + let inviteCodeViewController = InviteCodeViewController() - enterInviteCodeViewController.modalTransitionStyle = .crossDissolve - enterInviteCodeViewController.modalPresentationStyle = .fullScreen + inviteCodeViewController.modalTransitionStyle = .crossDissolve + inviteCodeViewController.modalPresentationStyle = .fullScreen - navigationController?.pushViewController(enterInviteCodeViewController, animated: true) + navigationController?.pushViewController(inviteCodeViewController, animated: true) } @objc private func createGroupViewDidTap() { diff --git a/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift b/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift index b37db7fd..e6e3ed15 100644 --- a/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift +++ b/KkuMulKum/Source/GroupCreate/FinishCreate/View/FinishCreateNavigationView.swift @@ -12,14 +12,15 @@ class FinishCreateNavigationView: BaseView { $0.setText("내 모임 추가하기", style: .body03, color: .gray8) } - let separatorView = UIView().then { - $0.backgroundColor = .gray1 - } + let separatorView = UIView(backgroundColor: .gray1) override func setupView() { backgroundColor = .white - addSubviews(titleLabel, separatorView) + addSubviews( + titleLabel, + separatorView + ) } override func setupAutoLayout() { diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift b/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift index 77f1f1b0..a7cb29b4 100644 --- a/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/View/InviteCodeView.swift @@ -32,7 +32,13 @@ class InviteCodeView: BaseView { override func setupView() { backgroundColor = .white - addSubviews(mainTitleLabel, inviteCodeTextField, checkImageView, errorLabel, presentButton) + addSubviews( + mainTitleLabel, + inviteCodeTextField, + checkImageView, + errorLabel, + presentButton + ) } override func setupAutoLayout() { From 12b734e48e673c2aea6407788edae2f1baa94ffa Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 13 Jul 2024 03:22:19 +0900 Subject: [PATCH 12/14] =?UTF-8?q?fix/#157=20=EC=8B=9C=EC=9E=91=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum/Application/SceneDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KkuMulKum/Application/SceneDelegate.swift b/KkuMulKum/Application/SceneDelegate.swift index 11d514e9..50b6e567 100644 --- a/KkuMulKum/Application/SceneDelegate.swift +++ b/KkuMulKum/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: windowScene) - self.window?.rootViewController = MainTabBarController() + self.window?.rootViewController = LoginViewController() self.window?.makeKeyAndVisible() } From cdea947139228f0131bb0ecf07cef2f61aac8a44 Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 13 Jul 2024 03:39:32 +0900 Subject: [PATCH 13/14] =?UTF-8?q?fix/#157=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateGroup/ViewController/CreateGroupViewController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift index 626057bd..45e3fd07 100644 --- a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewController/CreateGroupViewController.swift @@ -20,7 +20,6 @@ class CreateGroupViewController: BaseViewController { super.viewDidLoad() setupBinding() - setupActions() setupTapGesture() } @@ -44,7 +43,7 @@ class CreateGroupViewController: BaseViewController { } } - private func setupActions() { + override func setupAction() { createGroupView.nameTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) createGroupView.presentButton.addTarget(self, action: #selector(presentButtonDidTapped), for: .touchUpInside) } From 1dc3f8b3eafd355677a0e59f7589e6f4da638c8d Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 13 Jul 2024 04:13:03 +0900 Subject: [PATCH 14/14] =?UTF-8?q?feat/#157=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 24 +++++++++++++++++++ .../Service/CreateGroupService.swift | 17 +++++++++++++ .../ViewModel/CreateGroupViewModel.swift | 6 +++++ .../Service/InviteCodeService.swift | 17 +++++++++++++ .../ViewModel/InviteCodeViewModel.swift | 6 +++++ 5 files changed, 70 insertions(+) create mode 100644 KkuMulKum/Source/GroupCreate/CreateGroup/Service/CreateGroupService.swift create mode 100644 KkuMulKum/Source/GroupCreate/InviteCode/Service/InviteCodeService.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 5f1ae84b..4538597e 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -78,6 +78,8 @@ DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; DD3976682C41769400E2A4C4 /* CreateGroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */; }; DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */; }; + DD39766F2C41B54400E2A4C4 /* InviteCodeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766E2C41B54400E2A4C4 /* InviteCodeService.swift */; }; + DD3976732C41B6C800E2A4C4 /* CreateGroupService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* CreateGroupService.swift */; }; DD4393762C412F4500EC1799 /* InviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936D2C412F4500EC1799 /* InviteCodeView.swift */; }; DD4393772C412F4500EC1799 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936E2C412F4500EC1799 /* CreateGroupView.swift */; }; DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */; }; @@ -199,6 +201,8 @@ DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; DD3976672C41769400E2A4C4 /* CreateGroupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewModel.swift; sourceTree = ""; }; DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateNavigationView.swift; sourceTree = ""; }; + DD39766E2C41B54400E2A4C4 /* InviteCodeService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeService.swift; sourceTree = ""; }; + DD3976722C41B6C800E2A4C4 /* CreateGroupService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupService.swift; sourceTree = ""; }; DD43936D2C412F4500EC1799 /* InviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteCodeView.swift; sourceTree = ""; }; DD43936E2C412F4500EC1799 /* CreateGroupView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; }; DD43936F2C412F4500EC1799 /* CheckInviteCodeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInviteCodeView.swift; sourceTree = ""; }; @@ -504,6 +508,22 @@ path = ViewController; sourceTree = ""; }; + DD3976702C41B54800E2A4C4 /* Service */ = { + isa = PBXGroup; + children = ( + DD39766E2C41B54400E2A4C4 /* InviteCodeService.swift */, + ); + path = Service; + sourceTree = ""; + }; + DD3976712C41B6B100E2A4C4 /* Service */ = { + isa = PBXGroup; + children = ( + DD3976722C41B6C800E2A4C4 /* CreateGroupService.swift */, + ); + path = Service; + sourceTree = ""; + }; DD43936B2C412F4500EC1799 /* GroupCreate */ = { isa = PBXGroup; children = ( @@ -521,6 +541,7 @@ DD4393872C41637D00EC1799 /* ViewController */, DD4393882C41638500EC1799 /* View */, DD4393892C41638A00EC1799 /* ViewModel */, + DD3976702C41B54800E2A4C4 /* Service */, ); path = InviteCode; sourceTree = ""; @@ -563,6 +584,7 @@ DD4393842C41630200EC1799 /* CreateGroup */ = { isa = PBXGroup; children = ( + DD3976712C41B6B100E2A4C4 /* Service */, DD4393852C41632100EC1799 /* ViewController */, DD4393862C41632800EC1799 /* View */, DD3976692C41769900E2A4C4 /* ViewModel */, @@ -1200,6 +1222,7 @@ DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */, DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */, DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */, + DD3976732C41B6C800E2A4C4 /* CreateGroupService.swift in Sources */, DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */, DE6D4D152C3F14D80005584B /* InvitationCodePopUpViewController.swift in Sources */, DD4393792C412F4500EC1799 /* JoinButtonView.swift in Sources */, @@ -1219,6 +1242,7 @@ DE6D4D0F2C3F14D80005584B /* MeetingInfoService.swift in Sources */, DED5DBF42C34539A006ECE7E /* BaseTableViewCell.swift in Sources */, 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, + DD39766F2C41B54400E2A4C4 /* InviteCodeService.swift in Sources */, DE6D4D172C3F14D80005584B /* MeetingInfoViewModel.swift in Sources */, 78AED1372C3D98D1000AD80A /* NicknameView.swift in Sources */, A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */, diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/Service/CreateGroupService.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/Service/CreateGroupService.swift new file mode 100644 index 00000000..45dc773b --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/Service/CreateGroupService.swift @@ -0,0 +1,17 @@ +// +// CreateGroupService.swift +// KkuMulKum +// +// Created by YOUJIM on 7/13/24. +// + +import Foundation + +protocol CreateGroupServiceType { + +} + +final class CreateGroupService: CreateGroupServiceType { + +} + diff --git a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift index 0e24c780..2d41f8f7 100644 --- a/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift +++ b/KkuMulKum/Source/GroupCreate/CreateGroup/ViewModel/CreateGroupViewModel.swift @@ -20,6 +20,12 @@ class CreateGroupViewModel { let isNextButtonEnabled = ObservablePattern(false) let characterCount = ObservablePattern("0/5") + private let service: CreateGroupServiceType + + init(service: CreateGroupServiceType) { + self.service = service + } + func validateName(_ name: String) { groupName.value = name characterCount.value = "\(name.count)/10" diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/Service/InviteCodeService.swift b/KkuMulKum/Source/GroupCreate/InviteCode/Service/InviteCodeService.swift new file mode 100644 index 00000000..f2223aee --- /dev/null +++ b/KkuMulKum/Source/GroupCreate/InviteCode/Service/InviteCodeService.swift @@ -0,0 +1,17 @@ +// +// InviteCodeService.swift +// KkuMulKum +// +// Created by YOUJIM on 7/13/24. +// + +import Foundation + +protocol InviteCodeServiceType { + +} + +final class MockInviteCodeService: InviteCodeServiceType { + +} + diff --git a/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift b/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift index a46069bb..83c28704 100644 --- a/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift +++ b/KkuMulKum/Source/GroupCreate/InviteCode/ViewModel/InviteCodeViewModel.swift @@ -19,6 +19,12 @@ class InviteCodeViewModel { let inviteCodeState = ObservablePattern(.empty) let isNextButtonEnabled = ObservablePattern(false) + private let service: InviteCodeServiceType + + init(service: InviteCodeServiceType) { + self.service = service + } + func validateCode(_ code: String) { inviteCode.value = code