// // EmployeeDetailViewController.swift // EmployeeDirectory // // Created by Matt Bruce on 2/6/25. // import UIKit import Combine public class EmployeeDetailViewController: UIViewController { private let photoImageView = UIImageView() private let nameLabel = UILabel() private let emailLabel = UILabel() private let teamLabel = UILabel() private let employeeTypeLabel = UILabel() private let phoneLabel = UILabel() private let bioLabel = UILabel() private let stackView = UIStackView() private let scrollView = UIScrollView() /// Used for grabbing the photo private var largerPhotoSubscriber: AnyCancellable? public var viewModel: EmployeeDetailViewModel? public override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // default image photoImageView.image = UIImage(systemName: "person.crop.circle") photoImageView.contentMode = .scaleAspectFit // Configure stackView stackView.axis = .vertical stackView.spacing = 5 stackView.alignment = .top stackView.distribution = .fill stackView.translatesAutoresizingMaskIntoConstraints = false // Add labels to stackView stackView.addArrangedSubview(photoImageView) stackView.addArrangedSubview(nameLabel) stackView.addArrangedSubview(teamLabel) stackView.addArrangedSubview(employeeTypeLabel) stackView.addArrangedSubview(phoneLabel) stackView.addArrangedSubview(emailLabel) stackView.addArrangedSubview(bioLabel) view.addSubview(stackView) photoImageView.heightAnchor.constraint(equalToConstant: 200).isActive = true photoImageView.widthAnchor.constraint(equalToConstant: 200).isActive = true stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true stackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true stackView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: 10).isActive = true stackView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true // Bind the image to the photoImageView largerPhotoSubscriber = viewModel?.$largePhoto .compactMap { $0 } .receive(on: DispatchQueue.main) .sink { [weak self] image in self?.photoImageView.image = image } if let viewModel { // Bind data to UI components nameLabel.text = viewModel.fullName emailLabel.text = viewModel.emailAddress teamLabel.text = viewModel.team employeeTypeLabel.text = viewModel.employeeType phoneLabel.text = viewModel.phoneNumber bioLabel.text = viewModel.biography // Dynamically show or hide elements based on their content phoneLabel.isHidden = viewModel.phoneNumber == nil bioLabel.isHidden = viewModel.biography == nil } let phoneTap = UITapGestureRecognizer(target: self, action: #selector(didTapPhoneView(_:))) phoneLabel.isUserInteractionEnabled = true phoneLabel.addGestureRecognizer(phoneTap) } @objc func didTapPhoneView(_ sender: UITapGestureRecognizer) { guard let phoneNumber = viewModel?.phoneNumber?.filter({ $0.isNumber }) else { print("phone not there") return } let numberUrl = URL(string: "tel://\(phoneNumber)")! if UIApplication.shared.canOpenURL(numberUrl) { UIApplication.shared.open(numberUrl) } print("print", phoneNumber) } }