Skip to content

Instantly share code, notes, and snippets.

@styrken
Created December 12, 2019 11:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save styrken/b40b93e1d3dcb248a7689b3370b0cb25 to your computer and use it in GitHub Desktop.
Save styrken/b40b93e1d3dcb248a7689b3370b0cb25 to your computer and use it in GitHub Desktop.
//
// 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