// // LiveDetailViewModel.swift // SodaLive // // Created by klaus on 2023/08/14. // import Foundation import Combine import FirebaseDynamicLinks final class LiveDetailViewModel: ObservableObject { private let repository = LiveRepository() private var subscription = Set() @Published var isLoading = false @Published var errorMessage = "" @Published var isShowPopup = false @Published var room: GetRoomDetailResponse? = nil @Published var showDetail = false @Published var shareMessage = "" @Published var isShowShareView = false func getDetail(roomId: Int) { if !isLoading { isLoading = true repository.getRoomDetail(roomId: roomId) .sink { result in switch result { case .finished: DEBUG_LOG("finish") case .failure(let error): ERROR_LOG(error.localizedDescription) } } receiveValue: { response in let responseData = response.data do { let jsonDecoder = JSONDecoder() let decoded = try jsonDecoder.decode(ApiResponse.self, from: responseData) if let data = decoded.data, decoded.success { DispatchQueue.main.async { self.showDetail = true self.room = data } } else { if let message = decoded.message { self.errorMessage = message } else { self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." } self.isShowPopup = true } } catch { print(error) self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." self.isShowPopup = true } self.isLoading = false } .store(in: &subscription) } } func onBack(afterExecute: () -> Void) { showDetail = false afterExecute() } func liveCancel(roomId: Int, reason: String, onSuccess: @escaping () -> Void) { isLoading = true repository.cancelRoom(roomId: roomId, reason: reason) .sink { result in switch result { case .finished: DEBUG_LOG("finish") case .failure(let error): ERROR_LOG(error.localizedDescription) } } receiveValue: { 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() } else { if let message = decoded.message { self.errorMessage = message } else { self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." } self.isShowPopup = true } } catch { self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." self.isShowPopup = true } } .store(in: &subscription) } func shareRoom(roomId: Int) { isLoading = true guard let link = URL(string: "https://sodalive.net/?room_id=\(roomId)") else { return } let dynamicLinksDomainURIPrefix = "https://sodalive.page.link" guard let linkBuilder = DynamicLinkComponents(link: link, domainURIPrefix: dynamicLinksDomainURIPrefix) else { self.errorMessage = "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요." self.isShowPopup = true isLoading = false return } linkBuilder.iOSParameters = DynamicLinkIOSParameters(bundleID: "kr.co.vividnext.sodalive") linkBuilder.iOSParameters?.appStoreID = "6461721697" linkBuilder.androidParameters = DynamicLinkAndroidParameters(packageName: "kr.co.vividnext.sodalive") guard let longDynamicLink = linkBuilder.url else { self.errorMessage = "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요." self.isShowPopup = true isLoading = false return } DEBUG_LOG("The long URL is: \(longDynamicLink)") DynamicLinkComponents.shortenURL(longDynamicLink, options: nil) { [unowned self] url, warnings, error in let shortUrl = url?.absoluteString if let liveRoomInfo = self.room { let urlString = shortUrl != nil ? shortUrl! : longDynamicLink.absoluteString if liveRoomInfo.isPrivateRoom { shareMessage = "\(UserDefaults.string(forKey: .nickname))님이 귀하를 소다라이브 비공개라이브에 초대하였습니다.\n" + "※ 라이브 참여: \(urlString)\n" + "(입장 비밀번호: \(liveRoomInfo.password!))" } else { shareMessage = "\(UserDefaults.string(forKey: .nickname))님이 귀하를 소다라이브 공개라이브에 초대하였습니다.\n" + "※ 라이브 참여: \(urlString)" } isShowShareView = true } else { self.errorMessage = "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요." self.isShowPopup = true return } isLoading = false } } }