diff --git a/FitHub/FitHub/Discovery/DiscoveryViewController.swift b/FitHub/FitHub/Discovery/DiscoveryViewController.swift index ff52447..00a0551 100644 --- a/FitHub/FitHub/Discovery/DiscoveryViewController.swift +++ b/FitHub/FitHub/Discovery/DiscoveryViewController.swift @@ -10,14 +10,19 @@ import UIKit class DiscoveryViewController: BaseViewController, UISearchControllerDelegate, UISearchBarDelegate, UITableViewDataSource, UITableViewDelegate { + var items = [RepositoryModel]() + @IBOutlet weak var tableView: UITableView! var searchController: UISearchController! var searchResultController: SearchViewController! override func viewDidLoad() { super.viewDidLoad() + self.tableView.fit_registerCell(cell: RepositoriesTableViewCell.self) + searchResultController = SearchViewController.loadStoryboard() + searchResultController.nav = self.navigationController searchController = UISearchController(searchResultsController: searchResultController) searchController.searchResultsUpdater = searchResultController @@ -27,9 +32,22 @@ class DiscoveryViewController: BaseViewController, UISearchControllerDelegate, U searchController.searchBar.tintColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) navigationItem.searchController = searchController - navigationItem.hidesSearchBarWhenScrolling = true + navigationItem.hidesSearchBarWhenScrolling = false definesPresentationContext = true + + self.requestData() + } + + fileprivate func requestData() { + NetworkManager.getTrendingRepository(success: { (items) in + + self.items = items + self.tableView.reloadData() + + }) { (_) in + + } } override func didReceiveMemoryWarning() { @@ -56,12 +74,12 @@ class DiscoveryViewController: BaseViewController, UISearchControllerDelegate, U extension DiscoveryViewController { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 5 + return items.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = UITableViewCell(style: .default, reuseIdentifier: "cell") - cell.textLabel?.text = "de" + let cell = tableView.fit_dequeueReusableCell(indexPath: indexPath) as RepositoriesTableViewCell + cell.model = items[indexPath.row] return cell } @@ -72,20 +90,12 @@ extension DiscoveryViewController { extension DiscoveryViewController { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) - } - -} - - -// MARK: - UISearchBarDelegate - -extension DiscoveryViewController { - func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { - searchBar.resignFirstResponder() - - - + let vc = RepositoryViewController.loadStoryboard() + vc.userName = self.items[indexPath.row].owner!.login! + vc.repositoryName = self.items[indexPath.row].name! + self.navigationController?.pushViewController(vc, animated: true) } } diff --git a/FitHub/FitHub/Discovery/SearchViewController.swift b/FitHub/FitHub/Discovery/SearchViewController.swift index b1bad65..7d073b0 100644 --- a/FitHub/FitHub/Discovery/SearchViewController.swift +++ b/FitHub/FitHub/Discovery/SearchViewController.swift @@ -19,6 +19,8 @@ enum SearchType: String { class SearchViewController: UITableViewController, UISearchBarDelegate, StoryboardLoadable { + var nav: UINavigationController? + var text: String = "" var type: SearchType! @@ -35,6 +37,13 @@ class SearchViewController: UITableViewController, UISearchBarDelegate, Storyboa tableView.fit_registerCell(cell: UserTableViewCell.self) tableView.fit_registerCell(cell: RepositoriesTableViewCell.self) } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + self.users.removeAll() + self.repos.removeAll() + } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() @@ -84,8 +93,8 @@ extension SearchViewController { extension SearchViewController { func searchRepos(name: String) { - NetworkManager.searchUser(name: name, success: { (items) in - self.users = items + NetworkManager.searchRepos(name: name, success: { (items) in + self.repos = items self.tableView.reloadData() }) { (_) in @@ -147,13 +156,17 @@ extension SearchViewController { let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") as! SearchSectionHeaderView header.type = type header.reposBlock = { - self.searchRepos(name: self.text) + self.repos.removeAll() self.type = .repositories + self.tableView.reloadData() + self.searchRepos(name: self.text) } header.usersBlock = { - self.searchUsers(name: self.text) + self.users.removeAll() self.type = .users + self.tableView.reloadData() + self.searchUsers(name: self.text) } return header } @@ -172,4 +185,30 @@ extension SearchViewController { return 0 } } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + switch type { + case .repositories: + let vc = RepositoryViewController.loadStoryboard() + vc.userName = self.repos[indexPath.row].owner!.login! + vc.repositoryName = self.repos[indexPath.row].name! + self.nav?.pushViewController(vc, animated: true) + case .users: + + let model = self.users[indexPath.row] + if model.type == "User" { + let vc = UserDetailViewController.loadStoryboard() + vc.name = model.login! + self.nav?.pushViewController(vc, animated: true) + } else { + let vc = OrgViewController.loadStoryboard() + vc.name = model.login! + self.nav?.pushViewController(vc, animated: true) + } + + default: + break + } + } } diff --git a/FitHub/FitHub/Info.plist b/FitHub/FitHub/Info.plist index e272756..e07b47d 100644 --- a/FitHub/FitHub/Info.plist +++ b/FitHub/FitHub/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.0.1 CFBundleURLTypes diff --git a/FitHub/FitHub/Main/Base.lproj/Main.storyboard b/FitHub/FitHub/Main/Base.lproj/Main.storyboard index 1a2d033..e51e259 100644 --- a/FitHub/FitHub/Main/Base.lproj/Main.storyboard +++ b/FitHub/FitHub/Main/Base.lproj/Main.storyboard @@ -263,16 +263,35 @@ + + + + + + + + + + + + + + + + + + + - + diff --git a/FitHub/FitHub/Org/OrgsViewController.swift b/FitHub/FitHub/Org/OrgsViewController.swift index 0565723..fbabcda 100644 --- a/FitHub/FitHub/Org/OrgsViewController.swift +++ b/FitHub/FitHub/Org/OrgsViewController.swift @@ -9,7 +9,7 @@ import UIKit import FitRefresh -class OrgsViewController: BaseViewController { +class OrgsViewController: BaseViewController, StoryboardLoadable { var url: String = "" diff --git a/FitHub/FitHub/Repository/RepositoriesTableViewCell.xib b/FitHub/FitHub/Repository/RepositoriesTableViewCell.xib index 409fd22..84e6ef4 100644 --- a/FitHub/FitHub/Repository/RepositoriesTableViewCell.xib +++ b/FitHub/FitHub/Repository/RepositoriesTableViewCell.xib @@ -98,7 +98,7 @@ - + diff --git a/FitHub/FitHub/Tool/NetworkManager.swift b/FitHub/FitHub/Tool/NetworkManager.swift index 53e2b2d..9fd059b 100644 --- a/FitHub/FitHub/Tool/NetworkManager.swift +++ b/FitHub/FitHub/Tool/NetworkManager.swift @@ -17,6 +17,9 @@ protocol NetworkManagerProtocol { static func loadOrgs(withUrl urlStr: String, page: Int, success: @escaping (_ items: [OrgModel]) -> (), failure: @escaping (Error) -> ()) static func searchUser(name: String, success: @escaping (_ items: [UserModel]) -> (), failure: @escaping (Error) -> ()) + static func searchRepos(name: String, success: @escaping (_ items: [RepositoryModel]) -> (), failure: @escaping (Error) -> ()) + + static func getTrendingRepository(success: @escaping (_ items: [RepositoryModel]) -> (), failure: @escaping (Error) -> ()) /// <#Description#> /// @@ -151,6 +154,59 @@ class NetworkManager: NetworkManagerProtocol { } } + static func searchRepos(name: String, success: @escaping (_ items: [RepositoryModel]) -> (), failure: @escaping (Error) -> ()) { + + let url = "https://api.github.com/search/repositories?q=\(name)" + let header = self.getHeader() + Alamofire.request(url, method: .get, headers:header).responseJSON { (response) in + switch response.result { + case .success(let value): + let json = JSON(value) + + let total_count = json["total_count"].int + + if let items = json["items"].arrayObject { + + var models = [RepositoryModel]() + for dict in items { + models.append(RepositoryModel(dict: dict as! [String : AnyObject])) + } + success(models) + } + break + case .failure(let error): + failure(error) + break + } + } + } + + static func getTrendingRepository(success: @escaping (_ items: [RepositoryModel]) -> (), failure: @escaping (Error) -> ()) { + + let url = "https://raw.githubusercontent.com/cywd/cywd.github.io/master/json/treding.json" + let header = self.getHeader() + Alamofire.request(url, method: .get, headers:header).responseJSON { (response) in + switch response.result { + case .success(let value): + let json = JSON(value) + + if let items = json.arrayObject { + + var models = [RepositoryModel]() + for dict in items { + models.append(RepositoryModel(dict: dict as! [String : AnyObject])) + } + success(models) + } + break + case .failure(let error): + failure(error) + break + } + } + + } + static func loadCommonUsers(withUrl urlStr: String, page: Int, success: @escaping (_ items: [UserModel]) -> (), failure: @escaping (Error) -> ()) { let url = "\(urlStr)?page=\(page)"