aboutsummaryrefslogblamecommitdiff
path: root/foray/Scenes/ForayTableViewController.swift
blob: 64ec086e8771b729836a9ae4c4d349ab6aebaf12 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                         




                                     


                                                                    
    
                                                                
                                      


                               





                                  
                            
        

                                                            
                                   
                                                                                                 
        
                                                                
                                  

                       
                                                


                                                                                                             

                                       



                          






                                                                 




                                                                    
 


                                                
         

     



                                                                      
                                  


                                                                                                  

                                                     


                                                                                                             
                                                                                                                                                                        

                                                                                             



                                                                                                        
                                                           
     
    

                                                                                            

                                                                        
                                                 
     
 
//
//  ForayTableViewController.swift
//  foray
//
//  Created by Nicholas Tay on 14/3/2022.
//

import UIKit

struct YearSection {
    var year: Int
    var items: [PenguinItemViewModel]
}

class ForayTableViewController: UITableViewController, Coordinated {

    typealias CoordinatorType = ForayCoordinator
    
    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() {
        Task(priority: .medium) { [weak self] in
            let models = await self?.presenter.fetch()

            guard let self = self,
                  let models = models else { return }

            let groups = Dictionary(grouping: models) { $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 {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "ForayTableViewCell", for: indexPath) as? ForayTableViewCell else { return ForayTableViewCell() }
        let item = self.sections[indexPath.section].items[indexPath.row]
        cell.setData(name: item.name, desc: item.typeName + "ID: " + item.id, img: item.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)
    }
}