Last active
March 29, 2020 00:28
-
-
Save wbbernardes/fe20c3373bf3131e0c61bc1b0678a4fb to your computer and use it in GitHub Desktop.
HomeTableViewController.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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