오디션 지원 완료 다이얼로그 추가
This commit is contained in:
		| @@ -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() | ||||||
|   | |||||||
							
								
								
									
										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