88 lines
3.1 KiB
Swift
88 lines
3.1 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, let url = URL(string: text) {
|
|
navigator.changeURL(url)
|
|
} else {
|
|
textField.text = navigator.displayURL
|
|
}
|
|
}
|
|
|
|
}
|