diff --git a/Examples/Package.swift b/Examples/Package.swift new file mode 100644 index 0000000000000000000000000000000000000000..d0a31fe81dd861a3d33bf4eaeb4f59fb7c9f4947 --- /dev/null +++ b/Examples/Package.swift @@ -0,0 +1,4 @@ +// swift-tools-version:5.6 +// This file makes Xcode doesn't display this directory inside swift package. +import PackageDescription +let package = Package(name: "", products: [], targets: []) diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppCore.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppCore.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..2bd4e0801d9c8785542e12f5dedb6e8e66fa27aa --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppCore.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "AppCore" + BuildableName = "AppCore" + BlueprintName = "AppCore" + 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 = "AppCoreTests" + BuildableName = "AppCoreTests" + BlueprintName = "AppCoreTests" + 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 = "AppCore" + BuildableName = "AppCore" + BlueprintName = "AppCore" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppFeature.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..076cfa82379a4f3c57008017aa6f356892754cc9 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/AppFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "AppFeature" + BuildableName = "AppFeature" + BlueprintName = "AppFeature" + 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 = "AppFeatureTests" + BuildableName = "AppFeatureTests" + BlueprintName = "AppFeatureTests" + 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 = "AppFeature" + BuildableName = "AppFeature" + BlueprintName = "AppFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/HomeFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/HomeFeature.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..44bed4e71971f74ec4d316580602b1e965d0a3a4 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/HomeFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "HomeFeature" + BuildableName = "HomeFeature" + BlueprintName = "HomeFeature" + 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 = "HomeFeatureTests" + BuildableName = "HomeFeatureTests" + BlueprintName = "HomeFeatureTests" + 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 = "HomeFeature" + BuildableName = "HomeFeature" + BlueprintName = "HomeFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/LaunchFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/LaunchFeature.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..0b5b716cb194f784d36c6cfe45d705107c4e6549 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/LaunchFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "LaunchFeature" + BuildableName = "LaunchFeature" + BlueprintName = "LaunchFeature" + 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 = "LaunchFeatureTests" + BuildableName = "LaunchFeatureTests" + BlueprintName = "LaunchFeatureTests" + 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 = "LaunchFeature" + BuildableName = "LaunchFeature" + BlueprintName = "LaunchFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RegisterFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RegisterFeature.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..69611b8706471b3f246fe1747b7bb63953c22ab4 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RegisterFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "RegisterFeature" + BuildableName = "RegisterFeature" + BlueprintName = "RegisterFeature" + 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 = "RegisterFeatureTests" + BuildableName = "RegisterFeatureTests" + BlueprintName = "RegisterFeatureTests" + 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 = "RegisterFeature" + BuildableName = "RegisterFeature" + BlueprintName = "RegisterFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RestoreFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RestoreFeature.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..47afca01630455cc3749e2016b21a0b879e0b5e3 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/RestoreFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "RestoreFeature" + BuildableName = "RestoreFeature" + BlueprintName = "RestoreFeature" + 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 = "RestoreFeatureTests" + BuildableName = "RestoreFeatureTests" + BlueprintName = "RestoreFeatureTests" + 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 = "RestoreFeature" + BuildableName = "RestoreFeature" + BlueprintName = "RestoreFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/WelcomeFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/WelcomeFeature.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..60bd803bf3175a785b693461f4154e8b89467a2a --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/WelcomeFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "WelcomeFeature" + BuildableName = "WelcomeFeature" + BlueprintName = "WelcomeFeature" + 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 = "WelcomeFeatureTests" + BuildableName = "WelcomeFeatureTests" + BlueprintName = "WelcomeFeatureTests" + 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 = "WelcomeFeature" + BuildableName = "WelcomeFeature" + BlueprintName = "WelcomeFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/LICENSE b/Examples/xx-messenger/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..8551215fa5b651bb93a247cde5ab89d4b8f5f7e6 --- /dev/null +++ b/Examples/xx-messenger/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2022, xx network SEZC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift new file mode 100644 index 0000000000000000000000000000000000000000..5eb7bede849b86baf218f969361cf911bd4a5907 --- /dev/null +++ b/Examples/xx-messenger/Package.swift @@ -0,0 +1,171 @@ +// swift-tools-version: 5.6 +import PackageDescription + +let swiftSettings: [SwiftSetting] = [ + .unsafeFlags( + [ + // "-Xfrontend", "-warn-concurrency", + "-Xfrontend", "-debug-time-function-bodies", + "-Xfrontend", "-debug-time-expression-type-checking", + ], + .when(configuration: .debug) + ), +] + +let package = Package( + name: "xx-messenger", + platforms: [ + .iOS(.v15), + ], + products: [ + .library(name: "AppCore", targets: ["AppCore"]), + .library(name: "AppFeature", targets: ["AppFeature"]), + .library(name: "HomeFeature", targets: ["HomeFeature"]), + .library(name: "LaunchFeature", targets: ["LaunchFeature"]), + .library(name: "RegisterFeature", targets: ["RegisterFeature"]), + .library(name: "RestoreFeature", targets: ["RestoreFeature"]), + .library(name: "WelcomeFeature", targets: ["WelcomeFeature"]), + ], + dependencies: [ + .package( + path: "../../" + ), + .package( + url: "https://github.com/pointfreeco/swift-composable-architecture.git", + .upToNextMajor(from: "0.39.0") + ), + .package( + url: "https://git.xx.network/elixxir/client-ios-db.git", + .upToNextMajor(from: "1.1.0") + ), + .package( + url: "https://github.com/darrarski/swift-composable-presentation.git", + .upToNextMajor(from: "0.5.2") + ), + .package( + url: "https://github.com/pointfreeco/xctest-dynamic-overlay.git", + .upToNextMajor(from: "0.4.0") + ), + ], + targets: [ + .target( + name: "AppCore", + dependencies: [ + .product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay"), + .product(name: "XXDatabase", package: "client-ios-db"), + .product(name: "XXModels", package: "client-ios-db"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "AppCoreTests", + dependencies: [ + .target(name: "AppCore") + ], + swiftSettings: swiftSettings + ), + .target( + name: "AppFeature", + dependencies: [ + .target(name: "AppCore"), + .target(name: "HomeFeature"), + .target(name: "LaunchFeature"), + .target(name: "RegisterFeature"), + .target(name: "RestoreFeature"), + .target(name: "WelcomeFeature"), + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "ComposablePresentation", package: "swift-composable-presentation"), + .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + .product(name: "XXModels", package: "client-ios-db"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "AppFeatureTests", + dependencies: [ + .target(name: "AppFeature"), + ], + swiftSettings: swiftSettings + ), + .target( + name: "HomeFeature", + dependencies: [ + .target(name: "AppCore"), + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "HomeFeatureTests", + dependencies: [ + .target(name: "HomeFeature"), + ], + swiftSettings: swiftSettings + ), + .target( + name: "LaunchFeature", + dependencies: [ + .target(name: "AppCore"), + .target(name: "RegisterFeature"), + .target(name: "RestoreFeature"), + .target(name: "WelcomeFeature"), + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "ComposablePresentation", package: "swift-composable-presentation"), + .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "LaunchFeatureTests", + dependencies: [ + .target(name: "LaunchFeature"), + ], + swiftSettings: swiftSettings + ), + .target( + name: "RegisterFeature", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "RegisterFeatureTests", + dependencies: [ + .target(name: "RegisterFeature"), + ], + swiftSettings: swiftSettings + ), + .target( + name: "RestoreFeature", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "RestoreFeatureTests", + dependencies: [ + .target(name: "RestoreFeature"), + ], + swiftSettings: swiftSettings + ), + .target( + name: "WelcomeFeature", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "WelcomeFeatureTests", + dependencies: [ + .target(name: "WelcomeFeature"), + ], + swiftSettings: swiftSettings + ), + ] +) diff --git a/Examples/xx-messenger/Project/Package.swift b/Examples/xx-messenger/Project/Package.swift new file mode 100644 index 0000000000000000000000000000000000000000..d0a31fe81dd861a3d33bf4eaeb4f59fb7c9f4947 --- /dev/null +++ b/Examples/xx-messenger/Project/Package.swift @@ -0,0 +1,4 @@ +// swift-tools-version:5.6 +// This file makes Xcode doesn't display this directory inside swift package. +import PackageDescription +let package = Package(name: "", products: [], targets: []) diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.pbxproj b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.pbxproj new file mode 100644 index 0000000000000000000000000000000000000000..48ab32e161ebe4a729ed9473c83f522eb376a019 --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.pbxproj @@ -0,0 +1,338 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 313CFFFA28B632E40050B10D /* AppFeature in Frameworks */ = {isa = PBXBuildFile; productRef = 313CFFF928B632E40050B10D /* AppFeature */; }; + 31964B9228A6D37200BBDC17 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 31964B9128A6D37200BBDC17 /* Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 31964B8A28A6D37100BBDC17 /* XXMessenger.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XXMessenger.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 31964B9128A6D37200BBDC17 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 31964B8728A6D37100BBDC17 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 313CFFFA28B632E40050B10D /* AppFeature in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 31964B8128A6D37100BBDC17 = { + isa = PBXGroup; + children = ( + 31964B8C28A6D37100BBDC17 /* XXMessenger */, + 31964B8B28A6D37100BBDC17 /* Products */, + ); + sourceTree = "<group>"; + }; + 31964B8B28A6D37100BBDC17 /* Products */ = { + isa = PBXGroup; + children = ( + 31964B8A28A6D37100BBDC17 /* XXMessenger.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + 31964B8C28A6D37100BBDC17 /* XXMessenger */ = { + isa = PBXGroup; + children = ( + 31964B9128A6D37200BBDC17 /* Assets.xcassets */, + ); + path = XXMessenger; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 31964B8928A6D37100BBDC17 /* XXMessenger */ = { + isa = PBXNativeTarget; + buildConfigurationList = 31964B9828A6D37200BBDC17 /* Build configuration list for PBXNativeTarget "XXMessenger" */; + buildPhases = ( + 31964B8628A6D37100BBDC17 /* Sources */, + 31964B8728A6D37100BBDC17 /* Frameworks */, + 31964B8828A6D37100BBDC17 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = XXMessenger; + packageProductDependencies = ( + 313CFFF928B632E40050B10D /* AppFeature */, + ); + productName = XXMessenger; + productReference = 31964B8A28A6D37100BBDC17 /* XXMessenger.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 31964B8228A6D37100BBDC17 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1340; + LastUpgradeCheck = 1340; + TargetAttributes = { + 31964B8928A6D37100BBDC17 = { + CreatedOnToolsVersion = 13.4.1; + }; + }; + }; + buildConfigurationList = 31964B8528A6D37100BBDC17 /* Build configuration list for PBXProject "XXMessenger" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 31964B8128A6D37100BBDC17; + productRefGroup = 31964B8B28A6D37100BBDC17 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 31964B8928A6D37100BBDC17 /* XXMessenger */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 31964B8828A6D37100BBDC17 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31964B9228A6D37200BBDC17 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 31964B8628A6D37100BBDC17 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 31964B9628A6D37200BBDC17 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 0; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + MARKETING_VERSION = 1.0.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 31964B9728A6D37200BBDC17 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 0; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.5; + MARKETING_VERSION = 1.0.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 31964B9928A6D37200BBDC17 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = P38XW29864; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.darrarski.XXMessenger; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 31964B9A28A6D37200BBDC17 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = P38XW29864; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.darrarski.XXMessenger; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 31964B8528A6D37100BBDC17 /* Build configuration list for PBXProject "XXMessenger" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 31964B9628A6D37200BBDC17 /* Debug */, + 31964B9728A6D37200BBDC17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 31964B9828A6D37200BBDC17 /* Build configuration list for PBXNativeTarget "XXMessenger" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 31964B9928A6D37200BBDC17 /* Debug */, + 31964B9A28A6D37200BBDC17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 313CFFF928B632E40050B10D /* AppFeature */ = { + isa = XCSwiftPackageProductDependency; + productName = AppFeature; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 31964B8228A6D37100BBDC17 /* Project object */; +} diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000000000000000000000000000000000..919434a6254f0e9651f402737811be6634a03e9c --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "self:"> + </FileRef> +</Workspace> diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000000000000000000000000000000000..18d981003d68d0546c4804ac2ff47dd97c6e7921 --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IDEDidComputeMac32BitWarning</key> + <true/> +</dict> +</plist> diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme new file mode 100644 index 0000000000000000000000000000000000000000..9e83a72f3d20c49c9a5fec35e35ca64500fe5ebe --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "31964B8928A6D37100BBDC17" + BuildableName = "XXMessenger.app" + BlueprintName = "XXMessenger" + ReferencedContainer = "container:XXMessenger.xcodeproj"> + </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 = "AppCoreTests" + BuildableName = "AppCoreTests" + BlueprintName = "AppCoreTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "AppFeatureTests" + BuildableName = "AppFeatureTests" + BlueprintName = "AppFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "HomeFeatureTests" + BuildableName = "HomeFeatureTests" + BlueprintName = "HomeFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "LaunchFeatureTests" + BuildableName = "LaunchFeatureTests" + BlueprintName = "LaunchFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "RegisterFeatureTests" + BuildableName = "RegisterFeatureTests" + BlueprintName = "RegisterFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "RestoreFeatureTests" + BuildableName = "RestoreFeatureTests" + BlueprintName = "RestoreFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "WelcomeFeatureTests" + BuildableName = "WelcomeFeatureTests" + BlueprintName = "WelcomeFeatureTests" + 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"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "31964B8928A6D37100BBDC17" + BuildableName = "XXMessenger.app" + BlueprintName = "XXMessenger" + ReferencedContainer = "container:XXMessenger.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "31964B8928A6D37100BBDC17" + BuildableName = "XXMessenger.app" + BlueprintName = "XXMessenger" + ReferencedContainer = "container:XXMessenger.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AccentColor.colorset/Contents.json b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..eb8789700816459c1e1480e0b34781d9fb78a1ca --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..84c0167b1a1045edaaee154e355e3d9362bb03c2 --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "filename" : "iPhone Notification 20pt 2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "iPhone Notification 20pt 3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "iPhone Settings 29pt 2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "iPhone Settings 29pt 3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "iPhone Spotlight 40pt 2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "iPhone Spotlight 40pt 3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "iPhone App 60pt 2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "iPhone App 60pt 3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "iPad Notification 20pt 1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "iPad Notification 20pt 2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "iPad Settings 29pt 1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "iPad Settings 29pt 2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "iPad Spotlight 40pt 1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "iPad Spotlight 40pt 2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "iPad App 76pt 1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "iPad App 76pt 2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "iPad Pro (12.9-inch) App 83.5pt 2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "iOS App Store 1024pt 1x.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iOS App Store 1024pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iOS App Store 1024pt 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f74bafba9a74e2c0f9a075ef11c390612af07c69 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iOS App Store 1024pt 1x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..33755231d84723c6cfc3f823bad05eb5c8961ba2 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 1x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5ae552b64790957d1a355d80eec642bf93d100 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad App 76pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9a346232d62f79579473062b9758afb7f8907f Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 1x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5a33677bdedee2496d9f1bf25f34dc88b0a473 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Notification 20pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Pro (12.9-inch) App 83.5pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Pro (12.9-inch) App 83.5pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..35bcfba03a28d1a7e50573e9e6438cce84e75363 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Pro (12.9-inch) App 83.5pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..907b2832c75cded4bca5e65ec9da25f3c04d572a Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 1x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2aade831c23ada90101c8fc4cd8b07442a68fcb8 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Settings 29pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 1x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5a33677bdedee2496d9f1bf25f34dc88b0a473 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 1x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c35f34b4c2a4bea13a14c6901964057817ec0a0c Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPad Spotlight 40pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..911a010e155c39f2a82f8dd2b472a2dfbcfa486e Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5a7a7ac44be361e8fb67318af7b3028630d2f0 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone App 60pt 3x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5a33677bdedee2496d9f1bf25f34dc88b0a473 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3561cb40fa8325368092ed54c78d8ebaa670d170 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Notification 20pt 3x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2aade831c23ada90101c8fc4cd8b07442a68fcb8 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2719654ceaa888998261e08e89b94143165c1b50 Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Settings 29pt 3x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 2x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c35f34b4c2a4bea13a14c6901964057817ec0a0c Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 2x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 3x.png b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 3x.png new file mode 100644 index 0000000000000000000000000000000000000000..911a010e155c39f2a82f8dd2b472a2dfbcfa486e Binary files /dev/null and b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/AppIcon.appiconset/iPhone Spotlight 40pt 3x.png differ diff --git a/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/Contents.json b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..73c00596a7fca3f3d4bdd64053b69d86745f9e10 --- /dev/null +++ b/Examples/xx-messenger/Project/XXMessenger/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/xx-messenger/README.md b/Examples/xx-messenger/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6863cdab629da2701b2a732ebaf04fce1455ccfe --- /dev/null +++ b/Examples/xx-messenger/README.md @@ -0,0 +1,32 @@ +# xx-messenger + +Example iOS messenger application built with **Elixxir dApps Swift SDK**. + + + + +## 🛠Development + +Open `XXMessenger.xcworkspace` in Xcode (≥13.4). + +### Project structure + +``` +XXMessenger [Xcode Workspace] + ├─ xx-messenger [Swift Package] + | ├─ AppFeature [Library] + | └─ ... + └─ XXMessenger [Xcode Project] + └─ XXMessenger (iOS) [iOS App Target] +``` + +### Build schemes + +- Use `XXMessenger` scheme to build, test, and run the app. +- Use other schemes (like `AppFeature`) for building and testing individual libraries in isolation. + +## 📄 License + +Copyright © 2022 xx network SEZC + +[License](LICENSE) diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManager.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManager.swift new file mode 100644 index 0000000000000000000000000000000000000000..178e1078e56aaddaf6ef8170834ea830b944aac5 --- /dev/null +++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManager.swift @@ -0,0 +1,31 @@ +import XXModels + +public struct DBManager { + public var hasDB: DBManagerHasDB + public var makeDB: DBManagerMakeDB + public var getDB: DBManagerGetDB +} + +extension DBManager { + public static func live() -> DBManager { + class Container { + var db: Database? + } + + let container = Container() + + return DBManager( + hasDB: .init { container.db != nil }, + makeDB: .live(setDB: { container.db = $0 }), + getDB: .live(getDB: { container.db }) + ) + } +} + +extension DBManager { + public static let unimplemented = DBManager( + hasDB: .unimplemented, + makeDB: .unimplemented, + getDB: .unimplemented + ) +} diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerGetDB.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerGetDB.swift new file mode 100644 index 0000000000000000000000000000000000000000..7b5898b7f4b57fdb49dec6b978e3ef04489251b5 --- /dev/null +++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerGetDB.swift @@ -0,0 +1,33 @@ +import XCTestDynamicOverlay +import XXModels + +public struct DBManagerGetDB { + public enum Error: Swift.Error, Equatable { + case missingDB + } + + public var run: () throws -> Database + + public func callAsFunction() throws -> Database { + try run() + } +} + +extension DBManagerGetDB { + public static func live( + getDB: @escaping () -> Database? + ) -> DBManagerGetDB { + DBManagerGetDB { + guard let db = getDB() else { + throw Error.missingDB + } + return db + } + } +} + +extension DBManagerGetDB { + public static let unimplemented = DBManagerGetDB( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerHasDB.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerHasDB.swift new file mode 100644 index 0000000000000000000000000000000000000000..12fb1bb34ca0882404bf765f640e61496cbaedd5 --- /dev/null +++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerHasDB.swift @@ -0,0 +1,19 @@ +import XCTestDynamicOverlay + +public struct DBManagerHasDB { + init(run: @escaping () -> Bool) { + self.run = run + } + + public var run: () -> Bool + + public func callAsFunction() -> Bool { + run() + } +} + +extension DBManagerHasDB { + public static let unimplemented = DBManagerHasDB( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerMakeDB.swift b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerMakeDB.swift new file mode 100644 index 0000000000000000000000000000000000000000..a3f018b1d617ad402a4c5f8914b07a2c622150ac --- /dev/null +++ b/Examples/xx-messenger/Sources/AppCore/DBManager/DBManagerMakeDB.swift @@ -0,0 +1,41 @@ +import Foundation +import XCTestDynamicOverlay +import XXDatabase +import XXModels + +public struct DBManagerMakeDB { + public var run: () throws -> Void + + public func callAsFunction() throws -> Void { + try run() + } +} + +extension DBManagerMakeDB { + public static func live( + setDB: @escaping (Database) -> Void + ) -> DBManagerMakeDB { + DBManagerMakeDB { + let dbDirectoryURL = FileManager.default + .urls(for: .applicationSupportDirectory, in: .userDomainMask) + .first! + .appendingPathComponent("database") + + try? FileManager.default + .createDirectory(at: dbDirectoryURL, withIntermediateDirectories: true) + + let dbFilePath = dbDirectoryURL + .appendingPathComponent("db") + .appendingPathExtension("sqlite") + .path + + setDB(try Database.onDisk(path: dbFilePath)) + } + } +} + +extension DBManagerMakeDB { + public static let unimplemented = DBManagerMakeDB( + run: XCTUnimplemented("\(Self.self)") + ) +} diff --git a/Examples/xx-messenger/Sources/AppFeature/App.swift b/Examples/xx-messenger/Sources/AppFeature/App.swift new file mode 100644 index 0000000000000000000000000000000000000000..d6b0b722c4d610d823b5313aae797e3f72dc10a3 --- /dev/null +++ b/Examples/xx-messenger/Sources/AppFeature/App.swift @@ -0,0 +1,15 @@ +import ComposableArchitecture +import SwiftUI + +@main +struct App: SwiftUI.App { + var body: some Scene { + WindowGroup { + AppView(store: Store( + initialState: AppState(), + reducer: appReducer, + environment: .live() + )) + } + } +} diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift new file mode 100644 index 0000000000000000000000000000000000000000..6b1df10d25b421f5530cc0b8b77146acdee6023b --- /dev/null +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -0,0 +1,52 @@ +import AppCore +import Foundation +import HomeFeature +import LaunchFeature +import RegisterFeature +import RestoreFeature +import WelcomeFeature +import XXMessengerClient +import XXModels + +extension AppEnvironment { + static func live() -> AppEnvironment { + let dbManager = DBManager.live() + let messengerEnv = MessengerEnvironment.live() + let messenger = Messenger.live(messengerEnv) + let mainQueue = DispatchQueue.main.eraseToAnyScheduler() + let bgQueue = DispatchQueue.global(qos: .background).eraseToAnyScheduler() + + return AppEnvironment( + launch: { + LaunchEnvironment( + dbManager: dbManager, + messenger: messenger, + mainQueue: mainQueue, + bgQueue: bgQueue, + welcome: { + WelcomeEnvironment( + messenger: messenger, + mainQueue: mainQueue, + bgQueue: bgQueue + ) + }, + restore: { + RestoreEnvironment() + }, + register: { + RegisterEnvironment( + messenger: messenger, + mainQueue: mainQueue, + bgQueue: bgQueue + ) + } + ) + }, + home: { + HomeEnvironment( + messenger: messenger + ) + } + ) + } +} diff --git a/Examples/xx-messenger/Sources/AppFeature/AppFeature.swift b/Examples/xx-messenger/Sources/AppFeature/AppFeature.swift new file mode 100644 index 0000000000000000000000000000000000000000..18927c0bc21af48ba57317be8b38c7c80ca27a0b --- /dev/null +++ b/Examples/xx-messenger/Sources/AppFeature/AppFeature.swift @@ -0,0 +1,67 @@ +import ComposableArchitecture +import ComposablePresentation +import HomeFeature +import LaunchFeature + +struct AppState: Equatable { + enum Screen: Equatable { + case launch(LaunchState) + case home(HomeState) + } + + var screen: Screen = .launch(LaunchState()) +} + +extension AppState.Screen { + var asLaunch: LaunchState? { + get { (/AppState.Screen.launch).extract(from: self) } + set { if let newValue = newValue { self = .launch(newValue) } } + } + var asHome: HomeState? { + get { (/AppState.Screen.home).extract(from: self) } + set { if let newValue = newValue { self = .home(newValue) } } + } +} + +enum AppAction: Equatable { + case home(HomeAction) + case launch(LaunchAction) +} + +struct AppEnvironment { + var launch: () -> LaunchEnvironment + var home: () -> HomeEnvironment +} + +extension AppEnvironment { + static let unimplemented = AppEnvironment( + launch: { .unimplemented }, + home: { .unimplemented } + ) +} + +let appReducer = Reducer<AppState, AppAction, AppEnvironment> +{ state, action, env in + switch action { + case .launch(.finished): + state.screen = .home(HomeState()) + return .none + + case .launch(_), .home(_): + return .none + } +} +.presenting( + launchReducer, + state: .keyPath(\.screen.asLaunch), + id: .notNil(), + action: /AppAction.launch, + environment: { $0.launch() } +) +.presenting( + homeReducer, + state: .keyPath(\.screen.asHome), + id: .notNil(), + action: /AppAction.home, + environment: { $0.home() } +) diff --git a/Examples/xx-messenger/Sources/AppFeature/AppView.swift b/Examples/xx-messenger/Sources/AppFeature/AppView.swift new file mode 100644 index 0000000000000000000000000000000000000000..317560a3f749bd2b2eaa923318c7c4f4fc66fb1c --- /dev/null +++ b/Examples/xx-messenger/Sources/AppFeature/AppView.swift @@ -0,0 +1,64 @@ +import ComposableArchitecture +import SwiftUI +import HomeFeature +import LaunchFeature + +struct AppView: View { + let store: Store<AppState, AppAction> + + enum ViewState: Equatable { + case launch + case home + + init(_ state: AppState) { + switch state.screen { + case .launch(_): self = .launch + case .home(_): self = .home + } + } + } + + var body: some View { + WithViewStore(store.scope(state: ViewState.init)) { viewStore in + ZStack { + SwitchStore(store.scope(state: \.screen)) { + CaseLet( + state: /AppState.Screen.launch, + action: AppAction.launch, + then: { store in + LaunchView(store: store) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.opacity) + } + ) + + CaseLet( + state: /AppState.Screen.home, + action: AppAction.home, + then: { store in + HomeView(store: store) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .opacity + )) + } + ) + } + } + .animation(.default, value: viewStore.state) + } + } +} + +#if DEBUG +struct AppView_Previews: PreviewProvider { + static var previews: some View { + AppView(store: Store( + initialState: AppState(), + reducer: .empty, + environment: () + )) + } +} +#endif diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift new file mode 100644 index 0000000000000000000000000000000000000000..4aad88dac7cb70cac5908b50bce45a6367b91ca8 --- /dev/null +++ b/Examples/xx-messenger/Sources/HomeFeature/HomeFeature.swift @@ -0,0 +1,35 @@ +import ComposableArchitecture +import XXClient +import XXMessengerClient + +public struct HomeState: Equatable { + public init() {} +} + +public enum HomeAction: Equatable { + case start +} + +public struct HomeEnvironment { + public init( + messenger: Messenger + ) { + self.messenger = messenger + } + + public var messenger: Messenger +} + +extension HomeEnvironment { + public static let unimplemented = HomeEnvironment( + messenger: .unimplemented + ) +} + +public let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> +{ state, action, env in + switch action { + case .start: + return .none + } +} diff --git a/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift new file mode 100644 index 0000000000000000000000000000000000000000..0bda29bd8c2ea48b125337dd5a487e63334794f0 --- /dev/null +++ b/Examples/xx-messenger/Sources/HomeFeature/HomeView.swift @@ -0,0 +1,39 @@ +import ComposableArchitecture +import SwiftUI + +public struct HomeView: View { + public init(store: Store<HomeState, HomeAction>) { + self.store = store + } + + let store: Store<HomeState, HomeAction> + + struct ViewState: Equatable { + init(state: HomeState) {} + } + + public var body: some View { + WithViewStore(store.scope(state: ViewState.init)) { viewStore in + NavigationView { + Form { + + } + .navigationTitle("Home") + } + .navigationViewStyle(.stack) + .task { viewStore.send(.start) } + } + } +} + +#if DEBUG +public struct HomeView_Previews: PreviewProvider { + public static var previews: some View { + HomeView(store: Store( + initialState: HomeState(), + reducer: .empty, + environment: () + )) + } +} +#endif diff --git a/Examples/xx-messenger/Sources/LaunchFeature/LaunchErrorView.swift b/Examples/xx-messenger/Sources/LaunchFeature/LaunchErrorView.swift new file mode 100644 index 0000000000000000000000000000000000000000..893492c0b9670af7389e341713527346eb6e4d26 --- /dev/null +++ b/Examples/xx-messenger/Sources/LaunchFeature/LaunchErrorView.swift @@ -0,0 +1,44 @@ +import ComposableArchitecture +import SwiftUI + +struct LaunchErrorView: View { + var failure: String + var onRetry: () -> Void + + var body: some View { + NavigationView { + VStack(spacing: 0) { + ScrollView { + Text(failure) + .frame(maxWidth: .infinity, alignment: .leading) + .padding() + } + + Divider() + + Button { + onRetry() + } label: { + Text("Retry") + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .controlSize(.large) + .padding() + } + .navigationTitle("Error") + } + .navigationViewStyle(.stack) + } +} + +#if DEBUG +struct LaunchErrorView_Previews: PreviewProvider { + static var previews: some View { + LaunchErrorView( + failure: "Something went wrong...", + onRetry: {} + ) + } +} +#endif diff --git a/Examples/xx-messenger/Sources/LaunchFeature/LaunchFeature.swift b/Examples/xx-messenger/Sources/LaunchFeature/LaunchFeature.swift new file mode 100644 index 0000000000000000000000000000000000000000..39e3efdf0c70780ccd3f2343f17a0fc138fdab57 --- /dev/null +++ b/Examples/xx-messenger/Sources/LaunchFeature/LaunchFeature.swift @@ -0,0 +1,172 @@ +import AppCore +import Combine +import ComposableArchitecture +import ComposablePresentation +import RegisterFeature +import RestoreFeature +import WelcomeFeature +import XXMessengerClient +import XXModels + +public struct LaunchState: Equatable { + public enum Screen: Equatable { + case loading + case welcome(WelcomeState) + case restore(RestoreState) + case register(RegisterState) + case failure(String) + } + + public init( + screen: Screen = .loading + ) { + self.screen = screen + } + + @BindableState public var screen: Screen +} + +extension LaunchState.Screen { + var asWelcome: WelcomeState? { + get { (/LaunchState.Screen.welcome).extract(from: self) } + set { if let state = newValue { self = .welcome(state) } } + } + var asRestore: RestoreState? { + get { (/LaunchState.Screen.restore).extract(from: self) } + set { if let state = newValue { self = .restore(state) } } + } + var asRegister: RegisterState? { + get { (/LaunchState.Screen.register).extract(from: self) } + set { if let state = newValue { self = .register(state) } } + } +} + +public enum LaunchAction: Equatable, BindableAction { + case start + case finished + case binding(BindingAction<LaunchState>) + case welcome(WelcomeAction) + case restore(RestoreAction) + case register(RegisterAction) +} + +public struct LaunchEnvironment { + public init( + dbManager: DBManager, + messenger: Messenger, + mainQueue: AnySchedulerOf<DispatchQueue>, + bgQueue: AnySchedulerOf<DispatchQueue>, + welcome: @escaping () -> WelcomeEnvironment, + restore: @escaping () -> RestoreEnvironment, + register: @escaping () -> RegisterEnvironment + ) { + self.dbManager = dbManager + self.messenger = messenger + self.mainQueue = mainQueue + self.bgQueue = bgQueue + self.welcome = welcome + self.restore = restore + self.register = register + } + + public var dbManager: DBManager + public var messenger: Messenger + public var mainQueue: AnySchedulerOf<DispatchQueue> + public var bgQueue: AnySchedulerOf<DispatchQueue> + public var welcome: () -> WelcomeEnvironment + public var restore: () -> RestoreEnvironment + public var register: () -> RegisterEnvironment +} + +extension LaunchEnvironment { + public static let unimplemented = LaunchEnvironment( + dbManager: .unimplemented, + messenger: .unimplemented, + mainQueue: .unimplemented, + bgQueue: .unimplemented, + welcome: { .unimplemented }, + restore: { .unimplemented }, + register: { .unimplemented } + ) +} + +public let launchReducer = Reducer<LaunchState, LaunchAction, LaunchEnvironment> +{ state, action, env in + switch action { + case .start, .welcome(.finished), .restore(.finished), .register(.finished): + state.screen = .loading + return .future { fulfill in + do { + if env.dbManager.hasDB() == false { + try env.dbManager.makeDB() + } + + if env.messenger.isLoaded() == false { + if env.messenger.isCreated() == false { + fulfill(.success(.set(\.$screen, .welcome(WelcomeState())))) + return + } + try env.messenger.load() + } + + try env.messenger.start() + + if env.messenger.isConnected() == false { + try env.messenger.connect() + } + + if env.messenger.isLoggedIn() == false { + if try env.messenger.isRegistered() == false { + fulfill(.success(.set(\.$screen, .register(RegisterState())))) + return + } + try env.messenger.logIn() + } + + fulfill(.success(.finished)) + } + catch { + fulfill(.success(.set(\.$screen, .failure(error.localizedDescription)))) + } + } + .subscribe(on: env.bgQueue) + .receive(on: env.mainQueue) + .eraseToEffect() + + case .finished: + return .none + + case .welcome(.restoreTapped): + state.screen = .restore(RestoreState()) + return .none + + case .welcome(.failed(let failure)): + state.screen = .failure(failure) + return .none + + case .binding(_), .welcome(_), .restore(_), .register(_): + return .none + } +} +.binding() +.presenting( + welcomeReducer, + state: .keyPath(\.screen.asWelcome), + id: .notNil(), + action: /LaunchAction.welcome, + environment: { $0.welcome() } +) +.presenting( + restoreReducer, + state: .keyPath(\.screen.asRestore), + id: .notNil(), + action: /LaunchAction.restore, + environment: { $0.restore() } +) +.presenting( + registerReducer, + state: .keyPath(\.screen.asRegister), + id: .notNil(), + action: /LaunchAction.register, + environment: { $0.register() } +) diff --git a/Examples/xx-messenger/Sources/LaunchFeature/LaunchView.swift b/Examples/xx-messenger/Sources/LaunchFeature/LaunchView.swift new file mode 100644 index 0000000000000000000000000000000000000000..ed110302f45ff390664f9af2e939571c9bbb2646 --- /dev/null +++ b/Examples/xx-messenger/Sources/LaunchFeature/LaunchView.swift @@ -0,0 +1,118 @@ +import ComposableArchitecture +import RegisterFeature +import RestoreFeature +import SwiftUI +import WelcomeFeature + +public struct LaunchView: View { + public init(store: Store<LaunchState, LaunchAction>) { + self.store = store + } + + struct ViewState: Equatable { + enum Screen: Equatable { + case loading + case welcome + case restore + case register + case failure(String) + } + + init(_ state: LaunchState) { + switch state.screen { + case .loading: screen = .loading + case .welcome(_): screen = .welcome + case .restore(_): screen = .restore + case .register(_): screen = .register + case .failure(let failure): screen = .failure(failure) + } + } + + var screen: Screen + } + + let store: Store<LaunchState, LaunchAction> + + public var body: some View { + WithViewStore(store.scope(state: ViewState.init)) { viewStore in + ZStack { + switch viewStore.screen { + case .loading: + ProgressView { + Text("Loading") + } + .controlSize(.large) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.opacity) + + case .welcome: + IfLetStore( + store.scope( + state: { (/LaunchState.Screen.welcome).extract(from: $0.screen) }, + action: LaunchAction.welcome + ), + then: WelcomeView.init(store:) + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .opacity + )) + + case .restore: + IfLetStore( + store.scope( + state: { (/LaunchState.Screen.restore).extract(from: $0.screen) }, + action: LaunchAction.restore + ), + then: RestoreView.init(store:) + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .opacity + )) + + case .register: + IfLetStore( + store.scope( + state: { (/LaunchState.Screen.register).extract(from: $0.screen) }, + action: LaunchAction.register + ), + then: RegisterView.init(store:) + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .opacity + )) + + case .failure(let failure): + LaunchErrorView( + failure: failure, + onRetry: { viewStore.send(.start) } + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .transition(.asymmetric( + insertion: .move(edge: .trailing), + removal: .opacity + )) + } + } + .animation(.default, value: viewStore.screen) + .task { viewStore.send(.start) } + } + } +} + +#if DEBUG +public struct LaunchView_Previews: PreviewProvider { + public static var previews: some View { + LaunchView(store: Store( + initialState: LaunchState(), + reducer: .empty, + environment: () + )) + } +} +#endif diff --git a/Examples/xx-messenger/Sources/RegisterFeature/RegisterFeature.swift b/Examples/xx-messenger/Sources/RegisterFeature/RegisterFeature.swift new file mode 100644 index 0000000000000000000000000000000000000000..f929d18fd5bdc1a004cd05f4bb366b5c0d835c03 --- /dev/null +++ b/Examples/xx-messenger/Sources/RegisterFeature/RegisterFeature.swift @@ -0,0 +1,89 @@ +import ComposableArchitecture +import SwiftUI +import XXMessengerClient + +public struct RegisterState: Equatable { + public enum Field: String, Hashable { + case username + } + + public init( + focusedField: Field? = nil, + username: String = "", + isRegistering: Bool = false + ) { + self.focusedField = focusedField + self.username = username + self.isRegistering = isRegistering + } + + @BindableState public var focusedField: Field? + @BindableState public var username: String + public var isRegistering: Bool + public var failure: String? +} + +public enum RegisterAction: Equatable, BindableAction { + case registerTapped + case failed(String) + case finished + case binding(BindingAction<RegisterState>) +} + +public struct RegisterEnvironment { + public init( + messenger: Messenger, + mainQueue: AnySchedulerOf<DispatchQueue>, + bgQueue: AnySchedulerOf<DispatchQueue> + ) { + self.messenger = messenger + self.mainQueue = mainQueue + self.bgQueue = bgQueue + } + + public var messenger: Messenger + public var mainQueue: AnySchedulerOf<DispatchQueue> + public var bgQueue: AnySchedulerOf<DispatchQueue> +} + +extension RegisterEnvironment { + public static let unimplemented = RegisterEnvironment( + messenger: .unimplemented, + mainQueue: .unimplemented, + bgQueue: .unimplemented + ) +} + +public let registerReducer = Reducer<RegisterState, RegisterAction, RegisterEnvironment> +{ state, action, env in + switch action { + case .binding(_): + return .none + + case .registerTapped: + state.focusedField = nil + state.isRegistering = true + state.failure = nil + return .future { [username = state.username] fulfill in + do { + try env.messenger.register(username: username) + fulfill(.success(.finished)) + } + catch { + fulfill(.success(.failed(error.localizedDescription))) + } + } + .subscribe(on: env.bgQueue) + .receive(on: env.mainQueue) + .eraseToEffect() + + case .failed(let failure): + state.isRegistering = false + state.failure = failure + return .none + + case .finished: + return .none + } +} +.binding() diff --git a/Examples/xx-messenger/Sources/RegisterFeature/RegisterView.swift b/Examples/xx-messenger/Sources/RegisterFeature/RegisterView.swift new file mode 100644 index 0000000000000000000000000000000000000000..27bc0962780d7214095ff26592d66c9f6703ae52 --- /dev/null +++ b/Examples/xx-messenger/Sources/RegisterFeature/RegisterView.swift @@ -0,0 +1,87 @@ +import ComposableArchitecture +import SwiftUI + +public struct RegisterView: View { + public init(store: Store<RegisterState, RegisterAction>) { + self.store = store + } + + let store: Store<RegisterState, RegisterAction> + @FocusState var focusedField: RegisterState.Field? + + struct ViewState: Equatable { + init(_ state: RegisterState) { + focusedField = state.focusedField + username = state.username + isRegistering = state.isRegistering + failure = state.failure + } + + var focusedField: RegisterState.Field? + var username: String + var isRegistering: Bool + var failure: String? + } + + public var body: some View { + WithViewStore(store.scope(state: ViewState.init)) { viewStore in + NavigationView { + Form { + Section { + TextField( + text: viewStore.binding( + get: \.username, + send: { RegisterAction.set(\.$username, $0) } + ), + prompt: Text("Enter username"), + label: { Text("Username") } + ) + .focused($focusedField, equals: .username) + } header: { + Text("Username") + } + + Section { + Button { + viewStore.send(.registerTapped) + } label: { + HStack { + if viewStore.isRegistering { + ProgressView().padding(.trailing) + Text("Registering...") + } else { + Text("Register") + } + } + .frame(maxWidth: .infinity) + } + } + + if let failure = viewStore.failure { + Section { + Text(failure) + } header: { + Text("Error").foregroundColor(.red) + } + } + } + .disabled(viewStore.isRegistering) + .navigationTitle("Register") + .onChange(of: viewStore.focusedField) { focusedField = $0 } + .onChange(of: focusedField) { viewStore.send(.set(\.$focusedField, $0)) } + } + } + } +} + +#if DEBUG +public struct RegisterView_Previews: PreviewProvider { + public static var previews: some View { + RegisterView(store: Store( + initialState: RegisterState(), + reducer: .empty, + environment: () + )) + } +} +#endif diff --git a/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift new file mode 100644 index 0000000000000000000000000000000000000000..6ce31e5d67acfde939a1bc9ba03e28226f4e0761 --- /dev/null +++ b/Examples/xx-messenger/Sources/RestoreFeature/RestoreFeature.swift @@ -0,0 +1,19 @@ +import ComposableArchitecture + +public struct RestoreState: Equatable { + public init() {} +} + +public enum RestoreAction: Equatable { + case finished +} + +public struct RestoreEnvironment { + public init() {} +} + +extension RestoreEnvironment { + public static let unimplemented = RestoreEnvironment() +} + +public let restoreReducer = Reducer<RestoreState, RestoreAction, RestoreEnvironment>.empty diff --git a/Examples/xx-messenger/Sources/RestoreFeature/RestoreView.swift b/Examples/xx-messenger/Sources/RestoreFeature/RestoreView.swift new file mode 100644 index 0000000000000000000000000000000000000000..137b55069b5c0e5df287b2351e181309abbe7181 --- /dev/null +++ b/Examples/xx-messenger/Sources/RestoreFeature/RestoreView.swift @@ -0,0 +1,49 @@ +import ComposableArchitecture +import SwiftUI + +public struct RestoreView: View { + public init(store: Store<RestoreState, RestoreAction>) { + self.store = store + } + + let store: Store<RestoreState, RestoreAction> + + struct ViewState: Equatable { + init(state: RestoreState) {} + } + + public var body: some View { + WithViewStore(store.scope(state: ViewState.init)) { viewStore in + NavigationView { + Form { + Section { + Text("Not implemented") + } + + Section { + Button { + viewStore.send(.finished) + } label: { + Text("OK") + .frame(maxWidth: .infinity) + } + } + } + .navigationTitle("Restore") + } + .navigationViewStyle(.stack) + } + } +} + +#if DEBUG +public struct RestoreView_Previews: PreviewProvider { + public static var previews: some View { + RestoreView(store: Store( + initialState: RestoreState(), + reducer: .empty, + environment: () + )) + } +} +#endif diff --git a/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeFeature.swift b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeFeature.swift new file mode 100644 index 0000000000000000000000000000000000000000..6c6f2e22aa36e73ff0fc4acc441eb63b91f56e66 --- /dev/null +++ b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeFeature.swift @@ -0,0 +1,75 @@ +import ComposableArchitecture +import SwiftUI +import XXMessengerClient + +public struct WelcomeState: Equatable { + public init( + isCreatingCMix: Bool = false + ) { + self.isCreatingAccount = isCreatingCMix + } + + public var isCreatingAccount: Bool +} + +public enum WelcomeAction: Equatable { + case newAccountTapped + case restoreTapped + case finished + case failed(String) +} + +public struct WelcomeEnvironment { + public init( + messenger: Messenger, + mainQueue: AnySchedulerOf<DispatchQueue>, + bgQueue: AnySchedulerOf<DispatchQueue> + ) { + self.messenger = messenger + self.mainQueue = mainQueue + self.bgQueue = bgQueue + } + + public var messenger: Messenger + public var mainQueue: AnySchedulerOf<DispatchQueue> + public var bgQueue: AnySchedulerOf<DispatchQueue> +} + +extension WelcomeEnvironment { + public static let unimplemented = WelcomeEnvironment( + messenger: .unimplemented, + mainQueue: .unimplemented, + bgQueue: .unimplemented + ) +} + +public let welcomeReducer = Reducer<WelcomeState, WelcomeAction, WelcomeEnvironment> +{ state, action, env in + switch action { + case .newAccountTapped: + state.isCreatingAccount = true + return .future { fulfill in + do { + try env.messenger.create() + fulfill(.success(.finished)) + } + catch { + fulfill(.success(.failed(error.localizedDescription))) + } + } + .subscribe(on: env.bgQueue) + .receive(on: env.mainQueue) + .eraseToEffect() + + case .restoreTapped: + return .none + + case .finished: + state.isCreatingAccount = false + return .none + + case .failed(_): + state.isCreatingAccount = false + return .none + } +} diff --git a/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeView.swift b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeView.swift new file mode 100644 index 0000000000000000000000000000000000000000..d3686c5aa5f1b410cea89176feecdcf050dccb3a --- /dev/null +++ b/Examples/xx-messenger/Sources/WelcomeFeature/WelcomeView.swift @@ -0,0 +1,68 @@ +import ComposableArchitecture +import SwiftUI + +public struct WelcomeView: View { + public init(store: Store<WelcomeState, WelcomeAction>) { + self.store = store + } + + let store: Store<WelcomeState, WelcomeAction> + + struct ViewState: Equatable { + init(_ state: WelcomeState) { + isCreatingAccount = state.isCreatingAccount + } + + var isCreatingAccount: Bool + } + + public var body: some View { + WithViewStore(store.scope(state: ViewState.init)) { viewStore in + NavigationView { + Form { + Section { + Text("xx messenger") + } + + Section { + Button { + viewStore.send(.newAccountTapped) + } label: { + HStack { + if viewStore.isCreatingAccount { + ProgressView().padding(.trailing) + Text("Creating Account...") + } else { + Text("New Account") + } + } + .frame(maxWidth: .infinity) + } + + Button { + viewStore.send(.restoreTapped) + } label: { + Text("Restore from Backup") + .frame(maxWidth: .infinity) + } + } + } + .disabled(viewStore.isCreatingAccount) + .navigationTitle("Welcome") + } + .navigationViewStyle(.stack) + } + } +} + +#if DEBUG +public struct WelcomeView_Previews: PreviewProvider { + public static var previews: some View { + WelcomeView(store: Store( + initialState: WelcomeState(), + reducer: .empty, + environment: () + )) + } +} +#endif diff --git a/Examples/xx-messenger/Tests/AppCoreTests/AppCoreTests.swift b/Examples/xx-messenger/Tests/AppCoreTests/AppCoreTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..9a5658d4caa59cea2181061ff1ca1d2d6d38c5e4 --- /dev/null +++ b/Examples/xx-messenger/Tests/AppCoreTests/AppCoreTests.swift @@ -0,0 +1,9 @@ +import XCTest +@testable import AppCore + +@MainActor +final class AppCoreTests: XCTestCase { + func testExample() async throws { + XCTAssert(true) + } +} diff --git a/Examples/xx-messenger/Tests/AppFeatureTests/AppFeatureTests.swift b/Examples/xx-messenger/Tests/AppFeatureTests/AppFeatureTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..6563da86bb1d74e25b4cb0c551c7314c20542792 --- /dev/null +++ b/Examples/xx-messenger/Tests/AppFeatureTests/AppFeatureTests.swift @@ -0,0 +1,19 @@ +import ComposableArchitecture +import HomeFeature +import XCTest +@testable import AppFeature + +@MainActor +final class AppFeatureTests: XCTestCase { + func testLaunchFinished() async throws { + let store = TestStore( + initialState: AppState(), + reducer: appReducer, + environment: .unimplemented + ) + + await store.send(.launch(.finished)) { + $0.screen = .home(HomeState()) + } + } +} diff --git a/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..21a25bb641274dced7d7dd83ebc49f073ada4420 --- /dev/null +++ b/Examples/xx-messenger/Tests/HomeFeatureTests/HomeFeatureTests.swift @@ -0,0 +1,16 @@ +import ComposableArchitecture +import XCTest +@testable import HomeFeature + +@MainActor +final class HomeFeatureTests: XCTestCase { + func testStart() async throws { + let store = TestStore( + initialState: HomeState(), + reducer: homeReducer, + environment: .unimplemented + ) + + await store.send(.start) + } +} diff --git a/Examples/xx-messenger/Tests/LaunchFeatureTests/LaunchFeatureTests.swift b/Examples/xx-messenger/Tests/LaunchFeatureTests/LaunchFeatureTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..b2b3f856f79260ef652664f9c9892382296ede95 --- /dev/null +++ b/Examples/xx-messenger/Tests/LaunchFeatureTests/LaunchFeatureTests.swift @@ -0,0 +1,327 @@ +import AppCore +import ComposableArchitecture +import RegisterFeature +import RestoreFeature +import WelcomeFeature +import XCTest +import XXModels +@testable import LaunchFeature + +@MainActor +final class LaunchFeatureTests: XCTestCase { + func testStart() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + var didMakeDB = 0 + var messengerDidLoad = 0 + var messengerDidStart = 0 + var messengerDidConnect = 0 + var messengerDidLogIn = 0 + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { false } + store.environment.dbManager.makeDB.run = { didMakeDB += 1 } + store.environment.messenger.isLoaded.run = { false } + store.environment.messenger.isCreated.run = { true } + store.environment.messenger.load.run = { messengerDidLoad += 1 } + store.environment.messenger.start.run = { _ in messengerDidStart += 1 } + store.environment.messenger.isConnected.run = { false } + store.environment.messenger.connect.run = { messengerDidConnect += 1 } + store.environment.messenger.isLoggedIn.run = { false } + store.environment.messenger.isRegistered.run = { true } + store.environment.messenger.logIn.run = { messengerDidLogIn += 1 } + + store.send(.start) + + bgQueue.advance() + + XCTAssertNoDifference(didMakeDB, 1) + XCTAssertNoDifference(messengerDidLoad, 1) + XCTAssertNoDifference(messengerDidStart, 1) + XCTAssertNoDifference(messengerDidConnect, 1) + XCTAssertNoDifference(messengerDidLogIn, 1) + + mainQueue.advance() + + store.receive(.finished) + } + + func testStartWithoutMessengerCreated() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { false } + store.environment.messenger.isCreated.run = { false } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .welcome(WelcomeState()))) { + $0.screen = .welcome(WelcomeState()) + } + } + + func testStartUnregistered() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { true } + store.environment.messenger.start.run = { _ in } + store.environment.messenger.isConnected.run = { true } + store.environment.messenger.isLoggedIn.run = { false } + store.environment.messenger.isRegistered.run = { false } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .register(RegisterState()))) { + $0.screen = .register(RegisterState()) + } + } + + func testStartMakeDBFailure() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { false } + store.environment.dbManager.makeDB.run = { throw error } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .failure(error.localizedDescription))) { + $0.screen = .failure(error.localizedDescription) + } + } + + func testStartMessengerLoadFailure() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { false } + store.environment.messenger.isCreated.run = { true } + store.environment.messenger.load.run = { throw error } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .failure(error.localizedDescription))) { + $0.screen = .failure(error.localizedDescription) + } + } + + func testStartMessengerStartFailure() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { true } + store.environment.messenger.start.run = { _ in throw error } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .failure(error.localizedDescription))) { + $0.screen = .failure(error.localizedDescription) + } + } + + func testStartMessengerConnectFailure() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { true } + store.environment.messenger.start.run = { _ in } + store.environment.messenger.isConnected.run = { false } + store.environment.messenger.connect.run = { throw error } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .failure(error.localizedDescription))) { + $0.screen = .failure(error.localizedDescription) + } + } + + func testStartMessengerIsRegisteredFailure() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { true } + store.environment.messenger.start.run = { _ in } + store.environment.messenger.isConnected.run = { true } + store.environment.messenger.isLoggedIn.run = { false } + store.environment.messenger.isRegistered.run = { throw error } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .failure(error.localizedDescription))) { + $0.screen = .failure(error.localizedDescription) + } + } + + func testStartMessengerLogInFailure() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.dbManager.hasDB.run = { true } + store.environment.messenger.isLoaded.run = { true } + store.environment.messenger.start.run = { _ in } + store.environment.messenger.isConnected.run = { true } + store.environment.messenger.isLoggedIn.run = { false } + store.environment.messenger.isRegistered.run = { true } + store.environment.messenger.logIn.run = { throw error } + + store.send(.start) + + bgQueue.advance() + mainQueue.advance() + + store.receive(.set(\.$screen, .failure(error.localizedDescription))) { + $0.screen = .failure(error.localizedDescription) + } + } + + func testWelcomeRestoreTapped() { + let store = TestStore( + initialState: LaunchState( + screen: .welcome(WelcomeState()) + ), + reducer: launchReducer, + environment: .unimplemented + ) + + store.send(.welcome(.restoreTapped)) { + $0.screen = .restore(RestoreState()) + } + } + + func testWelcomeFailed() { + let store = TestStore( + initialState: LaunchState( + screen: .welcome(WelcomeState()) + ), + reducer: launchReducer, + environment: .unimplemented + ) + + let failure = "Something went wrong" + + store.send(.welcome(.failed(failure))) { + $0.screen = .failure(failure) + } + } + + func testFinished() { + let store = TestStore( + initialState: LaunchState(), + reducer: launchReducer, + environment: .unimplemented + ) + + store.send(.finished) + } +} diff --git a/Examples/xx-messenger/Tests/RegisterFeatureTests/RegisterFeatureTests.swift b/Examples/xx-messenger/Tests/RegisterFeatureTests/RegisterFeatureTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..21d4da16412ab852ff11e1b40da58ac1a5fd5388 --- /dev/null +++ b/Examples/xx-messenger/Tests/RegisterFeatureTests/RegisterFeatureTests.swift @@ -0,0 +1,72 @@ +import ComposableArchitecture +import XCTest +@testable import RegisterFeature + +@MainActor +final class RegisterFeatureTests: XCTestCase { + func testRegister() throws { + let store = TestStore( + initialState: RegisterState(), + reducer: registerReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + var messengerDidRegisterUsername: [String] = [] + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.messenger.register.run = { username in + messengerDidRegisterUsername.append(username) + } + + store.send(.set(\.$username, "NewUser")) { + $0.username = "NewUser" + } + + store.send(.registerTapped) { + $0.isRegistering = true + } + + XCTAssertNoDifference(messengerDidRegisterUsername, []) + + bgQueue.advance() + + XCTAssertNoDifference(messengerDidRegisterUsername, ["NewUser"]) + + mainQueue.advance() + + store.receive(.finished) + } + + func testRegisterFailure() throws { + struct Error: Swift.Error, Equatable {} + let error = Error() + + let store = TestStore( + initialState: RegisterState(), + reducer: registerReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.messenger.register.run = { _ in throw error } + + store.send(.registerTapped) { + $0.isRegistering = true + } + + bgQueue.advance() + mainQueue.advance() + + store.receive(.failed(error.localizedDescription)) { + $0.isRegistering = false + $0.failure = error.localizedDescription + } + } +} diff --git a/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..1c3e1c97da4f95ddedf16116d44a155a3c2200da --- /dev/null +++ b/Examples/xx-messenger/Tests/RestoreFeatureTests/RestoreFeatureTests.swift @@ -0,0 +1,16 @@ +import ComposableArchitecture +import XCTest +@testable import RestoreFeature + +@MainActor +final class RestoreFeatureTests: XCTestCase { + func testFinish() async throws { + let store = TestStore( + initialState: RestoreState(), + reducer: restoreReducer, + environment: .unimplemented + ) + + await store.send(.finished) + } +} diff --git a/Examples/xx-messenger/Tests/WelcomeFeatureTests/WelcomeFeatureTests.swift b/Examples/xx-messenger/Tests/WelcomeFeatureTests/WelcomeFeatureTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..eb6b08566af0f4193c10b5167271bd86b2897330 --- /dev/null +++ b/Examples/xx-messenger/Tests/WelcomeFeatureTests/WelcomeFeatureTests.swift @@ -0,0 +1,74 @@ +import ComposableArchitecture +import XCTest +@testable import WelcomeFeature + +@MainActor +final class WelcomeFeatureTests: XCTestCase { + func testNewAccountTapped() { + let store = TestStore( + initialState: WelcomeState(), + reducer: welcomeReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + var messengerDidCreate = false + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.messenger.create.run = { messengerDidCreate = true } + + store.send(.newAccountTapped) { + $0.isCreatingAccount = true + } + + bgQueue.advance() + + XCTAssertTrue(messengerDidCreate) + + mainQueue.advance() + + store.receive(.finished) { + $0.isCreatingAccount = false + } + } + + func testNewAccountTappedMessengerCreateFailure() { + let store = TestStore( + initialState: WelcomeState(), + reducer: welcomeReducer, + environment: .unimplemented + ) + + let mainQueue = DispatchQueue.test + let bgQueue = DispatchQueue.test + struct Error: Swift.Error, Equatable {} + let error = Error() + + store.environment.mainQueue = mainQueue.eraseToAnyScheduler() + store.environment.bgQueue = bgQueue.eraseToAnyScheduler() + store.environment.messenger.create.run = { throw error } + + store.send(.newAccountTapped) { + $0.isCreatingAccount = true + } + + bgQueue.advance() + mainQueue.advance() + + store.receive(.failed(error.localizedDescription)) { + $0.isCreatingAccount = false + } + } + + func testRestore() { + let store = TestStore( + initialState: WelcomeState(), + reducer: welcomeReducer, + environment: .unimplemented + ) + + store.send(.restoreTapped) + } +} diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/contents.xcworkspacedata b/Examples/xx-messenger/XXMessenger.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000000000000000000000000000000000..b101ba6c89faef725536d6bee514440ad3b906db --- /dev/null +++ b/Examples/xx-messenger/XXMessenger.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "group:"> + </FileRef> + <FileRef + location = "group:Project/XXMessenger.xcodeproj"> + </FileRef> +</Workspace> diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000000000000000000000000000000000..18d981003d68d0546c4804ac2ff47dd97c6e7921 --- /dev/null +++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IDEDidComputeMac32BitWarning</key> + <true/> +</dict> +</plist> diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000000000000000000000000000000000..08de0be8d3c8c1786ebe04545dd772526853eef4 --- /dev/null +++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key> + <false/> +</dict> +</plist> diff --git a/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000000000000000000000000000000000000..c330aa9448492ecb8f33d3b05ee260fe3897d417 --- /dev/null +++ b/Examples/xx-messenger/XXMessenger.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,104 @@ +{ + "pins" : [ + { + "identity" : "client-ios-db", + "kind" : "remoteSourceControl", + "location" : "https://git.xx.network/elixxir/client-ios-db.git", + "state" : { + "revision" : "f8e3e0088de8301d6c4816e12f0aca1d6f02a280", + "version" : "1.1.0" + } + }, + { + "identity" : "combine-schedulers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/combine-schedulers", + "state" : { + "revision" : "8fee20f993e64bbbf22bc3e3f444758ac2d05692", + "version" : "0.7.2" + } + }, + { + "identity" : "grdb.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/groue/GRDB.swift", + "state" : { + "revision" : "23f4254ae36fa19aecd73047c0577a9f49850d1c", + "version" : "5.26.0" + } + }, + { + "identity" : "keychainaccess", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git", + "state" : { + "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", + "version" : "4.2.2" + } + }, + { + "identity" : "swift-case-paths", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-case-paths", + "state" : { + "revision" : "a09839348486db8866f85a727b8550be1d671c50", + "version" : "0.9.1" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "48254824bb4248676bf7ce56014ff57b142b77eb", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-composable-architecture", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-composable-architecture.git", + "state" : { + "revision" : "108e3a536fcebb16c4f247ef92c2d7326baf9fe3", + "version" : "0.39.0" + } + }, + { + "identity" : "swift-composable-presentation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/darrarski/swift-composable-presentation.git", + "state" : { + "revision" : "1f4d17fae1f7ed41cbed17929083190fd9a78ee6", + "version" : "0.5.2" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "21ec1d717c07cea5a026979cb0471dd95c7087e7", + "version" : "0.5.0" + } + }, + { + "identity" : "swift-identified-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-identified-collections", + "state" : { + "revision" : "2d6b7ffcc67afd9077fac5e5a29bcd6d39b71076", + "version" : "0.4.0" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay.git", + "state" : { + "revision" : "38bc9242e4388b80bd23ddfdf3071428859e3260", + "version" : "0.4.0" + } + } + ], + "version" : 2 +}