오디션 지원 완료 다이얼로그 추가
This commit is contained in:
		| @@ -138,7 +138,7 @@ enum AppStep { | ||||
|      | ||||
|     case auditionDetail(auditionId: Int) | ||||
|      | ||||
|     case auditionRoleDetail(roleId: Int) | ||||
|     case auditionRoleDetail(roleId: Int, auditionTitle: String) | ||||
|      | ||||
|     case searchChannel | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|                                                         ) | ||||
|                                                     ) | ||||
|                                             } | ||||
|                                         } | ||||
|                                 } | ||||
|   | ||||
| @@ -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: "스위치온") | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
							
								
								
									
										72
									
								
								SodaLive/Sources/Dialog/ApplyAuditionCompleteDialog.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								SodaLive/Sources/Dialog/ApplyAuditionCompleteDialog.swift
									
									
									
									
									
										Normal 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) | ||||
|     ) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Yu Sung
					Yu Sung