From 8228f4717a381efc3e215a40a5cd38858041a2b2 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Mon, 20 Jan 2025 21:21:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=94=94=EC=85=98=20=EC=A7=80?= =?UTF-8?q?=EC=9B=90=20=EC=99=84=EB=A3=8C=20=EB=8B=A4=EC=9D=B4=EC=96=BC?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SodaLive/Sources/App/AppStep.swift | 2 +- .../Audition/Detail/AuditionDetailView.swift | 7 +- .../Role/AuditionRoleDetailView.swift | 17 ++++- .../Role/AuditionRoleDetailViewModel.swift | 8 +-- SodaLive/Sources/ContentView.swift | 7 +- .../Dialog/ApplyAuditionCompleteDialog.swift | 72 +++++++++++++++++++ 6 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 SodaLive/Sources/Dialog/ApplyAuditionCompleteDialog.swift diff --git a/SodaLive/Sources/App/AppStep.swift b/SodaLive/Sources/App/AppStep.swift index 62ec1de..eea785d 100644 --- a/SodaLive/Sources/App/AppStep.swift +++ b/SodaLive/Sources/App/AppStep.swift @@ -138,7 +138,7 @@ enum AppStep { case auditionDetail(auditionId: Int) - case auditionRoleDetail(roleId: Int) + case auditionRoleDetail(roleId: Int, auditionTitle: String) case searchChannel } diff --git a/SodaLive/Sources/Audition/Detail/AuditionDetailView.swift b/SodaLive/Sources/Audition/Detail/AuditionDetailView.swift index 1974ae7..7500541 100644 --- a/SodaLive/Sources/Audition/Detail/AuditionDetailView.swift +++ b/SodaLive/Sources/Audition/Detail/AuditionDetailView.swift @@ -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 + ) + ) } } } diff --git a/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift b/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift index b5c58bf..944f0f2 100644 --- a/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift +++ b/SodaLive/Sources/Audition/Role/AuditionRoleDetailView.swift @@ -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: "스위치온") } diff --git a/SodaLive/Sources/Audition/Role/AuditionRoleDetailViewModel.swift b/SodaLive/Sources/Audition/Role/AuditionRoleDetailViewModel.swift index b711c35..7226bdd 100644 --- a/SodaLive/Sources/Audition/Role/AuditionRoleDetailViewModel.swift +++ b/SodaLive/Sources/Audition/Role/AuditionRoleDetailViewModel.swift @@ -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 diff --git a/SodaLive/Sources/ContentView.swift b/SodaLive/Sources/ContentView.swift index c684285..f4151fa 100644 --- a/SodaLive/Sources/ContentView.swift +++ b/SodaLive/Sources/ContentView.swift @@ -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() diff --git a/SodaLive/Sources/Dialog/ApplyAuditionCompleteDialog.swift b/SodaLive/Sources/Dialog/ApplyAuditionCompleteDialog.swift new file mode 100644 index 0000000..c07ab07 --- /dev/null +++ b/SodaLive/Sources/Dialog/ApplyAuditionCompleteDialog.swift @@ -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) + ) +}