From fcc9c03959b20d930a63dd5c657f2f1ca7fddafc Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Wed, 30 Nov 2022 11:49:05 +0100 Subject: [PATCH] Present new group from groups --- Examples/xx-messenger/Package.swift | 1 + .../GroupsFeature/GroupsComponent.swift | 27 +++++++++++++++++- .../Sources/GroupsFeature/GroupsView.swift | 28 +++++++++++++++++++ .../GroupsComponentTests.swift | 16 +++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index 84704908..f4fa8cab 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -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"), diff --git a/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift b/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift index 9d12a95d..e5b01a9e 100644 --- a/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift +++ b/Examples/xx-messenger/Sources/GroupsFeature/GroupsComponent.swift @@ -1,23 +1,31 @@ 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() } + ) } } diff --git a/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift b/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift index 79e10214..847381f5 100644 --- a/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift +++ b/Examples/xx-messenger/Sources/GroupsFeature/GroupsView.swift @@ -1,5 +1,7 @@ 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 diff --git a/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift b/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift index c726955f..7a7f9301 100644 --- a/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift +++ b/Examples/xx-messenger/Tests/GroupsFeatureTests/GroupsComponentTests.swift @@ -1,6 +1,7 @@ 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 { -- GitLab