Created
December 12, 2019 11:28
-
-
Save styrken/b40b93e1d3dcb248a7689b3370b0cb25 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// AppCordinator.swift | |
// | |
// Created by Rasmus Styrk on 12/12/2019. | |
// Copyright © 2019 House of Code ApS. All rights reserved. | |
// | |
import UIKit | |
import RxSwift | |
/// App Coordinator | |
/// | |
/// Coordinates the main app state, ie if you are logged in or not | |
class AppCordinator { | |
/// RX Dispose bag | |
var disposeBag = DisposeBag() | |
/// Current App State | |
enum AppState { | |
case splash | |
case login | |
case app | |
} | |
/// The window where we cordinate the view in | |
private var window: UIWindow | |
/// The data repository to use | |
var repository: DataRepository | |
// SessionManager that managaes the user session | |
var sessionManager: SessionManager | |
/// | |
init(window: UIWindow, repository: DataRepository, sessionManager: SessionManager) { | |
self.window = window | |
self.repository = repository | |
self.sessionManager = sessionManager | |
// React if session state changes | |
self.sessionManager | |
.status | |
.subscribe(onNext: { [weak self] (status) in | |
switch(status) { | |
case .loggedIn: | |
self?.setRootController(state: .app) | |
break | |
case .loggedOut: | |
self?.setRootController(state: .login) | |
break | |
} | |
}).disposed(by: self.disposeBag) | |
} | |
/// Starts the cordinator and sets the app state | |
func start() { | |
setRootController(state: .splash) | |
self.repository.logEvent(event: "APP_OPEN") | |
} | |
/// Sets a new root view controller on the window | |
private func setRootController(state: AppState) { | |
self.window.rootViewController?.view.removeFromSuperview() | |
self.window.rootViewController = nil | |
switch state { | |
case .splash: | |
self.window.rootViewController = UIStoryboard(name: "SplashStoryboard", bundle: nil).instantiateInitialViewController() | |
break | |
case .login: | |
let loginRouter = LoginSelectionRouter(sessionManager: self.sessionManager, | |
analyticsRepository: self.repository) | |
loginRouter.start(in: self.window) | |
break | |
case .app: | |
let tabbedRouter = TabbedNavigationRouter(repository: self.repository, | |
sessionManager: self.sessionManager) | |
tabbedRouter.start(in: self.window) | |
break | |
} | |
self.window.makeKeyAndVisible() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment