Files
swift-composable-architectu…/Examples/CaseStudies/UIKitCaseStudies/ListsOfState.swift
Stephen Celis 57e804f1cc Macro bonanza (#2553)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Silence test warnings

* wip

* wip

* wip

* update a bunch of docs

* wip

* wip

* fix

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Kill integration tests for now

* wip

* wip

* wip

* wip

* updating docs for @Reducer macro

* replaced more Reducer protocols with @Reducer

* Fixed some broken docc references

* wip

* Some @Reducer docs

* more docs

* convert some old styles to new style

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* bump

* update tutorials to use body

* update tutorials to use DML on destination state enum

* Add diagnostic

* wip

* updated a few more tests

* wip

* wip

* Add another gotcha

* wip

* wip

* wip

* fixes

* wip

* wip

* wip

* wip

* wip

* fix

* wip

* remove for now

* wip

* wip

* updated some docs

* migration guides

* more migration guide

* fix ci

* fix

* soft deprecate all apis using AnyCasePath

* wip

* Fix

* fix tests

* swift-format 509 compatibility

* wip

* wip

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>

* wip

* wip

* update optional state case study

* remove initializer

* Don't use @State for BasicsView integration demo

* fix tests

* remove reduce diagnostics for now

* diagnose error not warning

* Update Sources/ComposableArchitecture/Macros.swift

Co-authored-by: Jesse Tipton <jesse@jessetipton.com>

* wip

* move integration tests to cron

* Revert "move integration tests to cron"

This reverts commit f9bdf2f04b.

* disable flakey tests on CI

* wip

* wip

* Revert "Revert "move integration tests to cron""

This reverts commit 66aafa7327.

* fix

* wip

* fix

---------

Co-authored-by: Brandon Williams <mbrandonw@hey.com>
Co-authored-by: Mateusz Bąk <bakmatthew@icloud.com>
Co-authored-by: Brandon Williams <135203+mbrandonw@users.noreply.github.com>
Co-authored-by: Jesse Tipton <jesse@jessetipton.com>
2023-11-13 12:57:35 -08:00

101 lines
2.6 KiB
Swift

import Combine
import ComposableArchitecture
import SwiftUI
import UIKit
@Reducer
struct CounterList {
struct State: Equatable {
var counters: IdentifiedArrayOf<Counter.State> = []
}
enum Action {
case counters(IdentifiedActionOf<Counter>)
}
var body: some Reducer<State, Action> {
EmptyReducer()
.forEach(\.counters, action: \.counters) {
Counter()
}
}
}
let cellIdentifier = "Cell"
final class CountersTableViewController: UITableViewController {
let store: StoreOf<CounterList>
let viewStore: ViewStoreOf<CounterList>
var cancellables: Set<AnyCancellable> = []
init(store: StoreOf<CounterList>) {
self.store = store
self.viewStore = ViewStore(store, observe: { $0 })
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Lists"
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
self.viewStore.publisher.counters
.sink(receiveValue: { [weak self] _ in self?.tableView.reloadData() })
.store(in: &self.cancellables)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
self.viewStore.counters.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
-> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
cell.accessoryType = .disclosureIndicator
cell.textLabel?.text = "\(self.viewStore.counters[indexPath.row].count)"
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexPathRow = indexPath.row
let counter = self.viewStore.counters[indexPathRow]
self.navigationController?.pushViewController(
CounterViewController(
store: self.store.scope(
state: \.counters[indexPathRow],
action: { .counters(.element(id: counter.id, action: $0)) }
)
),
animated: true
)
}
}
struct CountersTableViewController_Previews: PreviewProvider {
static var previews: some View {
let vc = UINavigationController(
rootViewController: CountersTableViewController(
store: Store(
initialState: CounterList.State(
counters: [
Counter.State(),
Counter.State(),
Counter.State(),
]
)
) {
CounterList()
}
)
)
return UIViewRepresented(makeUIView: { _ in vc.view })
}
}