From d29d68bdd4744281535c8f91435468155dbc4072 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Fri, 2 Dec 2022 10:58:26 +0100 Subject: [PATCH] Add GroupFeature library --- .../xcschemes/GroupFeature.xcscheme | 78 +++++++++++++++++++ Examples/xx-messenger/Package.swift | 21 +++++ .../xcschemes/XXMessenger.xcscheme | 10 +++ .../Sources/GroupFeature/GroupComponent.swift | 29 +++++++ .../Sources/GroupFeature/GroupView.swift | 57 ++++++++++++++ .../GroupComponentTests.swift | 30 +++++++ 6 files changed, 225 insertions(+) create mode 100644 Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/GroupFeature.xcscheme create mode 100644 Examples/xx-messenger/Sources/GroupFeature/GroupComponent.swift create mode 100644 Examples/xx-messenger/Sources/GroupFeature/GroupView.swift create mode 100644 Examples/xx-messenger/Tests/GroupFeatureTests/GroupComponentTests.swift diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/GroupFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/GroupFeature.xcscheme new file mode 100644 index 00000000..a2c612b7 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/GroupFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1410" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "GroupFeature" + BuildableName = "GroupFeature" + BlueprintName = "GroupFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "GroupFeatureTests" + BuildableName = "GroupFeatureTests" + BlueprintName = "GroupFeatureTests" + ReferencedContainer = "container:"> + </BuildableReference> + </TestableReference> + </Testables> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "GroupFeature" + BuildableName = "GroupFeature" + BlueprintName = "GroupFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index f4fa8cab..0a4226fd 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -22,6 +22,7 @@ let package = Package( .library(name: "ContactFeature", targets: ["ContactFeature"]), .library(name: "ContactLookupFeature", targets: ["ContactLookupFeature"]), .library(name: "ContactsFeature", targets: ["ContactsFeature"]), + .library(name: "GroupFeature", targets: ["GroupFeature"]), .library(name: "GroupsFeature", targets: ["GroupsFeature"]), .library(name: "HomeFeature", targets: ["HomeFeature"]), .library(name: "MyContactFeature", targets: ["MyContactFeature"]), @@ -262,6 +263,26 @@ let package = Package( ], swiftSettings: swiftSettings ), + .target( + name: "GroupFeature", + dependencies: [ + .target(name: "AppCore"), + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "ComposablePresentation", package: "swift-composable-presentation"), + .product(name: "XXClient", package: "elixxir-dapps-sdk-swift"), + .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + .product(name: "XXModels", package: "client-ios-db"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "GroupFeatureTests", + dependencies: [ + .target(name: "GroupFeature"), + .product(name: "CustomDump", package: "swift-custom-dump"), + ], + swiftSettings: swiftSettings + ), .target( name: "GroupsFeature", dependencies: [ diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme index 45d9c2cb..5cd339fe 100644 --- a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme +++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme @@ -119,6 +119,16 @@ ReferencedContainer = "container:.."> </BuildableReference> </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "GroupFeatureTests" + BuildableName = "GroupFeatureTests" + BlueprintName = "GroupFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> <TestableReference skipped = "NO"> <BuildableReference diff --git a/Examples/xx-messenger/Sources/GroupFeature/GroupComponent.swift b/Examples/xx-messenger/Sources/GroupFeature/GroupComponent.swift new file mode 100644 index 00000000..5c2b7773 --- /dev/null +++ b/Examples/xx-messenger/Sources/GroupFeature/GroupComponent.swift @@ -0,0 +1,29 @@ +import ComposableArchitecture +import XXModels + +public struct GroupComponent: ReducerProtocol { + public struct State: Equatable { + public init( + group: XXModels.Group + ) { + self.group = group + } + + public var group: XXModels.Group + } + + public enum Action: Equatable { + case start + } + + public init() {} + + public var body: some ReducerProtocol<State, Action> { + Reduce { state, action in + switch action { + case .start: + return .none + } + } + } +} diff --git a/Examples/xx-messenger/Sources/GroupFeature/GroupView.swift b/Examples/xx-messenger/Sources/GroupFeature/GroupView.swift new file mode 100644 index 00000000..95d24a1f --- /dev/null +++ b/Examples/xx-messenger/Sources/GroupFeature/GroupView.swift @@ -0,0 +1,57 @@ +import AppCore +import ComposableArchitecture +import SwiftUI +import XXModels + +public struct GroupView: View { + public typealias Component = GroupComponent + typealias ViewStore = ComposableArchitecture.ViewStore<ViewState, Component.Action> + + public init(store: StoreOf<Component>) { + self.store = store + } + + let store: StoreOf<Component> + + struct ViewState: Equatable { + init(state: Component.State) { + group = state.group + } + + var group: XXModels.Group + } + + public var body: some View { + WithViewStore(store, observe: ViewState.init) { viewStore in + Form { + Section("Group name") { + Text(viewStore.group.name) + } + } + .navigationTitle("Group") + .task { viewStore.send(.start) } + } + } +} + +#if DEBUG +public struct GroupView_Previews: PreviewProvider { + public static var previews: some View { + NavigationView { + GroupView(store: Store( + initialState: GroupComponent.State( + group: .init( + id: "group-id".data(using: .utf8)!, + name: "Preview group", + leaderId: "group-leader-id".data(using: .utf8)!, + createdAt: Date(timeIntervalSince1970: TimeInterval(86_400)), + authStatus: .participating, + serialized: "group-serialized".data(using: .utf8)! + ) + ), + reducer: EmptyReducer() + )) + } + } +} +#endif diff --git a/Examples/xx-messenger/Tests/GroupFeatureTests/GroupComponentTests.swift b/Examples/xx-messenger/Tests/GroupFeatureTests/GroupComponentTests.swift new file mode 100644 index 00000000..9fe423d5 --- /dev/null +++ b/Examples/xx-messenger/Tests/GroupFeatureTests/GroupComponentTests.swift @@ -0,0 +1,30 @@ +import ComposableArchitecture +import XCTest +import XXModels +@testable import GroupFeature + +final class GroupComponentTests: XCTestCase { + func testStart() { + let store = TestStore( + initialState: GroupComponent.State( + group: .stub() + ), + reducer: GroupComponent() + ) + + store.send(.start) + } +} + +private extension XXModels.Group { + static func stub() -> XXModels.Group { + XXModels.Group( + id: "group-id".data(using: .utf8)!, + name: "Group name", + leaderId: "group-leader-id".data(using: .utf8)!, + createdAt: Date(timeIntervalSince1970: TimeInterval(86_400)), + authStatus: .participating, + serialized: "group-serialized".data(using: .utf8)! + ) + } +} -- GitLab