From 3a9399f076eacea0fb1346c0ff92d0fc50614098 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 6 Feb 2025 15:17:38 -0600 Subject: [PATCH] initial cut for Details VC Signed-off-by: Matt Bruce --- .../EmployeeDetailViewController.swift | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 EmployeeDirectory/ViewControllers/EmployeeDetailViewController.swift diff --git a/EmployeeDirectory/ViewControllers/EmployeeDetailViewController.swift b/EmployeeDirectory/ViewControllers/EmployeeDetailViewController.swift new file mode 100644 index 0000000..7e2549a --- /dev/null +++ b/EmployeeDirectory/ViewControllers/EmployeeDetailViewController.swift @@ -0,0 +1,99 @@ +// +// 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) + } + +}