Files
MessageKit/Example/Sources/View Controllers/SettingsViewController.swift
T
Martin Púčik bff35fda61 Added Swiftlint and Swiftformat plugins (#1729)
* build: Swiftlint plugin

* build: Swiftformat plugin

* build: Swiftformat plugin

* build: Swiftformat bash command

* style: Swiftformat rules

* style: Swiftformat applied to codebase

* style: Ignore Tests for Swiftlint

* Update bundler

* Update changelog and migration guide

* style: Ignore Example for Swiftlint

* chore: Changelog

* Update Xcode version for ci_pr_tests.yml

* Update ci_pr_framework.yml

* Update ci_pr_example.yml

* chore: Changelog

Co-authored-by: Jakub Kaspar <kaspikk@gmail.com>
2022-07-25 08:46:14 +00:00

186 lines
5.6 KiB
Swift

// MIT License
//
// Copyright (c) 2017-2019 MessageKit
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import MessageKit
import UIKit
// MARK: - SettingsViewController
final internal class SettingsViewController: UITableViewController {
// MARK: Lifecycle
// MARK: - View lifecycle
init() {
super.init(style: .insetGrouped)
}
required init?(coder _: NSCoder) { nil }
// MARK: Internal
// MARK: - Properties
let cells = [
"Mock messages count",
"Text Messages",
"AttributedText Messages",
"Photo Messages",
"Photo from URL Messages",
"Video Messages",
"Audio Messages",
"Emoji Messages",
"Location Messages",
"Url Messages",
"Phone Messages",
"ShareContact Messages",
]
var messagesPicker = UIPickerView()
// MARK: - Toolbar
var messagesToolbar = UIToolbar()
@objc
func onDoneWithPickerView() {
let selectedMessagesCount = messagesPicker.selectedRow(inComponent: 0)
UserDefaults.standard.setMockMessages(count: selectedMessagesCount)
view.endEditing(false)
tableView.reloadData()
}
@objc
func dismissPickerView() {
view.endEditing(false)
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Settings"
tableView.register(TextFieldTableViewCell.self, forCellReuseIdentifier: TextFieldTableViewCell.identifier)
tableView.tableFooterView = UIView()
configurePickerView()
configureToolbar()
}
// MARK: - TableViewDelegate & TableViewDataSource
override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
cells.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellValue = cells[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell()
cell.textLabel?.text = cells[indexPath.row]
switch cellValue {
case "Mock messages count":
return configureTextFieldTableViewCell(at: indexPath)
default:
let switchView = UISwitch(frame: .zero)
switchView.isOn = UserDefaults.standard.bool(forKey: cellValue)
switchView.tag = indexPath.row
switchView.onTintColor = .primaryColor
switchView.addTarget(self, action: #selector(switchChanged(_:)), for: .valueChanged)
cell.accessoryView = switchView
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let cell = tableView.cellForRow(at: indexPath)
cell?.contentView.subviews.forEach {
if $0 is UITextField {
$0.becomeFirstResponder()
}
}
}
@objc
func switchChanged(_ sender: UISwitch!) {
let cell = cells[sender.tag]
UserDefaults.standard.set(sender.isOn, forKey: cell)
UserDefaults.standard.synchronize()
}
// MARK: Private
private func configurePickerView() {
messagesPicker.dataSource = self
messagesPicker.delegate = self
messagesPicker.backgroundColor = .white
messagesPicker.selectRow(UserDefaults.standard.mockMessagesCount(), inComponent: 0, animated: false)
}
private func configureToolbar() {
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(onDoneWithPickerView))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(dismissPickerView))
messagesToolbar.items = [cancelButton, spaceButton, doneButton]
messagesToolbar.sizeToFit()
}
// MARK: - Helper
private func configureTextFieldTableViewCell(at indexPath: IndexPath) -> TextFieldTableViewCell {
if
let cell = tableView.dequeueReusableCell(
withIdentifier: TextFieldTableViewCell.identifier,
for: indexPath) as? TextFieldTableViewCell
{
cell.mainLabel.text = "Mock messages count:"
let messagesCount = UserDefaults.standard.mockMessagesCount()
cell.textField.text = "\(messagesCount)"
cell.textField.inputView = messagesPicker
cell.textField.inputAccessoryView = messagesToolbar
return cell
}
return TextFieldTableViewCell()
}
}
// MARK: UIPickerViewDelegate, UIPickerViewDataSource
extension SettingsViewController: UIPickerViewDelegate, UIPickerViewDataSource {
func numberOfComponents(in _: UIPickerView) -> Int {
1
}
func pickerView(_: UIPickerView, numberOfRowsInComponent _: Int) -> Int {
100
}
func pickerView(_: UIPickerView, titleForRow row: Int, forComponent _: Int) -> String? {
"\(row)"
}
}