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( ...@@ -266,6 +266,7 @@ let package = Package(
name: "GroupsFeature", name: "GroupsFeature",
dependencies: [ dependencies: [
.target(name: "AppCore"), .target(name: "AppCore"),
.target(name: "NewGroupFeature"),
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
.product(name: "ComposablePresentation", package: "swift-composable-presentation"), .product(name: "ComposablePresentation", package: "swift-composable-presentation"),
.product(name: "XXClient", package: "elixxir-dapps-sdk-swift"), .product(name: "XXClient", package: "elixxir-dapps-sdk-swift"),
......
import AppCore import AppCore
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation
import Foundation import Foundation
import NewGroupFeature
import XXModels import XXModels
public struct GroupsComponent: ReducerProtocol { public struct GroupsComponent: ReducerProtocol {
public struct State: Equatable { public struct State: Equatable {
public init( public init(
groups: IdentifiedArrayOf<Group> = [] groups: IdentifiedArrayOf<Group> = [],
newGroup: NewGroupComponent.State? = nil
) { ) {
self.groups = groups self.groups = groups
self.newGroup = newGroup
} }
public var groups: IdentifiedArrayOf<XXModels.Group> = [] public var groups: IdentifiedArrayOf<XXModels.Group> = []
public var newGroup: NewGroupComponent.State?
} }
public enum Action: Equatable { public enum Action: Equatable {
case start case start
case didFetchGroups([XXModels.Group]) case didFetchGroups([XXModels.Group])
case didSelectGroup(XXModels.Group) case didSelectGroup(XXModels.Group)
case newGroupButtonTapped
case newGroupDismissed
case newGroup(NewGroupComponent.Action)
} }
public init() {} public init() {}
...@@ -45,7 +53,24 @@ public struct GroupsComponent: ReducerProtocol { ...@@ -45,7 +53,24 @@ public struct GroupsComponent: ReducerProtocol {
case .didSelectGroup(_): case .didSelectGroup(_):
return .none 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 AppCore
import ComposableArchitecture import ComposableArchitecture
import ComposablePresentation
import NewGroupFeature
import SwiftUI import SwiftUI
import XXModels import XXModels
...@@ -21,6 +23,10 @@ public struct GroupsView: View { ...@@ -21,6 +23,10 @@ public struct GroupsView: View {
public var body: some View { public var body: some View {
WithViewStore(store, observe: ViewState.init) { viewStore in WithViewStore(store, observe: ViewState.init) { viewStore in
Form { Form {
newGroupButton {
viewStore.send(.newGroupButtonTapped)
}
ForEach(viewStore.groups) { group in ForEach(viewStore.groups) { group in
groupView(group) { groupView(group) {
viewStore.send(.didSelectGroup(group)) viewStore.send(.didSelectGroup(group))
...@@ -28,10 +34,32 @@ public struct GroupsView: View { ...@@ -28,10 +34,32 @@ public struct GroupsView: View {
} }
} }
.navigationTitle("Groups") .navigationTitle("Groups")
.background(NavigationLinkWithStore(
store.scope(
state: \.newGroup,
action: Component.Action.newGroup
),
onDeactivate: { viewStore.send(.newGroupDismissed) },
destination: NewGroupView.init
))
.task { viewStore.send(.start) } .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( func groupView(
_ group: XXModels.Group, _ group: XXModels.Group,
onSelect: @escaping () -> Void onSelect: @escaping () -> Void
......
import Combine import Combine
import ComposableArchitecture import ComposableArchitecture
import CustomDump import CustomDump
import NewGroupFeature
import XCTest import XCTest
import XXModels import XXModels
@testable import GroupsFeature @testable import GroupsFeature
...@@ -73,6 +74,21 @@ final class GroupsComponentTests: XCTestCase { ...@@ -73,6 +74,21 @@ final class GroupsComponentTests: XCTestCase {
store.send(.didSelectGroup(.stub(2))) 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 { private extension XXModels.Group {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment