sodalive-ios/SodaLive/Sources/Audition/Applicant/AuditionApplicantItemView.s...

108 lines
4.0 KiB
Swift

//
// AuditionApplicantItemView.swift
// SodaLive
//
// Created by klaus on 1/7/25.
//
import SwiftUI
import Kingfisher
struct AuditionApplicantItemView: View {
let item: GetAuditionRoleApplicantItem
let onClickVote: (Int) -> Void
@StateObject var soundManager = AuditionSoundManager.shared
var body: some View {
VStack(spacing: 5.3) {
HStack(spacing: 13.3) {
ZStack {
KFImage(URL(string: item.profileImageUrl))
.cancelOnDisappear(true)
.downsampling(size: CGSize(width: 40, height: 40))
.resizable()
.aspectRatio(1, contentMode: .fit)
.scaledToFill()
.frame(width: 40, height: 40)
.clipShape(Circle())
Image(soundManager.applicantId == item.applicantId && soundManager.isPlaying ? "ic_audition_pause" : "ic_audition_play")
.onTapGesture {
soundManager.playOrPause(
applicantId: item.applicantId,
url: item.voiceUrl
)
}
}
.onTapGesture {
AppState.shared.setAppStep(step: .creatorDetail(userId: item.memberId))
}
VStack(spacing: 8) {
HStack(spacing: 0) {
Text(item.nickname.count > 9 ? "\(item.nickname.prefix(9))..." : item.nickname)
.font(.custom(Font.medium.rawValue, size: 12))
.foregroundColor(Color.white)
.onTapGesture {
AppState.shared.setAppStep(step: .creatorDetail(userId: item.memberId))
}
Spacer()
if soundManager.applicantId == item.applicantId {
Text("\(secondsToMinutesSeconds(Int(soundManager.currentTime)))/\(secondsToMinutesSeconds(Int(soundManager.duration)))")
.font(.custom(Font.medium.rawValue, size: 12))
.foregroundColor(Color.gray77)
}
}
if soundManager.applicantId == item.applicantId {
ProgressView(value: soundManager.currentTime, total: soundManager.duration)
.progressViewStyle(LinearProgressViewStyle(tint: Color.button))
}
}
VStack(spacing: 2.3) {
Image("ic_heart_vote")
Text("\(item.voteCount)")
.font(.custom(Font.medium.rawValue, size: 12))
.foregroundColor(Color.gray77)
}
.onTapGesture {
onClickVote(item.applicantId)
}
}
.padding(.vertical, 18.7)
Color.gray55
.frame(maxWidth: .infinity)
.frame(height: 1)
}
.padding(.horizontal, 13.3)
}
private func secondsToMinutesSeconds(_ seconds: Int) -> String {
let minute = String(format: "%02d", seconds / 60)
let second = String(format: "%02d", seconds % 60)
return "\(minute):\(second)"
}
}
#Preview {
AuditionApplicantItemView(
item: GetAuditionRoleApplicantItem(
applicantId: 1,
memberId: 2,
nickname: "유저일유저일유저일유저일",
profileImageUrl: "https://test-cf.sodalive.net/profile/default-profile.png",
voiceUrl: "",
voteCount: 777
),
onClickVote: { _ in }
)
}