Bonjour à tous.
J’ai crée une application de restauration qui permet d’effectuer des reservation.J’ai utilisé Firebase pour les données utilisateurs.Cependant,j’ai testé différentes façons de déconnecter l’utilisateur de son profil et de retourner à l’écran de connection (à l’aide d’un bouton déconnection) mais je n’y arrive pas.
Est ce que quelqu’un a une idée s’il vous plait?
import UIKit
import FirebaseAuth
import FirebaseDatabase
class ProfilesViewController: UIViewController {
lazy var containerView: UIView = {
let view = UIView()
view.backgroundColor = .black
view.addSubview(profileImageView)
profileImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
profileImageView.anchor(top: view.topAnchor, paddingTop: 150,
width: 120, height: 120)
profileImageView.layer.cornerRadius = 120 / 2
profileImageView.isUserInteractionEnabled = true
view.addSubview(nameLabel)
nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
nameLabel.anchor(top: profileImageView.bottomAnchor, paddingTop: 50)
view.addSubview(emailLabel)
emailLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
emailLabel.anchor(top: nameLabel.bottomAnchor, paddingTop: 12)
view.addSubview(reservationlabel)
reservationlabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
reservationlabel.anchor(top: emailLabel.bottomAnchor, paddingTop: 120)
view.addSubview(reserveButton)
reserveButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
reserveButton.anchor(top : reservationlabel.bottomAnchor,paddingTop: 40)
view.addSubview(logOut)
logOut.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
logOut.anchor(top : reserveButton.bottomAnchor,paddingTop: 250)
/* view.addSubview(reserveButton)
reserveButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
emailLabel.anchor(top: emailLabel.bottomAnchor,paddingTop: 20)*/
return view
}()
@objc private func didTapChangeProfilePic() {
presentPhotoActionSheet()
}
private var reservationlabel: UILabel = {
let label = UILabel()
label.textAlignment = .left
// label.text = "Vous pouvez reserver en appuyant sur le bouton"
label.font = UIFont.boldSystemFont(ofSize: 16)
// label.font = UIFont(name: "AvenirNext-BoldItalic", size: 16)
label.numberOfLines = 0
label.textColor = .white
return label
}()
private let reserveButton : UIButton = {
let button = UIButton()
button.setTitle("Reserver", for: .normal)
button.backgroundColor = .black
button.tintColor = .white
button.layer.cornerRadius = 12
button.layer.borderWidth = 1
button.titleLabel?.font = UIFont(name: "AvenirNext-BoldItalic", size: 20)
button.layer.masksToBounds = true
return button
}()
let profileImageView: UIImageView = {
let profileImageView = UIImageView()
profileImageView.image = UIImage(systemName: "person.circle")
profileImageView.contentMode = .scaleAspectFill
profileImageView.clipsToBounds = true
profileImageView.layer.borderWidth = 3
profileImageView.layer.borderColor = UIColor.white.cgColor
return profileImageView
}()
let nameLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 30)
label.textColor = .white
return label
}()
let emailLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 16)
label.textColor = .lightGray
return label
}()
private let logOut : UIButton = {
let button = UIButton()
button.setTitle("Deconnection", for: .normal)
button.backgroundColor = .darkGray
button.setTitleColor(.red, for: .normal)
button.layer.cornerRadius = 12
button.layer.borderWidth = 1
button.layer.masksToBounds = true
button.titleLabel?.font = .systemFont(ofSize: 15, weight: .regular)
return button
}()
override func viewDidLoad() {
set()
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .init(systemName: "power.circle.fill"), style: .plain, target: self, action: nil)
navigationItem.rightBarButtonItem?.tintColor = .red
logOut.addTarget(self, action: #selector(signOut), for: .touchUpInside)
reserveButton.addTarget(self, action: #selector(openReserve), for: .touchUpInside)
if let user = Auth.auth().currentUser {
let ref = Database.database().reference()
let uiserID = Auth.auth().currentUser?.uid
ref.child("users").child(uiserID!).observeSingleEvent(of: .value) { (snapshot) in
let value = snapshot.value as? NSDictionary
let username = value?["username"] as? String ?? "no username"
let firstName = value?["firstname"] as? String ?? ""
let lastName = value?["lastname"] as? String ?? ""
self.emailLabel.text = "\(username)"
self.nameLabel.text = "\(firstName) \(lastName)"
self.reservationlabel.text = "\(firstName),vous pouvez effectuer une réservation"
}
} else {
fatalError("⛔️ Erreur : aucun utilisateur est connecté lors de l'affichage de l'écran d'accueil")
}
view.addSubview(containerView)
// view.addSubview(secondView)
containerView.anchor(top: view.topAnchor, left: view.leftAnchor,
right: view.rightAnchor, height: 800)
let gesture = UITapGestureRecognizer(target: self, action: #selector(didTapChangeProfilePic))
profileImageView.addGestureRecognizer(gesture)
}
@objc private func signOut(){
do {
try Auth.auth().signOut()
dismiss(animated: true, completion: nil)
} catch {
print("Impossible de deconnecter l'utilisateur")
}
}
@objc private func openReserve(){
UIApplication.shared.open(URL(string:"https://reservation.dish.co/widget/hydra-b0409b90-8c2a-11e9-86e6-6720499d7bcc" )! as URL,options : [:], completionHandler : nil)
}
func set(){
Utilities.styleBlackRoundedButton(reserveButton)
}
@objc private func didTapRegister() {
let vc = HomeViewController()
vc.title = "Create Account"
navigationController?.pushViewController(vc, animated: true)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
extension UIColor {
static func rgb(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor {
return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: 1)
}
static let mainBlue = UIColor.rgb(red: 0, green: 150, blue: 255)
}
extension UIView {
func anchor(top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, paddingTop: CGFloat? = 0,
paddingLeft: CGFloat? = 0, paddingBottom: CGFloat? = 0, paddingRight: CGFloat? = 0, width: CGFloat? = nil, height: CGFloat? = nil) {
translatesAutoresizingMaskIntoConstraints = false
if let top = top {
topAnchor.constraint(equalTo: top, constant: paddingTop!).isActive = true
}
if let left = left {
leftAnchor.constraint(equalTo: left, constant: paddingLeft!).isActive = true
}
if let bottom = bottom {
if let paddingBottom = paddingBottom {
bottomAnchor.constraint(equalTo: bottom, constant: -paddingBottom).isActive = true
}
}
if let right = right {
if let paddingRight = paddingRight {
rightAnchor.constraint(equalTo: right, constant: -paddingRight).isActive = true
}
}
if let width = width {
widthAnchor.constraint(equalToConstant: width).isActive = true
}
if let height = height {
heightAnchor.constraint(equalToConstant: height).isActive = true
}
}
}
extension ProfilesViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func presentPhotoActionSheet() {
let actionSheet = UIAlertController(title: "Photo de profil",
message: "Voulez vous choisir une photo?",
preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Annuler",
style: .cancel,
handler: nil))
actionSheet.addAction(UIAlertAction(title: "Prendre une photo",
style: .default,
handler: { [weak self] _ in
self?.presentCamera()
}))
actionSheet.addAction(UIAlertAction(title: "Choisir une photo",
style: .default,
handler: { [weak self] _ in
self?.presentPhotoPicker()
}))
present(actionSheet, animated: true)
}
func presentCamera() {
let vc = UIImagePickerController()
vc.sourceType = .camera
vc.delegate = self
vc.allowsEditing = true
present(vc, animated: true)
}
func presentPhotoPicker() {
let vc = UIImagePickerController()
vc.sourceType = .photoLibrary
vc.delegate = self
vc.allowsEditing = true
present(vc, animated: true)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true, completion: nil)
guard let selectedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage else {
return
}
self.profileImageView.image = selectedImage
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
}