// // ContentModifyViewModel.swift // SodaLive // // Created by klaus on 2023/08/13. // import UIKit import Moya import Combine final class ContentModifyViewModel: ObservableObject { private let repository = ContentRepository() private var subscription = Set() @Published var errorMessage = "" @Published var isShowPopup = false @Published var isLoading = false @Published private(set) var audioContent: GetAudioContentDetailResponse? @Published var title: String = "" @Published var detail: String = "" @Published var coverImage: UIImage? = nil @Published var coverImageUrl: String? = nil @Published var isAvailableComment = true @Published var isAdult = false @Published var isAdultShowUi = false var contentId: Int = 0 var placeholder = "내용을 입력하세요" func getAudioContentDetail(onFailure: (() -> Void)? = nil) { audioContent = nil isLoading = true repository.getAudioContentDetail(audioContentId: contentId) .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(ApiResponse.self, from: responseData) if let data = decoded.data, decoded.success { self.audioContent = data self.title = data.title self.detail = data.detail self.isAdult = data.isAdult self.isAdultShowUi = !data.isAdult self.coverImageUrl = data.coverImageUrl self.isAvailableComment = data.isCommentAvailable } 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 modifyAudioContent(onSuccess: @escaping () -> Void) { if !isLoading && contentId > 0 && validateData() { isLoading = true let request = ModifyContentRequest( contentId: contentId, title: title != audioContent!.title ? title : nil, detail: detail != audioContent!.detail ? detail : nil, isAdult: isAdult, isCommentAvailable: isAvailableComment ) var multipartData = [MultipartFormData]() let encoder = JSONEncoder() encoder.outputFormatting = .withoutEscapingSlashes let jsonData = try? encoder.encode(request) if let jsonData = jsonData { if let coverImage = coverImage { if let imageData = coverImage.jpegData(compressionQuality: 0.8) { multipartData.append( MultipartFormData( provider: .data(imageData), name: "coverImage", fileName: "\(UUID().uuidString)_\(Date().timeIntervalSince1970 * 1000).jpg", mimeType: "image/*") ) } else { errorMessage = "커버이미지를 업로드 하지 못했습니다.\n다시 선택해 주세요" isShowPopup = true isLoading = false return } } multipartData.append(MultipartFormData(provider: .data(jsonData), name: "request")) repository .modifyAudioContent(parameters: multipartData) .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 { self.errorMessage = "콘텐츠가 수정되었습니다." self.isShowPopup = true 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) } else { self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." self.isShowPopup = true self.isLoading = false } } } private func validateData() -> Bool { if title != audioContent!.title && title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { errorMessage = "제목을 입력해 주세요." isShowPopup = true return false } if detail != audioContent!.detail && (detail.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || detail.count < 5) { errorMessage = "내용을 5자 이상 입력해 주세요." isShowPopup = true return false } return true } }