오디션, 오디션 캐릭터

- 모집완료이면 터치되지 않도록 수정
This commit is contained in:
Yu Sung 2025-01-08 00:25:52 +09:00
parent dd6c2fe469
commit 92608b5449
5 changed files with 78 additions and 26 deletions

View File

@ -6,5 +6,5 @@
// //
enum AuditionApplicantSortType: String, Codable { enum AuditionApplicantSortType: String, Codable {
case NEWEST, LIKE case NEWEST, LIKES
} }

View File

@ -41,10 +41,12 @@ struct AuditionView: View {
AuditionItemView(item: item) AuditionItemView(item: item)
.onTapGesture { .onTapGesture {
AppState.shared if !item.isOff {
.setAppStep( AppState.shared
step: .auditionDetail(auditionId: item.id) .setAppStep(
) step: .auditionDetail(auditionId: item.id)
)
}
} }
} }
} else if $0 == viewModel.firstIsOffIndex { } else if $0 == viewModel.firstIsOffIndex {
@ -74,19 +76,23 @@ struct AuditionView: View {
AuditionItemView(item: item) AuditionItemView(item: item)
.padding(.top, 16.7) .padding(.top, 16.7)
.onTapGesture { .onTapGesture {
AppState.shared if !item.isOff {
.setAppStep( AppState.shared
step: .auditionDetail(auditionId: item.id) .setAppStep(
) step: .auditionDetail(auditionId: item.id)
)
}
} }
} }
} else { } else {
AuditionItemView(item: item) AuditionItemView(item: item)
.onTapGesture { .onTapGesture {
AppState.shared if !item.isOff {
.setAppStep( AppState.shared
step: .auditionDetail(auditionId: item.id) .setAppStep(
) step: .auditionDetail(auditionId: item.id)
)
}
} }
} }

View File

@ -47,10 +47,12 @@ struct AuditionDetailView: View {
ForEach(0..<response.roleList.count, id: \.self) { ForEach(0..<response.roleList.count, id: \.self) {
let role = response.roleList[$0] let role = response.roleList[$0]
AuditionDetailRoleItemView(item: response.roleList[$0]) AuditionDetailRoleItemView(item: role)
.onTapGesture { .onTapGesture {
AppState.shared if !role.isComplete {
.setAppStep(step: .auditionRoleDetail(roleId: role.roleId)) AppState.shared
.setAppStep(step: .auditionRoleDetail(roleId: role.roleId))
}
} }
} }
} }

View File

@ -84,6 +84,43 @@ struct AuditionRoleDetailView: View {
.foregroundColor(Color.grayee) .foregroundColor(Color.grayee)
.padding(.top, 15) .padding(.top, 15)
} else { } else {
HStack(spacing: 0) {
Text("참여자")
.font(.custom(Font.medium.rawValue, size: 13.3))
.foregroundColor(Color.graybb)
Text("\(viewModel.totalCount)")
.font(.custom(Font.medium.rawValue, size: 13.3))
.foregroundColor(Color.button)
.padding(.leading, 2.3)
Text("")
.font(.custom(Font.medium.rawValue, size: 13.3))
.foregroundColor(Color.graybb)
Spacer()
Text("최신순")
.font(.custom(Font.medium.rawValue, size: 13.3))
.foregroundColor(
viewModel.sortType == .NEWEST ? Color.button : Color.graybb
)
.onTapGesture {
viewModel.setSortType(sortType: .NEWEST)
}
Text("좋아요순")
.font(.custom(Font.medium.rawValue, size: 13.3))
.foregroundColor(
viewModel.sortType == .LIKES ? Color.button : Color.graybb
)
.onTapGesture {
viewModel.setSortType(sortType: .LIKES)
}
.padding(.leading, 13.3)
}
.padding(.top, 15)
VStack(spacing: 5.3) { VStack(spacing: 5.3) {
ForEach(0..<viewModel.applicantList.count, id: \.self) { ForEach(0..<viewModel.applicantList.count, id: \.self) {
let applicant = viewModel.applicantList[$0] let applicant = viewModel.applicantList[$0]

View File

@ -24,11 +24,9 @@ final class AuditionRoleDetailViewModel: ObservableObject {
@Published var name = "보이스온" @Published var name = "보이스온"
@Published var auditionRoleDetail: GetAuditionRoleDetailResponse? = nil @Published var auditionRoleDetail: GetAuditionRoleDetailResponse? = nil
@Published var sortType = AuditionApplicantSortType.NEWEST { @Published private (set) var sortType = AuditionApplicantSortType.NEWEST {
didSet { didSet {
page = 1 refreshApplicantList()
isLast = false
getAuditionRoleDetail()
} }
} }
@ -57,6 +55,12 @@ final class AuditionRoleDetailViewModel: ObservableObject {
var onFailure: () -> Void = {} var onFailure: () -> Void = {}
func setSortType(sortType: AuditionApplicantSortType) {
if self.sortType != sortType {
self.sortType = sortType
}
}
func getAuditionRoleDetail() { func getAuditionRoleDetail() {
isLoading = true isLoading = true
@ -237,13 +241,8 @@ final class AuditionRoleDetailViewModel: ObservableObject {
self.phoneNumber = "" self.phoneNumber = ""
self.fileName = "" self.fileName = ""
self.soundData = nil self.soundData = nil
self.applicantList = []
self.totalCount = 0
self.page = 1
self.isLast = false
self.getAuditionRoleDetail()
self.refreshApplicantList()
onSuccess() onSuccess()
} else { } else {
if let message = decoded.message { if let message = decoded.message {
@ -323,6 +322,14 @@ final class AuditionRoleDetailViewModel: ObservableObject {
.store(in: &subscription) .store(in: &subscription)
} }
private func refreshApplicantList() {
self.page = 1
self.isLast = false
self.totalCount = 0
self.applicantList = []
self.getAuditionApplicantList()
}
func deleteAllRecordingFilesWithNamePrefix(_ prefix: String) { func deleteAllRecordingFilesWithNamePrefix(_ prefix: String) {
let fileManager = FileManager.default let fileManager = FileManager.default
let documentsURL = getDocumentsDirectory() let documentsURL = getDocumentsDirectory()