This is base project custom from TCA, Hooks, Atoms. See more in:
basic TCA:
import ComposableArchitecture
import SwiftUI
// MARK: - Feature domain
@Reducer
struct Counter {
struct State: Equatable {
var count = 0
}
enum Action {
case decrementButtonTapped
case incrementButtonTapped
}
var body: some Reducer<State, Action> {
Reduce { state, action in
switch action {
case .decrementButtonTapped:
state.count -= 1
return .none
case .incrementButtonTapped:
state.count += 1
return .none
}
}
}
}
// MARK: - Feature view
struct CounterView: View {
let store: StoreOf<Counter>
var body: some View {
WithViewStore(self.store, observe: { $0 }) { viewStore in
HStack {
Button {
viewStore.send(.decrementButtonTapped)
} label: {
Image(systemName: "minus")
}
Text("\(viewStore.count)")
.monospacedDigit()
Button {
viewStore.send(.incrementButtonTapped)
} label: {
Image(systemName: "plus")
}
}
}
}
}
struct CounterDemoView: View {
@State var store = Store(initialState: Counter.State()) {
Counter()
}
var body: some View {
Form {
Section {
CounterView(store: self.store)
.frame(maxWidth: .infinity)
}
}
.buttonStyle(.borderless)
.navigationTitle("Counter demo")
}
}
// MARK: - SwiftUI previews
#Preview {
NavigationView {
CounterDemoView(
store: Store(initialState: Counter.State()) {
Counter()
}
)
}
}
swift package --allow-writing-to-directory ./docs \
generate-documentation --target Documentation --output-path ./docs
swift package --disable-sandbox preview-documentation --target Documentation
sudo swift package --allow-writing-to-directory ./docs \
generate-documentation --target Documentation \
--disable-indexing \
--transform-for-static-hosting \
--hosting-base-path Documentation \
--output-path ./docs