// // LoginViewModel.swift // AcaMate // // Created by Sean Kim on 12/14/24. // import SwiftUI import Combine class LoginViewModel: ObservableObject { private var cancellables = Set() @Published var toggleLoading: Bool = false @Published var pathName: PathName = .NONE var bidArray: [String] = [] func loginTest(type: SNSLoginType, id: String) { loadAPIData(url: "\(API_URL)", path: "/api/v1/in/user/login", parameters: [ "acctype": "\(type == .Apple ? "ST00": "ST01")", "sns_id": "\(id)" ], decodingType: APIResponse.self) .sink { [weak self] completion in // API 자체적으로 내보내는 에러는 여기서 거를거고 switch completion { case .failure(let error): self?.toggleLoading = false printLog("\(error)") case .finished: self?.toggleLoading = false } } receiveValue: { [weak self] response in guard let self = self else { return } guard let userToken = response as? APIResponse else {return} switch userToken.status.code { case .success: @UserDefault(key: "token", defaultValue: "accToken") var accToken @UserDefault(key: "refresh", defaultValue: "arefreshToken") var refreshToken if let token = userToken.data.toStringDict()["token"], let refresh = userToken.data.toStringDict()["refresh"] { printLog(token) printLog(refresh) accToken = token refreshToken = refresh self.pathName = .SelectAcademy } case .anything(let apiCode): // MARK: TO-DO // 회원가입 로직 printLog("\(apiCode) : 로그인 정보 없음") self.pathName = .Register(type, id: "\(id)") default: // 그외에 서버에서 처리를 하다가 문제가 생겨서 발생하는 에러는 여기로 보낼거임 printLog("ERROR") } } .store(in: &cancellables) } func loginAction(type: SNSLoginType) { LoginController().login(type) .flatMap{ snsId in loadAPIData(url: "\(API_URL)", path: "/api/v1/in/user/login", parameters: [ "acctype": "\(type == .Apple ? "ST00": "ST01")", "sns_id": "\(snsId.snsId)" ], decodingType: APIResponse.self) } .sink { [weak self] completion in switch completion { case .failure(let error): printLog("\(error)") self?.toggleLoading = false case .finished: self?.toggleLoading = false } } receiveValue: { [weak self] response in guard let self = self else { return } guard let userAcademy = response as? APIResponse else {return} if let bids = userAcademy.data.toStringDict()["bid"] { printLog(bids) if let bidArray: [String] = jsonToSwift(bids) { self.pathName = .SelectAcademy } else { printLog("JSON 변환 실패") } } } .store(in: &cancellables) } }