// // MenuSettingsViewModel.swift // SodaLive // // Created by klaus on 10/7/24. // import Foundation import Moya import Combine final class MenuSettingsViewModel: ObservableObject { private let repository = MenuSettingsRepository() private var subscription = Set() @Published var isLoading = false @Published var errorMessage = "" @Published var isShowPopup = false private var menuId = 0 @Published var menu = "" @Published var menuList = [GetMenuPresetResponse]() @Published var selectedMenu: SelectedMenu? = nil private var selectedMenuText = "" func selectMenuPreset(selectedMenuPreset: SelectedMenu) { if menuList.isEmpty && (selectedMenuPreset == .MENU_2 || selectedMenuPreset == .MENU_3) { errorMessage = "메뉴 1을 먼저 설정하세요" isShowPopup = true return } if menuList.count == 1 && selectedMenuPreset == .MENU_3 { errorMessage = "메뉴 1과 메뉴 2를 먼저 설정하세요" isShowPopup = true return } if self.selectedMenu != selectedMenuPreset { self.selectedMenu = selectedMenuPreset if menuList.count > selectedMenuPreset.rawValue { let menu = menuList[selectedMenuPreset.rawValue] self.menu = menu.menu self.menuId = menu.id self.selectedMenuText = menu.menu } else { self.menu = "" self.menuId = 0 self.selectedMenuText = "" } } } func getAllMenuPreset(selectedMenu: SelectedMenu = .MENU_1, onFailure: @escaping () -> Void) { isLoading = true repository.getAllMenuPreset(creatorId: UserDefaults.int(forKey: .userId)) .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<[GetMenuPresetResponse]>.self, from: responseData) if let data = decoded.data, decoded.success { self.menuList.removeAll() self.menuList.append(contentsOf: data) self.selectMenuPreset(selectedMenuPreset: selectedMenu) } else { onFailure() if let message = decoded.message { self.errorMessage = message } else { self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." } self.isShowPopup = true } } catch { onFailure() self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." self.isShowPopup = true } } .store(in: &subscription) } func saveMenu() { if selectedMenuText == menu { self.errorMessage = "저장되었습니다." self.isShowPopup = true return } isLoading = true repository.saveMenu(menuId: menuId, menu: menu) .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 self.getAllMenuPreset(selectedMenu: self.selectedMenu ?? .MENU_1) {} } 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) } }