// // ForayTableViewController.swift // foray // // Created by Nicholas Tay on 14/3/2022. // import UIKit private func firstDayOfYear(date: Date) -> Date { let calendar = Calendar.current let components = calendar.dateComponents([.year], from: date) return calendar.date(from: components)! } class ForayTableViewController: UITableViewController { // 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(ForayNewTableViewCell.self, forCellReuseIdentifier: "ForayNewTableViewCell") // Not sure if this is the right way to go about this... let alert = UIAlertController(title: nil, message: "Grabbing data...", preferredStyle: .alert) let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) loadingIndicator.hidesWhenStopped = true loadingIndicator.style = UIActivityIndicatorView.Style.medium loadingIndicator.startAnimating(); alert.view.addSubview(loadingIndicator) present(alert, animated: true, completion: nil) reloadApiData() dismiss(animated: false, completion: nil) self.refreshControl = UIRefreshControl() self.refreshControl?.addTarget(self, action: #selector(doRefresh), for: UIControl.Event.valueChanged) } @objc func doRefresh(sender: AnyObject) { reloadApiData() } func reloadApiData() { ForayNetworkManager.shared.get( url: "https://users.windblume.net/~nick/upload/dummy.json", onComplete: { (apiItems: [PenguinItem]) in var items = apiItems items.sort { (lhs, rhs) in lhs.releaseDate < rhs.releaseDate } let groups = Dictionary(grouping: apiItems) { (item) in return firstDayOfYear(date: item.releaseDate) } 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() }) } // 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: ForayNewTableViewCell = tableView.dequeueReusableCell(withIdentifier: "ForayNewTableViewCell", for: indexPath) as! ForayNewTableViewCell cell.setData(name: item.name, desc: type + "ID: " + item.id, img: icon) return cell } override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let section = self.sections[section] let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy" return "Released in " + dateFormatter.string(from: section.year) } let detailViewController: ForayDetailViewController = ForayDetailViewController() override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let item = self.sections[indexPath.section].items[indexPath.row] detailViewController.setSelectedItem(selectedItem: item) self.navigationController?.pushViewController(detailViewController, animated: true) } }