mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
5.1 KiB
Swift
104 lines
5.1 KiB
Swift
|
|
@objc(LKDeviceNameModal)
|
|
final class DeviceNameModal : Modal {
|
|
@objc public var device: DeviceLink.Device!
|
|
@objc public var delegate: DeviceNameModalDelegate?
|
|
|
|
// MARK: Components
|
|
private lazy var nameTextField: UITextField = {
|
|
let result = UITextField()
|
|
result.textColor = Colors.text
|
|
result.font = .systemFont(ofSize: Values.mediumFontSize)
|
|
result.textAlignment = .center
|
|
let placeholder = NSMutableAttributedString(string: NSLocalizedString("modal_edit_device_name_text_field_hint", comment: ""))
|
|
placeholder.addAttribute(.foregroundColor, value: Colors.text.withAlphaComponent(Values.unimportantElementOpacity), range: NSRange(location: 0, length: placeholder.length))
|
|
result.attributedPlaceholder = placeholder
|
|
result.tintColor = Colors.accent
|
|
result.keyboardAppearance = .dark
|
|
return result
|
|
}()
|
|
|
|
// MARK: Lifecycle
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
let notificationCenter = NotificationCenter.default
|
|
notificationCenter.addObserver(self, selector: #selector(handleKeyboardWillChangeFrameNotification(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
|
|
notificationCenter.addObserver(self, selector: #selector(handleKeyboardWillHideNotification(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
|
|
}
|
|
|
|
override func populateContentView() {
|
|
// Set up title label
|
|
let titleLabel = UILabel()
|
|
titleLabel.textColor = Colors.text
|
|
titleLabel.font = .boldSystemFont(ofSize: Values.mediumFontSize)
|
|
titleLabel.text = "Change Device Name"
|
|
titleLabel.numberOfLines = 0
|
|
titleLabel.lineBreakMode = .byWordWrapping
|
|
titleLabel.textAlignment = .center
|
|
// Set up explanation label
|
|
let explanationLabel = UILabel()
|
|
explanationLabel.textColor = Colors.text
|
|
explanationLabel.font = .systemFont(ofSize: Values.smallFontSize)
|
|
explanationLabel.text = "Enter the new display name for your device below"
|
|
explanationLabel.numberOfLines = 0
|
|
explanationLabel.textAlignment = .center
|
|
explanationLabel.lineBreakMode = .byWordWrapping
|
|
// Set up OK button
|
|
let okButton = UIButton()
|
|
okButton.set(.height, to: Values.mediumButtonHeight)
|
|
okButton.layer.cornerRadius = Values.modalButtonCornerRadius
|
|
okButton.backgroundColor = Colors.accent
|
|
okButton.titleLabel!.font = .systemFont(ofSize: Values.smallFontSize)
|
|
okButton.setTitleColor(Colors.text, for: UIControl.State.normal)
|
|
okButton.setTitle(NSLocalizedString("OK", comment: ""), for: UIControl.State.normal)
|
|
okButton.addTarget(self, action: #selector(changeName), for: UIControl.Event.touchUpInside)
|
|
// Set up button stack view
|
|
let buttonStackView = UIStackView(arrangedSubviews: [ cancelButton, okButton ])
|
|
buttonStackView.axis = .horizontal
|
|
buttonStackView.spacing = Values.mediumSpacing
|
|
buttonStackView.distribution = .fillEqually
|
|
// Set up main stack view
|
|
let stackView = UIStackView(arrangedSubviews: [ titleLabel, explanationLabel, nameTextField, buttonStackView ])
|
|
stackView.axis = .vertical
|
|
stackView.spacing = Values.largeSpacing
|
|
contentView.addSubview(stackView)
|
|
stackView.pin(.leading, to: .leading, of: contentView, withInset: Values.largeSpacing)
|
|
stackView.pin(.top, to: .top, of: contentView, withInset: Values.largeSpacing)
|
|
contentView.pin(.trailing, to: .trailing, of: stackView, withInset: Values.largeSpacing)
|
|
contentView.pin(.bottom, to: .bottom, of: stackView, withInset: Values.largeSpacing)
|
|
}
|
|
|
|
deinit {
|
|
NotificationCenter.default.removeObserver(self)
|
|
}
|
|
|
|
// MARK: Updating
|
|
@objc private func handleKeyboardWillChangeFrameNotification(_ notification: Notification) {
|
|
guard let newHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size.height else { return }
|
|
verticalCenteringConstraint.constant = -(newHeight / 2)
|
|
UIView.animate(withDuration: 0.25) {
|
|
self.view.layoutIfNeeded()
|
|
}
|
|
}
|
|
|
|
@objc private func handleKeyboardWillHideNotification(_ notification: Notification) {
|
|
verticalCenteringConstraint.constant = 0
|
|
UIView.animate(withDuration: 0.25) {
|
|
self.view.layoutIfNeeded()
|
|
}
|
|
}
|
|
|
|
// MARK: Interaction
|
|
@objc private func changeName() {
|
|
let name = nameTextField.text!.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
|
|
if !name.isEmpty {
|
|
UserDefaults.standard[.slaveDeviceName(device.publicKey)] = name
|
|
delegate?.handleDeviceNameChanged(to: name, for: device)
|
|
} else {
|
|
let alert = UIAlertController(title: "Error", message: "Please pick a name", preferredStyle: .alert)
|
|
alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), accessibilityIdentifier: nil, style: .default, handler: nil))
|
|
present(alert, animated: true, completion: nil)
|
|
}
|
|
}
|
|
}
|