Skip to content

Instantly share code, notes, and snippets.

@wbbernardes
Last active March 29, 2020 00:28
Show Gist options
  • Save wbbernardes/fe20c3373bf3131e0c61bc1b0678a4fb to your computer and use it in GitHub Desktop.
Save wbbernardes/fe20c3373bf3131e0c61bc1b0678a4fb to your computer and use it in GitHub Desktop.
HomeTableViewController.swift
//
// HomeTableViewController.swift
// javapop
//
// Created by Wesley Brito on 21/03/20.
// Copyright © 2020 Wesley Brito. All rights reserved.
//
import UIKit
import Kingfisher
enum SortType: Int {
case Star = 0
case Name
}
// MARK: - MVP - CONTROLLER UNCOMMENT
class HomeTableViewController: UITableViewController {
var pageCount: Int = 1
var totalPages: Int = 34
var isFiltering: Bool = false
var isOpen: Bool = false
let searchController = UISearchController(searchResultsController: nil)
private var homePresenter = HomePresenter()
@IBOutlet weak var tableViewHeader: UIView!
@IBOutlet weak var filterSegment: UISegmentedControl!
override func viewDidLoad() {
super.viewDidLoad()
homePresenter.delegate = self
filterSegment.isHidden = true
searchControllerConfiguration()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.loadingView(isEnabled: false)
homePresenter.loadRepos(pageCount: pageCount)
}
func searchControllerConfiguration() {
navigationItem.searchController = searchController
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
// For change textColor of SearchBar
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
}
@IBAction func refresh(_ sender: UIRefreshControl) {
loadingView(isEnabled: false)
isFiltering = false
homePresenter.loadRepos()
}
@IBAction func openFilter(_ sender: UIBarButtonItem) {
isOpen.toggle()
if isOpen {
filterSegment.isHidden = false
} else {
filterSegment.isHidden = true
}
}
@IBAction func segmentAction(_ sender: UISegmentedControl) {
let selectedSegment = SortType(rawValue: sender.selectedSegmentIndex)
switch selectedSegment {
case .Star:
homePresenter.filterRepo(sort: .Star)
isFiltering = true
self.tableView.reloadData()
case .Name:
homePresenter.filterRepo(sort: .Name)
isFiltering = true
self.tableView.reloadData()
case .none: break
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "repoSegue" {
if let destinationVC = segue.destination as? RepoWebViewController {
if let indexPath = self.tableView.indexPathForSelectedRow {
destinationVC.url = homePresenter.getHtmlUrl(indexPath.row)
destinationVC.viewTitle = homePresenter.getName(indexPath.row)
}
}
}
}
}
// MARK: - TableView
extension HomeTableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return homePresenter.getItensCount()
}
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if !isFiltering {
if indexPath.row == homePresenter.getItensCount() - 3 && pageCount <= totalPages {
pageCount += 1
loadingView(isEnabled: false)
homePresenter.loadRepos(pageCount: pageCount)
}
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "homeCell", for: indexPath)
if let cell = cell as? HomeTableViewCell {
cell.avatarImage.kf.indicatorType = .activity
cell.avatarImage.kf.setImage(with: homePresenter.getAvatarUrl(indexPath.row))
cell.nameLabel.text = homePresenter.getName(indexPath.row)
cell.descriptionLabel.text = homePresenter.getDescription(indexPath.row)
cell.forkCountLabel.text = homePresenter.getForkCount(indexPath.row)
cell.starsCountLabel.text = homePresenter.getStarsCount(indexPath.row)
cell.loginLabel.text = homePresenter.getUsername(indexPath.row)
cell.fullNameLabel.text = homePresenter.getFullName(indexPath.row)
}
return cell
}
}
// MARK: - UISearchController
extension HomeTableViewController: UISearchResultsUpdating, UISearchBarDelegate {
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
isFiltering = false
loadingView(isEnabled: false)
homePresenter.loadRepos()
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
if homePresenter.searchTextIsValid(text: searchBar.text!) {
homePresenter.filterRepo(searchText: searchBar.text!)
isFiltering = true
} else {
self.alertShow(title: "Error", message: "Large text", action: nil)
}
self.tableView.reloadData()
}
func updateSearchResults(for searchController: UISearchController) {}
}
extension HomeTableViewController: HomePresenterDelegate {
func repoFound(_ error: RequestErrors?) {
self.loadingView(isEnabled: true)
self.dismiss(animated: false, completion: nil)
self.refreshControl?.endRefreshing()
if let error = error, error == .noInternet {
return
}
self.tableView.reloadData()
}
}
// MARK: - MVC - CONTROLLER UNCOMMENT
//class HomeTableViewController: UITableViewController {
//
// var pageCount: Int = 1
// var totalPages: Int = 34
// var isFiltering: Bool = false
// var isOpen: Bool = false
//
// let searchController = UISearchController(searchResultsController: nil)
// let homeController = HomeController()
//
// @IBOutlet weak var tableViewHeader: UIView!
// @IBOutlet weak var filterSegment: UISegmentedControl!
//
// override func viewDidLoad() {
// super.viewDidLoad()
// filterSegment.isHidden = true
// searchControllerConfiguration()
// }
//
// override func viewWillAppear(_ animated: Bool) {
// super.viewWillAppear(animated)
// self.loadingView(isEnabled: false)
// homeController.loadRepos(pageCount: pageCount) { (result, error) in
// self.loadingView(isEnabled: true)
// self.dismiss(animated: false, completion: nil)
// if error != nil {
// print(error as Any)
// } else {
// self.tableView.reloadData()
// }
// }
// }
//
// func searchControllerConfiguration() {
// navigationItem.searchController = searchController
// searchController.searchResultsUpdater = self
// searchController.searchBar.delegate = self
//
// // For change textColor of SearchBar
// UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
// }
//
// @IBAction func refresh(_ sender: UIRefreshControl) {
// loadingView(isEnabled: false)
// isFiltering = false
// homeController.loadRepos() { (result, error) in
// self.loadingView(isEnabled: true)
// self.dismiss(animated: false, completion: nil)
// self.refreshControl?.endRefreshing()
// if error != nil {
// print(error as Any)
// } else {
// self.tableView.reloadData()
// }
// }
// }
//
// @IBAction func openFilter(_ sender: UIBarButtonItem) {
// isOpen.toggle()
// if isOpen {
// filterSegment.isHidden = false
// } else {
// filterSegment.isHidden = true
// }
// }
//
// @IBAction func segmentAction(_ sender: UISegmentedControl) {
// let selectedSegment = SortType(rawValue: sender.selectedSegmentIndex)
// switch selectedSegment {
// case .Star:
// homeController.filterRepo(sort: .Star)
// isFiltering = true
// self.tableView.reloadData()
// case .Name:
// homeController.filterRepo(sort: .Name)
// isFiltering = true
// self.tableView.reloadData()
//
// case .none: break
// }
// }
//
// override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// if segue.identifier == "repoSegue" {
// if let destinationVC = segue.destination as? RepoWebViewController {
// if let indexPath = self.tableView.indexPathForSelectedRow {
// destinationVC.url = homeController.getHtmlUrl(indexPath.row)
// destinationVC.viewTitle = homeController.getName(indexPath.row)
// }
// }
// }
// }
//}
//// MARK: - TableView
//extension HomeTableViewController {
//
// override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// // #warning Incomplete implementation, return the number of rows
// return homeController.getItensCount()
// }
//
// override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// if !isFiltering {
// if indexPath.row == homeController.getItensCount() - 3 && pageCount <= totalPages {
// pageCount += 1
// loadingView(isEnabled: false)
// homeController.loadRepos(pageCount: pageCount) { (result, error) in
// self.loadingView(isEnabled: true)
// self.dismiss(animated: false, completion: nil)
// if error != nil {
// print(error as Any)
// } else {
// self.tableView.reloadData()
// }
// }
// }
// }
// }
//
// override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// let cell = tableView.dequeueReusableCell(withIdentifier: "homeCell", for: indexPath)
// if let cell = cell as? HomeTableViewCell {
// cell.avatarImage.kf.indicatorType = .activity
// cell.avatarImage.kf.setImage(with: homeController.getAvatarUrl(indexPath.row))
// cell.nameLabel.text = homeController.getName(indexPath.row)
// cell.descriptionLabel.text = homeController.getDescription(indexPath.row)
// cell.forkCountLabel.text = homeController.getForkCount(indexPath.row)
// cell.starsCountLabel.text = homeController.getStarsCount(indexPath.row)
// cell.loginLabel.text = homeController.getUsername(indexPath.row)
// cell.fullNameLabel.text = homeController.getFullName(indexPath.row)
// }
// return cell
// }
//}
//
//// MARK: - UISearchController
//extension HomeTableViewController: UISearchResultsUpdating, UISearchBarDelegate {
// func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
// isFiltering = false
// loadingView(isEnabled: false)
// homeController.loadRepos() { (result, error) in
// self.loadingView(isEnabled: true)
// self.dismiss(animated: false, completion: nil)
// if error != nil {
// print(error as Any)
// } else {
// self.tableView.reloadData()
// }
// }
// }
//
// func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
// if homeController.searchTextIsValid(text: searchBar.text!) {
// homeController.filterRepo(searchText: searchBar.text!)
// isFiltering = true
// } else {
// self.alertShow(title: "Error", message: "Large text", action: nil)
// }
// self.tableView.reloadData()
// }
//
// func updateSearchResults(for searchController: UISearchController) {}
//}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment