Skip to content
Snippets Groups Projects
Commit fcc9c039 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Present new group from groups

parent eab25dde
No related branches found
No related tags found
2 merge requests!153Release 1.1.0,!149[Messenger example] create new group
......@@ -266,6 +266,7 @@ let package = Package(
name: "GroupsFeature",
dependencies: [
.target(name: "AppCore"),
.target(name: "NewGroupFeature"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ComposablePresentation", package: "swift-composable-presentation"),
.product(name: "XXClient", package: "elixxir-dapps-sdk-swift"),
......
import AppCore
import ComposableArchitecture
import ComposablePresentation
import Foundation
import NewGroupFeature
import XXModels
public struct GroupsComponent: ReducerProtocol {
public struct State: Equatable {
public init(
groups: IdentifiedArrayOf<Group> = []
groups: IdentifiedArrayOf<Group> = [],
newGroup: NewGroupComponent.State? = nil
) {
self.groups = groups
self.newGroup = newGroup
}
public var groups: IdentifiedArrayOf<XXModels.Group> = []
public var newGroup: NewGroupComponent.State?
}
public enum Action: Equatable {
case start
case didFetchGroups([XXModels.Group])
case didSelectGroup(XXModels.Group)
case newGroupButtonTapped
case newGroupDismissed
case newGroup(NewGroupComponent.Action)
}
public init() {}
......@@ -45,7 +53,24 @@ public struct GroupsComponent: ReducerProtocol {
case .didSelectGroup(_):
return .none
case .newGroupButtonTapped:
state.newGroup = NewGroupComponent.State()
return .none
case .newGroupDismissed:
state.newGroup = nil
return .none
case .newGroup(_):
return .none
}
}
.presenting(
state: .keyPath(\.newGroup),
id: .notNil(),
action: /Action.newGroup,
presented: { NewGroupComponent() }
)
}
}
import AppCore
import ComposableArchitecture
import ComposablePresentation
import NewGroupFeature
import SwiftUI
import XXModels
......@@ -21,6 +23,10 @@ public struct GroupsView: View {
public var body: some View {
WithViewStore(store, observe: ViewState.init) { viewStore in
Form {
newGroupButton {
viewStore.send(.newGroupButtonTapped)
}
ForEach(viewStore.groups) { group in
groupView(group) {
viewStore.send(.didSelectGroup(group))
......@@ -28,10 +34,32 @@ public struct GroupsView: View {
}
}
.navigationTitle("Groups")
.background(NavigationLinkWithStore(
store.scope(
state: \.newGroup,
action: Component.Action.newGroup
),
onDeactivate: { viewStore.send(.newGroupDismissed) },
destination: NewGroupView.init
))
.task { viewStore.send(.start) }
}
}
func newGroupButton(action: @escaping () -> Void) -> some View {
Section {
Button {
action()
} label: {
HStack {
Text("New Group")
Spacer()
Image(systemName: "chevron.forward")
}
}
}
}
func groupView(
_ group: XXModels.Group,
onSelect: @escaping () -> Void
......
import Combine
import ComposableArchitecture
import CustomDump
import NewGroupFeature
import XCTest
import XXModels
@testable import GroupsFeature
......@@ -73,6 +74,21 @@ final class GroupsComponentTests: XCTestCase {
store.send(.didSelectGroup(.stub(2)))
}
func testNewGroup() {
let store = TestStore(
initialState: GroupsComponent.State(),
reducer: GroupsComponent()
)
store.send(.newGroupButtonTapped) {
$0.newGroup = NewGroupComponent.State()
}
store.send(.newGroupDismissed) {
$0.newGroup = nil
}
}
}
private extension XXModels.Group {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment