Files
SodaLive
Preview Content
Resources
Sources
Agora
App
Audition
Common
Content
CustomView
Debug
Dialog
Explorer
Extensions
Follow
Font
FortuneWheel
IAP
ImagePicker
Keyboard
Live
Main
Message
MyPage
Auth
Block
Can
OrderList
Profile
ReservationStatus
Cancel
CancelLiveReservationRequest.swift
GetLiveReservationResponse.swift
LiveReservationStatusItemView.swift
LiveReservationStatusView.swift
LiveReservationStatusViewModel.swift
ServiceCenter
CanCardView.swift
MyInfoCardView.swift
MyPageResponse.swift
MyPageView.swift
MyPageViewModel.swift
ReservationStatusView.swift
NavigationBar
Onboarding
Report
Search
SearchChannel
Settings
Shape
Splash
Tracking
UI
User
Utils
ContentView.swift
SodaLive.entitlements
SodaLive.xcworkspace
generated
.gitignore
Podfile
Podfile.lock
SodaLive-dev.entitlements
model-SodaLive-dev.json
model-SodaLive.json
sodalive-ios/SodaLive/Sources/MyPage/ReservationStatus/LiveReservationStatusViewModel.swift

150 lines
6.2 KiB
Swift

//
// LiveReservationStatusViewModel.swift
// SodaLive
//
// Created by klaus on 2023/08/11.
//
import Foundation
import Combine
final class LiveReservationStatusViewModel: ObservableObject {
private let repository = LiveRepository()
private var subscription = Set<AnyCancellable>()
@Published var errorMessage = ""
@Published var isShowPopup = false
@Published var isLoading = false
@Published var reservationStatusItems = [GetLiveReservationResponse]()
@Published var selectedReservationStatusItem: GetLiveReservationResponse?
let cancelReasons = ["중요한 개인일정이 생겨서", "다른 라이브에 참여하고 싶어서", "라이브 참여자 중 불편한 사람이 있어서", "참여비용이 부담되서", "기타"]
@Published var cancelReasonSelectedIndex = -1
@Published var reason = ""
@Published var isCancelComplete = false
func getLiveReservationStatus() {
isLoading = true
repository.getReservations(isActive: true)
.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<[GetLiveReservationResponse]>.self, from: responseData)
if let data = decoded.data, decoded.success {
self.reservationStatusItems.append(contentsOf: data)
} 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 getReservation(reservationId: Int) {
isLoading = true
repository.getReservation(reservationId: reservationId)
.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<GetLiveReservationResponse>.self, from: responseData)
if let data = decoded.data, decoded.success {
self.selectedReservationStatusItem = data
} 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 cancelReservation(reservationId: Int) {
if cancelReasonSelectedIndex < 0 || (cancelReasonSelectedIndex == self.cancelReasons.count - 1 && self.reason.trimmingCharacters(in: .whitespaces).count <= 0) {
self.errorMessage = "취소이유를 선택해주세요."
self.isShowPopup = true
return
}
isLoading = true
let reason = cancelReasonSelectedIndex == cancelReasons.count - 1 ? self.reason : cancelReasons[cancelReasonSelectedIndex]
repository.cancelReservation(reservationId: reservationId, reason: reason)
.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.isCancelComplete = true
} 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)
}
}