오디션 지원 완료 다이얼로그 추가
This commit is contained in:
parent
1d3350d498
commit
8228f4717a
|
@ -138,7 +138,7 @@ enum AppStep {
|
||||||
|
|
||||||
case auditionDetail(auditionId: Int)
|
case auditionDetail(auditionId: Int)
|
||||||
|
|
||||||
case auditionRoleDetail(roleId: Int)
|
case auditionRoleDetail(roleId: Int, auditionTitle: String)
|
||||||
|
|
||||||
case searchChannel
|
case searchChannel
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,12 @@ struct AuditionDetailView: View {
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
if !role.isComplete {
|
if !role.isComplete {
|
||||||
AppState.shared
|
AppState.shared
|
||||||
.setAppStep(step: .auditionRoleDetail(roleId: role.roleId))
|
.setAppStep(
|
||||||
|
step: .auditionRoleDetail(
|
||||||
|
roleId: role.roleId,
|
||||||
|
auditionTitle: viewModel.title
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import Kingfisher
|
||||||
struct AuditionRoleDetailView: View {
|
struct AuditionRoleDetailView: View {
|
||||||
|
|
||||||
let roleId: Int
|
let roleId: Int
|
||||||
|
let auditionTitle: String
|
||||||
|
|
||||||
@StateObject var viewModel = AuditionRoleDetailViewModel()
|
@StateObject var viewModel = AuditionRoleDetailViewModel()
|
||||||
@StateObject var keyboardHandler = KeyboardHandler()
|
@StateObject var keyboardHandler = KeyboardHandler()
|
||||||
|
@ -22,6 +23,7 @@ struct AuditionRoleDetailView: View {
|
||||||
@State private var isShowNoticeAuthView = false
|
@State private var isShowNoticeAuthView = false
|
||||||
@State private var isShowApplyView = false
|
@State private var isShowApplyView = false
|
||||||
@State private var isShowNoticeReapply = false
|
@State private var isShowNoticeReapply = false
|
||||||
|
@State private var isShowApplyCompleteView = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
BaseView(isLoading: $viewModel.isLoading) {
|
BaseView(isLoading: $viewModel.isLoading) {
|
||||||
|
@ -253,6 +255,7 @@ struct AuditionRoleDetailView: View {
|
||||||
viewModel.applyAudition {
|
viewModel.applyAudition {
|
||||||
isShowApplyView = false
|
isShowApplyView = false
|
||||||
isShowRecordingView = false
|
isShowRecordingView = false
|
||||||
|
isShowApplyCompleteView = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -285,17 +288,25 @@ struct AuditionRoleDetailView: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if viewModel.isShowSodaDialog {
|
if viewModel.isShowVoteCompleteView {
|
||||||
SodaDialog(
|
SodaDialog(
|
||||||
title: viewModel.dialogTitle,
|
title: viewModel.dialogTitle,
|
||||||
desc: viewModel.dialogDesc,
|
desc: viewModel.dialogDesc,
|
||||||
confirmButtonTitle: "확인"
|
confirmButtonTitle: "확인"
|
||||||
) {
|
) {
|
||||||
viewModel.isShowSodaDialog = false
|
viewModel.isShowVoteCompleteView = false
|
||||||
viewModel.isShowNotifyVote = false
|
viewModel.isShowNotifyVote = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isShowApplyCompleteView {
|
||||||
|
ApplyAuditionCompleteDialog(
|
||||||
|
auditionTitle: auditionTitle,
|
||||||
|
roleName: viewModel.name,
|
||||||
|
isShowing: $isShowApplyCompleteView
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if soundManager.isLoading {
|
if soundManager.isLoading {
|
||||||
LoadingView()
|
LoadingView()
|
||||||
}
|
}
|
||||||
|
@ -334,5 +345,5 @@ struct AuditionRoleDetailView: View {
|
||||||
}
|
}
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
AuditionRoleDetailView(roleId: 1)
|
AuditionRoleDetailView(roleId: 1, auditionTitle: "스위치온")
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ final class AuditionRoleDetailViewModel: ObservableObject {
|
||||||
@Published var phoneNumber = ""
|
@Published var phoneNumber = ""
|
||||||
|
|
||||||
@Published var isShowNotifyVote = true
|
@Published var isShowNotifyVote = true
|
||||||
@Published var isShowSodaDialog = false
|
@Published var isShowVoteCompleteView = false
|
||||||
@Published var isShowNoticeReapply = false
|
@Published var isShowNoticeReapply = false
|
||||||
@Published var dialogTitle = ""
|
@Published var dialogTitle = ""
|
||||||
@Published var dialogDesc = ""
|
@Published var dialogDesc = ""
|
||||||
|
@ -236,8 +236,6 @@ final class AuditionRoleDetailViewModel: ObservableObject {
|
||||||
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
|
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
|
||||||
|
|
||||||
if decoded.success {
|
if decoded.success {
|
||||||
self.errorMessage = "오디션 지원이 완료되었습니다."
|
|
||||||
self.isShowPopup = true
|
|
||||||
self.deleteAllRecordingFilesWithNamePrefix("voiceon_now_voice")
|
self.deleteAllRecordingFilesWithNamePrefix("voiceon_now_voice")
|
||||||
|
|
||||||
self.phoneNumber = ""
|
self.phoneNumber = ""
|
||||||
|
@ -291,7 +289,7 @@ final class AuditionRoleDetailViewModel: ObservableObject {
|
||||||
if self.isShowNotifyVote {
|
if self.isShowNotifyVote {
|
||||||
self.dialogTitle = "[오디션 응원]"
|
self.dialogTitle = "[오디션 응원]"
|
||||||
self.dialogDesc = "오디션을 응원하셨습니다\n(무료응원 : 1계정당 1일 1회)\n1캔으로 추가 응원을 해보세요."
|
self.dialogDesc = "오디션을 응원하셨습니다\n(무료응원 : 1계정당 1일 1회)\n1캔으로 추가 응원을 해보세요."
|
||||||
self.isShowSodaDialog = true
|
self.isShowVoteCompleteView = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if let index = self.applicantList.firstIndex(where: { $0.applicantId == applicantId }) {
|
if let index = self.applicantList.firstIndex(where: { $0.applicantId == applicantId }) {
|
||||||
|
@ -306,7 +304,7 @@ final class AuditionRoleDetailViewModel: ObservableObject {
|
||||||
if message.contains("오늘 응원은 여기까지") {
|
if message.contains("오늘 응원은 여기까지") {
|
||||||
self.dialogTitle = "[오늘 응원 제한]"
|
self.dialogTitle = "[오늘 응원 제한]"
|
||||||
self.dialogDesc = "오늘 응원은 여기까지!\n하루 최대 10회까지 이용이 가능합니다.\n내일 다시 이용해주세요."
|
self.dialogDesc = "오늘 응원은 여기까지!\n하루 최대 10회까지 이용이 가능합니다.\n내일 다시 이용해주세요."
|
||||||
self.isShowSodaDialog = true
|
self.isShowVoteCompleteView = true
|
||||||
} else {
|
} else {
|
||||||
self.errorMessage = message
|
self.errorMessage = message
|
||||||
self.isShowPopup = true
|
self.isShowPopup = true
|
||||||
|
|
|
@ -206,8 +206,11 @@ struct ContentView: View {
|
||||||
case .auditionDetail(let auditionId):
|
case .auditionDetail(let auditionId):
|
||||||
AuditionDetailView(auditionId: auditionId)
|
AuditionDetailView(auditionId: auditionId)
|
||||||
|
|
||||||
case .auditionRoleDetail(let roleId):
|
case .auditionRoleDetail(let roleId, let auditionTitle):
|
||||||
AuditionRoleDetailView(roleId: roleId)
|
AuditionRoleDetailView(
|
||||||
|
roleId: roleId,
|
||||||
|
auditionTitle: auditionTitle
|
||||||
|
)
|
||||||
|
|
||||||
case .searchChannel:
|
case .searchChannel:
|
||||||
SearchChannelView()
|
SearchChannelView()
|
||||||
|
|
|
@ -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)
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue