// // 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 } ) }