Gemini/Gemini-iOS/NavigationBarView.swift

91 lines
3.3 KiB
Swift

//
// NavigationBarView.swift
// Gemini-iOS
//
// Created by Shadowfacts on 12/19/20.
//
import UIKit
import BrowserCore
import Combine
class NavigationBarView: UIView {
let navigator: NavigationManager
private var border: UIView!
private(set) var textField: UITextField!
private var cancellables = [AnyCancellable]()
init(navigator: NavigationManager) {
self.navigator = navigator
super.init(frame: .zero)
backgroundColor = .systemBackground
border = UIView()
border.backgroundColor = UIColor(white: traitCollection.userInterfaceStyle == .dark ? 0.25 : 0.75, alpha: 1)
border.translatesAutoresizingMaskIntoConstraints = false
addSubview(border)
NSLayoutConstraint.activate([
border.leadingAnchor.constraint(equalTo: leadingAnchor),
border.trailingAnchor.constraint(equalTo: trailingAnchor),
border.bottomAnchor.constraint(equalTo: bottomAnchor),
border.heightAnchor.constraint(equalToConstant: 1),
])
textField = UITextField()
textField.text = navigator.displayURL
textField.borderStyle = .roundedRect
textField.keyboardType = .URL
textField.returnKeyType = .go
textField.autocapitalizationType = .none
textField.autocorrectionType = .no
textField.addTarget(self, action: #selector(commitURL), for: .primaryActionTriggered)
textField.translatesAutoresizingMaskIntoConstraints = false
addSubview(textField)
NSLayoutConstraint.activate([
textField.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
textField.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8),
textField.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
textField.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -9),
])
navigator.$currentURL
.sink { (newURL) in
// can't use navigator.displayURL because the publisher fires before the underlying value is updated, so the displayURL getter returns the old value
var components = URLComponents(url: newURL, resolvingAgainstBaseURL: false)!
if components.port == 1965 {
components.port = nil
}
self.textField.text = components.string!
}
.store(in: &cancellables)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
border.backgroundColor = UIColor(white: traitCollection.userInterfaceStyle == .dark ? 0.25 : 0.75, alpha: 1)
}
@objc private func commitURL() {
textField.resignFirstResponder()
if let text = textField.text, var components = URLComponents(string: text) {
if components.scheme == nil {
components.scheme = "gemini"
}
navigator.changeURL(components.url!)
} else {
textField.text = navigator.displayURL
}
}
}