Files
POCloud-iOS/pocloud/Controller/DeviceListViewController.swift
2018-05-29 20:58:07 -05:00

137 lines
4.8 KiB
Swift

//
// DeviceListViewController.swift
// pocloud
//
// Created by Patrick McDonagh on 5/23/18.
// Copyright © 2018 patrickjmcd. All rights reserved.
//
import UIKit
import Alamofire
import PromiseKit
import SwiftyJSON
import RealmSwift
import SVProgressHUD
class DeviceListViewController: UITableViewController {
let realm = try! Realm()
let user = (UIApplication.shared.delegate as! AppDelegate).user
var addresses : Results<Address>?
var gateways : Results<Gateway>?
var devices : Results<Device>?
var deviceTypes : Results<DeviceType>?
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
let deviceTypeFilter = NSPredicate(format: "devices.@count > 0 AND NOT name IN %@", ["gen", "mainHP", "M1"])
var selectedDevice: Device?
override func viewDidLoad() {
super.viewDidLoad()
// self.refreshControl = UIRefreshControl()
// refreshControl?.attributedTitle = NSAttributedString(string: "Pull to refresh")
// refreshControl?.addTarget(self, action: #selector(refresh), for: UIControlEvents.valueChanged)
SVProgressHUD.show()
firstly {
self.loadRealmData()
}.then{ _ in
self.loadJSONData()
}.done { _ in
self.tableView.reloadData()
SVProgressHUD.dismiss()
}.catch { error in
print("Error in getting data in DeviceListViewController: \(error)")
}
}
func loadJSONData() -> Promise<Void>{
return Promise { promise in
firstly {
getDeviceTypes(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
getAddresses(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
getGateways(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
getDevices(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done{ _ in
promise.fulfill(())
}.catch { error in
promise.reject(error)
}
}
}
// @objc func refresh() {
//
// SVProgressHUD.show()
// self.realm.refresh()
// firstly {
// self.loadJSONData()
// }.done { _ in
// self.tableView.reloadData()
// self.refreshControl?.endRefreshing()
// SVProgressHUD.dismiss()
// }.catch { error in
// print("Error in getting data in DeviceListViewController: \(error)")
// }
//
// }
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
let deviceTypesWithDevices = deviceTypes?.filter(deviceTypeFilter)
return deviceTypesWithDevices?.count ?? 0
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let deviceTypesWithDevices = deviceTypes?.filter(deviceTypeFilter)
return deviceTypesWithDevices?[section].devices.count ?? 0
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let deviceTypesWithDevices = deviceTypes?.filter(deviceTypeFilter)
return deviceTypesWithDevices?[section].vanityName ?? "Unknown"
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openDeviceDetailView" {
let destinationVC = segue.destination as! DeviceDetailViewController
destinationVC.thisDevice = selectedDevice!
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "deviceListCell", for: indexPath)
let deviceTypesWithDevices = deviceTypes?.filter(deviceTypeFilter)
cell.textLabel?.text = deviceTypesWithDevices?[indexPath.section].devices[indexPath.row].vanityName
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let deviceTypesWithDevices = deviceTypes?.filter(deviceTypeFilter)
selectedDevice = deviceTypesWithDevices?[indexPath.section].devices[indexPath.row]
performSegue(withIdentifier: "openDeviceDetailView", sender: self)
}
//MARK: - Realm Functions
func loadRealmData() -> Promise<Void> {
return Promise { promise in
devices = realm.objects(Device.self)
deviceTypes = realm.objects(DeviceType.self)
gateways = realm.objects(Gateway.self)
addresses = realm.objects(Address.self)
promise.fulfill(())
}
}
}