// // ForayTableViewController.swift // foray // // Created by Nicholas Tay on 14/3/2022. // import UIKit struct YearSection { var year: Int var items: [PenguinItemViewModel] } class ForayTableViewController: UITableViewController, ForayCoordinated { let presenter: PenguinItemPresenter = PenguinItemPresenter() var coordinator: ForayCoordinator? // MARK: - Static data TEMP var sections = [YearSection]() // MARK: - On load override func viewDidLoad() { super.viewDidLoad() self.title = "Foray" tableView.rowHeight = UITableView.automaticDimension // Register our custom cell tableView.register(ForayTableViewCell.self, forCellReuseIdentifier: "ForayTableViewCell") // Not sure if this is the right way to go about this... coordinator?.showLoading() reloadApiData() self.refreshControl = UIRefreshControl() self.refreshControl?.addTarget(self, action: #selector(doRefresh), for: UIControl.Event.valueChanged) } @objc func doRefresh(sender: AnyObject) { reloadApiData() } func reloadApiData() { presenter.fetch(receiver: { (data: [PenguinItemViewModel]) in let groups = Dictionary(grouping: data) { $0.year } self.sections = groups.map { (key, values) in return YearSection(year: key, items: values) } // Sort the sections from oldest year to newest self.sections.sort { (lhs, rhs) in lhs.year < rhs.year } self.tableView.reloadData() self.refreshControl?.endRefreshing() self.coordinator?.hideLoading() }) } // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { // Returns number of sections for table return self.sections.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // Returns number of rows for table's section return self.sections[section].items.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let item = self.sections[indexPath.section].items[indexPath.row] let type: String let icon: UIImage switch item.type { case .item: type = "Item" icon = UIImage(named: item.id)! case .quest: type = "Quest" icon = UIImage(named: "spy")! } let cell: ForayTableViewCell = tableView.dequeueReusableCell(withIdentifier: "ForayTableViewCell", for: indexPath) as! ForayTableViewCell cell.setData(name: item.name, desc: type + "ID: " + item.id, img: icon) return cell } override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return "Released in \(self.sections[section].year)" } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let item = self.sections[indexPath.section].items[indexPath.row] self.coordinator?.showDetails(item: item) } }