// // DaftarSertifikatVC.swift // Sirani // // Created by Anhar Solehudin on 30/03/19. // Copyright © 2019 Anhar Solehudin. All rights reserved. // import UIKit import SkeletonView class DaftarSertifikatVC: UIViewController { // Outlets & Views @IBOutlet weak var certificatesTV: UITableView! @IBOutlet weak var progressLoading: UIView! @IBOutlet weak var layoutNoData: UIView! @IBOutlet weak var labelSubtitle: UILabel! // View Id private let daftarSertifikatCellId = "DaftarSertifikatCell" // Segue Id private let unwindToHomeSegueId = "unwindToHome" private let daftarSertifikatSearchSegueId = "daftarSertifikatSearchSegueId" // String Message private let alertNoConnectionTitle = "Informasi" private let alertNoConnectionMsg = "Sepertinya Anda sedang tidak tersambung pada koneksi internet" private let alertNoConnectionActionYes = "OK" // Initialize private var presenter: DaftarSertifikatPresenter! private var certificates: [CertificateData] = [CertificateData]() // Request Params private var jenis: String = "1" private var columns: String = "" private var cursor: Int = 0 private var prev: Int = 1 private var search: String = "" // Others private var loading = false private var lastDataLoadedEmpty = false private var loadMore = false private var kode: Int? // View Lifecycles override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } override func viewDidLoad() { super.viewDidLoad() certificatesTV.delegate = self certificatesTV.dataSource = self certificatesTV.isSkeletonable = true certificatesTV.rowHeight = UITableView.automaticDimension certificatesTV.estimatedRowHeight = 120 certificatesTV.separatorStyle = .none certificatesTV.backgroundColor = .groupTableViewBackground presenter = DaftarSertifikatPresenter(siraniApiServices: SiraniApiServices()) presenter.attachView(view: self) loadCertificateData() } override func viewWillAppear(_ animated: Bool) { presenter.attachView(view: self) } override func viewDidDisappear(_ animated: Bool) { presenter.detachView() } // private functions private func loadCertificateData() { if !loading && !lastDataLoadedEmpty { if ConnectionHelper.isConnectedToNetwork() { self.presenter.loadCertificatesData(jenis: self.jenis, columns: self.columns, cursor: self.cursor, prev: self.prev, search: self.search) } else { showNoConnection() } } } // Actions @IBAction func onBackTapped(_ sender: Any) { performSegue(withIdentifier: unwindToHomeSegueId, sender: self) } @IBAction func onSearchTapped(_ sender: Any) { performSegue(withIdentifier: daftarSertifikatSearchSegueId, sender: self) } @IBAction func unwindToDaftarSertifikat(segue: UIStoryboardSegue) {} } // View Delegate Protocols extension DaftarSertifikatVC: DaftarSertifikatViewDelegate { func showNoConnection() { let alertNoConnection = UIAlertController( title: alertNoConnectionTitle, message: alertNoConnectionMsg, preferredStyle: .alert ) alertNoConnection.addAction( UIAlertAction(title: alertNoConnectionActionYes, style: .default, handler: nil) ) self.present(alertNoConnection, animated: true, completion: nil) } func showLoading() { loading = true if certificates.isEmpty { DispatchQueue.main.async { self.view.layoutIfNeeded() self.certificatesTV.showAnimatedGradientSkeleton() } } else { progressLoading.show() } } func hideLoading() { loading = false certificatesTV.hideSkeleton() progressLoading.hide() } func showNoDataLayout() { if cursor == 0 { layoutNoData.show() } } func hideNoDataLayout() { layoutNoData.hide() } func setCertificates(certificates: [CertificateData]) { if cursor == 0 { layoutNoData.hide() } if certificates.count > 0 { self.certificates.append(contentsOf: certificates) certificatesTV.reloadData() let totalData = certificates.count cursor += totalData loadMore = true } else { lastDataLoadedEmpty = true loadMore = false } } } // SkeletonTableViewDataSource extension DaftarSertifikatVC: SkeletonTableViewDataSource { func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier { return daftarSertifikatCellId } } // UITableController Protocols extension DaftarSertifikatVC: UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate, SertifikatCellDelegate { func openSertifikatDetail(data: CertificateData?) { self.kode = data?.apl_id performSegue(withIdentifier: "sertifikatDetailSegueId", sender: self) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return certificates.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView == certificatesTV { if let cell = tableView.dequeueReusableCell(withIdentifier: daftarSertifikatCellId, for: indexPath) as? DaftarSertifikatCell { cell.cellDelegate = self cell.card.tag = indexPath.row let certificate = certificates[indexPath.row] cell.updateViews(certificateData: certificate) return cell } else { return DaftarSertifikatCell() } } else { return DaftarSertifikatCell() } } func scrollViewDidScroll(_ scrollView: UIScrollView) { let threshold = -5 let contentOffset = scrollView.contentOffset.y let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height; if loadMore && !loading && (Int(maximumOffset - contentOffset) <= threshold) { loadCertificateData() } } } // SearchDaftarSertifikatModal Delegate Protocols extension DaftarSertifikatVC: SearchDaftarSertifikatDelegate { func onSearch(search: String, parameter: String, jenis: String, jenisLabel: String) { presenter.attachView(view: self) loadMore = false loading = false lastDataLoadedEmpty = false self.cursor = 0 self.prev = 0 self.search = search self.jenis = jenis self.columns = parameter certificates.removeAll() certificatesTV.reloadData() labelSubtitle.text = jenisLabel loadCertificateData() } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == daftarSertifikatSearchSegueId { let destinationVC: SearchDaftarSertifikatVC = segue.destination as! SearchDaftarSertifikatVC destinationVC.delegate = self } if let detailSertifikatVC = segue.destination as? QRScannerVC { detailSertifikatVC.kode = kode } } }