feat: Allows to change filters from map detail (seismic network)

This commit is contained in:
Andrea Busi
2021-03-22 20:55:59 +01:00
parent 87c5444a37
commit ae247a1695
9 changed files with 153 additions and 9 deletions
@@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */
651901B925F5358700CAFF20 /* EQNMapAnnotationSeismic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */; };
6525A82625E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */; };
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */; };
65355FFF25F38D3300BB57D2 /* SegnalazioniMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */; };
6535600425F398CD00BB57D2 /* Costanti+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */; };
653C67E225F3CC2E00FE52AC /* EQNCustomAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653C67E125F3CC2E00FE52AC /* EQNCustomAnnotationView.swift */; };
@@ -279,6 +280,7 @@
40CD2E5581CF2FA3D52F392D /* Pods-Earthquake Network.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Earthquake Network.release.xcconfig"; path = "Pods/Target Support Files/Pods-Earthquake Network/Pods-Earthquake Network.release.xcconfig"; sourceTree = "<group>"; };
651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNMapAnnotationSeismic.swift; sourceTree = "<group>"; };
6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicNetworkAdvertiseTableViewCell.swift; sourceTree = "<group>"; };
652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersViewModel.swift; sourceTree = "<group>"; };
65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegnalazioniMapViewController.swift; sourceTree = "<group>"; };
6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Costanti+Extensions.swift"; sourceTree = "<group>"; };
653C67E125F3CC2E00FE52AC /* EQNCustomAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNCustomAnnotationView.swift; sourceTree = "<group>"; };
@@ -623,6 +625,7 @@
isa = PBXGroup;
children = (
DC974AFE251748B300A139EC /* SeismicFiltersViewController.swift */,
652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */,
);
path = Filters;
sourceTree = "<group>";
@@ -1529,6 +1532,7 @@
DCD4571C24F6CF0D00B58304 /* EQNGenericValue.swift in Sources */,
8C4E343F215012FA008B0D2A /* EQNManager.m in Sources */,
DCAA913F24F68A1D00145A3D /* SettingMultivaluesTableViewCell.swift in Sources */,
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */,
DCF9E14F24F6EA07002B6B1D /* EQNSeismicNetwork.swift in Sources */,
DC2814302519C24400C1AFF7 /* SeismicNetworkTableViewCell.swift in Sources */,
654D18C425F93C0600BB6DB0 /* PasquakesMapViewController.swift in Sources */,
@@ -0,0 +1,48 @@
//
// FiltersViewModel.swift
// Earthquake Network
//
// Created by Andrea Busi on 22/03/21.
// Copyright © 2021 Earthquake Network. All rights reserved.
//
import Foundation
struct FiltersViewModel {
let magnitude: String
let distance: String
let timeframe: String
init() {
let magnitudoMinima = EQNData.magitudoDebole(for: EQNSeismic.shared.magnitudoMinima)
self.magnitude = Self.formattedMagnitude(magnitudoMinima.value)
let distanzaMassima = EQNData.raggioSisma(for: EQNSeismic.shared.distanzaMassima)
self.distance = Self.formattedDistance(distanzaMassima.value)
let periodoTemporale = EQNData.periodoTemporale(for: EQNSeismic.shared.periodoTemporale)
self.timeframe = Self.formattedTimeframe(periodoTemporale.value)
}
// MARK: - Private
private static func formattedMagnitude(_ magnitude: String) -> String {
return magnitude
}
private static func formattedDistance(_ distance: String) -> String {
if distance == EQNData.MaxRaggioSisma {
return ""
}
return "\(distance)km"
}
private static func formattedTimeframe(_ timeframe: String) -> String {
let time = Int(timeframe) ?? 0
if time < 60 {
return "\(time)m"
}
return "\(time/60)h"
}
}
@@ -9,20 +9,57 @@
import UIKit
import MapKit
protocol SeismicNetworksMapDetailViewControllerDelegate: class {
func seismicNetworksMapDetailControllerWillUpdateData(_ controller: SeismicNetworksMapDetailViewController, needsDataUpdate: Bool)
}
class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
// MARK: - State
override var availableFilters: [EQNFiltroMappa] {
// filters are not available for this map
[]
// trick to show filtersView
[ .unGiorno ]
}
weak var delegate: SeismicNetworksMapDetailViewControllerDelegate?
// MARK: - UI
override var filtersView: UIView {
get { return seismicFiltersView }
set { seismicFiltersView = newValue }
}
private lazy var seismicFiltersView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .lightGray
// label with current selecte filter
view.addSubview(seismicsFilterLabel)
seismicsFilterLabel.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
seismicsFilterLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
seismicsFilterLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8.0).isActive = true
seismicsFilterLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8.0).isActive = true
// tap recognizer
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(filtersTapped(_:)))
view.addGestureRecognizer(tapRecognizer)
return view
}()
private lazy var seismicsFilterLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.textAlignment = .center
label.text = ""
return label
}()
// MARK: - Internal
private let seismic: EQNSisma
private let allSeismics: [EQNSisma]
private var allSeismics: [EQNSisma]
// MARK: - Init
@@ -33,11 +70,16 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
fatalError("init(coder:) is not available, please use init(seismic:allSeismics:)")
}
// MARK: - Public
func updateSeismics(_ seismics: [EQNSisma]) {
allSeismics = seismics
loadDataSource()
}
override func registerMapAnnotationViews() {
mapView.register(EQNCustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: EQNCustomAnnotationView.DoubleLineIdentifier)
}
@@ -46,6 +88,7 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
let annotations = allSeismics.map { EQNMapAnnotationSeismic(seismic: $0) }
updateMap(with: annotations)
loadFiltersRecap()
}
override func elaborateMapCenter() {
@@ -70,6 +113,30 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
present(alert, animated: true)
}
// MARK: - Private
private func loadFiltersRecap() {
let filters = FiltersViewModel()
let recap = "\(NSLocalizedString("filter_filter", comment: "")): "
+ "M≥\(filters.magnitude) "
+ "D≤\(filters.distance) "
+ "T≤\(filters.timeframe)"
seismicsFilterLabel.text = recap
}
// MARK: - Actions
@objc override func filtersTapped(_ sender: UIGestureRecognizer) {
let controller = SeismicFiltersViewController.makeController()
controller.delegate = self
controller.modalPresentationStyle = .overCurrentContext
controller.modalTransitionStyle = .crossDissolve
present(controller, animated: true, completion: nil)
}
// MARK: - Map
override func setupAnnotationView(for annotation: MKAnnotation, on mapView: MKMapView) -> MKAnnotationView? {
@@ -88,3 +155,9 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
return annotationView
}
}
extension SeismicNetworksMapDetailViewController: SeismicFiltersViewControllerDelegate {
func seismicFiltersControllerDidUpdateFilters(_ controller: SeismicFiltersViewController) {
delegate?.seismicNetworksMapDetailControllerWillUpdateData(self, needsDataUpdate: controller.needsDataUpdate)
}
}
@@ -26,6 +26,7 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
@IBOutlet private weak var tableView: UITableView?
@IBOutlet private weak var expandeCollapseButton: UIBarButtonItem!
weak var currentMapController: SeismicNetworksMapDetailViewController?
/// The ad loader
private lazy var adLoader: GADAdLoader = {
@@ -105,7 +106,10 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
private func showMapDetail(for seismic: EQNSisma) {
let seismics = getSeismics()
let controller = SeismicNetworksMapDetailViewController(seismic: seismic, allSeismics: seismics)
controller.delegate = self
present(controller, animated: true, completion: nil)
self.currentMapController = controller
}
// MARK: - Notifications
@@ -155,6 +159,11 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
if !EQNPurchaseUtility.isProVersionEnabled() {
loadAd()
}
// if a map detail is presented, update its data
if let mapController = currentMapController {
mapController.updateSeismics(filteredSeismics)
}
}
private func getSeismics() -> [EQNSisma] {
@@ -418,3 +427,10 @@ extension SeismicNetworksViewController: DZNEmptyDataSetSource {
return string
}
}
extension SeismicNetworksViewController: SeismicNetworksMapDetailViewControllerDelegate {
func seismicNetworksMapDetailControllerWillUpdateData(_ controller: SeismicNetworksMapDetailViewController, needsDataUpdate: Bool) {
loadData(forced: needsDataUpdate)
refreshUI()
}
}
@@ -54,7 +54,7 @@ class EQNBaseMapViewController: EQNBaseViewController, MKMapViewDelegate {
return containerView
}
private lazy var filtersView: UIView = {
lazy var filtersView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .lightGray
@@ -233,7 +233,7 @@ class EQNBaseMapViewController: EQNBaseViewController, MKMapViewDelegate {
dismiss(animated: true)
}
@objc private func filtersTapped(_ sender: UIGestureRecognizer) {
@objc func filtersTapped(_ sender: UIGestureRecognizer) {
let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
availableFilters.forEach { (filter) in
sheet.addAction(UIAlertAction(title: filter.title, style: .default, handler: { _ in
@@ -10,8 +10,8 @@ import Foundation
@objc class EQNData: NSObject {
@objc public static let DefaultRaggioSisma = EQNGenericValue(value:"100000", display:"Qualsiasi distanza")
@objc public static let MaxRaggioSisma = "100000"
@objc public static let DefaultRaggioSisma = EQNGenericValue(value:MaxRaggioSisma, display:"Qualsiasi distanza")
@objc public static let DefaultMagitudoDebole = EQNGenericValue(value:"2.0", display:"Magnitudo >= 2.0")
@objc public static let DefaultMagitudoForte = EQNGenericValue(value:"5.5", display:"Magnitudo >= 5.5")
@objc public static let DefaultSeismicToNotify = EQNGenericValue(value: "0", display: "Qualsiasi intensità")
@@ -34,7 +34,7 @@ import Foundation
EQNGenericValue(value:"1000", display:"1000 km"),
EQNGenericValue(value:"2000", display:"2000 km"),
EQNGenericValue(value:"4000", display:"4000 km"),
EQNGenericValue(value:"100000", display:"Qualsiasi distanza"),
EQNGenericValue(value:Self.MaxRaggioSisma, display:"Qualsiasi distanza"),
]
}
@@ -305,6 +305,7 @@
"manual_sure" = "Do you really want to notify an earthquake?";
"manual_yes" = "Yes";
"calendar_missing_permission" = "The calendar cannot be opened, make sure you have set the correct permissions.";
"filter_filter" = "Filters";
// Segnalazioni
"manual_sendmessage" = "Send a message that the other users can read about the earthquake that you reported";
@@ -305,6 +305,7 @@
"manual_sure" = "¿Estas seguro de querer reportar un sismo?";
"manual_yes" = "Sí";
"calendar_missing_permission" = "El calendario no se puede abrir, asegúrese de haber configurado los permisos correctos.";
"filter_filter" = "Filtros";
// Segnalazioni
"manual_sendmessage" = "Enviar un mensaje que los demás usuarios puedan leer sobre el sismo que has notificado";
@@ -304,6 +304,7 @@
"manual_sure" = "Vuoi davvero segnalare un sisma?";
"manual_yes" = "Sì";
"calendar_missing_permission" = "Non è possibile aprire il calendario, assicurarsi di aver impostato i permessi corretti.";
"filter_filter" = "Filtri";
// Segnalazioni
"manual_sendmessage" = "Invia un messaggio che gli altri utenti possono leggere sul sisma che hai segnalato";