From 2e8258a9771348f0807d75f9eb584b54698ba54d Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 6 Dec 2023 23:24:33 +0900 Subject: [PATCH] =?UTF-8?q?-=20=EB=A3=B0=EB=A0=9B=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20API=20=EC=A0=81=EC=9A=A9=20-=20=EB=A3=B0?= =?UTF-8?q?=EB=A0=9B=20=EC=84=A4=EC=A0=95=20=EC=99=84=EB=A3=8C=20=EC=8B=9C?= =?UTF-8?q?=20=EC=8B=A0=ED=98=B8=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Room/Chat/LiveRoomChatRawMessage.swift | 3 +- SodaLive/Sources/Live/Room/LiveRoomView.swift | 4 +- .../Sources/Live/Room/LiveRoomViewModel.swift | 14 ++++++ .../CreateOrUpdateRouletteRequest.swift | 14 ++++++ .../Config/RouletteSettingsView.swift | 7 ++- .../Config/RouletteSettingsViewModel.swift | 48 +++++++++++++++++++ .../Room/Routlette/GetRouletteResponse.swift | 2 +- .../Live/Room/Routlette/RouletteApi.swift | 9 +++- .../Room/Routlette/RouletteRepository.swift | 4 ++ 9 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 SodaLive/Sources/Live/Room/Routlette/Config/CreateOrUpdateRouletteRequest.swift diff --git a/SodaLive/Sources/Live/Room/Chat/LiveRoomChatRawMessage.swift b/SodaLive/Sources/Live/Room/Chat/LiveRoomChatRawMessage.swift index d5255b1..42d0f42 100644 --- a/SodaLive/Sources/Live/Room/Chat/LiveRoomChatRawMessage.swift +++ b/SodaLive/Sources/Live/Room/Chat/LiveRoomChatRawMessage.swift @@ -9,11 +9,12 @@ import Foundation struct LiveRoomChatRawMessage: Codable { enum LiveRoomChatRawMessageType: String, Codable { - case DONATION, EDIT_ROOM_INFO, SET_MANAGER + case DONATION, EDIT_ROOM_INFO, SET_MANAGER, TOGGLE_ROULETTE } let type: LiveRoomChatRawMessageType let message: String let can: Int let donationMessage: String? + var isActiveRoulette: Bool? = nil } diff --git a/SodaLive/Sources/Live/Room/LiveRoomView.swift b/SodaLive/Sources/Live/Room/LiveRoomView.swift index 6c3a4fa..ce39819 100644 --- a/SodaLive/Sources/Live/Room/LiveRoomView.swift +++ b/SodaLive/Sources/Live/Room/LiveRoomView.swift @@ -686,7 +686,9 @@ struct LiveRoomView: View { } if viewModel.isShowRouletteSettings { - RouletteSettingsView(isShowing: $viewModel.isShowRouletteSettings) + RouletteSettingsView(isShowing: $viewModel.isShowRouletteSettings) { isActiveRoulette in + self.viewModel.setActiveRoulette(isActiveRoulette: isActiveRoulette) + } } if viewModel.isLoading && viewModel.liveRoomInfo == nil { diff --git a/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift b/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift index 608de70..1ec25b7 100644 --- a/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift +++ b/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift @@ -1328,6 +1328,20 @@ final class LiveRoomViewModel: NSObject, ObservableObject { UserDefaults.set(jsonData, forKey: .noChatRoomList) } } + + func setActiveRoulette(isActiveRoulette: Bool) { + self.popupContent = isActiveRoulette ? "룰렛을 활성화 했습니다." : "룰렛을 비활성화 했습니다." + self.isShowPopup = true + self.agora.sendRawMessageToGroup( + rawMessage: LiveRoomChatRawMessage( + type: .TOGGLE_ROULETTE, + message: "", + can: 0, + donationMessage: "", + isActiveRoulette: isActiveRoulette + ) + ) + } } extension LiveRoomViewModel: AgoraRtcEngineDelegate { diff --git a/SodaLive/Sources/Live/Room/Routlette/Config/CreateOrUpdateRouletteRequest.swift b/SodaLive/Sources/Live/Room/Routlette/Config/CreateOrUpdateRouletteRequest.swift new file mode 100644 index 0000000..50b2f4c --- /dev/null +++ b/SodaLive/Sources/Live/Room/Routlette/Config/CreateOrUpdateRouletteRequest.swift @@ -0,0 +1,14 @@ +// +// CreateOrUpdateRouletteRequest.swift +// SodaLive +// +// Created by klaus on 2023/12/06. +// + +import Foundation + +struct CreateOrUpdateRouletteRequest: Encodable { + let can: Int + let isActive: Bool + let items: [RouletteItem] +} diff --git a/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsView.swift b/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsView.swift index 7d8d1cc..fb9c93b 100644 --- a/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsView.swift +++ b/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsView.swift @@ -13,6 +13,7 @@ struct RouletteSettingsView: View { @StateObject var viewModel = RouletteSettingsViewModel() @Binding var isShowing: Bool + let onComplete: (Bool) -> Void var body: some View { GeometryReader { proxy in @@ -132,6 +133,10 @@ struct RouletteSettingsView: View { .background(Color(hex: "3bb9f1")) .cornerRadius(10) .onTapGesture { + viewModel.createOrUpdateRoulette { + onComplete($0) + isShowing = false + } } } .padding(13.3) @@ -180,6 +185,6 @@ struct RouletteSettingsView: View { struct RouletteSettingsView_Previews: PreviewProvider { static var previews: some View { - RouletteSettingsView(isShowing: .constant(true)) + RouletteSettingsView(isShowing: .constant(true)) { _ in } } } diff --git a/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsViewModel.swift b/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsViewModel.swift index cc34754..dc37645 100644 --- a/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsViewModel.swift +++ b/SodaLive/Sources/Live/Room/Routlette/Config/RouletteSettingsViewModel.swift @@ -147,4 +147,52 @@ final class RouletteSettingsViewModel: ObservableObject { isLoading = false isShowPreview = true } + + func createOrUpdateRoulette(onSuccess: @escaping (Bool) -> Void) { + if !isLoading { + isLoading = true + + var items = [RouletteItem]() + for option in options { + if option.title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + isLoading = false + errorMessage = "옵션은 빈칸일 수 없습니다." + isShowErrorPopup = true + return + } + + items.append(RouletteItem(title: option.title, weight: option.weight)) + } + + let request = CreateOrUpdateRouletteRequest(can: can, isActive: isActive, items: items) + repository.createOrUpdateRoulette(request: request) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { [unowned self] response in + self.isLoading = false + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData) + + if decoded.success { + onSuccess(isActive) + } else { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowErrorPopup = true + } + } catch { + self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." + self.isShowErrorPopup = true + } + } + .store(in: &subscription) + } + } } diff --git a/SodaLive/Sources/Live/Room/Routlette/GetRouletteResponse.swift b/SodaLive/Sources/Live/Room/Routlette/GetRouletteResponse.swift index b159fde..ac4395d 100644 --- a/SodaLive/Sources/Live/Room/Routlette/GetRouletteResponse.swift +++ b/SodaLive/Sources/Live/Room/Routlette/GetRouletteResponse.swift @@ -11,7 +11,7 @@ struct GetRouletteResponse: Decodable { let items: [RouletteItem] } -struct RouletteItem: Decodable { +struct RouletteItem: Codable { let title: String let weight: Int } diff --git a/SodaLive/Sources/Live/Room/Routlette/RouletteApi.swift b/SodaLive/Sources/Live/Room/Routlette/RouletteApi.swift index 14e9ec3..5b5d13d 100644 --- a/SodaLive/Sources/Live/Room/Routlette/RouletteApi.swift +++ b/SodaLive/Sources/Live/Room/Routlette/RouletteApi.swift @@ -10,6 +10,7 @@ import Moya enum RouletteApi { case getRoulette(creatorId: Int) + case createOrUpdateRoulette(request: CreateOrUpdateRouletteRequest) } extension RouletteApi: TargetType { @@ -19,7 +20,7 @@ extension RouletteApi: TargetType { var path: String { switch self { - case .getRoulette: + case .getRoulette, .createOrUpdateRoulette: return "/roulette" } } @@ -28,6 +29,9 @@ extension RouletteApi: TargetType { switch self { case .getRoulette: return .get + + case .createOrUpdateRoulette: + return .post } } @@ -42,6 +46,9 @@ extension RouletteApi: TargetType { parameters: parameters, encoding: URLEncoding.queryString ) + + case .createOrUpdateRoulette(let request): + return .requestJSONEncodable(request) } } diff --git a/SodaLive/Sources/Live/Room/Routlette/RouletteRepository.swift b/SodaLive/Sources/Live/Room/Routlette/RouletteRepository.swift index ea7caec..9de30e7 100644 --- a/SodaLive/Sources/Live/Room/Routlette/RouletteRepository.swift +++ b/SodaLive/Sources/Live/Room/Routlette/RouletteRepository.swift @@ -16,5 +16,9 @@ final class RouletteRepository { func getRoulette(creatorId: Int) -> AnyPublisher { return api.requestPublisher(.getRoulette(creatorId: creatorId)) } + + func createOrUpdateRoulette(request: CreateOrUpdateRouletteRequest) -> AnyPublisher { + return api.requestPublisher(.createOrUpdateRoulette(request: request)) + } }