Merge branch 'bad-host-wizard-flow'
This commit is contained in:
commit
e3d2d54226
|
@ -89,53 +89,50 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
|
|||
guard let root = window?.rootViewController else {
|
||||
fatalError("No window.rootViewController?")
|
||||
}
|
||||
|
||||
let topmost = root.presentedViewController ?? root
|
||||
|
||||
let fm = FileManager.default
|
||||
guard let parsedFile = ParsedFile.from(url, withErrorAlertIn: root) else {
|
||||
guard let parsedFile = ParsedFile.from(url, withErrorAlertIn: topmost) else {
|
||||
try? fm.removeItem(at: url)
|
||||
return true
|
||||
}
|
||||
if let warning = parsedFile.warning {
|
||||
ParsedFile.alertImportWarning(url: url, in: root, withWarning: warning) {
|
||||
ParsedFile.alertImportWarning(url: url, in: topmost, withWarning: warning) {
|
||||
if $0 {
|
||||
self.handleParsedFile(parsedFile, in: root)
|
||||
self.handleParsedFile(parsedFile, in: topmost)
|
||||
} else {
|
||||
try? fm.removeItem(at: url)
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
handleParsedFile(parsedFile, in: root)
|
||||
handleParsedFile(parsedFile, in: topmost)
|
||||
return true
|
||||
}
|
||||
|
||||
private func handleParsedFile(_ parsedFile: ParsedFile, in root: UIViewController) {
|
||||
private func handleParsedFile(_ parsedFile: ParsedFile, in target: UIViewController) {
|
||||
|
||||
// already presented: update parsed configuration
|
||||
if let nav = root.presentedViewController as? UINavigationController, let wizard = nav.topViewController as? WizardHostViewController {
|
||||
if let nav = target as? UINavigationController, let wizard = nav.topViewController as? WizardHostViewController {
|
||||
if let oldURL = wizard.parsedFile?.url {
|
||||
try? FileManager.default.removeItem(at: oldURL)
|
||||
}
|
||||
wizard.parsedFile = parsedFile
|
||||
wizard.removesConfigurationOnCancel = true
|
||||
return
|
||||
}
|
||||
|
||||
// present now
|
||||
let nav = StoryboardScene.Organizer.wizardHostIdentifier.instantiate()
|
||||
guard let wizard = nav.topViewController as? WizardHostViewController else {
|
||||
let wizardNav = StoryboardScene.Organizer.wizardHostIdentifier.instantiate()
|
||||
guard let wizard = wizardNav.topViewController as? WizardHostViewController else {
|
||||
fatalError("Expected WizardHostViewController from storyboard")
|
||||
}
|
||||
wizard.parsedFile = parsedFile
|
||||
wizard.removesConfigurationOnCancel = true
|
||||
|
||||
// best effort to delegate to main vc
|
||||
let split = root as? UISplitViewController
|
||||
let master = split?.viewControllers.first as? UINavigationController
|
||||
master?.viewControllers.forEach {
|
||||
if let organizerVC = $0 as? OrganizerViewController {
|
||||
wizard.delegate = organizerVC
|
||||
}
|
||||
}
|
||||
nav.modalPresentationStyle = .formSheet
|
||||
root.present(nav, animated: true, completion: nil)
|
||||
wizardNav.modalPresentationStyle = .formSheet
|
||||
target.present(wizardNav, animated: true, completion: nil)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,8 +34,6 @@ class ImportedHostsViewController: UITableViewController {
|
|||
|
||||
private var parsedFile: ParsedFile?
|
||||
|
||||
weak var wizardDelegate: WizardDelegate?
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
@ -104,7 +102,6 @@ class ImportedHostsViewController: UITableViewController {
|
|||
return
|
||||
}
|
||||
wizard.parsedFile = parsedFile
|
||||
wizard.delegate = wizardDelegate
|
||||
|
||||
// retain back button
|
||||
wizard.navigationItem.leftBarButtonItem = nil
|
||||
|
|
|
@ -69,6 +69,10 @@ class OrganizerViewController: UITableViewController, TableModelHost {
|
|||
}
|
||||
|
||||
// MARK: UIViewController
|
||||
|
||||
deinit {
|
||||
NotificationCenter.default.removeObserver(self)
|
||||
}
|
||||
|
||||
override func awakeFromNib() {
|
||||
super.awakeFromNib()
|
||||
|
@ -90,6 +94,8 @@ class OrganizerViewController: UITableViewController, TableModelHost {
|
|||
}
|
||||
|
||||
service.delegate = self
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(wizardDidCreate(notification:)), name: .WizardDidCreate, object: nil)
|
||||
}
|
||||
|
||||
override func viewDidAppear(_ animated: Bool) {
|
||||
|
@ -134,13 +140,8 @@ class OrganizerViewController: UITableViewController, TableModelHost {
|
|||
assert(selectedProfile != nil, "No selected profile")
|
||||
|
||||
vc.profile = selectedProfile
|
||||
} else if let vc = destination as? Wizard {
|
||||
if let providerVC = vc as? WizardProviderViewController {
|
||||
providerVC.availableNames = availableProviderNames ?? []
|
||||
}
|
||||
vc.delegate = self
|
||||
} else if let vc = destination as? ImportedHostsViewController {
|
||||
vc.wizardDelegate = self
|
||||
} else if let providerVC = destination as? WizardProviderViewController {
|
||||
providerVC.availableNames = availableProviderNames ?? []
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -436,14 +437,34 @@ extension OrganizerViewController: ConnectionServiceDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
extension OrganizerViewController: WizardDelegate {
|
||||
func wizard(didCreate profile: ConnectionProfile, withCredentials credentials: Credentials) {
|
||||
extension OrganizerViewController {
|
||||
@objc private func wizardDidCreate(notification: Notification) {
|
||||
guard let profile = notification.userInfo?[WizardCreationKey.profile] as? ConnectionProfile,
|
||||
let credentials = notification.userInfo?[WizardCreationKey.credentials] as? Credentials else {
|
||||
|
||||
fatalError("WizardDidCreate notification must post profile and credentials")
|
||||
}
|
||||
|
||||
service.addOrReplaceProfile(profile, credentials: credentials)
|
||||
TransientStore.shared.serialize() // add
|
||||
|
||||
reloadModel()
|
||||
tableView.reloadData()
|
||||
|
||||
// XXX: hack around bad replace when detail presented in compact view
|
||||
if let detailNav = navigationController?.viewControllers.last as? UINavigationController {
|
||||
var existingServiceVC: ServiceViewController?
|
||||
for vc in detailNav.viewControllers {
|
||||
if let found = vc as? ServiceViewController {
|
||||
existingServiceVC = found
|
||||
break
|
||||
}
|
||||
}
|
||||
let serviceVC = existingServiceVC ?? (StoryboardScene.Main.serviceIdentifier.instantiate().topViewController as! ServiceViewController)
|
||||
serviceVC.profile = profile
|
||||
detailNav.setViewControllers([serviceVC], animated: true)
|
||||
return
|
||||
}
|
||||
perform(segue: StoryboardSegue.Organizer.selectProfileSegueIdentifier, sender: profile)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ import SwiftyBeaver
|
|||
|
||||
private let log = SwiftyBeaver.self
|
||||
|
||||
class WizardHostViewController: UITableViewController, TableModelHost, Wizard {
|
||||
class WizardHostViewController: UITableViewController, TableModelHost {
|
||||
@IBOutlet private weak var itemNext: UIBarButtonItem!
|
||||
|
||||
private let existingHosts: [String] = {
|
||||
|
@ -46,8 +46,6 @@ class WizardHostViewController: UITableViewController, TableModelHost, Wizard {
|
|||
|
||||
private var createdProfile: HostConnectionProfile?
|
||||
|
||||
weak var delegate: WizardDelegate?
|
||||
|
||||
// MARK: TableModelHost
|
||||
|
||||
lazy var model: TableModel<SectionType, RowType> = {
|
||||
|
@ -89,12 +87,7 @@ class WizardHostViewController: UITableViewController, TableModelHost, Wizard {
|
|||
// MARK: Actions
|
||||
|
||||
private func useSuggestedTitle() {
|
||||
guard let field = cellTitle?.field else {
|
||||
return
|
||||
}
|
||||
if field.text?.isEmpty ?? true {
|
||||
field.text = parsedFile?.url.normalizedFilename
|
||||
}
|
||||
cellTitle?.field.text = parsedFile?.url.normalizedFilename
|
||||
}
|
||||
|
||||
@IBAction private func next() {
|
||||
|
@ -150,7 +143,10 @@ class WizardHostViewController: UITableViewController, TableModelHost, Wizard {
|
|||
}
|
||||
|
||||
dismiss(animated: true) {
|
||||
self.delegate?.wizard(didCreate: profile, withCredentials: credentials)
|
||||
NotificationCenter.default.post(name: .WizardDidCreate, object: nil, userInfo: [
|
||||
WizardCreationKey.profile: profile,
|
||||
WizardCreationKey.credentials: credentials
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,13 +25,11 @@
|
|||
|
||||
import UIKit
|
||||
|
||||
class WizardProviderViewController: UITableViewController, Wizard {
|
||||
class WizardProviderViewController: UITableViewController {
|
||||
var availableNames: [Infrastructure.Name] = []
|
||||
|
||||
private var createdProfile: ProviderConnectionProfile?
|
||||
|
||||
weak var delegate: WizardDelegate?
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
|
@ -55,7 +53,10 @@ class WizardProviderViewController: UITableViewController, Wizard {
|
|||
fatalError("No profile created?")
|
||||
}
|
||||
dismiss(animated: true) {
|
||||
self.delegate?.wizard(didCreate: profile, withCredentials: credentials)
|
||||
NotificationCenter.default.post(name: .WizardDidCreate, object: nil, userInfo: [
|
||||
WizardCreationKey.profile: profile,
|
||||
WizardCreationKey.credentials: credentials
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,10 +25,12 @@
|
|||
|
||||
import Foundation
|
||||
|
||||
protocol Wizard: class {
|
||||
var delegate: WizardDelegate? { get set }
|
||||
extension Notification.Name {
|
||||
static let WizardDidCreate = Notification.Name("WizardDidCreate")
|
||||
}
|
||||
|
||||
protocol WizardDelegate: class {
|
||||
func wizard(didCreate profile: ConnectionProfile, withCredentials credentials: Credentials)
|
||||
enum WizardCreationKey: String {
|
||||
case profile
|
||||
|
||||
case credentials
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue