// // FastSwitchingAccountView.swift // Tusker // // Created by Shadowfacts on 11/4/20. // Copyright © 2020 Shadowfacts. All rights reserved. // import UIKit class FastSwitchingAccountView: UIView { let account: LocalData.UserAccountInfo private static let selectedColor = UIColor { (traits) in if traits.userInterfaceStyle == .dark { return UIColor(hue: 211 / 360, saturation: 85 / 100, brightness: 100 / 100, alpha: 1) } else { return UIColor(hue: 211 / 360, saturation: 70 / 100, brightness: 100 / 100, alpha: 1) } } private static let currentColor = UIColor { (traits) in if traits.userInterfaceStyle == .dark { return UIColor(hue: 211 / 360, saturation: 85 / 100, brightness: 85 / 100, alpha: 1) } else { return UIColor(hue: 211 / 360, saturation: 50 / 100, brightness: 100 / 100, alpha: 1) } } var isSelected = false { didSet { updateLabelColors() } } var isCurrent = false { didSet { updateLabelColors() } } private let usernameLabel = UILabel() private let instanceLabel = UILabel() private var avatarRequest: ImageCache.Request? init(account: LocalData.UserAccountInfo) { self.account = account super.init(frame: .zero) usernameLabel.textColor = .white usernameLabel.font = UIFont(descriptor: .preferredFontDescriptor(withTextStyle: .headline), size: 0) usernameLabel.text = account.username instanceLabel.textColor = .white instanceLabel.font = UIFont(descriptor: .preferredFontDescriptor(withTextStyle: .subheadline), size: 0) instanceLabel.text = account.instanceURL.host! let stackView = UIStackView(arrangedSubviews: [ usernameLabel, instanceLabel ]) stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .vertical stackView.alignment = .trailing addSubview(stackView) let avatarImageView = UIImageView() avatarImageView.translatesAutoresizingMaskIntoConstraints = false avatarImageView.layer.masksToBounds = true avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadiusFraction * 40 avatarImageView.image = UIImage(systemName: Preferences.shared.avatarStyle == .circle ? "person.crop.circle" : "person.crop.square") avatarImageView.contentMode = .scaleAspectFit addSubview(avatarImageView) NSLayoutConstraint.activate([ avatarImageView.topAnchor.constraint(equalTo: topAnchor, constant: 8), avatarImageView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8), avatarImageView.trailingAnchor.constraint(equalTo: trailingAnchor), avatarImageView.widthAnchor.constraint(equalToConstant: 40), avatarImageView.heightAnchor.constraint(equalTo: avatarImageView.widthAnchor), stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8), stackView.trailingAnchor.constraint(equalTo: avatarImageView.leadingAnchor, constant: -8), stackView.centerYAnchor.constraint(equalTo: avatarImageView.centerYAnchor), ]) let controller = MastodonController.getForAccount(account) controller.getOwnAccount { [weak self] (result) in guard let self = self, case let .success(account) = result else { return } self.avatarRequest = ImageCache.avatars.get(account.avatar) { [weak avatarImageView] (_, image) in guard let avatarImageView = avatarImageView, let image = image else { return } DispatchQueue.main.async { avatarImageView.image = image } } } } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func updateLabelColors() { let color: UIColor if isSelected { color = FastSwitchingAccountView.selectedColor } else if isCurrent { color = FastSwitchingAccountView.currentColor } else { color = .white } usernameLabel.textColor = color instanceLabel.textColor = color } }