// // LiveRoomEditViewModel.swift // SodaLive // // Created by klaus on 2023/08/14. // import Foundation import Moya import Combine final class LiveRoomEditViewModel: ObservableObject { @Published var isLoading = false @Published var title: String = "" @Published var notice: String = "" { didSet { if notice.count > 1000 { notice = String(notice.prefix(1000)) } } } @Published var numberOfPeople = "" @Published var reservationDateString: String = "" @Published var reservationTimeString: String = "" @Published var errorMessage = "" @Published var isShowPopup = false private let repository = LiveRepository() private var subscription = Set() var reservationDate = Date() { didSet { reservationDateString = reservationDate.convertDateFormat(dateFormat: "yyyy.MM.dd") } } var reservationTime = Date() { didSet { reservationTimeString = reservationTime.convertDateFormat(dateFormat: "a hh:mm") } } let placeholder = "라이브 공지를 입력하세요" var room: GetRoomDetailResponse? = nil { didSet { isLoading = true title = room!.title notice = room!.notice numberOfPeople = String(room!.numberOfParticipantsTotal) let fromFormatter = DateFormatter() fromFormatter.dateFormat = "yyyy.MM.dd EEE hh:mm a" fromFormatter.locale = Locale(identifier: "en_US_POSIX") reservationDate = fromFormatter.date(from: room!.beginDateTime)! reservationTime = fromFormatter.date(from: room!.beginDateTime)! let beginDate = reservationDate.convertDateFormat(dateFormat: "yyyy-MM-dd") let beginTime = reservationTime.convertDateFormat(dateFormat: "HH:mm") beginDateTimeStr = "\(beginDate) \(beginTime)" isLoading = false } } var beginDateTimeStr: String = "" func updateLiveRoom() { if let room = room, !isLoading && validate() { isLoading = true let beginDate = reservationDate.convertDateFormat(dateFormat: "yyyy-MM-dd") let beginTime = reservationTime.convertDateFormat(dateFormat: "HH:mm") let beginDateTime = "\(beginDate) \(beginTime)" let request = EditLiveRoomInfoRequest( title: room.title != title ? title : nil, notice: room.notice != notice ? notice : nil, numberOfPeople: room.numberOfParticipantsTotal != Int(numberOfPeople)! ? Int(numberOfPeople)! : nil, beginDateTimeString: beginDateTimeStr != beginDateTime ? beginDateTime : nil, timezone: TimeZone.current.identifier ) if ( request.title == nil && request.notice == nil && request.numberOfPeople == nil && request.beginDateTimeString == nil ) { self.errorMessage = "변경사항이 없습니다." self.isShowPopup = true isLoading = false return } var multipartData = [MultipartFormData]() let encoder = JSONEncoder() encoder.outputFormatting = .withoutEscapingSlashes let jsonData = try? encoder.encode(request) if let jsonData = jsonData { multipartData.append(MultipartFormData(provider: .data(jsonData), name: "request")) repository.editLiveRoomInfo(roomId: room.roomId, parameters: multipartData) .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 { self.errorMessage = "라이브 정보가 수정되었습니다." self.isShowPopup = true DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { AppState.shared.back() } } else { if let message = decoded.message { self.errorMessage = message } else { self.errorMessage = "라이브 정보를 수정 하지 못했습니다.\n다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." } self.isShowPopup = true } } catch { self.errorMessage = "라이브 정보를 수정 하지 못했습니다.\n다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." self.isShowPopup = true } } .store(in: &subscription) } else { self.errorMessage = "라이브 정보를 수정 하지 못했습니다.\n다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." self.isShowPopup = true self.isLoading = false } } } private func validate() -> Bool { if title.trimmingCharacters(in: .whitespaces).isEmpty { self.errorMessage = "제목을 입력해 주세요." self.isShowPopup = true return false } let notice = notice.trimmingCharacters(in: .whitespacesAndNewlines) != placeholder ? notice : "" if notice.isEmpty && notice.count < 5 { self.errorMessage = "공지를 5자 이상 입력해주세요." self.isShowPopup = true return false } guard let numberOfPeople = Int(numberOfPeople), (numberOfPeople >= 3 && numberOfPeople <= 999) else { self.errorMessage = "인원을 3~999명 사이로 입력해주세요." self.isShowPopup = true return false } return true } }