You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
11 KiB
305 lines
11 KiB
//
|
|
// AgentViewModel.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by FMI-12 on 2/5/18.
|
|
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftyJSON
|
|
|
|
class AgentViewModel: ModelExtension {
|
|
|
|
var agentLocationAvailable: Box<Bool?> = Box(nil)
|
|
var agentCountryListAvailable: Box<Bool?> = Box(nil)
|
|
var agentLocationBool: Box<Bool?> = Box(nil)
|
|
|
|
var agentConnectionTimeOut: Box<Bool?> = Box(nil)
|
|
|
|
let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
|
|
|
|
private var agentArray = [AgentModel]()
|
|
private var agentCountryList = [AgentCountryList]()
|
|
private var agentNameArray = [String]()
|
|
|
|
/**
|
|
Fetch agent location
|
|
|
|
- Parameter countryId: each country is provided with unique id
|
|
- Parameter city: name of city
|
|
*/
|
|
func fetchAgentLocation(countryId: String, city: String) {
|
|
let countryIdLocal = countryId
|
|
let cityLocal = city
|
|
if !Reachability.isConnectedToNetwork() {
|
|
self.internetConnection.value = false
|
|
} else {
|
|
|
|
RestApiMananger.sharedInstance.getAgentLocationDetails(countryId: countryId, city: city) { result in
|
|
|
|
switch result {
|
|
case let .success(agentJSON):
|
|
self.agentArray.removeAll()
|
|
self.agentNameArray.removeAll()
|
|
guard agentJSON.count > 0 else {
|
|
self.agentLocationAvailable.value = true
|
|
return
|
|
}
|
|
if agentJSON.count > 0 {
|
|
for i in 0 ... (agentJSON.count-1) {
|
|
do {
|
|
let agent = try JSONDecoder().decode(AgentModel.self, from: agentJSON[i].rawData())
|
|
self.agentArray.append(agent)
|
|
} catch let err {
|
|
self.setErrorMessage(message: err as! String)
|
|
self.agentLocationAvailable.value = false
|
|
}
|
|
}
|
|
}
|
|
|
|
self.agentArray = self.agentArray.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })
|
|
if self.agentArray.count > 0{
|
|
for i in 0...(self.agentArray.count - 1) {
|
|
self.agentNameArray.append(self.agentArray[i].name)
|
|
}
|
|
}
|
|
self.agentLocationAvailable.value = true
|
|
|
|
case let .failure(errorJSON):
|
|
self.setErrorMessage(message: errorJSON["message"].stringValue)
|
|
self.agentLocationAvailable.value = false
|
|
|
|
case .updateAccessCode:
|
|
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
|
|
result in
|
|
if result != "Error"{
|
|
let uuid = RestApiMananger.sharedInstance.getUUID()
|
|
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
|
|
self.fetchAgentLocation(countryId: countryIdLocal, city: cityLocal)
|
|
}
|
|
}
|
|
|
|
case .logOutUser():
|
|
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
|
|
self.anotherLogin.value = true
|
|
case .timeOut:
|
|
self.agentConnectionTimeOut.value = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Fetch list of country
|
|
*/
|
|
func fetchListOfCountry(){
|
|
if !Reachability.isConnectedToNetwork() {
|
|
self.internetConnection.value = false
|
|
}else{
|
|
RestApiMananger.sharedInstance.fetchCountryList() { result in
|
|
switch result {
|
|
case let .success(countryListJSON):
|
|
self.agentCountryList.removeAll()
|
|
guard countryListJSON.count > 0 else {
|
|
return
|
|
}
|
|
|
|
self.setCountryListDataInObject(countryList: countryListJSON)
|
|
|
|
case let .failure(errorJSON):
|
|
self.setErrorMessage(message: errorJSON["message"].stringValue)
|
|
self.agentLocationAvailable.value = false
|
|
case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
|
|
result in
|
|
if result != "Error"{
|
|
let uuid = RestApiMananger.sharedInstance.getUUID()
|
|
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
|
|
self.fetchListOfCountry()
|
|
}
|
|
}
|
|
case .logOutUser():
|
|
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
|
|
self.anotherLogin.value = true
|
|
case .timeOut:
|
|
self.agentConnectionTimeOut.value = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Set country list data in array object
|
|
- Parameter: json array of country list
|
|
*/
|
|
func setCountryListDataInObject(countryList: JSON){
|
|
if countryList.count > 0{
|
|
for i in 0 ... (countryList.count-1) {
|
|
do {
|
|
let country = try JSONDecoder().decode(AgentCountryList.self, from: countryList[i].rawData())
|
|
agentCountryList.append(country)
|
|
} catch let err {
|
|
self.setErrorMessage(message: err as! String)
|
|
self.agentLocationAvailable.value = false
|
|
}
|
|
}
|
|
}
|
|
self.agentCountryListAvailable.value = true
|
|
}
|
|
|
|
/**
|
|
Fetch agent location
|
|
|
|
- Parameter countryId: country is provided with a unique id
|
|
*/
|
|
func fetchAgentLocation(countryId: String){
|
|
let countryIdLocal = countryId
|
|
if !Reachability.isConnectedToNetwork() {
|
|
self.internetConnection.value = false
|
|
} else {
|
|
RestApiMananger.sharedInstance.fetchAgentLocation(countryId: countryId){
|
|
result in
|
|
switch result{
|
|
case let .success(agentLocationJSON):
|
|
self.agentArray.removeAll()
|
|
guard agentLocationJSON.count > 0 else {
|
|
return
|
|
}
|
|
self.setAgentLocation(agentLocation: agentLocationJSON)
|
|
case let .failure(errorJSON):
|
|
self.setErrorMessage(message: errorJSON["message"].stringValue)
|
|
self.agentLocationBool.value = false
|
|
case .updateAccessCode:
|
|
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
|
|
result in
|
|
if result != "Error"{
|
|
let uuid = RestApiMananger.sharedInstance.getUUID()
|
|
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
|
|
self.fetchAgentLocation(countryId: countryIdLocal)
|
|
}
|
|
}
|
|
case .logOutUser():
|
|
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
|
|
self.anotherLogin.value = true
|
|
case .timeOut:
|
|
self.agentConnectionTimeOut.value = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Set json array in model object
|
|
|
|
- Parameter agentLocation: json array of agent location data
|
|
*/
|
|
func setAgentLocation(agentLocation: JSON){
|
|
if agentLocation.count > 0 {
|
|
for i in 0 ... (agentLocation.count-1) {
|
|
do {
|
|
let agentLocation = try JSONDecoder().decode(AgentModel.self, from: agentLocation[i].rawData())
|
|
agentArray.append(agentLocation)
|
|
} catch let err {
|
|
self.setErrorMessage(message: err as! String)
|
|
self.agentLocationBool.value = false
|
|
}
|
|
}
|
|
}
|
|
self.agentLocationBool.value = true
|
|
}
|
|
|
|
/**
|
|
- returns: array of agent model
|
|
*/
|
|
func getAgentLocation() -> [AgentModel]{
|
|
return agentArray
|
|
}
|
|
|
|
/**
|
|
- returns: array of agent country list
|
|
*/
|
|
func getCountryList() -> [AgentCountryList]{
|
|
return agentCountryList
|
|
}
|
|
|
|
/**
|
|
- returns: array of agent model
|
|
*/
|
|
func getAgentArray() -> [AgentModel] {
|
|
return agentArray
|
|
}
|
|
|
|
/**
|
|
- returns: array of agent name
|
|
*/
|
|
func getAgentNamesArray() -> [String] {
|
|
return agentNameArray
|
|
}
|
|
|
|
/**
|
|
- returns: agent array total count
|
|
*/
|
|
func getAgentCount() -> Int {
|
|
return agentArray.count
|
|
}
|
|
|
|
/**
|
|
- Parameter index: position of name in agent array
|
|
- returns: name
|
|
*/
|
|
func getAgentName(index: Int) -> String {
|
|
if let name = agentArray[index].name {
|
|
return name
|
|
} else {
|
|
return "N/A"
|
|
}
|
|
}
|
|
|
|
/**
|
|
- Parameter index: position of address in agent array
|
|
- returns: address
|
|
*/
|
|
func getAgentAddress(index: Int) -> String {
|
|
if let address = agentArray[index].address {
|
|
return address
|
|
}
|
|
return ""
|
|
}
|
|
|
|
/**
|
|
- Parameter index: position of phone in agent array
|
|
- returns: phone
|
|
*/
|
|
func getAgentPhone(index: Int) -> String {
|
|
if let phone = agentArray[index].phone {
|
|
return phone
|
|
}
|
|
else {
|
|
return "N/A"
|
|
}
|
|
}
|
|
|
|
/**
|
|
- Parameter index: position of latitude in agent array
|
|
- returns: latitude
|
|
*/
|
|
func getAgentLatitude(index:Int) -> String {
|
|
if let latitude = agentArray[index].latitude {
|
|
return latitude
|
|
} else {
|
|
return "0"
|
|
}
|
|
}
|
|
|
|
/**
|
|
- Parameter index: position of longitude in agent array
|
|
- returns: longitude
|
|
*/
|
|
func getAgentLongitude(index:Int) -> String {
|
|
if let longitude = agentArray[index].longitude {
|
|
return longitude
|
|
} else {
|
|
return "0"
|
|
}
|
|
}
|
|
}
|