From 7e13689763cc66e1c728082e108f406063b28001 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Tue, 7 Jan 2025 19:59:19 +0900 Subject: [PATCH] =?UTF-8?q?=ED=88=AC=ED=91=9C=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Applicant/AuditionApplicantItemView.swift | 7 ++- .../GetAuditionApplicantListResponse.swift | 2 +- SodaLive/Sources/Audition/AuditionApi.swift | 10 ++- .../Sources/Audition/AuditionRepository.swift | 4 ++ .../Role/AuditionRoleDetailView.swift | 19 +++++- .../Role/AuditionRoleDetailViewModel.swift | 61 +++++++++++++++++++ .../Vote/VoteAuditionApplicantRequest.swift | 14 +++++ 7 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 SodaLive/Sources/Audition/Vote/VoteAuditionApplicantRequest.swift diff --git a/SodaLive/Sources/Audition/Applicant/AuditionApplicantItemView.swift b/SodaLive/Sources/Audition/Applicant/AuditionApplicantItemView.swift index 6ce60cb..d8b2448 100644 --- a/SodaLive/Sources/Audition/Applicant/AuditionApplicantItemView.swift +++ b/SodaLive/Sources/Audition/Applicant/AuditionApplicantItemView.swift @@ -11,6 +11,7 @@ import Kingfisher struct AuditionApplicantItemView: View { let item: GetAuditionRoleApplicantItem + let onClickVote: (Int) -> Void var body: some View { VStack(spacing: 5.3) { @@ -47,6 +48,9 @@ struct AuditionApplicantItemView: View { .font(.custom(Font.medium.rawValue, size: 12)) .foregroundColor(Color.gray77) } + .onTapGesture { + onClickVote(item.applicantId) + } } .padding(.vertical, 18.7) @@ -67,6 +71,7 @@ struct AuditionApplicantItemView: View { profileImageUrl: "https://test-cf.sodalive.net/profile/default-profile.png", voiceUrl: "", voteCount: 777 - ) + ), + onClickVote: { _ in } ) } diff --git a/SodaLive/Sources/Audition/Applicant/GetAuditionApplicantListResponse.swift b/SodaLive/Sources/Audition/Applicant/GetAuditionApplicantListResponse.swift index ef09461..b03e1f8 100644 --- a/SodaLive/Sources/Audition/Applicant/GetAuditionApplicantListResponse.swift +++ b/SodaLive/Sources/Audition/Applicant/GetAuditionApplicantListResponse.swift @@ -16,5 +16,5 @@ struct GetAuditionRoleApplicantItem: Decodable { let nickname: String let profileImageUrl: String let voiceUrl: String - let voteCount: Int + var voteCount: Int } diff --git a/SodaLive/Sources/Audition/AuditionApi.swift b/SodaLive/Sources/Audition/AuditionApi.swift index 3b93b6e..66101e2 100644 --- a/SodaLive/Sources/Audition/AuditionApi.swift +++ b/SodaLive/Sources/Audition/AuditionApi.swift @@ -14,6 +14,7 @@ enum AuditionApi { case getAuditionRoleDetail(auditionRoleId: Int) case getAuditionApplicantList(auditionRoleId: Int, sortType: AuditionApplicantSortType, page: Int, size: Int) case applyAudition(parameters: [MultipartFormData]) + case voteApplicant(applicantId: Int) } extension AuditionApi: TargetType { @@ -37,6 +38,9 @@ extension AuditionApi: TargetType { case .applyAudition: return "/audition/applicant" + + case .voteApplicant: + return "/audition/vote" } } @@ -46,7 +50,7 @@ extension AuditionApi: TargetType { case .getAuditionList, .getAuditionDetail, . getAuditionRoleDetail, .getAuditionApplicantList: return .get - case .applyAudition: + case .applyAudition, .voteApplicant: return .post } } @@ -77,6 +81,10 @@ extension AuditionApi: TargetType { case .applyAudition(let parameters): return .uploadMultipart(parameters) + + case .voteApplicant(let applicantId): + let request = VoteAuditionApplicantRequest(applicantId: applicantId) + return .requestJSONEncodable(request) } } diff --git a/SodaLive/Sources/Audition/AuditionRepository.swift b/SodaLive/Sources/Audition/AuditionRepository.swift index ab48843..e168480 100644 --- a/SodaLive/Sources/Audition/AuditionRepository.swift +++ b/SodaLive/Sources/Audition/AuditionRepository.swift @@ -39,4 +39,8 @@ final class AuditionRepository { func applyAudition(parameters: [MultipartFormData]) -> AnyPublisher { return api.requestPublisher(.applyAudition(parameters: parameters)) } + + func voteApplicant(applicantId: Int) -> AnyPublisher { + return api.requestPublisher(.voteApplicant(applicantId: applicantId)) + } } diff --git a/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift b/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift index 2fc9368..c5c574b 100644 --- a/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift +++ b/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift @@ -87,8 +87,12 @@ struct AuditionRoleDetailView: View { ForEach(0..