100 lines
3.7 KiB
Swift
100 lines
3.7 KiB
Swift
//
|
|
// 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)
|
|
}
|
|
|
|
}
|