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..