From fcbc682cd91ae78477fe22b81eb6fe0ed393a7ef Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 02:20:09 +0900 Subject: [PATCH 01/12] =?UTF-8?q?refactor/#277=20MeetingService=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 36 +++++----- .../CreateMeetingServiceType.swift} | 2 +- .../CreateMeetingViewController.swift | 69 ++++++++++--------- .../ViewModel/CreateMeetingViewModel.swift | 5 +- .../InviteCodeServiceType.swift} | 0 5 files changed, 60 insertions(+), 52 deletions(-) rename KkuMulKum/Source/MeetingCreate/CreateMeeting/{Service/CreateMeetingService.swift => ServiceType/CreateMeetingServiceType.swift} (94%) rename KkuMulKum/Source/MeetingCreate/InviteCode/{Service/InviteCodeService.swift => ServiceType/InviteCodeServiceType.swift} (100%) diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index af44d8bc..6b87c567 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -96,8 +96,7 @@ DD3072262C3C0F0B00416D9F /* TardyInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* TardyInfoModel.swift */; }; DD3976682C41769400E2A4C4 /* CreateMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */; }; DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */; }; - DD39766F2C41B54400E2A4C4 /* InviteCodeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766E2C41B54400E2A4C4 /* InviteCodeService.swift */; }; - DD3976732C41B6C800E2A4C4 /* CreateMeetingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* CreateMeetingService.swift */; }; + DD39766F2C41B54400E2A4C4 /* InviteCodeServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766E2C41B54400E2A4C4 /* InviteCodeServiceType.swift */; }; DD3976832C41C2AD00E2A4C4 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */; }; DD3976842C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976792C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift */; }; DD3976862C41C2AD00E2A4C4 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39767D2C41C2AD00E2A4C4 /* HomeView.swift */; }; @@ -106,7 +105,6 @@ DD3976892C41C2AD00E2A4C4 /* TodayEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976802C41C2AD00E2A4C4 /* TodayEmptyView.swift */; }; DD39768A2C41C2AD00E2A4C4 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976822C41C2AD00E2A4C4 /* HomeViewController.swift */; }; DD39768C2C41C36B00E2A4C4 /* Color.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DD39768B2C41C36B00E2A4C4 /* Color.xcassets */; }; - DD3F9DC22C481ED5008E1FF7 /* MeetingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DC12C481ED5008E1FF7 /* MeetingService.swift */; }; DD3F9DC62C484DEB008E1FF7 /* PromiseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DC52C484DEB008E1FF7 /* PromiseService.swift */; }; DD3F9DCC2C485614008E1FF7 /* HomeServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DCB2C485614008E1FF7 /* HomeServiceType.swift */; }; DD3F9DD02C48571A008E1FF7 /* MeetingListServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DCF2C48571A008E1FF7 /* MeetingListServiceType.swift */; }; @@ -148,6 +146,8 @@ DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */; }; DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */; }; DDB0D7D32C469C77000CF782 /* PagePromiseSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB0D7D22C469C77000CF782 /* PagePromiseSegmentedControl.swift */; }; + DDD62FFB2C5FA4FE00174B57 /* MeetingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD62FFA2C5FA4FE00174B57 /* MeetingService.swift */; }; + DDD62FFC2C5FA54100174B57 /* CreateMeetingServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceType.swift */; }; DDE7D2C62C47D2BB005A921F /* MeetingTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE7D2C52C47D2BB005A921F /* MeetingTargetType.swift */; }; DDE7D2CA2C47EE81005A921F /* PromiseTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE7D2C92C47EE81005A921F /* PromiseTargetType.swift */; }; DDE7D2CC2C47F073005A921F /* PlaceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9E18992C3BCCBE00DB76B4 /* PlaceModel.swift */; }; @@ -284,8 +284,8 @@ DD3072252C3C0F0B00416D9F /* TardyInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyInfoModel.swift; sourceTree = ""; }; DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingViewModel.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 /* CreateMeetingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingService.swift; sourceTree = ""; }; + DD39766E2C41B54400E2A4C4 /* InviteCodeServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeServiceType.swift; sourceTree = ""; }; + DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingServiceType.swift; sourceTree = ""; }; DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; DD3976792C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingPromiseCollecitonViewCell.swift; sourceTree = ""; }; DD39767D2C41C2AD00E2A4C4 /* HomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; @@ -294,7 +294,6 @@ DD3976802C41C2AD00E2A4C4 /* TodayEmptyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayEmptyView.swift; sourceTree = ""; }; DD3976822C41C2AD00E2A4C4 /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; DD39768B2C41C36B00E2A4C4 /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = ""; }; - DD3F9DC12C481ED5008E1FF7 /* MeetingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingService.swift; sourceTree = ""; }; DD3F9DC52C484DEB008E1FF7 /* PromiseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseService.swift; sourceTree = ""; }; DD3F9DCB2C485614008E1FF7 /* HomeServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeServiceType.swift; sourceTree = ""; }; DD3F9DCF2C48571A008E1FF7 /* MeetingListServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingListServiceType.swift; sourceTree = ""; }; @@ -333,6 +332,7 @@ DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TardyViewController.swift; sourceTree = ""; }; DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseViewController.swift; sourceTree = ""; }; DDB0D7D22C469C77000CF782 /* PagePromiseSegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PagePromiseSegmentedControl.swift; sourceTree = ""; }; + DDD62FFA2C5FA4FE00174B57 /* MeetingService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeetingService.swift; sourceTree = ""; }; DDE7D2C52C47D2BB005A921F /* MeetingTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingTargetType.swift; sourceTree = ""; }; DDE7D2C92C47EE81005A921F /* PromiseTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseTargetType.swift; sourceTree = ""; }; DDFA507A2C4693BD000A62E2 /* ProfileSetupViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileSetupViewModel.swift; sourceTree = ""; }; @@ -663,9 +663,9 @@ A3DD9C642C45B30600E58A13 /* Service */ = { isa = PBXGroup; children = ( + DDD62FFA2C5FA4FE00174B57 /* MeetingService.swift */, 78BD61332C45B4A7005752FD /* AuthService.swift */, A3DD9C672C45C78300E58A13 /* HomeService.swift */, - DD3F9DC12C481ED5008E1FF7 /* MeetingService.swift */, DD3F9DC52C484DEB008E1FF7 /* PromiseService.swift */, DD3F9DD12C485753008E1FF7 /* UtilService.swift */, ); @@ -761,20 +761,20 @@ path = ViewController; sourceTree = ""; }; - DD3976702C41B54800E2A4C4 /* Service */ = { + DD3976702C41B54800E2A4C4 /* ServiceType */ = { isa = PBXGroup; children = ( - DD39766E2C41B54400E2A4C4 /* InviteCodeService.swift */, + DD39766E2C41B54400E2A4C4 /* InviteCodeServiceType.swift */, ); - path = Service; + path = ServiceType; sourceTree = ""; }; - DD3976712C41B6B100E2A4C4 /* Service */ = { + DD3976712C41B6B100E2A4C4 /* ServiceType */ = { isa = PBXGroup; children = ( - DD3976722C41B6C800E2A4C4 /* CreateMeetingService.swift */, + DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceType.swift */, ); - path = Service; + path = ServiceType; sourceTree = ""; }; DD3976752C41C2AD00E2A4C4 /* Home */ = { @@ -896,7 +896,7 @@ DD43936C2C412F4500EC1799 /* InviteCode */ = { isa = PBXGroup; children = ( - DD3976702C41B54800E2A4C4 /* Service */, + DD3976702C41B54800E2A4C4 /* ServiceType */, DD4393872C41637D00EC1799 /* ViewController */, DD4393882C41638500EC1799 /* View */, DD4393892C41638A00EC1799 /* ViewModel */, @@ -942,7 +942,7 @@ DD4393842C41630200EC1799 /* CreateMeeting */ = { isa = PBXGroup; children = ( - DD3976712C41B6B100E2A4C4 /* Service */, + DD3976712C41B6B100E2A4C4 /* ServiceType */, DD4393852C41632100EC1799 /* ViewController */, DD4393862C41632800EC1799 /* View */, DD3976692C41769900E2A4C4 /* ViewModel */, @@ -1673,6 +1673,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + DDD62FFC2C5FA54100174B57 /* CreateMeetingServiceType.swift in Sources */, DDE7D2CC2C47F073005A921F /* PlaceModel.swift in Sources */, DEFBEBD12C46B33000437188 /* SelectCapsuleButton.swift in Sources */, DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, @@ -1684,7 +1685,6 @@ 789D73A72C46AF4900C7077D /* KeychainService.swift in Sources */, DD43937C2C412F4500EC1799 /* InviteCodeViewController.swift in Sources */, DD4393782C412F4500EC1799 /* CheckInviteCodeView.swift in Sources */, - DD3F9DC22C481ED5008E1FF7 /* MeetingService.swift in Sources */, DE6D4D102C3F14D80005584B /* InvitationCodePopUpView.swift in Sources */, 789196382C49697B00FF8CDF /* AuthError.swift in Sources */, A39F2B1B2C47C206008DA5F5 /* SetReadyCompletedViewController.swift in Sources */, @@ -1705,6 +1705,7 @@ A3FB184D2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift in Sources */, DD3976842C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift in Sources */, DEBA03312C3C2972002ED8F2 /* ViewController.swift in Sources */, + DDD62FFB2C5FA4FE00174B57 /* MeetingService.swift in Sources */, DD43937D2C412F4500EC1799 /* CheckInviteCodeViewController.swift in Sources */, DEFBEBD92C46E4C200437188 /* AddPromiseCompleteView.swift in Sources */, DEFBEBDB2C46FD5700437188 /* AddPromiseResponseModel.swift in Sources */, @@ -1744,7 +1745,6 @@ 789D73B32C47CC6D00C7077D /* LocalNotificationManager.swift in Sources */, DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */, DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */, - DD3976732C41B6C800E2A4C4 /* CreateMeetingService.swift in Sources */, DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */, DEFBEBD32C46C27200437188 /* SelectPenaltyViewModel.swift in Sources */, DE6D4D152C3F14D80005584B /* InvitationCodePopUpViewController.swift in Sources */, @@ -1779,7 +1779,7 @@ DD1FD0302C5CCB4400D0A72C /* ReadyStatusViewController.swift in Sources */, DDB0D7D32C469C77000CF782 /* PagePromiseSegmentedControl.swift in Sources */, 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, - DD39766F2C41B54400E2A4C4 /* InviteCodeService.swift in Sources */, + DD39766F2C41B54400E2A4C4 /* InviteCodeServiceType.swift in Sources */, DE6D4D172C3F14D80005584B /* MeetingInfoViewModel.swift in Sources */, 78AED1372C3D98D1000AD80A /* NicknameView.swift in Sources */, DECB845A2C43FC140022A003 /* AddPromiseView.swift in Sources */, diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/Service/CreateMeetingService.swift b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift similarity index 94% rename from KkuMulKum/Source/MeetingCreate/CreateMeeting/Service/CreateMeetingService.swift rename to KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift index 66b65ae0..3ea8ce56 100644 --- a/KkuMulKum/Source/MeetingCreate/CreateMeeting/Service/CreateMeetingService.swift +++ b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift @@ -1,5 +1,5 @@ // -// CreateMeetingService.swift +// MeetingService.swift // KkuMulKum // // Created by YOUJIM on 7/13/24. diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewController/CreateMeetingViewController.swift b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewController/CreateMeetingViewController.swift index 248b26b3..3c124354 100644 --- a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewController/CreateMeetingViewController.swift +++ b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewController/CreateMeetingViewController.swift @@ -13,7 +13,6 @@ class CreateMeetingViewController: BaseViewController { // MARK: Property private let createMeetingViewModel: CreateMeetingViewModel - private let createMeetingView: CreateMeetingView = CreateMeetingView() @@ -53,7 +52,6 @@ class CreateMeetingViewController: BaseViewController { super.viewDidLoad() setupBinding() - setupTapGesture() } @@ -75,6 +73,12 @@ class CreateMeetingViewController: BaseViewController { action: #selector(presentButtonDidTapped), for: .touchUpInside ) + view.addGestureRecognizer( + UITapGestureRecognizer( + target: self, + action: #selector(dismissKeyboard) + ) + ) } } @@ -97,11 +101,6 @@ private extension CreateMeetingViewController { } } - func setupTapGesture() { - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) - view.addGestureRecognizer(tapGesture) - } - @objc func textFieldDidChange(_ textField: UITextField) { createMeetingViewModel.validateName(textField.text ?? "") @@ -119,35 +118,17 @@ private extension CreateMeetingViewController { invitationCode: createMeetingViewModel.inviteCode.value ) - inviteCodePopUpViewController.modalPresentationStyle = .overFullScreen - inviteCodePopUpViewController.modalTransitionStyle = .crossDissolve - inviteCodePopUpViewController.view.backgroundColor = .black.withAlphaComponent(0.7) - - inviteCodePopUpViewController.rootView.copyButton.addTarget( - self, - action: #selector(copyButtonDidTapped), - for: .touchUpInside - ) - inviteCodePopUpViewController.rootView.inviteLaterButton.addTarget( - self, - action: #selector(inviteLaterButtonDidTapped), - for: .touchUpInside - ) - - inviteCodePopUpViewController.rootView.removeGestureRecognizer( - inviteCodePopUpViewController.rootView.gestureRecognizers![0] - ) - - createMeetingViewModel.createMeeting( - name: createMeetingViewModel.meetingName.value - ) + setupPopUpViewController(viewController: inviteCodePopUpViewController) + setupPopUpAction(view: inviteCodePopUpViewController.rootView) + removeDismissGesture(view: inviteCodePopUpViewController.rootView) + createMeetingViewModel.createMeeting(name: createMeetingViewModel.meetingName.value) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { inviteCodePopUpViewController.rootView.setInvitationCodeText( self.createMeetingViewModel.inviteCode.value ) - self.present(inviteCodePopUpViewController, animated: true, completion: nil) + self.present(inviteCodePopUpViewController, animated: true) } } @@ -168,4 +149,30 @@ private extension CreateMeetingViewController { self.navigationController?.pushViewController(finishCreateViewController, animated: true) } } + + private func setupPopUpViewController(viewController: BaseViewController) { + viewController.modalPresentationStyle = .overFullScreen + viewController.modalTransitionStyle = .crossDissolve + viewController.view.backgroundColor = .black.withAlphaComponent(0.7) + } + + private func setupPopUpAction(view: InvitationCodePopUpView) { + view.copyButton.addTarget( + self, + action: #selector(copyButtonDidTapped), + for: .touchUpInside + ) + + view.inviteLaterButton.addTarget( + self, + action: #selector(inviteLaterButtonDidTapped), + for: .touchUpInside + ) + } + + private func removeDismissGesture(view: BaseView) { + if let gesture = view.gestureRecognizers?.first { + view.removeGestureRecognizer(gesture) + } + } } diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift index 3e5d14b1..ca3612af 100644 --- a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift +++ b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift @@ -19,12 +19,13 @@ class CreateMeetingViewModel { // MARK: Property var createMeetingResponse = ObservablePattern(nil) - let createMeetingService: CreateMeetingServiceType let isNextButtonEnabled = ObservablePattern(false) let meetingName = ObservablePattern("") let inviteCode = ObservablePattern("") - let characterCount = ObservablePattern("0/5") + let characterCount = ObservablePattern("0/10") let inviteCodeState = ObservablePattern(.empty) + let createMeetingService: CreateMeetingServiceType + private (set) var meetingID: Int = 0 diff --git a/KkuMulKum/Source/MeetingCreate/InviteCode/Service/InviteCodeService.swift b/KkuMulKum/Source/MeetingCreate/InviteCode/ServiceType/InviteCodeServiceType.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/InviteCode/Service/InviteCodeService.swift rename to KkuMulKum/Source/MeetingCreate/InviteCode/ServiceType/InviteCodeServiceType.swift From 994294cf4aac36dc5fc217ec2ebe7ffc92299c71 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 02:47:53 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor/#277=20JoinButtonView=20?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=84=A4=EC=A0=95=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=8C=80=EC=8B=A0=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=EB=A1=9C=20=EC=B4=88=EA=B8=B0=ED=99=94=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../View/CheckInviteCodeView.swift | 18 ++++++----- .../CheckInviteCode/View/JoinButtonView.swift | 32 +++++++------------ 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/CheckInviteCodeView.swift b/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/CheckInviteCodeView.swift index acb3395d..24ccb722 100644 --- a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/CheckInviteCodeView.swift +++ b/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/CheckInviteCodeView.swift @@ -11,19 +11,21 @@ class CheckInviteCodeView: BaseView { // MARK: Property + + let enterInviteCodeView: JoinButtonView = JoinButtonView( + mainTitle: "초대 코드를 받았다면", + subTitle: "초대 코드가 없다면" + ) + + let createMeetingView: JoinButtonView = JoinButtonView( + mainTitle: "초대 코드 입력하기", + subTitle: "직접 모임 추가하기" + ) private let checkInviteLabel: UILabel = UILabel().then { $0.setText("친구에게 받은\n모임 초대 코드가 있으신가요?", style: .head01, color: .gray8) } - let enterInviteCodeView: JoinButtonView = JoinButtonView().then { - $0.setJoinButtonViewStatus(isReceived: true) - } - - let createMeetingView: JoinButtonView = JoinButtonView().then { - $0.setJoinButtonViewStatus(isReceived: false) - } - // MARK: - Setup diff --git a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/JoinButtonView.swift b/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/JoinButtonView.swift index 5c561834..cdc74188 100644 --- a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/JoinButtonView.swift +++ b/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/JoinButtonView.swift @@ -27,7 +27,18 @@ class JoinButtonView: BaseView { // MARK: - Setup - + + init(mainTitle: String, subTitle: String) { + super.init(frame: .zero) + + mainTitleLabel.setText(mainTitle, style: .body03, color: .gray8) + subTitleLabel.setText(subTitle, style: .caption02, color: .gray5) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func setupView() { self.backgroundColor = .green1 @@ -58,22 +69,3 @@ class JoinButtonView: BaseView { } } } - - -// MARK: - Extension - -extension JoinButtonView { - func setJoinButtonViewStatus(isReceived: Bool) { - subTitleLabel.setText( - isReceived ? "초대 코드를 받았다면" : "초대 코드가 없다면", - style: .caption02, - color: .gray5 - ) - - mainTitleLabel.setText( - isReceived ? "초대 코드 입력하기" : "직접 모임 추가하기", - style: .body03, - color: .gray8 - ) - } -} From 4de114170222b17d1a715d63bce3ab66ccc57219 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 02:49:17 +0900 Subject: [PATCH 03/12] =?UTF-8?q?refactor/#277=20=EC=83=9D=EB=AA=85?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/CheckInviteCodeViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/MeetingCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift index 3ef08759..2f26a5b3 100644 --- a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift +++ b/KkuMulKum/Source/MeetingCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift @@ -17,6 +17,10 @@ class CheckInviteCodeViewController: BaseViewController { // MARK: LifeCycle + override func loadView() { + view = checkInviteCodeView + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -28,10 +32,6 @@ class CheckInviteCodeViewController: BaseViewController { navigationController?.isNavigationBarHidden = true } - - override func loadView() { - view = checkInviteCodeView - } // MARK: Setup From 3a0008f14ad49c3f03a3222a27f29d3251c4bf5a Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 02:58:05 +0900 Subject: [PATCH 04/12] =?UTF-8?q?refactor/#277=20serviceType=20serviceProt?= =?UTF-8?q?ocol=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 48 ++-- .../Network/Service/MeetingService.swift | 38 +++ .../Network/Service/PromiseService.swift | 245 ++++++++++++++++ .../View/CheckInviteCodeView.swift | 0 .../CheckInviteCode/View/JoinButtonView.swift | 0 .../CheckInviteCodeViewController.swift | 0 .../CreateMeetingServiceProtocol.swift | 16 ++ .../View/CreateMeetingView.swift | 0 .../CreateMeetingViewController.swift | 0 .../ViewModel/CreateMeetingViewModel.swift | 4 +- .../View/FinishCreateNavigationView.swift | 0 .../FinishCreateViewController.swift | 1 - .../InviteCodeServiceProtocol.swift | 14 + .../InviteCode/View/InviteCodeView.swift | 0 .../InviteCodeViewController.swift | 0 .../ViewModel/InviteCodeViewModel.swift | 4 +- .../CreateMeetingServiceType.swift | 28 -- .../ServiceType/InviteCodeServiceType.swift | 40 --- .../PromiseServiceProtocol.swift | 23 ++ .../ServiceType/PromiseServiceType.swift | 267 ------------------ .../Promise/ViewModel/PromiseViewModel.swift | 4 +- 21 files changed, 366 insertions(+), 366 deletions(-) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/CheckInviteCode/View/CheckInviteCodeView.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/CheckInviteCode/View/JoinButtonView.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift (100%) create mode 100644 KkuMulKum/Source/AddMeeting/CreateMeeting/ServiceProtocol/CreateMeetingServiceProtocol.swift rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/CreateMeeting/View/CreateMeetingView.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/CreateMeeting/ViewController/CreateMeetingViewController.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/CreateMeeting/ViewModel/CreateMeetingViewModel.swift (94%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/FinishCreate/View/FinishCreateNavigationView.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/FinishCreate/ViewController/FinishCreateViewController.swift (97%) create mode 100644 KkuMulKum/Source/AddMeeting/InviteCode/ServiceProtocol/InviteCodeServiceProtocol.swift rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/InviteCode/View/InviteCodeView.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/InviteCode/ViewController/InviteCodeViewController.swift (100%) rename KkuMulKum/Source/{MeetingCreate => AddMeeting}/InviteCode/ViewModel/InviteCodeViewModel.swift (95%) delete mode 100644 KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift delete mode 100644 KkuMulKum/Source/MeetingCreate/InviteCode/ServiceType/InviteCodeServiceType.swift create mode 100644 KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift delete mode 100644 KkuMulKum/Source/Promise/ServiceType/PromiseServiceType.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index fee606c9..ee06cbea 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -108,7 +108,7 @@ DD3072262C3C0F0B00416D9F /* TardyInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* TardyInfoModel.swift */; }; DD3976682C41769400E2A4C4 /* CreateMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */; }; DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */; }; - DD39766F2C41B54400E2A4C4 /* InviteCodeServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766E2C41B54400E2A4C4 /* InviteCodeServiceType.swift */; }; + DD39766F2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766E2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift */; }; DD3976832C41C2AD00E2A4C4 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */; }; DD3976842C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976792C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift */; }; DD3976862C41C2AD00E2A4C4 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39767D2C41C2AD00E2A4C4 /* HomeView.swift */; }; @@ -123,7 +123,7 @@ DD3F9DD22C485753008E1FF7 /* UtilService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD12C485753008E1FF7 /* UtilService.swift */; }; DD3F9DD42C4858A3008E1FF7 /* UtilTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD32C4858A3008E1FF7 /* UtilTargetType.swift */; }; DD3F9DD62C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD52C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift */; }; - DD3F9DD82C49C25D008E1FF7 /* PromiseServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD72C49C25D008E1FF7 /* PromiseServiceType.swift */; }; + DD3F9DD82C49C25D008E1FF7 /* PromiseServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DD72C49C25D008E1FF7 /* PromiseServiceProtocol.swift */; }; DD41BEFA2C41D4160095A068 /* TardyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD41BEF92C41D4160095A068 /* TardyView.swift */; }; DD41BEFC2C41D54D0095A068 /* TardyPenaltyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD41BEFB2C41D54D0095A068 /* TardyPenaltyView.swift */; }; DD41BEFF2C41DAA40095A068 /* TardyEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD41BEFE2C41DAA40095A068 /* TardyEmptyView.swift */; }; @@ -159,7 +159,7 @@ DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */; }; DDB0D7D32C469C77000CF782 /* PagePromiseSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB0D7D22C469C77000CF782 /* PagePromiseSegmentedControl.swift */; }; DDD62FFB2C5FA4FE00174B57 /* MeetingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD62FFA2C5FA4FE00174B57 /* MeetingService.swift */; }; - DDD62FFC2C5FA54100174B57 /* CreateMeetingServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceType.swift */; }; + DDD62FFC2C5FA54100174B57 /* CreateMeetingServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceProtocol.swift */; }; DDE7D2C62C47D2BB005A921F /* MeetingTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE7D2C52C47D2BB005A921F /* MeetingTargetType.swift */; }; DDE7D2CA2C47EE81005A921F /* PromiseTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE7D2C92C47EE81005A921F /* PromiseTargetType.swift */; }; DDE7D2CC2C47F073005A921F /* PlaceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE9E18992C3BCCBE00DB76B4 /* PlaceModel.swift */; }; @@ -296,8 +296,8 @@ DD3072252C3C0F0B00416D9F /* TardyInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyInfoModel.swift; sourceTree = ""; }; DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingViewModel.swift; sourceTree = ""; }; DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateNavigationView.swift; sourceTree = ""; }; - DD39766E2C41B54400E2A4C4 /* InviteCodeServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeServiceType.swift; sourceTree = ""; }; - DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingServiceType.swift; sourceTree = ""; }; + DD39766E2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeServiceProtocol.swift; sourceTree = ""; }; + DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingServiceProtocol.swift; sourceTree = ""; }; DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; DD3976792C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingPromiseCollecitonViewCell.swift; sourceTree = ""; }; DD39767D2C41C2AD00E2A4C4 /* HomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; @@ -312,7 +312,7 @@ DD3F9DD12C485753008E1FF7 /* UtilService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilService.swift; sourceTree = ""; }; DD3F9DD32C4858A3008E1FF7 /* UtilTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilTargetType.swift; sourceTree = ""; }; DD3F9DD52C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterMeetingsResponseModel.swift; sourceTree = ""; }; - DD3F9DD72C49C25D008E1FF7 /* PromiseServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseServiceType.swift; sourceTree = ""; }; + DD3F9DD72C49C25D008E1FF7 /* PromiseServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseServiceProtocol.swift; sourceTree = ""; }; DD41BEF92C41D4160095A068 /* TardyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyView.swift; sourceTree = ""; }; DD41BEFB2C41D54D0095A068 /* TardyPenaltyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyPenaltyView.swift; sourceTree = ""; }; DD41BEFE2C41DAA40095A068 /* TardyEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyEmptyView.swift; sourceTree = ""; }; @@ -785,20 +785,20 @@ path = ViewController; sourceTree = ""; }; - DD3976702C41B54800E2A4C4 /* ServiceType */ = { + DD3976702C41B54800E2A4C4 /* ServiceProtocol */ = { isa = PBXGroup; children = ( - DD39766E2C41B54400E2A4C4 /* InviteCodeServiceType.swift */, + DD39766E2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift */, ); - path = ServiceType; + path = ServiceProtocol; sourceTree = ""; }; - DD3976712C41B6B100E2A4C4 /* ServiceType */ = { + DD3976712C41B6B100E2A4C4 /* ServiceProtocol */ = { isa = PBXGroup; children = ( - DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceType.swift */, + DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceProtocol.swift */, ); - path = ServiceType; + path = ServiceProtocol; sourceTree = ""; }; DD3976752C41C2AD00E2A4C4 /* Home */ = { @@ -898,15 +898,15 @@ path = ServiceType; sourceTree = ""; }; - DD3F9DD92C49CF05008E1FF7 /* ServiceType */ = { + DD3F9DD92C49CF05008E1FF7 /* ServiceProtocol */ = { isa = PBXGroup; children = ( - DD3F9DD72C49C25D008E1FF7 /* PromiseServiceType.swift */, + DD3F9DD72C49C25D008E1FF7 /* PromiseServiceProtocol.swift */, ); - path = ServiceType; + path = ServiceProtocol; sourceTree = ""; }; - DD43936B2C412F4500EC1799 /* MeetingCreate */ = { + DD43936B2C412F4500EC1799 /* AddMeeting */ = { isa = PBXGroup; children = ( DD4393812C4162CA00EC1799 /* CheckInviteCode */, @@ -914,13 +914,13 @@ DD43936C2C412F4500EC1799 /* InviteCode */, DD4393712C412F4500EC1799 /* FinishCreate */, ); - path = MeetingCreate; + path = AddMeeting; sourceTree = ""; }; DD43936C2C412F4500EC1799 /* InviteCode */ = { isa = PBXGroup; children = ( - DD3976702C41B54800E2A4C4 /* ServiceType */, + DD3976702C41B54800E2A4C4 /* ServiceProtocol */, DD4393872C41637D00EC1799 /* ViewController */, DD4393882C41638500EC1799 /* View */, DD4393892C41638A00EC1799 /* ViewModel */, @@ -966,7 +966,7 @@ DD4393842C41630200EC1799 /* CreateMeeting */ = { isa = PBXGroup; children = ( - DD3976712C41B6B100E2A4C4 /* ServiceType */, + DD3976712C41B6B100E2A4C4 /* ServiceProtocol */, DD4393852C41632100EC1799 /* ViewController */, DD4393862C41632800EC1799 /* View */, DD3976692C41769900E2A4C4 /* ViewModel */, @@ -1109,7 +1109,7 @@ DDAF1C872C3D6E3D008A37D3 /* Promise */ = { isa = PBXGroup; children = ( - DD3F9DD92C49CF05008E1FF7 /* ServiceType */, + DD3F9DD92C49CF05008E1FF7 /* ServiceProtocol */, DD39768F2C41CAC700E2A4C4 /* ViewModel */, DD39768D2C41CA0700E2A4C4 /* PagePromise */, DD1FD0322C5CCF7700D0A72C /* PromiseInfo */, @@ -1218,7 +1218,7 @@ DDA2EE7E2C3860B2007C6059 /* Core */, DD865B652C3920F600C351A2 /* Onboarding */, DD3976752C41C2AD00E2A4C4 /* Home */, - DD43936B2C412F4500EC1799 /* MeetingCreate */, + DD43936B2C412F4500EC1799 /* AddMeeting */, A3DD9C3C2C41BAD000E58A13 /* MeetingList */, DE6D4D0E2C3F14D80005584B /* MeetingInfo */, DECB844E2C43FB200022A003 /* AddPromise */, @@ -1709,7 +1709,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DDD62FFC2C5FA54100174B57 /* CreateMeetingServiceType.swift in Sources */, + DDD62FFC2C5FA54100174B57 /* CreateMeetingServiceProtocol.swift in Sources */, DDE7D2CC2C47F073005A921F /* PlaceModel.swift in Sources */, DEFBEBD12C46B33000437188 /* SelectCapsuleButton.swift in Sources */, DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, @@ -1775,7 +1775,7 @@ DD3F9DD02C48571A008E1FF7 /* MeetingListServiceType.swift in Sources */, A39F2B212C499CE5008DA5F5 /* SetReadyStatusInfoServiceType.swift in Sources */, DE6D4D132C3F14D80005584B /* MeetingMemberCell.swift in Sources */, - DD3F9DD82C49C25D008E1FF7 /* PromiseServiceType.swift in Sources */, + DD3F9DD82C49C25D008E1FF7 /* PromiseServiceProtocol.swift in Sources */, DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */, 789D73BE2C47FE0F00C7077D /* AuthInterceptor.swift in Sources */, 789D73B32C47CC6D00C7077D /* LocalNotificationManager.swift in Sources */, @@ -1815,7 +1815,7 @@ DD1FD0302C5CCB4400D0A72C /* ReadyStatusViewController.swift in Sources */, DDB0D7D32C469C77000CF782 /* PagePromiseSegmentedControl.swift in Sources */, 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, - DD39766F2C41B54400E2A4C4 /* InviteCodeServiceType.swift in Sources */, + DD39766F2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift in Sources */, DE6D4D172C3F14D80005584B /* MeetingInfoViewModel.swift in Sources */, 78AED1372C3D98D1000AD80A /* NicknameView.swift in Sources */, DECB845A2C43FC140022A003 /* AddPromiseView.swift in Sources */, diff --git a/KkuMulKum/Network/Service/MeetingService.swift b/KkuMulKum/Network/Service/MeetingService.swift index bbeb9ad7..c66c3adc 100644 --- a/KkuMulKum/Network/Service/MeetingService.swift +++ b/KkuMulKum/Network/Service/MeetingService.swift @@ -39,3 +39,41 @@ final class MeetingService { } } } + +extension MeetingService: CreateMeetingServiceProtocol { + func createMeeting( + request: MakeMeetingsRequestModel + ) async throws -> ResponseBodyDTO? { + return try await self.request( + with: .createMeeting( + request: request + ) + ) + } +} + +extension MeetingService: InviteCodeServiceProtocol { + func joinMeeting( + with request: RegisterMeetingsModel + ) async throws -> ResponseBodyDTO? { + return try await self.request( + with: .joinMeeting( + request: request + ) + ) + } +} + +final class MockInviteCodeService: InviteCodeServiceProtocol { + func joinMeeting(with request: RegisterMeetingsModel) -> ResponseBodyDTO? { + let mockData = RegisterMeetingsResponseModel( + meetingID: 1 + ) + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } +} diff --git a/KkuMulKum/Network/Service/PromiseService.swift b/KkuMulKum/Network/Service/PromiseService.swift index f60eff61..d9b5b5c5 100644 --- a/KkuMulKum/Network/Service/PromiseService.swift +++ b/KkuMulKum/Network/Service/PromiseService.swift @@ -39,3 +39,248 @@ final class PromiseService { } } } + +extension PromiseService: PromiseServiceProtocol { + func fetchTardyInfo(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .fetchTardyInfo( + promiseID: promiseID + ) + ) + } + + func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updatePromiseCompletion( + promiseID: promiseID + ) + ) + } + + func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .fetchPromiseInfo( + promiseID: promiseId + ) + ) + } + + func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updatePreparationStatus( + promiseID: promiseID + ) + ) + } + + func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updateDepartureStatus( + promiseID: promiseID + ) + ) + } + + func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .updateArrivalStatus( + promiseID: promiseID + ) + ) + } + + func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .fetchMyReadyStatus( + promiseID: promiseID + ) + ) + } + + func fetchPromiseParticipantList(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request( + with: .fetchPromiseParticipantList( + promiseID: promiseID + ) + ) + } +} + +final class MockPromiseService: PromiseServiceProtocol { + func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? { + let mockData = PromiseInfoModel( + promiseID: 1, + promiseName: "냐미", + placeName: "우리집 앞", + address: "경기도 용인시 수지구 대지로 72", + roadAddress: "경기도 용인시 수지구 대지로 72", + time: "2024년 7월 24일 오후 10시 30분", + dressUpLevel: "LV 2. 냐미", + penalty: "냐미" + ) + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } + + func fetchTardyInfo(with promiseID: Int) -> ResponseBodyDTO? { + let mockData = TardyInfoModel( + penalty: "티라미수 케익 릴스", + isPastDue: true, + lateComers: [Comer( + participantId: 1, + name: "유짐이", + profileImageURL: "" + ), + Comer( + participantId: 1, + name: "유짐이", + profileImageURL: "" + ), + Comer( + participantId: 1, + name: "유짐이", + profileImageURL: "" + ), + Comer( + participantId: 1, + name: "유짐이", + profileImageURL: "" + ), + Comer( + participantId: 1, + name: "유짐이", + profileImageURL: "" + )] + ) + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } + + func updatePromiseCompletion(with promiseID: Int) -> ResponseBodyDTO? { + let mockData = EmptyModel() + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } + + func getPromiseTardyInfo(with promiseID: Int) -> ResponseBodyDTO? { + let mockData = TardyInfoModel( + penalty: "티라미수 케익 릴스", + isPastDue: true, + lateComers: [Comer( + participantId: 1, + name: "유짐이", + profileImageURL: "" + )] + ) + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } + + func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? { + let mockData = EmptyModel() + + return ResponseBodyDTO( + success: true, + data: mockData, + error: nil + ) + } + + func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + let mockData = EmptyModel() + + return ResponseBodyDTO( + success: true, + data: mockData, + error: nil + ) + } + + func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + let mockData = EmptyModel() + + return ResponseBodyDTO( + success: true, + data: mockData, + error: nil + ) + } + + func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { + let mockData = EmptyModel() + + return ResponseBodyDTO( + success: true, + data: mockData, + error: nil + ) + } + + func fetchMyReadyStatus(with promiseID: Int) -> ResponseBodyDTO? { + let mockData = MyReadyStatusModel( + promiseTime: "", + preparationTime: 300, + travelTime: 230, + preparationStartAt: "AM 11:00", + departureAt: "PM 1:30", + arrivalAt: "PM 2:00" + ) + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } + + func fetchPromiseParticipantList(with promiseID: Int) -> ResponseBodyDTO? { + let mockData = PromiseParticipantListModel( + participantCount: 3, + participants: [ + Participant( + participantId: 1, + memberId: 3, + name: "안꾸물이", + state: "도착", + profileImageURL: nil + ), + Participant( + participantId: 2, + memberId: 4, + name: "꾸우우우웅물이", + state: "도착", + profileImageURL: nil + ), + Participant( + participantId: 3, + memberId: 5, + name: "꾸물이", + state: "이동중", + profileImageURL: nil + ) + ] + ) + + return ResponseBodyDTO.init( + success: true, + data: mockData, + error: nil + ) + } +} diff --git a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/CheckInviteCodeView.swift b/KkuMulKum/Source/AddMeeting/CheckInviteCode/View/CheckInviteCodeView.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/CheckInviteCodeView.swift rename to KkuMulKum/Source/AddMeeting/CheckInviteCode/View/CheckInviteCodeView.swift diff --git a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/JoinButtonView.swift b/KkuMulKum/Source/AddMeeting/CheckInviteCode/View/JoinButtonView.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/CheckInviteCode/View/JoinButtonView.swift rename to KkuMulKum/Source/AddMeeting/CheckInviteCode/View/JoinButtonView.swift diff --git a/KkuMulKum/Source/MeetingCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift rename to KkuMulKum/Source/AddMeeting/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ServiceProtocol/CreateMeetingServiceProtocol.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ServiceProtocol/CreateMeetingServiceProtocol.swift new file mode 100644 index 00000000..c4c1a0ad --- /dev/null +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ServiceProtocol/CreateMeetingServiceProtocol.swift @@ -0,0 +1,16 @@ +// +// CreateMeetingServiceProtocol.swift +// KkuMulKum +// +// Created by YOUJIM on 7/13/24. +// + +import Foundation + +import Moya + +protocol CreateMeetingServiceProtocol { + func createMeeting( + request: MakeMeetingsRequestModel + ) async throws -> ResponseBodyDTO? +} diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/View/CreateMeetingView.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/View/CreateMeetingView.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/CreateMeeting/View/CreateMeetingView.swift rename to KkuMulKum/Source/AddMeeting/CreateMeeting/View/CreateMeetingView.swift diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewController/CreateMeetingViewController.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewController/CreateMeetingViewController.swift rename to KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift similarity index 94% rename from KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift rename to KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift index ca3612af..ad950708 100644 --- a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ViewModel/CreateMeetingViewModel.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift @@ -24,14 +24,14 @@ class CreateMeetingViewModel { let inviteCode = ObservablePattern("") let characterCount = ObservablePattern("0/10") let inviteCodeState = ObservablePattern(.empty) - let createMeetingService: CreateMeetingServiceType + let createMeetingService: CreateMeetingServiceProtocol private (set) var meetingID: Int = 0 // MARK: Initialize - init(createMeetingService: CreateMeetingServiceType) { + init(createMeetingService: CreateMeetingServiceProtocol) { self.createMeetingService = createMeetingService } } diff --git a/KkuMulKum/Source/MeetingCreate/FinishCreate/View/FinishCreateNavigationView.swift b/KkuMulKum/Source/AddMeeting/FinishCreate/View/FinishCreateNavigationView.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/FinishCreate/View/FinishCreateNavigationView.swift rename to KkuMulKum/Source/AddMeeting/FinishCreate/View/FinishCreateNavigationView.swift diff --git a/KkuMulKum/Source/MeetingCreate/FinishCreate/ViewController/FinishCreateViewController.swift b/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift similarity index 97% rename from KkuMulKum/Source/MeetingCreate/FinishCreate/ViewController/FinishCreateViewController.swift rename to KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift index ab5034c0..f588ff1d 100644 --- a/KkuMulKum/Source/MeetingCreate/FinishCreate/ViewController/FinishCreateViewController.swift +++ b/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift @@ -110,7 +110,6 @@ class FinishCreateViewController: BaseViewController { private extension FinishCreateViewController { @objc func presentMeetingInfoViewControllerDidTapped() { - // TODO: 서버 연결할 때 데이터 바인딩해서 화면 전환 시키기 let meetingInfoViewController = MeetingInfoViewController( viewModel: MeetingInfoViewModel( meetingID: self.meetingID, diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/ServiceProtocol/InviteCodeServiceProtocol.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ServiceProtocol/InviteCodeServiceProtocol.swift new file mode 100644 index 00000000..9afa8a97 --- /dev/null +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ServiceProtocol/InviteCodeServiceProtocol.swift @@ -0,0 +1,14 @@ +// +// InviteCodeServiceProtocol.swift +// KkuMulKum +// +// Created by YOUJIM on 7/13/24. +// + +import Foundation + +protocol InviteCodeServiceProtocol { + func joinMeeting( + with request: RegisterMeetingsModel + ) async throws -> ResponseBodyDTO? +} diff --git a/KkuMulKum/Source/MeetingCreate/InviteCode/View/InviteCodeView.swift b/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/InviteCode/View/InviteCodeView.swift rename to KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift diff --git a/KkuMulKum/Source/MeetingCreate/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift similarity index 100% rename from KkuMulKum/Source/MeetingCreate/InviteCode/ViewController/InviteCodeViewController.swift rename to KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift diff --git a/KkuMulKum/Source/MeetingCreate/InviteCode/ViewModel/InviteCodeViewModel.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift similarity index 95% rename from KkuMulKum/Source/MeetingCreate/InviteCode/ViewModel/InviteCodeViewModel.swift rename to KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift index a6e83c3c..2a964899 100644 --- a/KkuMulKum/Source/MeetingCreate/InviteCode/ViewModel/InviteCodeViewModel.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift @@ -25,11 +25,11 @@ class InviteCodeViewModel { let inviteCodeState = ObservablePattern(.empty) let isNextButtonEnabled = ObservablePattern(false) - private let service: InviteCodeServiceType + private let service: InviteCodeServiceProtocol // MARK: Initialize - init(service: InviteCodeServiceType) { + init(service: InviteCodeServiceProtocol) { self.service = service } } diff --git a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift b/KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift deleted file mode 100644 index 3ea8ce56..00000000 --- a/KkuMulKum/Source/MeetingCreate/CreateMeeting/ServiceType/CreateMeetingServiceType.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// MeetingService.swift -// KkuMulKum -// -// Created by YOUJIM on 7/13/24. -// - -import Foundation - -import Moya - -protocol CreateMeetingServiceType { - func createMeeting( - request: MakeMeetingsRequestModel - ) async throws -> ResponseBodyDTO? -} - -extension MeetingService: CreateMeetingServiceType { - func createMeeting( - request: MakeMeetingsRequestModel - ) async throws -> ResponseBodyDTO? { - return try await self.request( - with: .createMeeting( - request: request - ) - ) - } -} diff --git a/KkuMulKum/Source/MeetingCreate/InviteCode/ServiceType/InviteCodeServiceType.swift b/KkuMulKum/Source/MeetingCreate/InviteCode/ServiceType/InviteCodeServiceType.swift deleted file mode 100644 index 65f2d4c5..00000000 --- a/KkuMulKum/Source/MeetingCreate/InviteCode/ServiceType/InviteCodeServiceType.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// InviteCodeService.swift -// KkuMulKum -// -// Created by YOUJIM on 7/13/24. -// - -import Foundation - -protocol InviteCodeServiceType { - func joinMeeting( - with request: RegisterMeetingsModel - ) async throws -> ResponseBodyDTO? -} - -extension MeetingService: InviteCodeServiceType { - func joinMeeting( - with request: RegisterMeetingsModel - ) async throws -> ResponseBodyDTO? { - return try await self.request( - with: .joinMeeting( - request: request - ) - ) - } -} - -final class MockInviteCodeService: InviteCodeServiceType { - func joinMeeting(with request: RegisterMeetingsModel) -> ResponseBodyDTO? { - let mockData = RegisterMeetingsResponseModel( - meetingID: 1 - ) - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } -} diff --git a/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift b/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift new file mode 100644 index 00000000..5eb37028 --- /dev/null +++ b/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift @@ -0,0 +1,23 @@ +// +// PromiseServiceProtocol.swift +// KkuMulKum +// +// Created by YOUJIM on 7/19/24. +// + +import Foundation + +protocol PromiseServiceProtocol { + /// 약속 정보 + func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? + /// 준비 현황 + func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + func fetchPromiseParticipantList(with promiseID: Int) async throws -> ResponseBodyDTO? + func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + /// 지각 꾸물이 + func fetchTardyInfo(with promiseID: Int) async throws -> ResponseBodyDTO? + func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? +} + diff --git a/KkuMulKum/Source/Promise/ServiceType/PromiseServiceType.swift b/KkuMulKum/Source/Promise/ServiceType/PromiseServiceType.swift deleted file mode 100644 index 4bd617ce..00000000 --- a/KkuMulKum/Source/Promise/ServiceType/PromiseServiceType.swift +++ /dev/null @@ -1,267 +0,0 @@ -// -// PromiseServiceType.swift -// KkuMulKum -// -// Created by YOUJIM on 7/19/24. -// - -import Foundation - -protocol PromiseServiceType { - /// 약속 정보 - func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? - /// 준비 현황 - func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO? - func fetchPromiseParticipantList(with promiseID: Int) async throws -> ResponseBodyDTO? - func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? - func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? - func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? - /// 지각 꾸물이 - func fetchTardyInfo(with promiseID: Int) async throws -> ResponseBodyDTO? - func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? -} - -extension PromiseService: PromiseServiceType { - func fetchTardyInfo(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchTardyInfo( - promiseID: promiseID - ) - ) - } - - func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updatePromiseCompletion( - promiseID: promiseID - ) - ) - } - - func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchPromiseInfo( - promiseID: promiseId - ) - ) - } - - func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updatePreparationStatus( - promiseID: promiseID - ) - ) - } - - func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updateDepartureStatus( - promiseID: promiseID - ) - ) - } - - func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updateArrivalStatus( - promiseID: promiseID - ) - ) - } - - func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchMyReadyStatus( - promiseID: promiseID - ) - ) - } - - func fetchPromiseParticipantList(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchPromiseParticipantList( - promiseID: promiseID - ) - ) - } -} - -final class MockPromiseService: PromiseServiceType { - func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? { - let mockData = PromiseInfoModel( - promiseID: 1, - promiseName: "냐미", - placeName: "우리집 앞", - address: "경기도 용인시 수지구 대지로 72", - roadAddress: "경기도 용인시 수지구 대지로 72", - time: "2024년 7월 24일 오후 10시 30분", - dressUpLevel: "LV 2. 냐미", - penalty: "냐미" - ) - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } - - func fetchTardyInfo(with promiseID: Int) -> ResponseBodyDTO? { - let mockData = TardyInfoModel( - penalty: "티라미수 케익 릴스", - isPastDue: true, - lateComers: [Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - )] - ) - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } - - func updatePromiseCompletion(with promiseID: Int) -> ResponseBodyDTO? { - let mockData = EmptyModel() - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } - - func getPromiseTardyInfo(with promiseID: Int) -> ResponseBodyDTO? { - let mockData = TardyInfoModel( - penalty: "티라미수 케익 릴스", - isPastDue: true, - lateComers: [Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - )] - ) - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } - - func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? { - let mockData = EmptyModel() - - return ResponseBodyDTO( - success: true, - data: mockData, - error: nil - ) - } - - func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - let mockData = EmptyModel() - - return ResponseBodyDTO( - success: true, - data: mockData, - error: nil - ) - } - - func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - let mockData = EmptyModel() - - return ResponseBodyDTO( - success: true, - data: mockData, - error: nil - ) - } - - func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - let mockData = EmptyModel() - - return ResponseBodyDTO( - success: true, - data: mockData, - error: nil - ) - } - - func fetchMyReadyStatus(with promiseID: Int) -> ResponseBodyDTO? { - let mockData = MyReadyStatusModel( - promiseTime: "", - preparationTime: 300, - travelTime: 230, - preparationStartAt: "AM 11:00", - departureAt: "PM 1:30", - arrivalAt: "PM 2:00" - ) - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } - - func fetchPromiseParticipantList(with promiseID: Int) -> ResponseBodyDTO? { - let mockData = PromiseParticipantListModel( - participantCount: 3, - participants: [ - Participant( - participantId: 1, - memberId: 3, - name: "안꾸물이", - state: "도착", - profileImageURL: nil - ), - Participant( - participantId: 2, - memberId: 4, - name: "꾸우우우웅물이", - state: "도착", - profileImageURL: nil - ), - Participant( - participantId: 3, - memberId: 5, - name: "꾸물이", - state: "이동중", - profileImageURL: nil - ) - ] - ) - - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) - } -} diff --git a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift index d3e6d4d3..46c0ce3f 100644 --- a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift +++ b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift @@ -68,12 +68,12 @@ class PromiseViewModel { $0.pmSymbol = "PM" } - private let service: PromiseServiceType + private let service: PromiseServiceProtocol // MARK: Initialize - init(promiseID: Int, service: PromiseServiceType) { + init(promiseID: Int, service: PromiseServiceProtocol) { self.service = service self.promiseID = promiseID } From eeed63d76577d0350e378d22ce7d5ff20532c69b Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 03:22:55 +0900 Subject: [PATCH 05/12] =?UTF-8?q?refactor/#277=20=EC=83=9D=EB=AA=85=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=EB=8C=80=EB=A1=9C=20=EC=88=9C=EC=84=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20=EB=B0=8F=20didtapped=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=9D=B4=EB=A6=84=20didtap=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 2 +- .../CreateMeetingViewController.swift | 33 ++++++++---------- .../FinishCreateViewController.swift | 9 +++-- .../InviteCodeViewController.swift | 25 ++++++-------- .../PromiseViewController.swift | 27 +++++---------- .../PromiseInfoViewController.swift | 6 ++++ .../ReadyStatusViewController.swift | 34 +++++++++++++------ .../ViewController/TardyViewController.swift | 20 +++++------ 8 files changed, 78 insertions(+), 78 deletions(-) diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index ee06cbea..090f497d 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -1083,8 +1083,8 @@ DD931B682C3D9DAD00526452 /* Tardy */ = { isa = PBXGroup; children = ( - DD1FD02C2C5CC6DE00D0A72C /* View */, DD3976972C41CC3300E2A4C4 /* ViewController */, + DD1FD02C2C5CC6DE00D0A72C /* View */, ); path = Tardy; sourceTree = ""; diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift index 3c124354..ad19c327 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift @@ -16,7 +16,7 @@ class CreateMeetingViewController: BaseViewController { private let createMeetingView: CreateMeetingView = CreateMeetingView() - // MARK: Initialize + // MARK: - LifeCycle init(viewModel: CreateMeetingViewModel) { self.createMeetingViewModel = viewModel @@ -28,8 +28,15 @@ class CreateMeetingViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } + override func loadView() { + view = createMeetingView + } - // MARK: - LifeCycle + override func viewDidLoad() { + super.viewDidLoad() + + setupBinding() + } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -43,16 +50,6 @@ class CreateMeetingViewController: BaseViewController { navigationController?.isNavigationBarHidden = true } - - override func loadView() { - view = createMeetingView - } - - override func viewDidLoad() { - super.viewDidLoad() - - setupBinding() - } // MARK: - Setup @@ -70,7 +67,7 @@ class CreateMeetingViewController: BaseViewController { ) createMeetingView.presentButton.addTarget( self, - action: #selector(presentButtonDidTapped), + action: #selector(presentButtonDidTap), for: .touchUpInside ) view.addGestureRecognizer( @@ -113,7 +110,7 @@ private extension CreateMeetingViewController { } @objc - func presentButtonDidTapped() { + func presentButtonDidTap() { let inviteCodePopUpViewController = InvitationCodePopUpViewController( invitationCode: createMeetingViewModel.inviteCode.value ) @@ -133,7 +130,7 @@ private extension CreateMeetingViewController { } @objc - private func copyButtonDidTapped() { + private func copyButtonDidTap() { UIPasteboard.general.string = createMeetingViewModel.inviteCode.value let finishCreateViewController = FinishCreateViewController(meetingID: createMeetingViewModel.meetingID) @@ -142,7 +139,7 @@ private extension CreateMeetingViewController { } @objc - private func inviteLaterButtonDidTapped() { + private func inviteLaterButtonDidTap() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { let finishCreateViewController = FinishCreateViewController(meetingID: self.createMeetingViewModel.meetingID) @@ -159,13 +156,13 @@ private extension CreateMeetingViewController { private func setupPopUpAction(view: InvitationCodePopUpView) { view.copyButton.addTarget( self, - action: #selector(copyButtonDidTapped), + action: #selector(copyButtonDidTap), for: .touchUpInside ) view.inviteLaterButton.addTarget( self, - action: #selector(inviteLaterButtonDidTapped), + action: #selector(inviteLaterButtonDidTap), for: .touchUpInside ) } diff --git a/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift b/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift index f588ff1d..f4c61bf5 100644 --- a/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift +++ b/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift @@ -34,7 +34,7 @@ class FinishCreateViewController: BaseViewController { } - // MARK: - Initialize + // MARK: - LifeCycle init(meetingID: Int) { self.meetingID = meetingID @@ -46,8 +46,6 @@ class FinishCreateViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } - // MARK: - LifeCycle - override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -55,6 +53,7 @@ class FinishCreateViewController: BaseViewController { self.navigationItem.hidesBackButton = true } + // MARK: - Setup override func setupView() { @@ -98,7 +97,7 @@ class FinishCreateViewController: BaseViewController { override func setupAction() { confirmButton.addTarget( self, - action: #selector(presentMeetingInfoViewControllerDidTapped), + action: #selector(presentMeetingInfoViewControllerDidTap), for: .touchUpInside ) } @@ -109,7 +108,7 @@ class FinishCreateViewController: BaseViewController { private extension FinishCreateViewController { @objc - func presentMeetingInfoViewControllerDidTapped() { + func presentMeetingInfoViewControllerDidTap() { let meetingInfoViewController = MeetingInfoViewController( viewModel: MeetingInfoViewModel( meetingID: self.meetingID, diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift index ce578cb2..c9464d6a 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift @@ -17,8 +17,8 @@ class InviteCodeViewController: BaseViewController { private let inviteCodeView: InviteCodeView = InviteCodeView() - // MARK: Initialize - + // MARK: - LifeCycle + init(viewModel: InviteCodeViewModel) { self.inviteCodeViewModel = viewModel super.init(nibName: nil, bundle: nil) @@ -28,8 +28,16 @@ class InviteCodeViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } + override func loadView() { + view = inviteCodeView + } - // MARK: - LifeCycle + override func viewDidLoad() { + super.viewDidLoad() + + setupBinding() + setupTapGesture() + } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -43,17 +51,6 @@ class InviteCodeViewController: BaseViewController { navigationController?.isNavigationBarHidden = true } - override func loadView() { - view = inviteCodeView - } - - override func viewDidLoad() { - super.viewDidLoad() - - setupBinding() - setupTapGesture() - } - // MARK: - Setup diff --git a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift index c62c5de3..fc81e712 100644 --- a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift +++ b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift @@ -32,24 +32,16 @@ class PromiseViewController: BaseViewController { ) - // MARK: Initializer - + // MARK: - LifeCycle + init(viewModel: PromiseViewModel) { self.viewModel = viewModel viewModel.fetchPromiseInfo(promiseID: viewModel.promiseID) - promiseInfoViewController = PromiseInfoViewController( - viewModel: viewModel - ) - - readyStatusViewController = ReadyStatusViewController( - viewModel: viewModel - ) - - tardyViewController = TardyViewController( - viewModel: viewModel - ) + promiseInfoViewController = PromiseInfoViewController(viewModel: viewModel) + readyStatusViewController = ReadyStatusViewController(viewModel: viewModel) + tardyViewController = TardyViewController(viewModel: viewModel) promiseViewControllerList = [ promiseInfoViewController, @@ -64,9 +56,6 @@ class PromiseViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } - - // MARK: - LifeCycle - override func viewDidLoad() { super.viewDidLoad() @@ -130,13 +119,13 @@ class PromiseViewController: BaseViewController { tardyViewController.tardyView.finishMeetingButton.addTarget( self, - action: #selector(finishMeetingButtonDidTapped), + action: #selector(finishMeetingButtonDidTap), for: .touchUpInside ) tardyViewController.arriveView.finishMeetingButton.addTarget( self, - action: #selector(finishMeetingButtonDidTapped), + action: #selector(finishMeetingButtonDidTap), for: .touchUpInside ) } @@ -173,7 +162,7 @@ extension PromiseViewController { } @objc - func finishMeetingButtonDidTapped() { + func finishMeetingButtonDidTap() { tardyViewController.viewModel.updatePromiseCompletion() navigationController?.popViewController(animated: true) diff --git a/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift b/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift index 008db3d0..579a7096 100644 --- a/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift +++ b/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift @@ -17,6 +17,9 @@ class PromiseInfoViewController: BaseViewController { private let viewModel: PromiseViewModel private let promiseInfoView: PromiseInfoView = PromiseInfoView() + + // MARK: - LifeCycle + init(viewModel: PromiseViewModel) { self.viewModel = viewModel @@ -38,6 +41,9 @@ class PromiseInfoViewController: BaseViewController { viewModel.fetchPromiseParticipantList() } + + // MARK: - Setup + override func setupDelegate() { promiseInfoView.participantCollectionView.delegate = self promiseInfoView.participantCollectionView.dataSource = self diff --git a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift index 088edfc6..24fdff30 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift @@ -10,10 +10,16 @@ import UIKit import Kingfisher class ReadyStatusViewController: BaseViewController { - private let viewModel: PromiseViewModel + + + // MARK: Property + private let viewModel: PromiseViewModel private let rootView: ReadyStatusView = ReadyStatusView() + + // MARK: - LifeCycle + init(viewModel: PromiseViewModel) { self.viewModel = viewModel @@ -48,6 +54,9 @@ class ReadyStatusViewController: BaseViewController { rootView.updateCollectionViewHeight() } + + // MARK: - Setup + override func setupDelegate() { rootView.ourReadyStatusCollectionView.dataSource = self } @@ -55,47 +64,52 @@ class ReadyStatusViewController: BaseViewController { override func setupAction() { rootView.myReadyStatusProgressView.readyStartButton.addTarget( self, - action: #selector(readyStartButtonDidTapped), + action: #selector(readyStartButtonDidTap), for: .touchUpInside ) rootView.myReadyStatusProgressView.moveStartButton.addTarget( self, - action: #selector(moveStartButtonDidTapped), + action: #selector(moveStartButtonDidTap), for: .touchUpInside ) rootView.myReadyStatusProgressView.arrivalButton.addTarget( self, - action: #selector(arrivalButtonDidTapped), + action: #selector(arrivalButtonDidTap), for: .touchUpInside ) rootView.enterReadyButtonView.addGestureRecognizer( UITapGestureRecognizer( target: self, - action: #selector(enterReadyButtonDidTapped) + action: #selector(enterReadyButtonDidTap) ) ) } - +} + + +// MARK: - Extension + +extension ReadyStatusViewController { @objc - func readyStartButtonDidTapped() { + func readyStartButtonDidTap() { viewModel.myReadyProgressStatus.value = .ready rootView.myReadyStatusProgressView.readyStartButton.isEnabled.toggle() } @objc - func moveStartButtonDidTapped() { + func moveStartButtonDidTap() { viewModel.myReadyProgressStatus.value = .move rootView.myReadyStatusProgressView.moveStartButton.isEnabled.toggle() } @objc - func arrivalButtonDidTapped() { + func arrivalButtonDidTap() { viewModel.myReadyProgressStatus.value = .done rootView.myReadyStatusProgressView.arrivalButton.isEnabled.toggle() } @objc - func enterReadyButtonDidTapped() { + func enterReadyButtonDidTap() { guard let _ = viewModel.promiseInfo.value?.promiseName else { return } guard let readyStatusInfo = viewModel.myReadyStatus.value else { return } diff --git a/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift b/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift index efb654e2..35302aa6 100644 --- a/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift +++ b/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift @@ -17,8 +17,8 @@ class TardyViewController: BaseViewController { let arriveView: ArriveView = ArriveView() - // MARK: Initialize - + // MARK: - LifeCycle + init(viewModel: PromiseViewModel) { self.viewModel = viewModel @@ -29,25 +29,23 @@ class TardyViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } - - // MARK: - Setup - override func loadView() { view = viewModel.isPastDue.value ? arriveView : tardyView } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - - } - override func viewDidLoad() { super.viewDidLoad() setupBinding() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + } + + + // MARK: - Setup + override func setupDelegate() { tardyView.tardyCollectionView.dataSource = self } From b5219d647e3466af18158bcd3ace12903b1e65b0 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 03:43:23 +0900 Subject: [PATCH 06/12] =?UTF-8?q?refactor/#277=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=EB=A7=9E=EA=B2=8C=20=EC=9E=AC=EC=A0=95?= =?UTF-8?q?=EB=A0=AC,=20viewController=EC=97=90=EC=84=9C=20rootView?= =?UTF-8?q?=EC=99=80=20viewModel=EC=9D=98=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC,=20extension=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CheckInviteCodeViewController.swift | 8 +- .../View/CreateMeetingView.swift | 8 +- .../CreateMeetingViewController.swift | 38 ++++----- .../ViewModel/CreateMeetingViewModel.swift | 3 +- .../InviteCode/View/InviteCodeView.swift | 7 +- .../InviteCodeViewController.swift | 77 +++++++++-------- .../View/PagePromiseSegmentedControl.swift | 4 +- .../PromiseViewController.swift | 39 ++++----- .../PromiseInfo/View/PromiseInfoView.swift | 42 +++++----- .../PromiseInfoViewController.swift | 22 ++--- .../View/EnterReadyInfoButtonView.swift | 3 + .../ReadyStatus/View/ReadyPlanInfoView.swift | 3 + .../ReadyStatus/View/ReadyStatusButton.swift | 4 + .../View/ReadyStatusProgressView.swift | 9 +- .../ReadyStatus/View/ReadyStatusView.swift | 82 +++++++++++-------- .../Promise/Tardy/View/ArriveView.swift | 14 ++-- .../Promise/Tardy/View/TardyPenaltyView.swift | 8 +- .../Source/Promise/Tardy/View/TardyView.swift | 8 +- .../Promise/ViewModel/PromiseViewModel.swift | 6 +- 19 files changed, 202 insertions(+), 183 deletions(-) diff --git a/KkuMulKum/Source/AddMeeting/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift index 2f26a5b3..42361659 100644 --- a/KkuMulKum/Source/AddMeeting/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift +++ b/KkuMulKum/Source/AddMeeting/CheckInviteCode/ViewController/CheckInviteCodeViewController.swift @@ -12,13 +12,13 @@ class CheckInviteCodeViewController: BaseViewController { // MARK: Property - private let checkInviteCodeView: CheckInviteCodeView = CheckInviteCodeView() + private let rootView: CheckInviteCodeView = CheckInviteCodeView() // MARK: LifeCycle override func loadView() { - view = checkInviteCodeView + view = rootView } override func viewWillAppear(_ animated: Bool) { @@ -44,11 +44,11 @@ class CheckInviteCodeViewController: BaseViewController { } override func setupAction() { - checkInviteCodeView.enterInviteCodeView.addGestureRecognizer(UITapGestureRecognizer( + rootView.enterInviteCodeView.addGestureRecognizer(UITapGestureRecognizer( target: self, action: #selector(inviteCodeViewDidTap) )) - checkInviteCodeView.createMeetingView.addGestureRecognizer(UITapGestureRecognizer( + rootView.createMeetingView.addGestureRecognizer(UITapGestureRecognizer( target: self, action: #selector(createMeetingViewDidTap) )) diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/View/CreateMeetingView.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/View/CreateMeetingView.swift index 53655331..ab434160 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/View/CreateMeetingView.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/View/CreateMeetingView.swift @@ -11,10 +11,6 @@ class CreateMeetingView: BaseView { // MARK: Property - - private let mainTitleLabel: UILabel = UILabel().then { - $0.setText("모임 이름을\n입력해 주세요", style: .head01) - } let nameTextField: CustomTextField = CustomTextField( placeHolder: "모임 이름을 입력해 주세요" @@ -29,6 +25,10 @@ class CreateMeetingView: BaseView { isEnabled: false ) + private let mainTitleLabel: UILabel = UILabel().then { + $0.setText("모임 이름을\n입력해 주세요", style: .head01) + } + // MARK: - Setup diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift index ad19c327..344bd1e3 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift @@ -12,14 +12,14 @@ class CreateMeetingViewController: BaseViewController { // MARK: Property - private let createMeetingViewModel: CreateMeetingViewModel - private let createMeetingView: CreateMeetingView = CreateMeetingView() + private let viewModel: CreateMeetingViewModel + private let rootView: CreateMeetingView = CreateMeetingView() // MARK: - LifeCycle init(viewModel: CreateMeetingViewModel) { - self.createMeetingViewModel = viewModel + self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } @@ -29,7 +29,7 @@ class CreateMeetingViewController: BaseViewController { } override func loadView() { - view = createMeetingView + view = rootView } override func viewDidLoad() { @@ -60,12 +60,12 @@ class CreateMeetingViewController: BaseViewController { } override func setupAction() { - createMeetingView.nameTextField.addTarget( + rootView.nameTextField.addTarget( self, action: #selector(textFieldDidChange(_:)), for: .editingChanged ) - createMeetingView.presentButton.addTarget( + rootView.presentButton.addTarget( self, action: #selector(presentButtonDidTap), for: .touchUpInside @@ -84,45 +84,45 @@ class CreateMeetingViewController: BaseViewController { private extension CreateMeetingViewController { func setupBinding() { - createMeetingViewModel.inviteCodeState.bind(with: self) { owner, state in + viewModel.inviteCodeState.bind(with: self) { owner, state in switch state { case .empty, .invalid: - owner.createMeetingView.presentButton.isEnabled = false + owner.rootView.presentButton.isEnabled = false case .valid: - owner.createMeetingView.presentButton.isEnabled = true + owner.rootView.presentButton.isEnabled = true } - owner.createMeetingViewModel.characterCount.bind(with: self) { owner, count in - owner.createMeetingView.characterLabel.text = count + owner.viewModel.characterCount.bind(with: self) { owner, count in + owner.rootView.characterLabel.text = count } } } @objc func textFieldDidChange(_ textField: UITextField) { - createMeetingViewModel.validateName(textField.text ?? "") + viewModel.validateName(textField.text ?? "") } @objc func dismissKeyboard() { view.endEditing(true) - createMeetingView.nameTextField.layer.borderColor = UIColor.gray3.cgColor + rootView.nameTextField.layer.borderColor = UIColor.gray3.cgColor } @objc func presentButtonDidTap() { let inviteCodePopUpViewController = InvitationCodePopUpViewController( - invitationCode: createMeetingViewModel.inviteCode.value + invitationCode: viewModel.inviteCode.value ) setupPopUpViewController(viewController: inviteCodePopUpViewController) setupPopUpAction(view: inviteCodePopUpViewController.rootView) removeDismissGesture(view: inviteCodePopUpViewController.rootView) - createMeetingViewModel.createMeeting(name: createMeetingViewModel.meetingName.value) + viewModel.createMeeting(name: viewModel.meetingName.value) DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { inviteCodePopUpViewController.rootView.setInvitationCodeText( - self.createMeetingViewModel.inviteCode.value + self.viewModel.inviteCode.value ) self.present(inviteCodePopUpViewController, animated: true) @@ -131,9 +131,9 @@ private extension CreateMeetingViewController { @objc private func copyButtonDidTap() { - UIPasteboard.general.string = createMeetingViewModel.inviteCode.value + UIPasteboard.general.string = viewModel.inviteCode.value - let finishCreateViewController = FinishCreateViewController(meetingID: createMeetingViewModel.meetingID) + let finishCreateViewController = FinishCreateViewController(meetingID: viewModel.meetingID) navigationController?.pushViewController(finishCreateViewController, animated: true) } @@ -141,7 +141,7 @@ private extension CreateMeetingViewController { @objc private func inviteLaterButtonDidTap() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { - let finishCreateViewController = FinishCreateViewController(meetingID: self.createMeetingViewModel.meetingID) + let finishCreateViewController = FinishCreateViewController(meetingID: self.viewModel.meetingID) self.navigationController?.pushViewController(finishCreateViewController, animated: true) } diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift index ad950708..2f96ff7e 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift @@ -18,7 +18,6 @@ class CreateMeetingViewModel { // MARK: Property - var createMeetingResponse = ObservablePattern(nil) let isNextButtonEnabled = ObservablePattern(false) let meetingName = ObservablePattern("") let inviteCode = ObservablePattern("") @@ -26,6 +25,8 @@ class CreateMeetingViewModel { let inviteCodeState = ObservablePattern(.empty) let createMeetingService: CreateMeetingServiceProtocol + var createMeetingResponse = ObservablePattern(nil) + private (set) var meetingID: Int = 0 diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift b/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift index 1366af5d..61ef5fe3 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift @@ -11,10 +11,6 @@ class InviteCodeView: BaseView { // MARK: Property - - private let mainTitleLabel: UILabel = UILabel().then { - $0.setText("모임 초대 코드를\n입력해 주세요", style: .head01) - } let inviteCodeTextField: CustomTextField = CustomTextField( placeHolder: "모임 초대 코드를 입력해 주세요" @@ -33,6 +29,9 @@ class InviteCodeView: BaseView { let presentButton: CustomButton = CustomButton(title: "모임 가입하기", isEnabled: false) + private let mainTitleLabel: UILabel = UILabel().then { + $0.setText("모임 초대 코드를\n입력해 주세요", style: .head01) + } // MARK: - Setup diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift index c9464d6a..f167360b 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift @@ -12,15 +12,14 @@ class InviteCodeViewController: BaseViewController { // MARK: Property - private let inviteCodeViewModel: InviteCodeViewModel - - private let inviteCodeView: InviteCodeView = InviteCodeView() + private let viewModel: InviteCodeViewModel + private let rootView: InviteCodeView = InviteCodeView() // MARK: - LifeCycle init(viewModel: InviteCodeViewModel) { - self.inviteCodeViewModel = viewModel + self.viewModel = viewModel super.init(nibName: nil, bundle: nil) } @@ -29,7 +28,7 @@ class InviteCodeViewController: BaseViewController { } override func loadView() { - view = inviteCodeView + view = rootView } override func viewDidLoad() { @@ -60,12 +59,12 @@ class InviteCodeViewController: BaseViewController { } override func setupAction() { - inviteCodeView.inviteCodeTextField.addTarget( + rootView.inviteCodeTextField.addTarget( self, action: #selector(textFieldDidChange(_:)), for: .editingChanged ) - inviteCodeView.presentButton.addTarget( + rootView.presentButton.addTarget( self, action: #selector(nextButtonTapped), for: .touchUpInside @@ -73,8 +72,8 @@ class InviteCodeViewController: BaseViewController { } override func setupDelegate() { - inviteCodeView.inviteCodeTextField.delegate = self - inviteCodeView.inviteCodeTextField.returnKeyType = .done + rootView.inviteCodeTextField.delegate = self + rootView.inviteCodeTextField.returnKeyType = .done } } @@ -83,36 +82,36 @@ class InviteCodeViewController: BaseViewController { extension InviteCodeViewController { private func setupBinding() { - inviteCodeViewModel.inviteCodeState.bind(with: self) { owner, state in + viewModel.inviteCodeState.bind(with: self) { owner, state in switch state { case .empty: - owner.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor - owner.inviteCodeView.errorLabel.isHidden = true - owner.inviteCodeView.checkImageView.isHidden = true - owner.inviteCodeView.presentButton.isEnabled = false + owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + owner.rootView.errorLabel.isHidden = true + owner.rootView.checkImageView.isHidden = true + owner.rootView.presentButton.isEnabled = false case .invalid: - owner.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor - owner.inviteCodeView.errorLabel.isHidden = false - owner.inviteCodeView.checkImageView.isHidden = true - owner.inviteCodeView.presentButton.isEnabled = false + owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor + owner.rootView.errorLabel.isHidden = false + owner.rootView.checkImageView.isHidden = true + owner.rootView.presentButton.isEnabled = false case .valid: - owner.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor - owner.inviteCodeView.errorLabel.isHidden = true - owner.inviteCodeView.checkImageView.isHidden = true - owner.inviteCodeView.presentButton.isEnabled = true + owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + owner.rootView.errorLabel.isHidden = true + owner.rootView.checkImageView.isHidden = true + owner.rootView.presentButton.isEnabled = true case .success: - owner.inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor - owner.inviteCodeView.errorLabel.isHidden = true - owner.inviteCodeView.checkImageView.isHidden = false - owner.inviteCodeView.presentButton.isEnabled = true + owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + owner.rootView.errorLabel.isHidden = true + owner.rootView.checkImageView.isHidden = false + owner.rootView.presentButton.isEnabled = true } } - inviteCodeViewModel.meetingID.bind { [weak self] id in + viewModel.meetingID.bind { [weak self] id in guard let id else { return } DispatchQueue.main.async { - self?.inviteCodeViewModel.inviteCodeState.value = .success + self?.viewModel.inviteCodeState.value = .success } DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { @@ -139,10 +138,10 @@ extension InviteCodeViewController { } } - inviteCodeViewModel.errorDescription.bind(with: self) { owner, error in + viewModel.errorDescription.bind(with: self) { owner, error in DispatchQueue.main.async { - owner.inviteCodeView.errorLabel.setText(error, style: .caption02, color: .mainred) - owner.inviteCodeViewModel.inviteCodeState.value = .invalid + owner.rootView.errorLabel.setText(error, style: .caption02, color: .mainred) + owner.viewModel.inviteCodeState.value = .invalid } } } @@ -155,16 +154,16 @@ extension InviteCodeViewController { } @objc private func nextButtonTapped() { - inviteCodeViewModel.joinMeeting(inviteCode: inviteCodeViewModel.inviteCode.value) + viewModel.joinMeeting(inviteCode: viewModel.inviteCode.value) } @objc private func textFieldDidChange(_ textField: UITextField) { - inviteCodeViewModel.validateCode(textField.text ?? "") + viewModel.validateCode(textField.text ?? "") } @objc private func dismissKeyboard() { view.endEditing(true) - inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + rootView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor } } @@ -173,19 +172,19 @@ extension InviteCodeViewController { extension InviteCodeViewController: UITextFieldDelegate { func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { - inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + rootView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor return true } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { - switch inviteCodeViewModel.inviteCodeState.value { + switch viewModel.inviteCodeState.value { case .empty: - inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor + rootView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor case .valid, .success: - inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor + rootView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor case .invalid: - inviteCodeView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor + rootView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor } return true diff --git a/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift b/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift index 155a2b8b..0a0a91e3 100644 --- a/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift +++ b/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift @@ -13,13 +13,13 @@ class PagePromiseSegmentedControl: UISegmentedControl { // MARK: Property - - private let backgroundLineView: UIView = UIView(backgroundColor: .gray2) let selectedUnderLineView: UIView = UIView(backgroundColor: .black).then { $0.layer.cornerRadius = 1 } + private let backgroundLineView: UIView = UIView(backgroundColor: .gray2) + // MARK: Initialize diff --git a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift index fc81e712..191edd63 100644 --- a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift +++ b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift @@ -13,24 +13,20 @@ class PromiseViewController: BaseViewController { // MARK: Property private let viewModel: PromiseViewModel - - private var promiseViewControllerList: [BaseViewController] = [] - private let promiseInfoViewController: PromiseInfoViewController - private let readyStatusViewController: ReadyStatusViewController - private let tardyViewController: TardyViewController - - private lazy var promiseSegmentedControl = PagePromiseSegmentedControl( - items: ["약속 정보", "준비 현황", "지각 꾸물이"] - ) - private let promisePageViewController = UIPageViewController( transitionStyle: .scroll, navigationOrientation: .vertical ) + private var promiseViewControllerList: [BaseViewController] = [] + + private lazy var promiseSegmentedControl = PagePromiseSegmentedControl( + items: ["약속 정보", "준비 현황", "지각 꾸물이"] + ) + // MARK: - LifeCycle @@ -86,7 +82,6 @@ class PromiseViewController: BaseViewController { addChild(promisePageViewController) - view.addSubviews( promiseSegmentedControl, promisePageViewController.view @@ -138,7 +133,16 @@ class PromiseViewController: BaseViewController { // MARK: - Extension -extension PromiseViewController { +private extension PromiseViewController { + func setupBindings() { + viewModel.promiseInfo.bind { [weak self] model in + guard let model else { return } + DispatchQueue.main.async { + self?.setupNavigationBarTitle(with: model.promiseName) + } + } + } + @objc private func didSegmentedControlIndexUpdated() { let condition = viewModel.currentPage.value <= promiseSegmentedControl.selectedSegmentIndex let direction: UIPageViewController.NavigationDirection = condition ? .forward : .reverse @@ -187,14 +191,3 @@ extension PromiseViewController: UIPageViewControllerDataSource { return nil } } - -private extension PromiseViewController { - func setupBindings() { - viewModel.promiseInfo.bind { [weak self] model in - guard let model else { return } - DispatchQueue.main.async { - self?.setupNavigationBarTitle(with: model.promiseName) - } - } - } -} diff --git a/KkuMulKum/Source/Promise/PromiseInfo/View/PromiseInfoView.swift b/KkuMulKum/Source/Promise/PromiseInfo/View/PromiseInfoView.swift index da566063..6a564027 100644 --- a/KkuMulKum/Source/Promise/PromiseInfo/View/PromiseInfoView.swift +++ b/KkuMulKum/Source/Promise/PromiseInfo/View/PromiseInfoView.swift @@ -17,11 +17,6 @@ class PromiseInfoView: BaseView { $0.setHighlightText("n명", style: .body01, color: .maincolor) } - private let chevronButton: UIButton = UIButton().then { - $0.setImage(.iconRight.withTintColor(.gray4), for: .normal) - $0.contentMode = .scaleAspectFill - } - let participantCollectionView: UICollectionView = UICollectionView( frame: .zero, collectionViewLayout: UICollectionViewFlowLayout().then { @@ -37,6 +32,27 @@ class PromiseInfoView: BaseView { ) } + let locationContentLabel: UILabel = UILabel().then { + $0.setText("sss역 s번 출구", style: .body04, color: .gray7) + } + + let timeContentLabel: UILabel = UILabel().then { + $0.setText("mm월 dd일 hh:mm", style: .body04, color: .gray7) + } + + let readyLevelContentLabel: UILabel = UILabel().then { + $0.setText("LV n. sss", style: .body04, color: .gray7) + } + + let penaltyLevelContentLabel: UILabel = UILabel().then { + $0.setText("ssss하기", style: .body04, color: .gray7) + } + + private let chevronButton: UIButton = UIButton().then { + $0.setImage(.iconRight.withTintColor(.gray4), for: .normal) + $0.contentMode = .scaleAspectFill + } + private let backgroundView: UIView = UIView().then { $0.backgroundColor = .gray0 $0.layer.cornerRadius = Screen.height(18) @@ -57,10 +73,6 @@ class PromiseInfoView: BaseView { $0.setText("위치", style: .caption01, color: .maincolor) } - let locationContentLabel: UILabel = UILabel().then { - $0.setText("sss역 s번 출구", style: .body04, color: .gray7) - } - private let locationDivideView: UIView = UIView().then { $0.backgroundColor = .gray2 } @@ -69,10 +81,6 @@ class PromiseInfoView: BaseView { $0.setText("약속시간", style: .caption01, color: .maincolor) } - let timeContentLabel: UILabel = UILabel().then { - $0.setText("mm월 dd일 hh:mm", style: .body04, color: .gray7) - } - private let timeDivideView: UIView = UIView().then { $0.backgroundColor = .gray2 } @@ -81,10 +89,6 @@ class PromiseInfoView: BaseView { $0.setText("준비레벨", style: .caption01, color: .maincolor) } - let readyLevelContentLabel: UILabel = UILabel().then { - $0.setText("LV n. sss", style: .body04, color: .gray7) - } - private let readyLevelDivideView: UIView = UIView().then { $0.backgroundColor = .gray2 } @@ -93,10 +97,6 @@ class PromiseInfoView: BaseView { $0.setText("벌칙", style: .caption01, color: .maincolor) } - let penaltyLevelContentLabel: UILabel = UILabel().then { - $0.setText("ssss하기", style: .body04, color: .gray7) - } - // MARK: - Setup diff --git a/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift b/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift index 579a7096..5536311b 100644 --- a/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift +++ b/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift @@ -15,7 +15,7 @@ class PromiseInfoViewController: BaseViewController { // MARK: Property private let viewModel: PromiseViewModel - private let promiseInfoView: PromiseInfoView = PromiseInfoView() + private let rootView: PromiseInfoView = PromiseInfoView() // MARK: - LifeCycle @@ -31,7 +31,7 @@ class PromiseInfoViewController: BaseViewController { } override func loadView() { - view = promiseInfoView + view = rootView } override func viewWillAppear(_ animated: Bool) { @@ -45,8 +45,8 @@ class PromiseInfoViewController: BaseViewController { // MARK: - Setup override func setupDelegate() { - promiseInfoView.participantCollectionView.delegate = self - promiseInfoView.participantCollectionView.dataSource = self + rootView.participantCollectionView.delegate = self + rootView.participantCollectionView.dataSource = self } } @@ -56,26 +56,26 @@ class PromiseInfoViewController: BaseViewController { extension PromiseInfoViewController { func setupBinding() { viewModel.promiseInfo.bind(with: self) { owner, info in - owner.promiseInfoView.timeContentLabel.setText( + owner.rootView.timeContentLabel.setText( info?.time ?? "설정되지 않음", style: .body04, color: .gray7 ) - owner.promiseInfoView.readyLevelContentLabel.setText( + owner.rootView.readyLevelContentLabel.setText( info?.dressUpLevel ?? "설정되지 않음", style: .body04, color: .gray7 ) - owner.promiseInfoView.locationContentLabel.setText( + owner.rootView.locationContentLabel.setText( info?.address ?? "설정되지 않음", style: .body04, color: .gray7, isSingleLine: true ) - owner.promiseInfoView.penaltyLevelContentLabel.setText( + owner.rootView.penaltyLevelContentLabel.setText( info?.penalty ?? "설정되지 않음", style: .body04, color: .gray7 @@ -86,17 +86,17 @@ extension PromiseInfoViewController { owner, participantsInfo in DispatchQueue.main.async { - owner.promiseInfoView.participantNumberLabel.setText( + owner.rootView.participantNumberLabel.setText( "약속 참여 인원 \(participantsInfo?.count ?? 0)명", style: .body01 ) - owner.promiseInfoView.participantNumberLabel.setHighlightText( + owner.rootView.participantNumberLabel.setHighlightText( "\(participantsInfo?.count ?? 0)명", style: .body01, color: .maincolor ) - owner.promiseInfoView.participantCollectionView.reloadData() + owner.rootView.participantCollectionView.reloadData() } } } diff --git a/KkuMulKum/Source/Promise/ReadyStatus/View/EnterReadyInfoButtonView.swift b/KkuMulKum/Source/Promise/ReadyStatus/View/EnterReadyInfoButtonView.swift index 1c40e8bd..1ecd31ab 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/View/EnterReadyInfoButtonView.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/View/EnterReadyInfoButtonView.swift @@ -21,6 +21,9 @@ class EnterReadyInfoButtonView: BaseView { $0.contentMode = .scaleAspectFill } + + // MARK: - Setup + override func setupView() { backgroundColor = .white addSubviews(descriptionLabel, chevronButton) diff --git a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyPlanInfoView.swift b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyPlanInfoView.swift index 879277fe..62faef46 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyPlanInfoView.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyPlanInfoView.swift @@ -34,6 +34,9 @@ class ReadyPlanInfoView: BaseView { $0.clipsToBounds = true } + + // MARK: - Setup + override func setupView() { backgroundColor = .white diff --git a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusButton.swift b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusButton.swift index f56c9041..28cbf2c1 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusButton.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusButton.swift @@ -15,6 +15,10 @@ enum ReadyProgressStatus { } class ReadyStatusButton: UIButton { + + + // MARK: - LifeCycle + init(title: String, readyStatus: ReadyProgressStatus) { super.init(frame: .zero) diff --git a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift index e6cd6e21..10376934 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift @@ -8,6 +8,10 @@ import UIKit class ReadyStatusProgressView: BaseView { + + + // MARK: Property + let statusProgressView: UIProgressView = UIProgressView().then { $0.trackTintColor = .gray2 $0.progressTintColor = .maincolor @@ -63,7 +67,7 @@ class ReadyStatusProgressView: BaseView { $0.isHidden = true } - let arrivalCheckImageView: UIImageView = UIImageView(backgroundColor: .gray2).then { + let arrivalCheckImageView: UIImageView = UIImageView(backgroundColor: .gray2).then { $0.layer.cornerRadius = Screen.height(16 / 2) $0.clipsToBounds = true } @@ -81,6 +85,9 @@ class ReadyStatusProgressView: BaseView { $0.isHidden = true } + + // MARK: - Setup + override func setupView() { backgroundColor = .white diff --git a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusView.swift b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusView.swift index c93c56ed..fdd795f2 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusView.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusView.swift @@ -6,22 +6,13 @@ // import UIKit -import SnapKit +import SnapKit class ReadyStatusView: BaseView { - private let scrollView: UIScrollView = UIScrollView().then { - $0.showsVerticalScrollIndicator = false - } - private let contentView: UIView = UIView() - - private var collectionViewHeightConstraint: Constraint? - private let baseStackView: UIStackView = UIStackView(axis: .vertical).then { - $0.spacing = 24 - $0.backgroundColor = .gray0 - } + // MARK: Property let enterReadyButtonView: EnterReadyInfoButtonView = EnterReadyInfoButtonView().then { $0.layer.cornerRadius = 8 @@ -33,14 +24,6 @@ class ReadyStatusView: BaseView { $0.clipsToBounds = true } - private let myReadyStatusTitleLabel: UILabel = UILabel().then { - $0.setText("나의 준비 현황", style: .body01, color: .gray8) - } - - private let readyBaseView: UIStackView = UIStackView(axis: .vertical).then { - $0.spacing = 4 - } - let myReadyStatusProgressView: ReadyStatusProgressView = ReadyStatusProgressView().then { $0.layer.cornerRadius = 8 $0.clipsToBounds = true @@ -51,14 +34,6 @@ class ReadyStatusView: BaseView { $0.isHidden = true } - private let ourReadyStatusLabel: UILabel = UILabel().then { - $0.setText( - "우리들의 준비 현황", - style: .body01, - color: .gray8 - ) - } - let ourReadyStatusCollectionView: UICollectionView = UICollectionView( frame: .zero, collectionViewLayout: UICollectionViewFlowLayout().then { @@ -74,6 +49,38 @@ class ReadyStatusView: BaseView { ) } + private let scrollView: UIScrollView = UIScrollView().then { + $0.showsVerticalScrollIndicator = false + } + + private let contentView: UIView = UIView() + + private let baseStackView: UIStackView = UIStackView(axis: .vertical).then { + $0.spacing = 24 + $0.backgroundColor = .gray0 + } + + private let myReadyStatusTitleLabel: UILabel = UILabel().then { + $0.setText("나의 준비 현황", style: .body01, color: .gray8) + } + + private let readyBaseView: UIStackView = UIStackView(axis: .vertical).then { + $0.spacing = 4 + } + + private let ourReadyStatusLabel: UILabel = UILabel().then { + $0.setText( + "우리들의 준비 현황", + style: .body01, + color: .gray8 + ) + } + + private var collectionViewHeightConstraint: Constraint? + + + // MARK: - Setup + override func setupView() { readyBaseView.addArrangedSubviews( myReadyStatusProgressView, @@ -99,13 +106,6 @@ class ReadyStatusView: BaseView { } - func updateCollectionViewHeight() { - ourReadyStatusCollectionView.layoutIfNeeded() - let contentHeight = ourReadyStatusCollectionView.collectionViewLayout.collectionViewContentSize.height - collectionViewHeightConstraint?.update(offset: contentHeight) - layoutIfNeeded() - } - override func setupAutoLayout() { scrollView.snp.makeConstraints { $0.edges.equalToSuperview() @@ -131,6 +131,16 @@ class ReadyStatusView: BaseView { $0.bottom.equalTo(ourReadyStatusCollectionView.snp.bottom).offset(20) } } - - +} + + +// MARK: - Extension + +extension ReadyStatusView { + func updateCollectionViewHeight() { + ourReadyStatusCollectionView.layoutIfNeeded() + let contentHeight = ourReadyStatusCollectionView.collectionViewLayout.collectionViewContentSize.height + collectionViewHeightConstraint?.update(offset: contentHeight) + layoutIfNeeded() + } } diff --git a/KkuMulKum/Source/Promise/Tardy/View/ArriveView.swift b/KkuMulKum/Source/Promise/Tardy/View/ArriveView.swift index 8888ba49..2a1230d0 100644 --- a/KkuMulKum/Source/Promise/Tardy/View/ArriveView.swift +++ b/KkuMulKum/Source/Promise/Tardy/View/ArriveView.swift @@ -11,6 +11,13 @@ class ArriveView: BaseView { // MARK: Property + + let finishMeetingButton: CustomButton = CustomButton( + title: "약속 마치기", + isEnabled: true + ).then { + $0.backgroundColor = .maincolor + } private let giftImageView: UIImageView = UIImageView().then { $0.image = .imgGift @@ -25,13 +32,6 @@ class ArriveView: BaseView { $0.setText("약속 시간까지 아무도 꾸물거리지 않았네요!", style: .body06, color: .gray6) } - let finishMeetingButton: CustomButton = CustomButton( - title: "약속 마치기", - isEnabled: true - ).then { - $0.backgroundColor = .maincolor - } - // MARK: - Setup diff --git a/KkuMulKum/Source/Promise/Tardy/View/TardyPenaltyView.swift b/KkuMulKum/Source/Promise/Tardy/View/TardyPenaltyView.swift index 1eabdf48..36d4b502 100644 --- a/KkuMulKum/Source/Promise/Tardy/View/TardyPenaltyView.swift +++ b/KkuMulKum/Source/Promise/Tardy/View/TardyPenaltyView.swift @@ -11,6 +11,10 @@ class TardyPenaltyView: BaseView { // MARK: Property + + let contentLabel: UILabel = UILabel().then { + $0.setText("탕후루 릴스 찍기", style: .body03, color: .gray8) + } private let penaltyImageView: UIImageView = UIImageView().then { $0.image = .iconPenalty @@ -21,10 +25,6 @@ class TardyPenaltyView: BaseView { $0.setText("벌칙", style: .caption02, color: .gray8) } - let contentLabel: UILabel = UILabel().then { - $0.setText("탕후루 릴스 찍기", style: .body03, color: .gray8) - } - // MARK: - Setup diff --git a/KkuMulKum/Source/Promise/Tardy/View/TardyView.swift b/KkuMulKum/Source/Promise/Tardy/View/TardyView.swift index eb2f9210..9d369054 100644 --- a/KkuMulKum/Source/Promise/Tardy/View/TardyView.swift +++ b/KkuMulKum/Source/Promise/Tardy/View/TardyView.swift @@ -16,10 +16,6 @@ class TardyView: BaseView { $0.layer.cornerRadius = 8 } - private let titleLabel: UILabel = UILabel().then { - $0.setText("이번 약속의 지각 꾸물이는?", style: .head01, color: .gray8) - } - let tardyEmptyView: TardyEmptyView = TardyEmptyView() let tardyCollectionView: UICollectionView = UICollectionView( @@ -44,6 +40,10 @@ class TardyView: BaseView { $0.backgroundColor = .maincolor } + private let titleLabel: UILabel = UILabel().then { + $0.setText("이번 약속의 지각 꾸물이는?", style: .head01, color: .gray8) + } + // MARK: - Setup diff --git a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift index 46c0ce3f..a541be04 100644 --- a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift +++ b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift @@ -28,6 +28,9 @@ class PromiseViewModel { /// 설령 데이터가 없다하더라도 약속 시간은 담겨있음. let myReadyStatus = ObservablePattern(nil) + /// 현재 준비 상태에 대한 버튼 처리 + let myReadyProgressStatus = ObservablePattern(.none) + /// 준비 시작 시간 var readyStartTime = ObservablePattern("") @@ -40,9 +43,6 @@ class PromiseViewModel { /// 이동 소요 시간 var moveTime = ObservablePattern("") - /// 현재 준비 상태에 대한 버튼 처리 - let myReadyProgressStatus = ObservablePattern(.none) - /// 꾸물거림 여부 var isLate = ObservablePattern(false) From f14a61d6afc24c6c2779be35af563c1e13505bac Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 04:22:31 +0900 Subject: [PATCH 07/12] =?UTF-8?q?refactor/#277=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20binding=20=EC=BD=94=EB=93=9C=20=EC=9E=98?= =?UTF-8?q?=EB=AA=BB=EB=90=9C=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateMeetingViewController.swift | 16 +++++++--------- .../ViewModel/CreateMeetingViewModel.swift | 15 ++++++--------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift index 344bd1e3..f683af92 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift @@ -86,15 +86,15 @@ private extension CreateMeetingViewController { func setupBinding() { viewModel.inviteCodeState.bind(with: self) { owner, state in switch state { - case .empty, .invalid: - owner.rootView.presentButton.isEnabled = false case .valid: owner.rootView.presentButton.isEnabled = true + case .empty, .invalid: + owner.rootView.presentButton.isEnabled = false } - - owner.viewModel.characterCount.bind(with: self) { owner, count in - owner.rootView.characterLabel.text = count - } + } + + viewModel.characterCount.bind(with: self) { owner, count in + owner.rootView.characterLabel.text = "\(count)/10" } } @@ -121,9 +121,7 @@ private extension CreateMeetingViewController { viewModel.createMeeting(name: viewModel.meetingName.value) DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - inviteCodePopUpViewController.rootView.setInvitationCodeText( - self.viewModel.inviteCode.value - ) + inviteCodePopUpViewController.rootView.setInvitationCodeText(self.viewModel.inviteCode.value) self.present(inviteCodePopUpViewController, animated: true) } diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift index 2f96ff7e..4a228780 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewModel/CreateMeetingViewModel.swift @@ -18,7 +18,6 @@ class CreateMeetingViewModel { // MARK: Property - let isNextButtonEnabled = ObservablePattern(false) let meetingName = ObservablePattern("") let inviteCode = ObservablePattern("") let characterCount = ObservablePattern("0/10") @@ -43,17 +42,15 @@ class CreateMeetingViewModel { extension CreateMeetingViewModel { func validateName(_ name: String) { meetingName.value = name - characterCount.value = "\(name.count)/10" + characterCount.value = String(name.count) - if name.isEmpty { + switch name.count { + case 0: inviteCodeState.value = .empty - isNextButtonEnabled.value = false - } else if name.count > 10 { - inviteCodeState.value = .invalid - isNextButtonEnabled.value = false - } else { + case 1...10: inviteCodeState.value = .valid - isNextButtonEnabled.value = true + default: + inviteCodeState.value = .invalid } } From 8ac0b5d858e629a1ff9df4ddd69877d287d7cd53 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 21:14:17 +0900 Subject: [PATCH 08/12] =?UTF-8?q?refactor/#277=20=EC=B4=88=EB=8C=80=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=85=EB=A0=A5=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InviteCode/View/InviteCodeView.swift | 1 + .../InviteCodeViewController.swift | 37 ++++++++----------- .../ViewModel/InviteCodeViewModel.swift | 25 ++++++------- 3 files changed, 28 insertions(+), 35 deletions(-) diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift b/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift index 61ef5fe3..2febd21e 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/View/InviteCodeView.swift @@ -33,6 +33,7 @@ class InviteCodeView: BaseView { $0.setText("모임 초대 코드를\n입력해 주세요", style: .head01) } + // MARK: - Setup override func setupView() { diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift index f167360b..5b72c9b2 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift @@ -20,6 +20,7 @@ class InviteCodeViewController: BaseViewController { init(viewModel: InviteCodeViewModel) { self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) } @@ -83,25 +84,21 @@ class InviteCodeViewController: BaseViewController { extension InviteCodeViewController { private func setupBinding() { viewModel.inviteCodeState.bind(with: self) { owner, state in + owner.rootView.errorLabel.isHidden = true + owner.rootView.checkImageView.isHidden = true + owner.rootView.presentButton.isEnabled = false + switch state { case .empty: owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor - owner.rootView.errorLabel.isHidden = true - owner.rootView.checkImageView.isHidden = true - owner.rootView.presentButton.isEnabled = false case .invalid: owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.mainred.cgColor owner.rootView.errorLabel.isHidden = false - owner.rootView.checkImageView.isHidden = true - owner.rootView.presentButton.isEnabled = false case .valid: owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor - owner.rootView.errorLabel.isHidden = true - owner.rootView.checkImageView.isHidden = true owner.rootView.presentButton.isEnabled = true case .success: owner.rootView.inviteCodeTextField.layer.borderColor = UIColor.maincolor.cgColor - owner.rootView.errorLabel.isHidden = true owner.rootView.checkImageView.isHidden = false owner.rootView.presentButton.isEnabled = true } @@ -122,19 +119,12 @@ extension InviteCodeViewController { ) ) - guard let rootViewController = self?.navigationController?.viewControllers.first as? MainTabBarController else { + guard let navigationController = self?.navigationController, + let rootViewController = navigationController.viewControllers.first as? MainTabBarController else { return } - - self?.navigationController?.popToViewController( - rootViewController, - animated: false - ) - - rootViewController.navigationController?.pushViewController( - meetingInfoViewController, - animated: true - ) + + navigationController.setViewControllers([rootViewController, meetingInfoViewController], animated: true) } } @@ -144,6 +134,10 @@ extension InviteCodeViewController { owner.viewModel.inviteCodeState.value = .invalid } } + + viewModel.inviteCode.bind { code in + self.viewModel.validateInviteCode() + } } @@ -154,15 +148,16 @@ extension InviteCodeViewController { } @objc private func nextButtonTapped() { - viewModel.joinMeeting(inviteCode: viewModel.inviteCode.value) + viewModel.joinMeeting() } @objc private func textFieldDidChange(_ textField: UITextField) { - viewModel.validateCode(textField.text ?? "") + viewModel.updateInviteCode(textField.text ?? "") } @objc private func dismissKeyboard() { view.endEditing(true) + rootView.inviteCodeTextField.layer.borderColor = UIColor.gray3.cgColor } } diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift index 2a964899..471889d5 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ViewModel/InviteCodeViewModel.swift @@ -23,11 +23,11 @@ class InviteCodeViewModel { let inviteCode = ObservablePattern("") let errorDescription = ObservablePattern("") let inviteCodeState = ObservablePattern(.empty) - let isNextButtonEnabled = ObservablePattern(false) private let service: InviteCodeServiceProtocol - // MARK: Initialize + + // MARK: - LifeCycle init(service: InviteCodeServiceProtocol) { self.service = service @@ -38,28 +38,26 @@ class InviteCodeViewModel { // MARK: - Extension extension InviteCodeViewModel { - func validateCode(_ code: String) { - inviteCode.value = code - - if code.isEmpty { + func updateInviteCode(_ code: String) { + self.inviteCode.value = code + } + + func validateInviteCode() { + if inviteCode.value.isEmpty { inviteCodeState.value = .empty - isNextButtonEnabled.value = false - } else if code.count == 6 { + } else if inviteCode.value.count == 6 { inviteCodeState.value = .valid - isNextButtonEnabled.value = true } else { inviteCodeState.value = .invalid - isNextButtonEnabled.value = false } } - func joinMeeting(inviteCode: String) { + func joinMeeting() { Task { do { - let request = RegisterMeetingsModel(invitationCode: inviteCode) + let request = RegisterMeetingsModel(invitationCode: inviteCode.value) let responseBody = try await service.joinMeeting(with: request) - /// 네트워크 자체가 성공인가.. guard let success = responseBody?.success, success == true else { @@ -67,7 +65,6 @@ extension InviteCodeViewModel { return } - /// 성공인 경우 meetingID.value = responseBody?.data?.meetingID } catch { print(">>>>> \(error.localizedDescription) : \(#function)") From 35782197d6e4e18bdbb6eb61ee9f37b118200653 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 9 Aug 2024 21:21:43 +0900 Subject: [PATCH 09/12] =?UTF-8?q?refactor/#277=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=84=B1=EA=B3=B5=20=EB=B7=B0=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 28 ++++-------- .../CreateMeetingViewController.swift | 4 +- .../CreateSuccessViewController.swift} | 6 +-- .../View/FinishCreateNavigationView.swift | 44 ------------------- 4 files changed, 13 insertions(+), 69 deletions(-) rename KkuMulKum/Source/AddMeeting/{FinishCreate/ViewController/FinishCreateViewController.swift => CreateSuccess/ViewController/CreateSuccessViewController.swift} (96%) delete mode 100644 KkuMulKum/Source/AddMeeting/FinishCreate/View/FinishCreateNavigationView.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 090f497d..836ce6d5 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -107,7 +107,6 @@ DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */; }; DD3072262C3C0F0B00416D9F /* TardyInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* TardyInfoModel.swift */; }; DD3976682C41769400E2A4C4 /* CreateMeetingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */; }; - DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */; }; DD39766F2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD39766E2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift */; }; DD3976832C41C2AD00E2A4C4 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */; }; DD3976842C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976792C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift */; }; @@ -132,7 +131,7 @@ DD4393772C412F4500EC1799 /* CreateMeetingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD43936E2C412F4500EC1799 /* CreateMeetingView.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 */; }; + DD43937A2C412F4500EC1799 /* CreateSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393722C412F4500EC1799 /* CreateSuccessViewController.swift */; }; DD43937B2C412F4500EC1799 /* CreateMeetingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393732C412F4500EC1799 /* CreateMeetingViewController.swift */; }; DD43937C2C412F4500EC1799 /* InviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393742C412F4500EC1799 /* InviteCodeViewController.swift */; }; DD43937D2C412F4500EC1799 /* CheckInviteCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4393752C412F4500EC1799 /* CheckInviteCodeViewController.swift */; }; @@ -295,7 +294,6 @@ DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPromiseReadyInfoRequestModel.swift; sourceTree = ""; }; DD3072252C3C0F0B00416D9F /* TardyInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyInfoModel.swift; sourceTree = ""; }; DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingViewModel.swift; sourceTree = ""; }; - DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateNavigationView.swift; sourceTree = ""; }; DD39766E2C41B54400E2A4C4 /* InviteCodeServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeServiceProtocol.swift; sourceTree = ""; }; DD3976722C41B6C800E2A4C4 /* CreateMeetingServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingServiceProtocol.swift; sourceTree = ""; }; DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; @@ -321,7 +319,7 @@ DD43936E2C412F4500EC1799 /* CreateMeetingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateMeetingView.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 = ""; }; + DD4393722C412F4500EC1799 /* CreateSuccessViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateSuccessViewController.swift; sourceTree = ""; }; DD4393732C412F4500EC1799 /* CreateMeetingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateMeetingViewController.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 = ""; }; @@ -769,18 +767,10 @@ path = ViewModel; sourceTree = ""; }; - DD39766C2C4199BC00E2A4C4 /* View */ = { - isa = PBXGroup; - children = ( - DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */, - ); - path = View; - sourceTree = ""; - }; DD39766D2C4199C100E2A4C4 /* ViewController */ = { isa = PBXGroup; children = ( - DD4393722C412F4500EC1799 /* FinishCreateViewController.swift */, + DD4393722C412F4500EC1799 /* CreateSuccessViewController.swift */, ); path = ViewController; sourceTree = ""; @@ -910,9 +900,9 @@ isa = PBXGroup; children = ( DD4393812C4162CA00EC1799 /* CheckInviteCode */, - DD4393842C41630200EC1799 /* CreateMeeting */, DD43936C2C412F4500EC1799 /* InviteCode */, - DD4393712C412F4500EC1799 /* FinishCreate */, + DD4393842C41630200EC1799 /* CreateMeeting */, + DD4393712C412F4500EC1799 /* CreateSuccess */, ); path = AddMeeting; sourceTree = ""; @@ -928,13 +918,12 @@ path = InviteCode; sourceTree = ""; }; - DD4393712C412F4500EC1799 /* FinishCreate */ = { + DD4393712C412F4500EC1799 /* CreateSuccess */ = { isa = PBXGroup; children = ( DD39766D2C4199C100E2A4C4 /* ViewController */, - DD39766C2C4199BC00E2A4C4 /* View */, ); - path = FinishCreate; + path = CreateSuccess; sourceTree = ""; }; DD4393812C4162CA00EC1799 /* CheckInviteCode */ = { @@ -1754,7 +1743,7 @@ DE9E18842C3BA84500DB76B4 /* CustomTextField.swift in Sources */, A3FB184F2C3BF4BC001483E5 /* MakeMeetingsResponseModel.swift in Sources */, DEF725DB2C3F3BBF008C87C7 /* Toast.swift in Sources */, - DD43937A2C412F4500EC1799 /* FinishCreateViewController.swift in Sources */, + DD43937A2C412F4500EC1799 /* CreateSuccessViewController.swift in Sources */, DE254AAC2C31192400A4015E /* UILabel+.swift in Sources */, DE254AB72C3119D000A4015E /* ReuseIdentifiable.swift in Sources */, A3DD9C412C41BAD000E58A13 /* MeetingListViewModel.swift in Sources */, @@ -1837,7 +1826,6 @@ A39F2B1D2C47F3D0008DA5F5 /* HomeTargetType.swift in Sources */, DDFA507F2C4693BD000A62E2 /* ProfileSetupViewModel.swift in Sources */, A3DD9C3D2C41BAD000E58A13 /* MeetingTableViewCell.swift in Sources */, - DD39766B2C41995A00E2A4C4 /* FinishCreateNavigationView.swift in Sources */, DE558C5B2C4595A7008DAC4A /* SelectMemberView.swift in Sources */, DD3072202C3C0D4500416D9F /* MyReadyStatusResponseModel.swift in Sources */, DD931B6E2C3DA27F00526452 /* ParticipantCollectionViewCell.swift in Sources */, diff --git a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift index f683af92..5a456c18 100644 --- a/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift +++ b/KkuMulKum/Source/AddMeeting/CreateMeeting/ViewController/CreateMeetingViewController.swift @@ -131,7 +131,7 @@ private extension CreateMeetingViewController { private func copyButtonDidTap() { UIPasteboard.general.string = viewModel.inviteCode.value - let finishCreateViewController = FinishCreateViewController(meetingID: viewModel.meetingID) + let finishCreateViewController = CreateSuccessViewController(meetingID: viewModel.meetingID) navigationController?.pushViewController(finishCreateViewController, animated: true) } @@ -139,7 +139,7 @@ private extension CreateMeetingViewController { @objc private func inviteLaterButtonDidTap() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { - let finishCreateViewController = FinishCreateViewController(meetingID: self.viewModel.meetingID) + let finishCreateViewController = CreateSuccessViewController(meetingID: self.viewModel.meetingID) self.navigationController?.pushViewController(finishCreateViewController, animated: true) } diff --git a/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift b/KkuMulKum/Source/AddMeeting/CreateSuccess/ViewController/CreateSuccessViewController.swift similarity index 96% rename from KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift rename to KkuMulKum/Source/AddMeeting/CreateSuccess/ViewController/CreateSuccessViewController.swift index f4c61bf5..cc9b83f3 100644 --- a/KkuMulKum/Source/AddMeeting/FinishCreate/ViewController/FinishCreateViewController.swift +++ b/KkuMulKum/Source/AddMeeting/CreateSuccess/ViewController/CreateSuccessViewController.swift @@ -1,5 +1,5 @@ // -// FinishCreateViewController.swift +// CreateSuccessViewController.swift // KkuMulKum // // Created by YOUJIM on 7/12/24. @@ -7,7 +7,7 @@ import UIKit -class FinishCreateViewController: BaseViewController { +class CreateSuccessViewController: BaseViewController { // MARK: Property @@ -106,7 +106,7 @@ class FinishCreateViewController: BaseViewController { // MARK: - Extension -private extension FinishCreateViewController { +private extension CreateSuccessViewController { @objc func presentMeetingInfoViewControllerDidTap() { let meetingInfoViewController = MeetingInfoViewController( diff --git a/KkuMulKum/Source/AddMeeting/FinishCreate/View/FinishCreateNavigationView.swift b/KkuMulKum/Source/AddMeeting/FinishCreate/View/FinishCreateNavigationView.swift deleted file mode 100644 index 3b189fa7..00000000 --- a/KkuMulKum/Source/AddMeeting/FinishCreate/View/FinishCreateNavigationView.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// FinishCreateNavigationView.swift -// KkuMulKum -// -// Created by YOUJIM on 7/13/24. -// - -import UIKit - -class FinishCreateNavigationView: BaseView { - - - // MARK: Property - - let titleLabel = UILabel().then { - $0.setText("내 모임 추가하기", style: .body03, color: .gray8) - } - - let separatorView = UIView(backgroundColor: .gray1) - - - // MARK: - Setup - - 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() - } - } -} From 7d5b331e4f5bf0603388d538da051d4787c9930c Mon Sep 17 00:00:00 2001 From: youz2me Date: Sat, 10 Aug 2024 01:11:43 +0900 Subject: [PATCH 10/12] =?UTF-8?q?refactor/#277=20PagePromise=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cell/ParticipantCollectionViewCell.swift | 2 +- .../Cell/TardyCollectionViewCell.swift | 11 +++-- .../View/PagePromiseSegmentedControl.swift | 9 ++-- .../PromiseViewController.swift | 30 ++++++------ .../PromiseInfoViewController.swift | 13 +++-- .../ReadyStatusViewController.swift | 6 +-- .../PromiseServiceProtocol.swift | 2 + .../ViewController/TardyViewController.swift | 21 +++++---- .../Promise/ViewModel/PromiseViewModel.swift | 47 ++++++++----------- 9 files changed, 69 insertions(+), 72 deletions(-) diff --git a/KkuMulKum/Source/Promise/PagePromise/Cell/ParticipantCollectionViewCell.swift b/KkuMulKum/Source/Promise/PagePromise/Cell/ParticipantCollectionViewCell.swift index 028d03b0..e9fc6e73 100644 --- a/KkuMulKum/Source/Promise/PagePromise/Cell/ParticipantCollectionViewCell.swift +++ b/KkuMulKum/Source/Promise/PagePromise/Cell/ParticipantCollectionViewCell.swift @@ -23,7 +23,7 @@ class ParticipantCollectionViewCell: BaseCollectionViewCell { } let userNameLabel: UILabel = UILabel().then { - $0.setText("userName", style: .caption02, color: .gray6) + $0.setText("꾸물이", style: .caption02, color: .gray6) } diff --git a/KkuMulKum/Source/Promise/PagePromise/Cell/TardyCollectionViewCell.swift b/KkuMulKum/Source/Promise/PagePromise/Cell/TardyCollectionViewCell.swift index 1a16d824..b8abfa9f 100644 --- a/KkuMulKum/Source/Promise/PagePromise/Cell/TardyCollectionViewCell.swift +++ b/KkuMulKum/Source/Promise/PagePromise/Cell/TardyCollectionViewCell.swift @@ -27,11 +27,14 @@ class TardyCollectionViewCell: BaseCollectionViewCell { // MARK: - Setup override func setupView() { - addSubviews(profileImageView, nameLabel) + addSubviews( + profileImageView, + nameLabel + ) - self.layer.cornerRadius = 8 - self.layer.borderWidth = 1 - self.layer.borderColor = UIColor.gray2.cgColor + layer.cornerRadius = Screen.height(8) + layer.borderWidth = 1 + layer.borderColor = UIColor.gray2.cgColor } override func setupAutoLayout() { diff --git a/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift b/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift index 0a0a91e3..458fd53a 100644 --- a/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift +++ b/KkuMulKum/Source/Promise/PagePromise/View/PagePromiseSegmentedControl.swift @@ -21,7 +21,7 @@ class PagePromiseSegmentedControl: UISegmentedControl { private let backgroundLineView: UIView = UIView(backgroundColor: .gray2) - // MARK: Initialize + // MARK: LifeCycle override init(items: [Any]?) { super.init(items: items) @@ -42,7 +42,10 @@ class PagePromiseSegmentedControl: UISegmentedControl { private extension PagePromiseSegmentedControl { func setupSegment() { - addSubviews(backgroundLineView, selectedUnderLineView) + addSubviews( + backgroundLineView, + selectedUnderLineView + ) selectedSegmentIndex = 0 } @@ -74,7 +77,7 @@ private extension PagePromiseSegmentedControl { func setupBackgroundLineView() { backgroundLineView.snp.makeConstraints { $0.bottom.leading.trailing.equalToSuperview() - $0.height.equalTo(2) + $0.height.equalTo(Screen.height(2)) } selectedUnderLineView.snp.makeConstraints { diff --git a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift index 191edd63..c08772c8 100644 --- a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift +++ b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift @@ -14,8 +14,8 @@ class PromiseViewController: BaseViewController { private let viewModel: PromiseViewModel private let promiseInfoViewController: PromiseInfoViewController - private let readyStatusViewController: ReadyStatusViewController - private let tardyViewController: TardyViewController + private let promiseReadyStatusViewController: ReadyStatusViewController + private let promiseTardyViewController: TardyViewController private let promisePageViewController = UIPageViewController( transitionStyle: .scroll, navigationOrientation: .vertical @@ -36,13 +36,13 @@ class PromiseViewController: BaseViewController { viewModel.fetchPromiseInfo(promiseID: viewModel.promiseID) promiseInfoViewController = PromiseInfoViewController(viewModel: viewModel) - readyStatusViewController = ReadyStatusViewController(viewModel: viewModel) - tardyViewController = TardyViewController(viewModel: viewModel) + promiseReadyStatusViewController = ReadyStatusViewController(viewModel: viewModel) + promiseTardyViewController = TardyViewController(viewModel: viewModel) promiseViewControllerList = [ promiseInfoViewController, - readyStatusViewController, - tardyViewController + promiseReadyStatusViewController, + promiseTardyViewController ] super.init(nibName: nil, bundle: nil) @@ -78,7 +78,6 @@ class PromiseViewController: BaseViewController { view.backgroundColor = .white setupNavigationBarBackButton() - setupNavigationBarTitle(with: viewModel.promiseInfo.value?.promiseName ?? "") addChild(promisePageViewController) @@ -112,13 +111,13 @@ class PromiseViewController: BaseViewController { for: .valueChanged ) - tardyViewController.tardyView.finishMeetingButton.addTarget( + promiseTardyViewController.tardyView.finishMeetingButton.addTarget( self, action: #selector(finishMeetingButtonDidTap), for: .touchUpInside ) - tardyViewController.arriveView.finishMeetingButton.addTarget( + promiseTardyViewController.arriveView.finishMeetingButton.addTarget( self, action: #selector(finishMeetingButtonDidTap), for: .touchUpInside @@ -135,16 +134,15 @@ class PromiseViewController: BaseViewController { private extension PromiseViewController { func setupBindings() { - viewModel.promiseInfo.bind { [weak self] model in - guard let model else { return } + viewModel.promiseInfo.bind { info in DispatchQueue.main.async { - self?.setupNavigationBarTitle(with: model.promiseName) + self.setupNavigationBarTitle(with: info?.promiseName ?? "") } } } @objc private func didSegmentedControlIndexUpdated() { - let condition = viewModel.currentPage.value <= promiseSegmentedControl.selectedSegmentIndex + let condition = viewModel.currentPageIndex.value <= promiseSegmentedControl.selectedSegmentIndex let direction: UIPageViewController.NavigationDirection = condition ? .forward : .reverse let (width, count, selectedIndex) = ( promiseSegmentedControl.bounds.width, @@ -156,18 +154,18 @@ private extension PromiseViewController { $0.leading.equalToSuperview().offset((width / CGFloat(count)) * CGFloat(selectedIndex)) } - viewModel.segmentIndexDidChanged( + viewModel.segmentIndexDidChange( index: promiseSegmentedControl.selectedSegmentIndex ) promisePageViewController.setViewControllers([ - promiseViewControllerList[viewModel.currentPage.value] + promiseViewControllerList[viewModel.currentPageIndex.value] ], direction: direction, animated: false) } @objc func finishMeetingButtonDidTap() { - tardyViewController.viewModel.updatePromiseCompletion() + promiseTardyViewController.viewModel.updatePromiseCompletion() navigationController?.popViewController(animated: true) } diff --git a/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift b/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift index 5536311b..3685a314 100644 --- a/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift +++ b/KkuMulKum/Source/Promise/PromiseInfo/ViewController/PromiseInfoViewController.swift @@ -57,39 +57,38 @@ extension PromiseInfoViewController { func setupBinding() { viewModel.promiseInfo.bind(with: self) { owner, info in owner.rootView.timeContentLabel.setText( - info?.time ?? "설정되지 않음", + info?.time ?? "시간이 설정되지 않았어요!", style: .body04, color: .gray7 ) owner.rootView.readyLevelContentLabel.setText( - info?.dressUpLevel ?? "설정되지 않음", + info?.dressUpLevel ?? "꾸밈 난이도가 설정되지 않았어요!", style: .body04, color: .gray7 ) owner.rootView.locationContentLabel.setText( - info?.address ?? "설정되지 않음", + info?.address ?? "위치 정보가 설정되지 않았어요!", style: .body04, color: .gray7, isSingleLine: true ) owner.rootView.penaltyLevelContentLabel.setText( - info?.penalty ?? "설정되지 않음", + info?.penalty ?? "벌칙이 설정되지 않았어요!", style: .body04, color: .gray7 ) } - viewModel.participantsInfo.bind(with: self) { - owner, - participantsInfo in + viewModel.participantsInfo.bind(with: self) { owner, participantsInfo in DispatchQueue.main.async { owner.rootView.participantNumberLabel.setText( "약속 참여 인원 \(participantsInfo?.count ?? 0)명", style: .body01 ) + owner.rootView.participantNumberLabel.setHighlightText( "\(participantsInfo?.count ?? 0)명", style: .body01, diff --git a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift index 24fdff30..6a835563 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift @@ -187,7 +187,7 @@ private extension ReadyStatusViewController { } /// 준비 시간을 계산해 UI에 표시 - owner.viewModel.calculateTakenTime() + owner.viewModel.calculateDuration() owner.viewModel.calculateStartTime() /// myReadyStatus의 바인딩 부분에 조건을 통해 myReadyProgressStatus 값을 업데이트 @@ -213,7 +213,7 @@ private extension ReadyStatusViewController { } } - viewModel.moveTime.bind(with: self) { + viewModel.moveDuration.bind(with: self) { owner, moveTime in owner.rootView.readyPlanInfoView.requestMoveTimeLabel.setText( @@ -223,7 +223,7 @@ private extension ReadyStatusViewController { ) } - viewModel.readyTime.bind(with: self) { + viewModel.readyDuration.bind(with: self) { owner, readyTime in owner.rootView.readyPlanInfoView.requestReadyTimeLabel.setText( diff --git a/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift b/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift index 5eb37028..8ed91698 100644 --- a/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift +++ b/KkuMulKum/Source/Promise/ServiceProtocol/PromiseServiceProtocol.swift @@ -10,12 +10,14 @@ import Foundation protocol PromiseServiceProtocol { /// 약속 정보 func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? + /// 준비 현황 func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO? func fetchPromiseParticipantList(with promiseID: Int) async throws -> ResponseBodyDTO? func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? + /// 지각 꾸물이 func fetchTardyInfo(with promiseID: Int) async throws -> ResponseBodyDTO? func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? diff --git a/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift b/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift index 35302aa6..3e0bf761 100644 --- a/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift +++ b/KkuMulKum/Source/Promise/Tardy/ViewController/TardyViewController.swift @@ -98,7 +98,7 @@ extension TardyViewController: UICollectionViewDataSource { _ collectionView: UICollectionView, numberOfItemsInSection section: Int ) -> Int { - return viewModel.comers.value?.count ?? 0 + return viewModel.comers.value.count } func collectionView( @@ -110,15 +110,16 @@ extension TardyViewController: UICollectionViewDataSource { for: indexPath ) as? TardyCollectionViewCell else { return UICollectionViewCell() } - guard let data = viewModel.comers.value?[indexPath.row] else { return cell } - - cell.nameLabel.setText(data.name ?? " " , style: .body06, color: .gray6) - - guard let imageURL = URL(string: data.profileImageURL ?? "") else { - cell.profileImageView.image = .imgProfile - return cell - } - cell.profileImageView.kf.setImage(with: imageURL) + cell.nameLabel.setText( + viewModel.comers.value[indexPath.row].name ?? "", + style: .body06, + color: .gray6 + ) + + cell.profileImageView.kf.setImage( + with: URL(string: viewModel.comers.value[indexPath.row].profileImageURL ?? ""), + placeholder: UIImage.imgProfile + ) return cell } diff --git a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift index a541be04..5447d5fc 100644 --- a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift +++ b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift @@ -16,7 +16,7 @@ class PromiseViewModel { let promiseID: Int /// 현재 페이지 인덱스 - let currentPage = ObservablePattern(0) + let currentPageIndex = ObservablePattern(0) /// 약속 정보 let promiseInfo = ObservablePattern(nil) @@ -35,13 +35,13 @@ class PromiseViewModel { var readyStartTime = ObservablePattern("") /// 준비 소요 시간 - var readyTime = ObservablePattern("") + var readyDuration = ObservablePattern("") /// 이동 시작 시간 var moveStartTime = ObservablePattern("") /// 이동 소요 시간 - var moveTime = ObservablePattern("") + var moveDuration = ObservablePattern("") /// 꾸물거림 여부 var isLate = ObservablePattern(false) @@ -56,14 +56,15 @@ class PromiseViewModel { var penalty: ObservablePattern = ObservablePattern("") /// 지각자 목록 - var comers: ObservablePattern<[Comer]?> = ObservablePattern<[Comer]?>(nil) + var comers: ObservablePattern<[Comer]> = ObservablePattern<[Comer]>([]) /// 서버로부터 받아올 에러 메시지 var errorMessage: ObservablePattern = ObservablePattern("") /// 현재 시간 받아오기 위한 dateFormatter 구헌 private let dateFormatter = DateFormatter().then { - $0.dateFormat = "a hh:mm" + $0.locale = Locale(identifier: "ko_KR") + $0.timeZone = TimeZone(identifier: "Asia/Seoul") $0.amSymbol = "AM" $0.pmSymbol = "PM" } @@ -84,8 +85,8 @@ class PromiseViewModel { extension PromiseViewModel { /// segmentedControl 인덱스 바뀌었을 때 호출되는 함수 - func segmentIndexDidChanged(index: Int) { - currentPage.value = index + func segmentIndexDidChange(index: Int) { + currentPageIndex.value = index } /// 우리들의 준비 현황 변동되었을 때 호출되는 함수 @@ -93,30 +94,22 @@ extension PromiseViewModel { participantsInfo.value = infos } - /// 준비 현황 버튼 클릭했을 때 호출되는 함수 + /// 준비 현황 버튼 클릭했을 때 현재 시간 반환하는 함수 func updateReadyStatusTime() -> String { - let dateFormatter = DateFormatter() - dateFormatter.locale = Locale(identifier: "ko_KR") - dateFormatter.dateFormat = "a h:mm" - dateFormatter.amSymbol = "AM" - dateFormatter.pmSymbol = "PM" + dateFormatter.dateFormat = "a hh:mm" - let currentTimeString = dateFormatter.string(from: Date()) - - return currentTimeString + return dateFormatter.string(from: Date()) } /// 꾸물거릴 시간이 없어요 팝업 표시를 위해 지각 여부를 판단하는 함수 - func checkLate(settingTime: String, realTime: String) { - let dateFormatter = DateFormatter() - dateFormatter.locale = Locale(identifier: "ko_KR") + func checkLate(settingTime: String, arriveTime: String) { dateFormatter.dateFormat = "HH시 mm분" let readyStartDate = dateFormatter.date(from: settingTime) dateFormatter.dateFormat = "a h:mm" - let preparationStartDate = dateFormatter.date(from: realTime) + let preparationStartDate = dateFormatter.date(from: arriveTime) if let readyStartDate = readyStartDate, let preparationStartDate = preparationStartDate { self.isLate.value = preparationStartDate.compare(readyStartDate) == .orderedDescending @@ -124,24 +117,22 @@ extension PromiseViewModel { } /// 준비 or 이동 소요 시간 계산하는 함수 - func calculateTakenTime() { + func calculateDuration() { let preparationHours = (self.myReadyStatus.value?.preparationTime ?? 0) / 60 let preparationMinutes = (self.myReadyStatus.value?.preparationTime ?? 0) % 60 - readyTime.value = preparationHours == 0 ? "\(preparationMinutes)분" : "\(preparationHours)시간 \(preparationMinutes)분" + readyDuration.value = preparationHours == 0 ? "\(preparationMinutes)분" : "\(preparationHours)시간 \(preparationMinutes)분" let travelHours = (self.myReadyStatus.value?.travelTime ?? 0) / 60 let travelMinutes = (self.myReadyStatus.value?.travelTime ?? 0) % 60 - moveTime.value = travelHours == 0 ? "\(travelMinutes)분" : "\(travelHours)시간 \(travelMinutes)분" + moveDuration.value = travelHours == 0 ? "\(travelMinutes)분" : "\(travelHours)시간 \(travelMinutes)분" } /// 준비 or 이동 시작 시간 계산하는 함수 func calculateStartTime() { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - dateFormatter.locale = Locale(identifier: "ko_KR") - dateFormatter.timeZone = TimeZone(identifier: "Asia/Seoul") let promiseTime = self.myReadyStatus.value?.promiseTime ?? "" let readyTime = self.myReadyStatus.value?.preparationTime ?? 0 @@ -244,7 +235,7 @@ extension PromiseViewModel { DispatchQueue.main.async { self.checkLate( settingTime: self.moveStartTime.value, - realTime: self.myReadyStatus.value?.departureAt ?? "" + arriveTime: self.myReadyStatus.value?.departureAt ?? "" ) } } @@ -266,8 +257,8 @@ extension PromiseViewModel { } DispatchQueue.main.async { self.checkLate( - settingTime: self.moveTime.value, - realTime: self.myReadyStatus.value?.preparationStartAt ?? "" + settingTime: self.moveDuration.value, + arriveTime: self.myReadyStatus.value?.preparationStartAt ?? "" ) } } From d9ad91694b21220c20acd5b824cdf54ff3a93405 Mon Sep 17 00:00:00 2001 From: youz2me Date: Thu, 15 Aug 2024 22:50:51 +0900 Subject: [PATCH 11/12] =?UTF-8?q?refactor/#277=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=82=B4=EC=9A=A9=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KkuMulKum.xcodeproj/project.pbxproj | 8 +- .../View/ReadyStatusProgressView.swift | 2 + .../ReadyStatusViewController.swift | 172 +++++++++--------- .../Promise/ViewModel/PromiseViewModel.swift | 31 ++-- 4 files changed, 111 insertions(+), 102 deletions(-) diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 836ce6d5..ab8f5762 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -58,7 +58,6 @@ 785AE1BC2C2E878600677CA0 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BB2C2E878600677CA0 /* FirebaseStorage */; }; 785AE1BE2C2E878600677CA0 /* FirebaseStorageCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BD2C2E878600677CA0 /* FirebaseStorageCombine-Community */; }; 785AE1C02C2E878600677CA0 /* FirebaseVertexAI-Preview in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BF2C2E878600677CA0 /* FirebaseVertexAI-Preview */; }; - 785AE1D12C3B07A600677CA0 /* PrivacyInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */; }; 789196342C486F6B00FF8CDF /* KeychainAccessible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789196332C486F6B00FF8CDF /* KeychainAccessible.swift */; }; 789196362C492F8600FF8CDF /* AuthTargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789196352C492F8600FF8CDF /* AuthTargetType.swift */; }; 789196382C49697B00FF8CDF /* AuthError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789196372C49697B00FF8CDF /* AuthError.swift */; }; @@ -98,6 +97,7 @@ A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3FB185A2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift */; }; DD1FD0302C5CCB4400D0A72C /* ReadyStatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1FD02F2C5CCB4400D0A72C /* ReadyStatusViewController.swift */; }; DD1FD0352C5CCF9F00D0A72C /* PromiseInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1FD0342C5CCF9F00D0A72C /* PromiseInfoViewController.swift */; }; + DD228AA22C69313500B440AF /* PrivacyInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = DD228AA12C69313500B440AF /* PrivacyInfo.plist */; }; DD3072142C3BF87A00416D9F /* NearestPromiseResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072132C3BF87A00416D9F /* NearestPromiseResponseModel.swift */; }; DD3072162C3BFE4E00416D9F /* UpcomingPromiseListResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072152C3BFE4E00416D9F /* UpcomingPromiseListResponseModel.swift */; }; DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072192C3C011600416D9F /* AddPromiseRequestModel.swift */; }; @@ -243,7 +243,6 @@ 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 = ""; }; 789196332C486F6B00FF8CDF /* KeychainAccessible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainAccessible.swift; sourceTree = ""; }; 789196352C492F8600FF8CDF /* AuthTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthTargetType.swift; sourceTree = ""; }; 789196372C49697B00FF8CDF /* AuthError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthError.swift; sourceTree = ""; }; @@ -285,6 +284,7 @@ A3FB185A2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingMembersResponseModel.swift; sourceTree = ""; }; DD1FD02F2C5CCB4400D0A72C /* ReadyStatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusViewController.swift; sourceTree = ""; }; DD1FD0342C5CCF9F00D0A72C /* PromiseInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseInfoViewController.swift; sourceTree = ""; }; + DD228AA12C69313500B440AF /* PrivacyInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = PrivacyInfo.plist; sourceTree = ""; }; DD3072132C3BF87A00416D9F /* NearestPromiseResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearestPromiseResponseModel.swift; sourceTree = ""; }; DD3072152C3BFE4E00416D9F /* UpcomingPromiseListResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpcomingPromiseListResponseModel.swift; sourceTree = ""; }; DD3072192C3C011600416D9F /* AddPromiseRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddPromiseRequestModel.swift; sourceTree = ""; }; @@ -1228,7 +1228,7 @@ DD39768B2C41C36B00E2A4C4 /* Color.xcassets */, 78B928742C29402E006D9942 /* Assets.xcassets */, 78B928762C29402E006D9942 /* LaunchScreen.storyboard */, - 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */, + DD228AA12C69313500B440AF /* PrivacyInfo.plist */, 789D73AE2C46D99B00C7077D /* GoogleService-Info.plist */, 78B928792C29402E006D9942 /* Info.plist */, DE9E187E2C3BA49B00DB76B4 /* Component */, @@ -1680,8 +1680,8 @@ DE254AC72C311DC200A4015E /* Pretendard-Bold.otf in Resources */, DE254ACC2C311DC200A4015E /* Pretendard-Thin.otf in Resources */, DE254ACA2C311DC200A4015E /* Pretendard-Light.otf in Resources */, - 785AE1D12C3B07A600677CA0 /* PrivacyInfo.plist in Resources */, DE254AC82C311DC200A4015E /* Pretendard-Medium.otf in Resources */, + DD228AA22C69313500B440AF /* PrivacyInfo.plist in Resources */, 78B928752C29402E006D9942 /* Assets.xcassets in Resources */, DE254ACB2C311DC200A4015E /* Pretendard-Black.otf in Resources */, DE254AC52C311DC200A4015E /* Pretendard-Regular.otf in Resources */, diff --git a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift index 10376934..5e436ba5 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/View/ReadyStatusProgressView.swift @@ -53,6 +53,7 @@ class ReadyStatusProgressView: BaseView { title: "이동 시작", readyStatus: .none ).then { + $0.isEnabled = false $0.layer.cornerRadius = 16 $0.layer.borderWidth = 1 } @@ -76,6 +77,7 @@ class ReadyStatusProgressView: BaseView { title: "도착 완료", readyStatus: .none ).then { + $0.isEnabled = false $0.layer.cornerRadius = 16 $0.layer.borderWidth = 1 } diff --git a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift index 6a835563..1a7efcce 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift @@ -90,92 +90,6 @@ class ReadyStatusViewController: BaseViewController { // MARK: - Extension extension ReadyStatusViewController { - @objc - func readyStartButtonDidTap() { - viewModel.myReadyProgressStatus.value = .ready - rootView.myReadyStatusProgressView.readyStartButton.isEnabled.toggle() - } - - @objc - func moveStartButtonDidTap() { - viewModel.myReadyProgressStatus.value = .move - rootView.myReadyStatusProgressView.moveStartButton.isEnabled.toggle() - } - - @objc - func arrivalButtonDidTap() { - viewModel.myReadyProgressStatus.value = .done - rootView.myReadyStatusProgressView.arrivalButton.isEnabled.toggle() - } - - @objc - func enterReadyButtonDidTap() { - guard let _ = viewModel.promiseInfo.value?.promiseName else { return } - guard let readyStatusInfo = viewModel.myReadyStatus.value else { return } - - let setReadyInfoViewController = SetReadyInfoViewController( - viewModel: SetReadyInfoViewModel( - promiseID: viewModel.promiseID, - promiseTime: readyStatusInfo.promiseTime, - promiseName: viewModel.promiseInfo.value?.promiseName ?? "", - service: PromiseService() - ) - ) - - navigationController?.pushViewController( - setReadyInfoViewController, - animated: true - ) - } -} - - -// MARK: - UICollectionViewDataSource - -extension ReadyStatusViewController: UICollectionViewDataSource { - func collectionView( - _ collectionView: UICollectionView, - numberOfItemsInSection section: Int - ) -> Int { - return viewModel.participantsInfo.value?.count ?? 0 - } - - func collectionView( - _ collectionView: UICollectionView, - cellForItemAt indexPath: IndexPath - ) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell( - withReuseIdentifier: OurReadyStatusCollectionViewCell.reuseIdentifier, - for: indexPath - ) as? OurReadyStatusCollectionViewCell - else { return UICollectionViewCell() } - - cell.nameLabel.setText( - viewModel.participantsInfo.value?[indexPath.row].name ?? "", - style: .body03, - color: .gray8 - ) - - if let imageURL = URL(string: viewModel.participantsInfo.value?[indexPath.row].profileImageURL ?? "") { - cell.profileImageView.kf.setImage(with: imageURL, placeholder: UIImage.imgProfile) - } - - switch viewModel.participantsInfo.value?[indexPath.row].state { - case "도착": - cell.readyStatusButton.setupButton("도착", .done) - case "이동중": - cell.readyStatusButton.setupButton("이동중", .move) - case "준비중": - cell.readyStatusButton.setupButton("준비중", .ready) - default: - cell.readyStatusButton.setupButton("꾸물중", .none) - } - - return cell - } -} - -private extension ReadyStatusViewController { func setupBinding() { viewModel.myReadyStatus.bind(with: self) { owner, @@ -502,4 +416,90 @@ private extension ReadyStatusViewController { viewModel.updateArrivalStatus() } } + + @objc + func readyStartButtonDidTap() { + viewModel.myReadyProgressStatus.value = .ready + rootView.myReadyStatusProgressView.readyStartButton.isEnabled = false + rootView.myReadyStatusProgressView.moveStartButton.isEnabled = true + } + + @objc + func moveStartButtonDidTap() { + viewModel.myReadyProgressStatus.value = .move + rootView.myReadyStatusProgressView.moveStartButton.isEnabled = false + rootView.myReadyStatusProgressView.arrivalButton.isEnabled = true + } + + @objc + func arrivalButtonDidTap() { + viewModel.myReadyProgressStatus.value = .done + rootView.myReadyStatusProgressView.arrivalButton.isEnabled = false + } + + @objc + func enterReadyButtonDidTap() { + guard let _ = viewModel.promiseInfo.value?.promiseName else { return } + guard let readyStatusInfo = viewModel.myReadyStatus.value else { return } + + let setReadyInfoViewController = SetReadyInfoViewController( + viewModel: SetReadyInfoViewModel( + promiseID: viewModel.promiseID, + promiseTime: readyStatusInfo.promiseTime, + promiseName: viewModel.promiseInfo.value?.promiseName ?? "", + service: PromiseService() + ) + ) + + navigationController?.pushViewController( + setReadyInfoViewController, + animated: true + ) + } +} + + +// MARK: - UICollectionViewDataSource + +extension ReadyStatusViewController: UICollectionViewDataSource { + func collectionView( + _ collectionView: UICollectionView, + numberOfItemsInSection section: Int + ) -> Int { + return viewModel.participantsInfo.value?.count ?? 0 + } + + func collectionView( + _ collectionView: UICollectionView, + cellForItemAt indexPath: IndexPath + ) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: OurReadyStatusCollectionViewCell.reuseIdentifier, + for: indexPath + ) as? OurReadyStatusCollectionViewCell + else { return UICollectionViewCell() } + + cell.nameLabel.setText( + viewModel.participantsInfo.value?[indexPath.row].name ?? "", + style: .body03, + color: .gray8 + ) + + if let imageURL = URL(string: viewModel.participantsInfo.value?[indexPath.row].profileImageURL ?? "") { + cell.profileImageView.kf.setImage(with: imageURL, placeholder: UIImage.imgProfile) + } + + switch viewModel.participantsInfo.value?[indexPath.row].state { + case "도착": + cell.readyStatusButton.setupButton("도착", .done) + case "이동중": + cell.readyStatusButton.setupButton("이동중", .move) + case "준비중": + cell.readyStatusButton.setupButton("준비중", .ready) + default: + cell.readyStatusButton.setupButton("꾸물중", .none) + } + + return cell + } } diff --git a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift index 5447d5fc..156d5ddf 100644 --- a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift +++ b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift @@ -116,6 +116,15 @@ extension PromiseViewModel { } } + func updateMyReadyProgressStatus() { + myReadyProgressStatus.value = myReadyStatus.value?.preparationStartAt == nil ? .none + : myReadyStatus.value?.departureAt == nil ? .ready + : myReadyStatus.value?.arrivalAt == nil ? .move + : .done + + print(">>>>> \(myReadyProgressStatus.value) : \(#function)") + } + /// 준비 or 이동 소요 시간 계산하는 함수 func calculateDuration() { let preparationHours = (self.myReadyStatus.value?.preparationTime ?? 0) / 60 @@ -232,12 +241,11 @@ extension PromiseViewModel { else { return } - DispatchQueue.main.async { - self.checkLate( - settingTime: self.moveStartTime.value, - arriveTime: self.myReadyStatus.value?.departureAt ?? "" - ) - } + + self.checkLate( + settingTime: self.moveStartTime.value, + arriveTime: self.myReadyStatus.value?.departureAt ?? "" + ) } } } @@ -255,12 +263,11 @@ extension PromiseViewModel { else { return } - DispatchQueue.main.async { - self.checkLate( - settingTime: self.moveDuration.value, - arriveTime: self.myReadyStatus.value?.preparationStartAt ?? "" - ) - } + + self.checkLate( + settingTime: self.moveDuration.value, + arriveTime: self.myReadyStatus.value?.preparationStartAt ?? "" + ) } } } From 981586d9616c5e9a46e646814bc7f44b42a382f9 Mon Sep 17 00:00:00 2001 From: youz2me Date: Fri, 16 Aug 2024 00:01:05 +0900 Subject: [PATCH 12/12] =?UTF-8?q?refactor/#277=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=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 --- .../Network/Service/MeetingService.swift | 18 +--- .../Network/Service/PromiseService.swift | 82 ++++--------------- .../InviteCodeViewController.swift | 12 +-- .../PromiseViewController.swift | 3 +- .../ReadyStatusViewController.swift | 8 +- .../Promise/ViewModel/PromiseViewModel.swift | 1 + 6 files changed, 32 insertions(+), 92 deletions(-) diff --git a/KkuMulKum/Network/Service/MeetingService.swift b/KkuMulKum/Network/Service/MeetingService.swift index c66c3adc..b5b58ed7 100644 --- a/KkuMulKum/Network/Service/MeetingService.swift +++ b/KkuMulKum/Network/Service/MeetingService.swift @@ -44,11 +44,7 @@ extension MeetingService: CreateMeetingServiceProtocol { func createMeeting( request: MakeMeetingsRequestModel ) async throws -> ResponseBodyDTO? { - return try await self.request( - with: .createMeeting( - request: request - ) - ) + return try await self.request(with: .createMeeting(request: request)) } } @@ -56,11 +52,7 @@ extension MeetingService: InviteCodeServiceProtocol { func joinMeeting( with request: RegisterMeetingsModel ) async throws -> ResponseBodyDTO? { - return try await self.request( - with: .joinMeeting( - request: request - ) - ) + return try await self.request(with: .joinMeeting(request: request)) } } @@ -70,10 +62,6 @@ final class MockInviteCodeService: InviteCodeServiceProtocol { meetingID: 1 ) - return ResponseBodyDTO.init( - success: true, - data: mockData, - error: nil - ) + return ResponseBodyDTO.init(success: true, data: mockData, error: nil) } } diff --git a/KkuMulKum/Network/Service/PromiseService.swift b/KkuMulKum/Network/Service/PromiseService.swift index d9b5b5c5..6240941a 100644 --- a/KkuMulKum/Network/Service/PromiseService.swift +++ b/KkuMulKum/Network/Service/PromiseService.swift @@ -42,67 +42,35 @@ final class PromiseService { extension PromiseService: PromiseServiceProtocol { func fetchTardyInfo(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchTardyInfo( - promiseID: promiseID - ) - ) + return try await request(with: .fetchTardyInfo(promiseID: promiseID)) } func updatePromiseCompletion(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updatePromiseCompletion( - promiseID: promiseID - ) - ) + return try await request(with: .updatePromiseCompletion(promiseID: promiseID)) } - func fetchPromiseInfo(with promiseId: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchPromiseInfo( - promiseID: promiseId - ) - ) + func fetchPromiseInfo(with promiseID: Int) async throws -> ResponseBodyDTO? { + return try await request(with: .fetchPromiseInfo(promiseID: promiseID)) } func updatePreparationStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updatePreparationStatus( - promiseID: promiseID - ) - ) + return try await request(with: .updatePreparationStatus(promiseID: promiseID)) } func updateDepartureStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updateDepartureStatus( - promiseID: promiseID - ) - ) + return try await request(with: .updateDepartureStatus(promiseID: promiseID)) } func updateArrivalStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .updateArrivalStatus( - promiseID: promiseID - ) - ) + return try await request(with: .updateArrivalStatus(promiseID: promiseID)) } func fetchMyReadyStatus(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchMyReadyStatus( - promiseID: promiseID - ) - ) + return try await request(with: .fetchMyReadyStatus(promiseID: promiseID)) } func fetchPromiseParticipantList(with promiseID: Int) async throws -> ResponseBodyDTO? { - return try await request( - with: .fetchPromiseParticipantList( - promiseID: promiseID - ) - ) + return try await request(with: .fetchPromiseParticipantList(promiseID: promiseID)) } } @@ -130,31 +98,13 @@ final class MockPromiseService: PromiseServiceProtocol { let mockData = TardyInfoModel( penalty: "티라미수 케익 릴스", isPastDue: true, - lateComers: [Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - ), - Comer( - participantId: 1, - name: "유짐이", - profileImageURL: "" - )] + lateComers: [ + Comer(participantId: 1, name: "유짐이", profileImageURL: ""), + Comer(participantId: 1, name: "유짐이", profileImageURL: ""), + Comer(participantId: 1, name: "유짐이", profileImageURL: ""), + Comer(participantId: 1, name: "유짐이", profileImageURL: ""), + Comer(participantId: 1, name: "유짐이",profileImageURL: "") + ] ) return ResponseBodyDTO.init( diff --git a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift index 5b72c9b2..49d4e6de 100644 --- a/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift +++ b/KkuMulKum/Source/AddMeeting/InviteCode/ViewController/InviteCodeViewController.swift @@ -81,8 +81,8 @@ class InviteCodeViewController: BaseViewController { // MARK: - Extension -extension InviteCodeViewController { - private func setupBinding() { +private extension InviteCodeViewController { + func setupBinding() { viewModel.inviteCodeState.bind(with: self) { owner, state in owner.rootView.errorLabel.isHidden = true owner.rootView.checkImageView.isHidden = true @@ -120,10 +120,11 @@ extension InviteCodeViewController { ) guard let navigationController = self?.navigationController, - let rootViewController = navigationController.viewControllers.first as? MainTabBarController else { + let rootViewController = navigationController.viewControllers.first as? MainTabBarController + else { return } - + navigationController.setViewControllers([rootViewController, meetingInfoViewController], animated: true) } } @@ -140,8 +141,7 @@ extension InviteCodeViewController { } } - - private func setupTapGesture() { + func setupTapGesture() { let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) view.addGestureRecognizer(tapGesture) diff --git a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift index c08772c8..93549645 100644 --- a/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift +++ b/KkuMulKum/Source/Promise/PagePromise/ViewController/PromiseViewController.swift @@ -141,7 +141,8 @@ private extension PromiseViewController { } } - @objc private func didSegmentedControlIndexUpdated() { + @objc + func didSegmentedControlIndexUpdated() { let condition = viewModel.currentPageIndex.value <= promiseSegmentedControl.selectedSegmentIndex let direction: UIPageViewController.NavigationDirection = condition ? .forward : .reverse let (width, count, selectedIndex) = ( diff --git a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift index 1a7efcce..11d250bb 100644 --- a/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift +++ b/KkuMulKum/Source/Promise/ReadyStatus/ViewController/ReadyStatusViewController.swift @@ -13,13 +13,13 @@ class ReadyStatusViewController: BaseViewController { // MARK: Property - + private let viewModel: PromiseViewModel private let rootView: ReadyStatusView = ReadyStatusView() // MARK: - LifeCycle - + init(viewModel: PromiseViewModel) { self.viewModel = viewModel @@ -56,7 +56,7 @@ class ReadyStatusViewController: BaseViewController { // MARK: - Setup - + override func setupDelegate() { rootView.ourReadyStatusCollectionView.dataSource = self } @@ -99,7 +99,7 @@ extension ReadyStatusViewController { owner.updateReadyInfoView(flag: false) return } - + /// 준비 시간을 계산해 UI에 표시 owner.viewModel.calculateDuration() owner.viewModel.calculateStartTime() diff --git a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift index 156d5ddf..64d3153a 100644 --- a/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift +++ b/KkuMulKum/Source/Promise/ViewModel/PromiseViewModel.swift @@ -122,6 +122,7 @@ extension PromiseViewModel { : myReadyStatus.value?.arrivalAt == nil ? .move : .done + // TODO: 리팩토링 끝나면 삭제 print(">>>>> \(myReadyProgressStatus.value) : \(#function)") }