// // PreferencesHostingController.swift // Tusker // // Created by Shadowfacts on 11/17/19. // Copyright © 2019 Shadowfacts. All rights reserved. // import UIKit import SwiftUI class PreferencesNavigationController: UINavigationController { private var isSwitchingAccounts = false init(mastodonController: MastodonController) { let view = PreferencesView() let hostingController = UIHostingController(rootView: view) super.init(rootViewController: hostingController) hostingController.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(donePressed)) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(showAddAccount), name: .addAccount, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(activateAccount(_:)), name: .activateAccount, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(userLoggedOut), name: .userLoggedOut, object: nil) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if !isSwitchingAccounts { // workaround for onDisappear not being called when a modally presented UIHostingController is dismissed NotificationCenter.default.post(name: .preferencesChanged, object: nil) } } @objc func donePressed() { dismiss(animated: true) } @objc func showAddAccount() { let onboardingController = OnboardingViewController() onboardingController.onboardingDelegate = self onboardingController.instanceSelector.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelAddAccount)) show(onboardingController, sender: self) } @objc func cancelAddAccount() { dismiss(animated: true) // dismisses instance selector } @objc func activateAccount(_ notification: Notification) { let account = notification.userInfo!["account"] as! LocalData.UserAccountInfo let sceneDelegate = self.view.window!.windowScene!.delegate as! SceneDelegate isSwitchingAccounts = true dismiss(animated: true) { // dismiss preferences sceneDelegate.activateAccount(account) } } @objc func userLoggedOut() { let sceneDelegate = self.view.window!.windowScene!.delegate as! SceneDelegate isSwitchingAccounts = true dismiss(animated: true) { // dismiss preferences sceneDelegate.logoutCurrent() } } } extension PreferencesNavigationController: OnboardingViewControllerDelegate { func didFinishOnboarding(account: LocalData.UserAccountInfo) { DispatchQueue.main.async { let sceneDelegate = self.view.window!.windowScene!.delegate as! SceneDelegate self.dismiss(animated: true) { // dismiss instance selector self.dismiss(animated: true) { // dismiss preferences sceneDelegate.activateAccount(account) } } } } }