ModuleOutput.md

December 30, 2022 ยท View on GitHub

Add ModuleOutput

  1. Udpate MainModuleBuilder.swift
import Foundation
import Highway

protocol MainModuleOutput: AnyObject {
    func mainModuleDidTapRandomButton()
}

final class MainModuleBuilder {
    func build(store: Store<MainFeature.State, MainFeature.Action>) -> UIViewController {
        return MainViewController(store: store)
    }
}
  1. Go to MainFlowCoordinator.swift
  2. Add import
// ...

import Highway
  1. Add store property
final class MainFlowCoordinator {
    // ...

    private var store: Store<MainFeature.State, MainFeature.Action>!
  1. Update start function
func start() {
    let store = Store<MainFeature.State, MainFeature.Action>(
        reducer: MainFeature.reducer(),
        state: MainFeature.State(),
        initialAction: nil,
        middleware: MainFeature.middleware(
            environment: .init(moduleOutput: self)
        )
    )
    self.store = store

    let mainViewController = MainModuleBuilder().build(store: store)
    window.rootViewController = mainViewController
    self.rootViewController = mainViewController
}
  1. Go to MainFeature.swift
  2. Add following to the end of the file
extension MainFeature {
    final class Environment {
        weak var moduleOutput: MainModuleOutput!

        init(moduleOutput: MainModuleOutput) {
            self.moduleOutput = moduleOutput
        }
    }
}
  1. Add an environment argument to the middleware func
extension MainFeature {
    static func middleware(environment: Environment) -> [Middleware<MainFeature.State, MainFeature.Action>] {
        // ...
    }
}
  1. Go to the MainFlowCoordinator.swift and add following to the end of file
extension MainFlowCoordinator: MainModuleOutput {
    func mainModuleDidTapRandomButton() {
        // TODO: show random module
    }
}

Next: Present second module