Skip to content

Commit

Permalink
Merge pull request #239 from OMZigak/feat/#234-meeting-create-api
Browse files Browse the repository at this point in the history
[feat] 모임 가입 및 생성 API 연결
  • Loading branch information
youz2me authored Jul 18, 2024
2 parents 8982989 + 1394913 commit 885a458
Show file tree
Hide file tree
Showing 14 changed files with 188 additions and 89 deletions.
13 changes: 9 additions & 4 deletions KkuMulKum.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@
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 /* MockCreateMeetingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* MockCreateMeetingService.swift */; };
DD3976732C41B6C800E2A4C4 /* CreateMeetingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3976722C41B6C800E2A4C4 /* CreateMeetingService.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 */; };
Expand All @@ -110,6 +110,7 @@
DD3F9DD02C48571A008E1FF7 /* MeetingListServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3F9DCF2C48571A008E1FF7 /* MeetingListServiceType.swift */; };
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 */; };
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 */; };
Expand Down Expand Up @@ -287,7 +288,7 @@
DD3976672C41769400E2A4C4 /* CreateMeetingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingViewModel.swift; sourceTree = "<group>"; };
DD39766A2C41995A00E2A4C4 /* FinishCreateNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinishCreateNavigationView.swift; sourceTree = "<group>"; };
DD39766E2C41B54400E2A4C4 /* InviteCodeService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteCodeService.swift; sourceTree = "<group>"; };
DD3976722C41B6C800E2A4C4 /* MockCreateMeetingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCreateMeetingService.swift; sourceTree = "<group>"; };
DD3976722C41B6C800E2A4C4 /* CreateMeetingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateMeetingService.swift; sourceTree = "<group>"; };
DD3976772C41C2AD00E2A4C4 /* HomeViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = "<group>"; };
DD3976792C41C2AD00E2A4C4 /* UpcomingPromiseCollecitonViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpcomingPromiseCollecitonViewCell.swift; sourceTree = "<group>"; };
DD39767D2C41C2AD00E2A4C4 /* HomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
Expand All @@ -302,6 +303,7 @@
DD3F9DCF2C48571A008E1FF7 /* MeetingListServiceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetingListServiceType.swift; sourceTree = "<group>"; };
DD3F9DD12C485753008E1FF7 /* UtilService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilService.swift; sourceTree = "<group>"; };
DD3F9DD32C4858A3008E1FF7 /* UtilTargetType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilTargetType.swift; sourceTree = "<group>"; };
DD3F9DD52C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterMeetingsResponseModel.swift; sourceTree = "<group>"; };
DD41BEF92C41D4160095A068 /* TardyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyView.swift; sourceTree = "<group>"; };
DD41BEFB2C41D54D0095A068 /* TardyPenaltyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyPenaltyView.swift; sourceTree = "<group>"; };
DD41BEFE2C41DAA40095A068 /* TardyEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TardyEmptyView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -715,7 +717,7 @@
DD3976712C41B6B100E2A4C4 /* Service */ = {
isa = PBXGroup;
children = (
DD3976722C41B6C800E2A4C4 /* MockCreateMeetingService.swift */,
DD3976722C41B6C800E2A4C4 /* CreateMeetingService.swift */,
);
path = Service;
sourceTree = "<group>";
Expand Down Expand Up @@ -1422,6 +1424,7 @@
A3FB184C2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift */,
A3FB184E2C3BF4BB001483E5 /* MakeMeetingsResponseModel.swift */,
A3FB18502C3BF531001483E5 /* RegisterMeetingsResquestModel.swift */,
DD3F9DD52C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift */,
A3FB18562C3BF704001483E5 /* MeetingListResponseModel.swift */,
A3FB18582C3BF77D001483E5 /* MeetingInfoResponseModel.swift */,
A3FB185A2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift */,
Expand Down Expand Up @@ -1768,7 +1771,7 @@
789D73B32C47CC6D00C7077D /* LocalNotificationManager.swift in Sources */,
DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */,
DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */,
DD3976732C41B6C800E2A4C4 /* MockCreateMeetingService.swift in Sources */,
DD3976732C41B6C800E2A4C4 /* CreateMeetingService.swift in Sources */,
DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */,
DEFBEBD32C46C27200437188 /* SelectPenaltyViewModel.swift in Sources */,
DE6D4D152C3F14D80005584B /* InvitationCodePopUpViewController.swift in Sources */,
Expand Down Expand Up @@ -1796,6 +1799,8 @@
789AD4B52C3C0147002E2688 /* ReissueModel.swift in Sources */,
DECB845E2C4442AF0022A003 /* FindPlaceView.swift in Sources */,
DE6D4D0F2C3F14D80005584B /* MeetingInfoService.swift in Sources */,
DD3F9DD62C4988E2008E1FF7 /* RegisterMeetingsResponseModel.swift in Sources */,
DDE7D2C32C470A58005A921F /* ProfileTargetType.swift in Sources */,
DD3F9DCC2C485614008E1FF7 /* HomeServiceType.swift in Sources */,
DD39768A2C41C2AD00E2A4C4 /* HomeViewController.swift in Sources */,
DED5DBF42C34539A006ECE7E /* BaseTableViewCell.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// RegisterMeetingsResponseModel.swift
// KkuMulKum
//
// Created by YOUJIM on 7/19/24.
//

import Foundation

/// 모임 가입 (Response)
struct RegisterMeetingsResponseModel: ResponseModelType {
let meetingID: Int

enum CodingKeys: String, CodingKey {
case meetingID = "meetingId"
}
}
2 changes: 1 addition & 1 deletion KkuMulKum/Resource/Component/CustomTextField.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ private extension CustomTextField {
textColor: .black,
backgroundColor: .white,
placeholderColor: .gray3,
style: .body02
style: .body04
)
addPadding(left: 18)
setLayer(borderWidth: 1, borderColor: .gray3, cornerRadius: 8)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ private extension CheckInviteCodeViewController {
func inviteCodeViewDidTap() {
let inviteCodeViewController = InviteCodeViewController(
viewModel: InviteCodeViewModel(
service: MockInviteCodeService()
service: MeetingService()
)
)

Expand All @@ -74,7 +74,7 @@ private extension CheckInviteCodeViewController {
private func createMeetingViewDidTap() {
let createMeetingViewController = CreateMeetingViewController(
viewModel: CreateMeetingViewModel(
createMeetingService: MockCreateMeetingService()
createMeetingService: MeetingService()
)
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// CreateMeetingService.swift
// KkuMulKum
//
// Created by YOUJIM on 7/13/24.
//

import Foundation

import Moya

protocol CreateMeetingServiceType {
func createMeeting(
request: MakeMeetingsRequestModel
) async throws -> ResponseBodyDTO<MakeMeetingsResponseModel>?
}

extension MeetingService: CreateMeetingServiceType {
func createMeeting(
request: MakeMeetingsRequestModel
) async throws -> ResponseBodyDTO<MakeMeetingsResponseModel>? {
return try await self.request(
with: .createMeeting(
request: request
)
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,6 @@ private extension CreateMeetingViewController {

@objc
func presentButtonDidTapped() {
// TODO: 서버 연결해서 초대 코드 받아올 수 있게 처리
let inviteCodePopUpViewController = InvitationCodePopUpViewController(
invitationCode: createMeetingViewModel.inviteCode.value
)
Expand All @@ -135,7 +134,17 @@ private extension CreateMeetingViewController {
for: .touchUpInside
)

present(inviteCodePopUpViewController, animated: true, completion: nil)
createMeetingViewModel.createMeeting(
name: createMeetingViewModel.meetingName.value
)

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
inviteCodePopUpViewController.rootView.setInvitationCodeText(
self.createMeetingViewModel.inviteCode.value
)

self.present(inviteCodePopUpViewController, animated: true, completion: nil)
}
}

@objc
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class CreateMeetingViewModel {
// MARK: Property

let createMeetingService: CreateMeetingServiceType
var createMeetingResponse = ObservablePattern<MakeMeetingsResponseModel?>(nil)

let meetingName = ObservablePattern<String>("")
let inviteCodeState = ObservablePattern<MeetingNameState>(.empty)
Expand Down Expand Up @@ -53,4 +54,22 @@ extension CreateMeetingViewModel {
isNextButtonEnabled.value = true
}
}

/// 모임 생성 네트워크 통신
func createMeeting(name: String) {
Task {
do {
let request = MakeMeetingsRequestModel(name: name)

createMeetingResponse.value = try await createMeetingService.createMeeting(request: request)?.data

guard let code = createMeetingResponse.value?.invitationCode else { return }

inviteCode.value = code
}
catch {
print(">>> \(error.localizedDescription) : \(#function)")
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,33 @@
import Foundation

protocol InviteCodeServiceType {
func postMeetingInviteCode(with registerMeetingsModel: RegisterMeetingsModel) -> ResponseBodyDTO<EmptyModel>?
func joinMeeting(
with request: RegisterMeetingsModel
) async throws -> ResponseBodyDTO<RegisterMeetingsResponseModel>?
}

extension MeetingService: InviteCodeServiceType {
func joinMeeting(
with request: RegisterMeetingsModel
) async throws -> ResponseBodyDTO<RegisterMeetingsResponseModel>? {
return try await self.request(
with: .joinMeeting(
request: request
)
)
}
}

final class MockInviteCodeService: InviteCodeServiceType {
func postMeetingInviteCode(with registerMeetingsModel: RegisterMeetingsModel) -> ResponseBodyDTO<EmptyModel>? {
let mockData = EmptyModel()
func joinMeeting(with request: RegisterMeetingsModel) -> ResponseBodyDTO<RegisterMeetingsResponseModel>? {
let mockData = RegisterMeetingsResponseModel(
meetingID: 1
)

return ResponseBodyDTO<EmptyModel>.init(
return ResponseBodyDTO<RegisterMeetingsResponseModel>.init(
success: true,
data: mockData,
error: nil
)
}


}

Original file line number Diff line number Diff line change
Expand Up @@ -110,36 +110,55 @@ extension InviteCodeViewController {
owner.inviteCodeView.presentButton.isEnabled = true
}
}

inviteCodeViewModel.meetingID.bind { [weak self] id in
guard let id else { return }

DispatchQueue.main.async {
self?.inviteCodeViewModel.inviteCodeState.value = .success
}

DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) {
let meetingInfoViewController = MeetingInfoViewController(
viewModel: MeetingInfoViewModel(
meetingID: id,
service: MeetingService()
)
)

guard let rootViewController = self?.navigationController?.viewControllers.first as? MainTabBarController else {
return
}

self?.navigationController?.popToViewController(
rootViewController,
animated: false
)

rootViewController.navigationController?.pushViewController(
meetingInfoViewController,
animated: true
)
}
}

inviteCodeViewModel.errorDescription.bind(with: self) { owner, error in
DispatchQueue.main.async {
owner.inviteCodeView.errorLabel.setText(error, style: .caption02, color: .mainred)
owner.inviteCodeViewModel.inviteCodeState.value = .invalid
}
}
}


private func setupTapGesture() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))

view.addGestureRecognizer(tapGesture)
}

@objc private func nextButtonTapped() {
// TODO: 서버 연결할 때 데이터 바인딩해서 화면 전환 시키기
let meetingInfoViewController = MeetingInfoViewController(
viewModel: MeetingInfoViewModel(
meetingID: 1,
service: MeetingService()
)
)

guard let rootViewController = navigationController?.viewControllers.first as? MainTabBarController else {
return
}

navigationController?.popToViewController(
rootViewController,
animated: false
)

rootViewController.navigationController?.pushViewController(
meetingInfoViewController,
animated: true
)
inviteCodeViewModel.joinMeeting(inviteCode: inviteCodeViewModel.inviteCode.value)
}

@objc private func textFieldDidChange(_ textField: UITextField) {
Expand Down Expand Up @@ -175,4 +194,3 @@ extension InviteCodeViewController: UITextFieldDelegate {
return true
}
}

Loading

0 comments on commit 885a458

Please sign in to comment.