// // NewQuizViewModel.swift // LMS // // Created by Suraj Kumar Mandal on 19/10/23. // import Foundation import Alamofire import SwiftyJSON class NewQuizViewModel { var delegate: NewQuizViewProtocol? var quizModel = [QuizModel]() func getQuizData(assessmentId:Int, completion: @escaping () -> Void) { // Perform the API request in the background thread DispatchQueue.global().async { // Make your API call here // You can use URLSession or any networking library of your choice let accessToken = UserDefaults.standard.value(forKey: "accessToken") as! String let url = ApiURL.GetQuizData + "/\(assessmentId)" print(url) let headers: HTTPHeaders = [ "Authorization": "Bearer \(accessToken)", "Accept": "application/json", "Content-Type": "application/json" ] print(headers) AF.request(url, method: .get, encoding: URLEncoding.httpBody, headers: headers) .responseString { response in if response.response?.statusCode == 200 { switch response.result { case .success(_): guard let jsonData = response.data else { return } let decoder = JSONDecoder() do { let quizData = try decoder.decode([QuizModel].self, from: jsonData) self.quizModel = quizData print(quizData.count) } catch { print("getDataList Unexpected error: \(error).") } // Call the completion handler on the main thread to update the UI DispatchQueue.main.async { completion() } break case .failure(let error): print(error.localizedDescription) break } } else { print("Server error") } } } } func submitQuizAnswer(assessmentId:String, userId:String, questionId:Int, quesType:String, answers:[String], sessionId:String) { if let delegate = delegate { delegate.startLoader() let accessToken = UserDefaults.standard.value(forKey: "accessToken") as! String let url = ApiURL.SubmitAnswer print(url) let headers: HTTPHeaders = [ "Authorization": "Bearer \(accessToken)", "Accept": "application/json", "Content-Type": "application/json" ] print(headers) let parameters: [String: Any] = [ "assessmentId": assessmentId, "userId": userId, "questionId": questionId, "quesType": quesType, "answers": answers, "sessionId": sessionId ] print(parameters) AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) .responseJSON { response in if response.response?.statusCode == 200 { switch response.result { case .success(_): delegate.stopLoader() guard let jsonData = response.data else { return } let decoder = JSONDecoder() do { let submitAnswerData = try decoder.decode(AnswerSubmitModel.self, from: jsonData) delegate.answerSubmitted(model: submitAnswerData) } catch { print("getDataList Unexpected error: \(error).") delegate.showError(error: "getDataList Unexpected error: \(error).") } break case .failure(let error): delegate.stopLoader() print(error.localizedDescription) delegate.showError(error: error.localizedDescription) break } } else { print("Server error") } } } } func submitAssessment(assessmentId:String, userId:Int, data:[SubmitAnswers], sessionId:String) { if let delegate = delegate { delegate.startLoader() let accessToken = UserDefaults.standard.value(forKey: "accessToken") as! String let url = ApiURL.SubmitTotalAssessment print(url) print(data) let headers: HTTPHeaders = [ "Authorization": "Bearer \(accessToken)", "Accept": "application/json", "Content-Type": "application/json" ] print(headers) // Define your parameters dictionary let parameters: [String: Any] = [ "assessmentId": assessmentId, "userId": userId, "data": data.map { [ "questionId": $0.questionId, "answers": $0.answers ] }, "sessionId": sessionId ] print(parameters) AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) .responseJSON { response in switch response.result { case .success(_): delegate.stopLoader() guard let jsonData = response.data else { return } let decoder = JSONDecoder() do { let submitAssessmentData = try decoder.decode(AssessmentSubmitModel.self, from: jsonData) delegate.assessmentSubmitted(model: submitAssessmentData) } catch { print("getDataList Unexpected error: \(error).") delegate.showError(error: "getDataList Unexpected error: \(error).") } break case .failure(let error): delegate.stopLoader() print(error.localizedDescription) delegate.showError(error: error.localizedDescription) break } } } } } protocol NewQuizViewProtocol { func startLoader() func stopLoader() func showError(error:String) func answerSubmitted(model:AnswerSubmitModel) func assessmentSubmitted(model:AssessmentSubmitModel) }