// // SettingsRealTimeAlertsViewController.swift // Earthquake Network // // Created by Andrea Busi on 10/06/24. // Copyright © 2024 Earthquake Network. All rights reserved. // import UIKit import Shogun class SettingsRealTimeAlertsViewController: SettingsBaseTableViewController { private enum RowIdentifier: Int { case abilitaNotifiche case disabilitaSuonoAllerta case abilitaCriticalAlerts } private var isNotificationEnabled = false private var isMildQuakeSoundDisabled = false private var isCriticalAlertsEnabled = false private let settings: [SettingItem] = [ .init(type: .enable, title: NSLocalizedString("options_notification_enable_alarm", comment: "")), .init(type: .enable, title: NSLocalizedString("options_notification_disable_sound", comment: "")), .init(type: .enable, title: NSLocalizedString("critical_alerts_setting", comment: "")) ] // MARK: - View Lifecycle override func viewDidLoad() { super.viewDidLoad() setupUI() tableView.reloadData() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) loadDataSource() tableView.reloadData() } // MARK: - Private private func setupUI() { navigationItem.largeTitleDisplayMode = .never tableView.estimatedRowHeight = 200.0 tableView.rowHeight = UITableView.automaticDimension tableView.registerHeaderFooterView(for: SettingSectionHeaderView.self) tableView.registerCell(for: SettingEnableTableViewCell.self) } private func loadDataSource() { let saved = EQNSettingRealTimeAlert.shared isNotificationEnabled = saved.isAbilitato isMildQuakeSoundDisabled = saved.isMildQuakeSoundDisabled isCriticalAlertsEnabled = saved.isCriticalAlertsEnabled } // MARK: - Table view delegate and data source override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let view = tableView.dequeueHeaderFooterView(cellIdentifiable: SettingSectionHeaderView.self) view.titleLabel.text = NSLocalizedString("options_alarms", comment: "") return view } override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { SettingSectionHeaderView.Height } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return settings.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let identifier = RowIdentifier(rawValue: indexPath.row) else { return UITableViewCell() } let setting = settings[indexPath.row] switch setting.type { case .enable: let cell = tableView.dequeueReusableCell(cellIdentifiable: SettingEnableTableViewCell.self, for: indexPath) cell.titleLabel.text = setting.displayTitle cell.descriptionLabel.text = setting.subtitle switch identifier { case .abilitaNotifiche: cell.toggleSwitch.isOn = isNotificationEnabled cell.valueChanged = { [weak self] enabled in self?.onChangeNotificationEnabled(enabled) } case .disabilitaSuonoAllerta: cell.toggleSwitch.isOn = isMildQuakeSoundDisabled cell.valueChanged = { [weak self] enabled in self?.onChangeDisableSoundEnabled(enabled) } case .abilitaCriticalAlerts: cell.toggleSwitch.isOn = isCriticalAlertsEnabled cell.valueChanged = { [weak self] enabled in self?.onChangeCriticalAlertsEnabled(enabled) } } return cell default: fatalError() } } // MARK: - Private private func onChangeNotificationEnabled(_ enabled: Bool) { isNotificationEnabled = enabled EQNSettingRealTimeAlert.shared.isAbilitato = isNotificationEnabled EQNSettingRealTimeAlert.shared.saveUserInfo() tableView.reloadData() } private func onChangeDisableSoundEnabled(_ enabled: Bool) { isMildQuakeSoundDisabled = enabled EQNSettingRealTimeAlert.shared.isMildQuakeSoundDisabled = isMildQuakeSoundDisabled EQNSettingRealTimeAlert.shared.saveUserInfo() tableView.reloadData() } private func onChangeCriticalAlertsEnabled(_ enabled: Bool) { if enabled { askForCriticalAlertsPermission() } isCriticalAlertsEnabled = enabled EQNSettingRealTimeAlert.shared.isCriticalAlertsEnabled = isCriticalAlertsEnabled EQNSettingRealTimeAlert.shared.saveUserInfo() tableView.reloadData() } private func askForCriticalAlertsPermission() { UNUserNotificationCenter.current().requestAuthorization(options: [ .criticalAlert ]) { granted, error in // nope } } }