ShareState.md

December 30, 2022 ยท View on GitHub

Share state

  1. Open MainFeature.swift
  2. Add new action to open next module
extension MainFeature {
    enum Action: Equatable {
        // ...
        case random
    }
}
  1. Add new middleware
static func middleware(environment: Environment) -> [Middleware<MainFeature.State, MainFeature.Action>] {
    var timerCancellable: [AnyCancellable] = []
    return [
        // ...
        // Add following to the end of array
        createMiddleware(environment: environment, { dispatch, getState, action, environment in
            guard action == .random else { return }
            DispatchQueue.main.async { [weak environment] in
                environment?.moduleOutput.mainModuleDidTapRandomButton()
            }
        })
    }
}
  1. Update reducer
static func reducer() -> Reducer<MainFeature.State, MainFeature.Action> {
    static func reducer() -> Reducer<MainFeature.State, MainFeature.Action> {
        return .init { state, action in
            switch action {
            // ...
            case .stopAutoIncrement:
                var state = state
                state.isAutoIncrementEnabled = false
                return state

            case .random:
                return state
            }
        }
    }
}
  1. Update first middleware
extension MainFeature {
    static func middleware(environment: Environment) -> [Middleware<MainFeature.State, MainFeature.Action>] {
        var timerCancellable: [AnyCancellable] = []
        return [
            createMiddleware({ dispatch, getState, action in
                switch action {
                // ...
                case .startAutoIncrement, .stopAutoIncrement, .random:
                    break
                }
            }),
            // ...
        ]
    }
}
  1. Go to MainViewController.swift and add button to open Randomizer module
final class MainViewController: UIViewController {
    // ...
    override func viewDidLoad() {
        super.viewDidLoad()
        // ...
        self.autoIncrementButton = autoIncrementButton

        let randomButton = UIButton(primaryAction: UIAction(handler: { [weak self] _ in
            self?.store.dispatch(.random)
        }))
        randomButton.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(randomButton)
        randomButton.topAnchor.constraint(equalTo: autoIncrementButton.bottomAnchor, constant: 20).isActive = true
        randomButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        randomButton.setTitle("Open 'Random'", for: .normal)
        randomButton.titleLabel?.font = .systemFont(ofSize: 20)

        let label = UILabel()
        // ...
    }
}
  1. Run app and tap "Start" button
  2. Wait for a second
  3. Tap Open 'Random' Button
  4. Label will increase value every second
  5. Play with counter
  6. That's it!

Go to home page