오디션 지원 완료 다이얼로그 추가

This commit is contained in:
Yu Sung 2025-01-20 21:21:51 +09:00
parent 1d3350d498
commit 8228f4717a
6 changed files with 101 additions and 12 deletions

View File

@ -138,7 +138,7 @@ enum AppStep {
case auditionDetail(auditionId: Int)
case auditionRoleDetail(roleId: Int)
case auditionRoleDetail(roleId: Int, auditionTitle: String)
case searchChannel
}

View File

@ -51,7 +51,12 @@ struct AuditionDetailView: View {
.onTapGesture {
if !role.isComplete {
AppState.shared
.setAppStep(step: .auditionRoleDetail(roleId: role.roleId))
.setAppStep(
step: .auditionRoleDetail(
roleId: role.roleId,
auditionTitle: viewModel.title
)
)
}
}
}

View File

@ -11,6 +11,7 @@ import Kingfisher
struct AuditionRoleDetailView: View {
let roleId: Int
let auditionTitle: String
@StateObject var viewModel = AuditionRoleDetailViewModel()
@StateObject var keyboardHandler = KeyboardHandler()
@ -22,6 +23,7 @@ struct AuditionRoleDetailView: View {
@State private var isShowNoticeAuthView = false
@State private var isShowApplyView = false
@State private var isShowNoticeReapply = false
@State private var isShowApplyCompleteView = false
var body: some View {
BaseView(isLoading: $viewModel.isLoading) {
@ -253,6 +255,7 @@ struct AuditionRoleDetailView: View {
viewModel.applyAudition {
isShowApplyView = false
isShowRecordingView = false
isShowApplyCompleteView = true
}
}
)
@ -285,17 +288,25 @@ struct AuditionRoleDetailView: View {
}
}
if viewModel.isShowSodaDialog {
if viewModel.isShowVoteCompleteView {
SodaDialog(
title: viewModel.dialogTitle,
desc: viewModel.dialogDesc,
confirmButtonTitle: "확인"
) {
viewModel.isShowSodaDialog = false
viewModel.isShowVoteCompleteView = false
viewModel.isShowNotifyVote = false
}
}
if isShowApplyCompleteView {
ApplyAuditionCompleteDialog(
auditionTitle: auditionTitle,
roleName: viewModel.name,
isShowing: $isShowApplyCompleteView
)
}
if soundManager.isLoading {
LoadingView()
}
@ -334,5 +345,5 @@ struct AuditionRoleDetailView: View {
}
#Preview {
AuditionRoleDetailView(roleId: 1)
AuditionRoleDetailView(roleId: 1, auditionTitle: "스위치온")
}

View File

@ -35,7 +35,7 @@ final class AuditionRoleDetailViewModel: ObservableObject {
@Published var phoneNumber = ""
@Published var isShowNotifyVote = true
@Published var isShowSodaDialog = false
@Published var isShowVoteCompleteView = false
@Published var isShowNoticeReapply = false
@Published var dialogTitle = ""
@Published var dialogDesc = ""
@ -236,8 +236,6 @@ final class AuditionRoleDetailViewModel: ObservableObject {
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
if decoded.success {
self.errorMessage = "오디션 지원이 완료되었습니다."
self.isShowPopup = true
self.deleteAllRecordingFilesWithNamePrefix("voiceon_now_voice")
self.phoneNumber = ""
@ -291,7 +289,7 @@ final class AuditionRoleDetailViewModel: ObservableObject {
if self.isShowNotifyVote {
self.dialogTitle = "[오디션 응원]"
self.dialogDesc = "오디션을 응원하셨습니다\n(무료응원 : 1계정당 1일 1회)\n1캔으로 추가 응원을 해보세요."
self.isShowSodaDialog = true
self.isShowVoteCompleteView = true
}
if let index = self.applicantList.firstIndex(where: { $0.applicantId == applicantId }) {
@ -306,7 +304,7 @@ final class AuditionRoleDetailViewModel: ObservableObject {
if message.contains("오늘 응원은 여기까지") {
self.dialogTitle = "[오늘 응원 제한]"
self.dialogDesc = "오늘 응원은 여기까지!\n하루 최대 10회까지 이용이 가능합니다.\n내일 다시 이용해주세요."
self.isShowSodaDialog = true
self.isShowVoteCompleteView = true
} else {
self.errorMessage = message
self.isShowPopup = true

View File

@ -206,8 +206,11 @@ struct ContentView: View {
case .auditionDetail(let auditionId):
AuditionDetailView(auditionId: auditionId)
case .auditionRoleDetail(let roleId):
AuditionRoleDetailView(roleId: roleId)
case .auditionRoleDetail(let roleId, let auditionTitle):
AuditionRoleDetailView(
roleId: roleId,
auditionTitle: auditionTitle
)
case .searchChannel:
SearchChannelView()

View File

@ -0,0 +1,72 @@
//
// ApplyAuditionCompleteDialog.swift
// SodaLive
//
// Created by klaus on 1/20/25.
//
import SwiftUI
struct ApplyAuditionCompleteDialog: View {
let auditionTitle: String
let roleName: String
@Binding var isShowing: Bool
var body: some View {
ZStack {
Color.black
.opacity(0.5)
VStack(spacing: 0) {
Text("오디션 지원")
.font(.custom(Font.bold.rawValue, size: 18.3))
.foregroundColor(Color.grayee)
.padding(.top, 26.7)
Text("보이스온 오디션에 지원해 주셔서 감사합니다.")
.font(.custom(Font.medium.rawValue, size: 15))
.foregroundColor(Color.graybb)
.padding(.top, 15)
Text(auditionTitle)
.font(.custom(Font.bold.rawValue, size: 18.3))
.foregroundColor(Color.graybb)
.padding(.top, 20)
Text(roleName)
.font(.custom(Font.medium.rawValue, size: 13.3))
.foregroundColor(Color.graybb)
.padding(.top, 10)
Text("확인")
.font(.custom(Font.bold.rawValue, size: 18.3))
.foregroundColor(Color.white)
.padding(.vertical, 16)
.frame(maxWidth: .infinity)
.background(Color.button)
.cornerRadius(8)
.contentShape(Rectangle())
.padding(.horizontal, 18.3)
.padding(.top, 35)
.padding(.bottom, 16.7)
.onTapGesture {
isShowing = false
}
}
.frame(maxWidth: .infinity)
.background(Color.gray22)
.cornerRadius(10)
.padding(.horizontal, 13.3)
}
}
}
#Preview {
ApplyAuditionCompleteDialog(
auditionTitle: "스위치온",
roleName: "장예은",
isShowing: .constant(true)
)
}