Initial setup.
@ -1,10 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1320"
|
LastUpgradeVersion = "1200"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES"
|
||||||
|
runPostActionsOnFailure = "NO">
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
@ -14,7 +15,7 @@
|
|||||||
buildForAnalyzing = "YES">
|
buildForAnalyzing = "YES">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "1850252327B6918C002E6B18"
|
BlueprintIdentifier = "C0FAEB81CFD9776CD78CE489"
|
||||||
BuildableName = "ElementX.app"
|
BuildableName = "ElementX.app"
|
||||||
BlueprintName = "ElementX"
|
BlueprintName = "ElementX"
|
||||||
ReferencedContainer = "container:ElementX.xcodeproj">
|
ReferencedContainer = "container:ElementX.xcodeproj">
|
||||||
@ -26,30 +27,31 @@
|
|||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
onlyGenerateCoverageForSpecifiedTargets = "NO"
|
||||||
codeCoverageEnabled = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
<Testables>
|
<Testables>
|
||||||
<TestableReference
|
<TestableReference
|
||||||
skipped = "NO">
|
skipped = "NO">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "1850253927B6918D002E6B18"
|
BlueprintIdentifier = "32C23C8D224D46EFE62AFAD0"
|
||||||
BuildableName = "ElementXTests.xctest"
|
BuildableName = "UnitTests.xctest"
|
||||||
BlueprintName = "ElementXTests"
|
BlueprintName = "UnitTests"
|
||||||
ReferencedContainer = "container:ElementX.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</TestableReference>
|
|
||||||
<TestableReference
|
|
||||||
skipped = "NO">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "1850254327B6918D002E6B18"
|
|
||||||
BuildableName = "ElementXUITests.xctest"
|
|
||||||
BlueprintName = "ElementXUITests"
|
|
||||||
ReferencedContainer = "container:ElementX.xcodeproj">
|
ReferencedContainer = "container:ElementX.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</TestableReference>
|
</TestableReference>
|
||||||
</Testables>
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C0FAEB81CFD9776CD78CE489"
|
||||||
|
BuildableName = "ElementX.app"
|
||||||
|
BlueprintName = "ElementX"
|
||||||
|
ReferencedContainer = "container:ElementX.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
<CommandLineArguments>
|
||||||
|
</CommandLineArguments>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
<LaunchAction
|
<LaunchAction
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
@ -65,12 +67,14 @@
|
|||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "1850252327B6918C002E6B18"
|
BlueprintIdentifier = "C0FAEB81CFD9776CD78CE489"
|
||||||
BuildableName = "ElementX.app"
|
BuildableName = "ElementX.app"
|
||||||
BlueprintName = "ElementX"
|
BlueprintName = "ElementX"
|
||||||
ReferencedContainer = "container:ElementX.xcodeproj">
|
ReferencedContainer = "container:ElementX.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
<CommandLineArguments>
|
||||||
|
</CommandLineArguments>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
@ -82,12 +86,14 @@
|
|||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "1850252327B6918C002E6B18"
|
BlueprintIdentifier = "C0FAEB81CFD9776CD78CE489"
|
||||||
BuildableName = "ElementX.app"
|
BuildableName = "ElementX.app"
|
||||||
BlueprintName = "ElementX"
|
BlueprintName = "ElementX"
|
||||||
ReferencedContainer = "container:ElementX.xcodeproj">
|
ReferencedContainer = "container:ElementX.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
<CommandLineArguments>
|
||||||
|
</CommandLineArguments>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
<AnalyzeAction
|
<AnalyzeAction
|
||||||
buildConfiguration = "Debug">
|
buildConfiguration = "Debug">
|
||||||
|
31
ElementX/Config/Common.xcconfig
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2020 Vector Creations Ltd
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Configuration settings file format documentation can be found at:
|
||||||
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
|
PRODUCT_NAME = ElementX
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = io.element.elementx
|
||||||
|
DEVELOPMENT_TEAM = 7J4U792NQT
|
||||||
|
|
||||||
|
MARKETING_VERSION = 1.0.0
|
||||||
|
CURRENT_PROJECT_VERSION = 1.0.0
|
||||||
|
|
||||||
|
INFOPLIST_FILE = ElementX/SupportingFiles/Info.plist
|
||||||
|
|
||||||
|
CODE_SIGN_ENTITLEMENTS = ElementX/SupportingFiles/ElementX.entitlements
|
||||||
|
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = ElementX/SupportingFiles/ElementX-Bridging-Header.h
|
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright 2021 New Vector Ltd
|
// Copyright 2020 Vector Creations Ltd
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
// you may not use this file except in compliance with the License.
|
// you may not use this file except in compliance with the License.
|
||||||
@ -14,11 +14,7 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
// Configuration settings file format documentation can be found at:
|
||||||
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
protocol TemplateSimpleScreenViewModelProtocol {
|
#include "Common.xcconfig"
|
||||||
|
|
||||||
var completion: ((TemplateSimpleScreenViewModelResult) -> Void)? { get set }
|
|
||||||
@available(iOS 14, *)
|
|
||||||
var context: TemplateSimpleScreenViewModelType.Context { get }
|
|
||||||
}
|
|
20
ElementX/Config/Release.xcconfig
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2020 Vector Creations Ltd
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Configuration settings file format documentation can be found at:
|
||||||
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
|
#include "Common.xcconfig"
|
@ -1,64 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
struct TemplateSimpleScreenCoordinatorParameters {
|
|
||||||
let promptType: TemplateSimpleScreenPromptType
|
|
||||||
}
|
|
||||||
|
|
||||||
final class TemplateSimpleScreenCoordinator: Coordinator, Presentable {
|
|
||||||
|
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
// MARK: Private
|
|
||||||
|
|
||||||
private let parameters: TemplateSimpleScreenCoordinatorParameters
|
|
||||||
private let templateSimpleScreenHostingController: UIViewController
|
|
||||||
private var templateSimpleScreenViewModel: TemplateSimpleScreenViewModelProtocol
|
|
||||||
|
|
||||||
// MARK: Public
|
|
||||||
|
|
||||||
// Must be used only internally
|
|
||||||
var childCoordinators: [Coordinator] = []
|
|
||||||
var completion: ((TemplateSimpleScreenViewModelResult) -> Void)?
|
|
||||||
|
|
||||||
// MARK: - Setup
|
|
||||||
|
|
||||||
@available(iOS 14.0, *)
|
|
||||||
init(parameters: TemplateSimpleScreenCoordinatorParameters) {
|
|
||||||
self.parameters = parameters
|
|
||||||
|
|
||||||
let viewModel = TemplateSimpleScreenViewModel(promptType: parameters.promptType)
|
|
||||||
let view = TemplateSimpleScreen(viewModel: viewModel.context)
|
|
||||||
templateSimpleScreenViewModel = viewModel
|
|
||||||
templateSimpleScreenHostingController = VectorHostingController(rootView: view)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Public
|
|
||||||
func start() {
|
|
||||||
MXLog.debug("[TemplateSimpleScreenCoordinator] did start.")
|
|
||||||
templateSimpleScreenViewModel.completion = { [weak self] result in
|
|
||||||
MXLog.debug("[TemplateSimpleScreenCoordinator] TemplateSimpleScreenViewModel did complete with result: \(result).")
|
|
||||||
guard let self = self else { return }
|
|
||||||
self.completion?(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func toPresentable() -> UIViewController {
|
|
||||||
return self.templateSimpleScreenHostingController
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
/// Using an enum for the screen allows you define the different state cases with
|
|
||||||
/// the relevant associated data for each case.
|
|
||||||
@available(iOS 14.0, *)
|
|
||||||
enum MockTemplateSimpleScreenScreenState: MockScreenState, CaseIterable {
|
|
||||||
// A case for each state you want to represent
|
|
||||||
// with specific, minimal associated data that will allow you
|
|
||||||
// mock that screen.
|
|
||||||
case promptType(TemplateSimpleScreenPromptType)
|
|
||||||
|
|
||||||
/// The associated screen
|
|
||||||
var screenType: Any.Type {
|
|
||||||
TemplateSimpleScreen.self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A list of screen state definitions
|
|
||||||
static var allCases: [MockTemplateSimpleScreenScreenState] {
|
|
||||||
// Each of the presence statuses
|
|
||||||
TemplateSimpleScreenPromptType.allCases.map(MockTemplateSimpleScreenScreenState.promptType)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Generate the view struct for the screen state.
|
|
||||||
var screenView: ([Any], AnyView) {
|
|
||||||
let promptType: TemplateSimpleScreenPromptType
|
|
||||||
switch self {
|
|
||||||
case .promptType(let type):
|
|
||||||
promptType = type
|
|
||||||
}
|
|
||||||
let viewModel = TemplateSimpleScreenViewModel(promptType: promptType)
|
|
||||||
|
|
||||||
// can simulate service and viewModel actions here if needs be.
|
|
||||||
|
|
||||||
return (
|
|
||||||
[promptType, viewModel],
|
|
||||||
AnyView(TemplateSimpleScreen(viewModel: viewModel.context)
|
|
||||||
.addDependency(MockAvatarService.example))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
// MARK: - Coordinator
|
|
||||||
|
|
||||||
enum TemplateSimpleScreenPromptType {
|
|
||||||
case regular
|
|
||||||
case upgrade
|
|
||||||
}
|
|
||||||
|
|
||||||
extension TemplateSimpleScreenPromptType: Identifiable, CaseIterable {
|
|
||||||
var id: Self { self }
|
|
||||||
|
|
||||||
var title: String {
|
|
||||||
switch self {
|
|
||||||
case .regular:
|
|
||||||
return VectorL10n.roomCreationMakePublicPromptTitle
|
|
||||||
case .upgrade:
|
|
||||||
return VectorL10n.roomDetailsHistorySectionPromptTitle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var image: ImageAsset {
|
|
||||||
switch self {
|
|
||||||
case .regular:
|
|
||||||
return Asset.Images.appSymbol
|
|
||||||
case .upgrade:
|
|
||||||
return Asset.Images.keyVerificationSuccessShield
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: View model
|
|
||||||
|
|
||||||
enum TemplateSimpleScreenViewModelResult {
|
|
||||||
case accept
|
|
||||||
case cancel
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: View
|
|
||||||
|
|
||||||
struct TemplateSimpleScreenViewState: BindableState {
|
|
||||||
var promptType: TemplateSimpleScreenPromptType
|
|
||||||
var count: Int
|
|
||||||
}
|
|
||||||
|
|
||||||
enum TemplateSimpleScreenViewAction {
|
|
||||||
case incrementCount
|
|
||||||
case decrementCount
|
|
||||||
case accept
|
|
||||||
case cancel
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
@available(iOS 14, *)
|
|
||||||
typealias TemplateSimpleScreenViewModelType = StateStoreViewModel<TemplateSimpleScreenViewState,
|
|
||||||
Never,
|
|
||||||
TemplateSimpleScreenViewAction>
|
|
||||||
@available(iOS 14, *)
|
|
||||||
class TemplateSimpleScreenViewModel: TemplateSimpleScreenViewModelType, TemplateSimpleScreenViewModelProtocol {
|
|
||||||
|
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
// MARK: Private
|
|
||||||
|
|
||||||
// MARK: Public
|
|
||||||
|
|
||||||
var completion: ((TemplateSimpleScreenViewModelResult) -> Void)?
|
|
||||||
|
|
||||||
// MARK: - Setup
|
|
||||||
|
|
||||||
init(promptType: TemplateSimpleScreenPromptType, initialCount: Int = 0) {
|
|
||||||
super.init(initialViewState: TemplateSimpleScreenViewState(promptType: promptType, count: 0))
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Public
|
|
||||||
|
|
||||||
override func process(viewAction: TemplateSimpleScreenViewAction) {
|
|
||||||
switch viewAction {
|
|
||||||
case .accept:
|
|
||||||
completion?(.accept)
|
|
||||||
case .cancel:
|
|
||||||
completion?(.cancel)
|
|
||||||
case .incrementCount:
|
|
||||||
state.count += 1
|
|
||||||
case .decrementCount:
|
|
||||||
state.count -= 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
import RiotSwiftUI
|
|
||||||
|
|
||||||
@available(iOS 14.0, *)
|
|
||||||
class TemplateSimpleScreenUITests: MockScreenTest {
|
|
||||||
|
|
||||||
override class var screenType: MockScreenState.Type {
|
|
||||||
return MockTemplateSimpleScreenScreenState.self
|
|
||||||
}
|
|
||||||
|
|
||||||
override class func createTest() -> MockScreenTest {
|
|
||||||
return TemplateSimpleScreenUITests(selector: #selector(verifyTemplateSimpleScreenScreen))
|
|
||||||
}
|
|
||||||
|
|
||||||
func verifyTemplateSimpleScreenScreen() throws {
|
|
||||||
guard let screenState = screenState as? MockTemplateSimpleScreenScreenState else { fatalError("no screen") }
|
|
||||||
switch screenState {
|
|
||||||
case .promptType(let promptType):
|
|
||||||
verifyTemplateSimpleScreenPromptType(promptType: promptType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func verifyTemplateSimpleScreenPromptType(promptType: TemplateSimpleScreenPromptType) {
|
|
||||||
let title = app.staticTexts["title"]
|
|
||||||
XCTAssert(title.exists)
|
|
||||||
XCTAssertEqual(title.label, promptType.title)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import XCTest
|
|
||||||
|
|
||||||
@testable import RiotSwiftUI
|
|
||||||
|
|
||||||
@available(iOS 14.0, *)
|
|
||||||
class TemplateSimpleScreenViewModelTests: XCTestCase {
|
|
||||||
private enum Constants {
|
|
||||||
static let counterInitialValue = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
var viewModel: TemplateSimpleScreenViewModelProtocol!
|
|
||||||
var context: TemplateSimpleScreenViewModelType.Context!
|
|
||||||
|
|
||||||
override func setUpWithError() throws {
|
|
||||||
viewModel = TemplateSimpleScreenViewModel(promptType: .regular, initialCount: Constants.counterInitialValue)
|
|
||||||
context = viewModel.context
|
|
||||||
}
|
|
||||||
|
|
||||||
func testInitialState() {
|
|
||||||
XCTAssertEqual(context.viewState.count, Constants.counterInitialValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testCounter() throws {
|
|
||||||
context.send(viewAction: .incrementCount)
|
|
||||||
XCTAssertEqual(context.viewState.count, 1)
|
|
||||||
|
|
||||||
context.send(viewAction: .incrementCount)
|
|
||||||
XCTAssertEqual(context.viewState.count, 2)
|
|
||||||
|
|
||||||
context.send(viewAction: .decrementCount)
|
|
||||||
XCTAssertEqual(context.viewState.count, 1)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,113 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2021 New Vector Ltd
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
@available(iOS 14.0, *)
|
|
||||||
struct TemplateSimpleScreen: View {
|
|
||||||
|
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
// MARK: Private
|
|
||||||
|
|
||||||
@Environment(\.theme) private var theme
|
|
||||||
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
|
|
||||||
|
|
||||||
private var horizontalPadding: CGFloat {
|
|
||||||
horizontalSizeClass == .regular ? 50 : 16
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: Public
|
|
||||||
|
|
||||||
@ObservedObject var viewModel: TemplateSimpleScreenViewModel.Context
|
|
||||||
|
|
||||||
// MARK: Views
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
GeometryReader { geometry in
|
|
||||||
VStack {
|
|
||||||
ScrollView(showsIndicators: false) {
|
|
||||||
mainContent
|
|
||||||
.padding(.top, 50)
|
|
||||||
.padding(.horizontal, horizontalPadding)
|
|
||||||
}
|
|
||||||
|
|
||||||
buttons
|
|
||||||
.padding(.horizontal, horizontalPadding)
|
|
||||||
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.background(theme.colors.background.ignoresSafeArea())
|
|
||||||
.accentColor(theme.colors.accent)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The main content of the view to be shown in a scroll view.
|
|
||||||
var mainContent: some View {
|
|
||||||
VStack(spacing: 36) {
|
|
||||||
Text(viewModel.viewState.promptType.title)
|
|
||||||
.font(theme.fonts.title1B)
|
|
||||||
.foregroundColor(theme.colors.primaryContent)
|
|
||||||
.accessibilityIdentifier("title")
|
|
||||||
|
|
||||||
Image(viewModel.viewState.promptType.image.name)
|
|
||||||
.resizable()
|
|
||||||
.scaledToFit()
|
|
||||||
.frame(width: 100)
|
|
||||||
.foregroundColor(theme.colors.accent)
|
|
||||||
|
|
||||||
HStack {
|
|
||||||
Text("Counter: \(viewModel.viewState.count)")
|
|
||||||
.foregroundColor(theme.colors.primaryContent)
|
|
||||||
|
|
||||||
Button("-") {
|
|
||||||
viewModel.send(viewAction: .decrementCount)
|
|
||||||
}
|
|
||||||
|
|
||||||
Button("+") {
|
|
||||||
viewModel.send(viewAction: .incrementCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.font(theme.fonts.title3)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The action buttons shown at the bottom of the view.
|
|
||||||
var buttons: some View {
|
|
||||||
VStack {
|
|
||||||
Button { viewModel.send(viewAction: .accept) } label: {
|
|
||||||
Text("Accept")
|
|
||||||
.font(theme.fonts.bodySB)
|
|
||||||
}
|
|
||||||
.buttonStyle(PrimaryActionButtonStyle())
|
|
||||||
|
|
||||||
Button { viewModel.send(viewAction: .cancel) } label: {
|
|
||||||
Text("Cancel")
|
|
||||||
.font(theme.fonts.body)
|
|
||||||
.padding(.vertical, 12)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Previews
|
|
||||||
|
|
||||||
@available(iOS 14.0, *)
|
|
||||||
struct TemplateSimpleScreen_Previews: PreviewProvider {
|
|
||||||
static let stateRenderer = MockTemplateSimpleScreenScreenState.stateRenderer
|
|
||||||
static var previews: some View {
|
|
||||||
stateRenderer.screenGroup()
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"colors" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
<?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">
|
|
||||||
<!--
|
|
||||||
Info.plist
|
|
||||||
ElementX
|
|
||||||
|
|
||||||
Created by Stefan Ceriu on 24.02.2022.
|
|
||||||
Copyright (c) 2022 Element. All rights reserved.
|
|
||||||
-->
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict/>
|
|
||||||
</plist>
|
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 778 KiB After Width: | Height: | Size: 778 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 440 KiB After Width: | Height: | Size: 440 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
24
ElementX/SupportingFiles/Info.plist
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?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>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
37
ElementX/target.yml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
name: ElementX
|
||||||
|
|
||||||
|
targets:
|
||||||
|
ElementX:
|
||||||
|
type: application
|
||||||
|
platform: iOS
|
||||||
|
|
||||||
|
info:
|
||||||
|
path: SupportingFiles/Info.plist
|
||||||
|
properties:
|
||||||
|
UILaunchStoryboardName: LaunchScreen
|
||||||
|
|
||||||
|
settings:
|
||||||
|
SUPPORTS_MACCATALYST: YES
|
||||||
|
|
||||||
|
configFiles:
|
||||||
|
Debug: Config/Debug.xcconfig
|
||||||
|
Release: Config/Release.xcconfig
|
||||||
|
|
||||||
|
scheme:
|
||||||
|
testTargets:
|
||||||
|
- UnitTests
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- package: MatrixRustSDK
|
||||||
|
- package: DTCoreText
|
||||||
|
- package: KeychainAccess
|
||||||
|
- package: Kingfisher
|
||||||
|
- package: Introspect
|
||||||
|
- package: SwiftyBeaver
|
||||||
|
|
||||||
|
sources:
|
||||||
|
- path: Config
|
||||||
|
- path: Sources
|
||||||
|
excludes:
|
||||||
|
- Screens/Templates
|
||||||
|
- path: SupportingFiles
|
22
UnitTests/Config/Common.xcconfig
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2020 Vector Creations Ltd
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Configuration settings file format documentation can be found at:
|
||||||
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
|
PRODUCT_NAME = UnitTests
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = io.element.elementx.unittests
|
||||||
|
|
20
UnitTests/Config/Debug.xcconfig
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2020 Vector Creations Ltd
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Configuration settings file format documentation can be found at:
|
||||||
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
|
#include "Common.xcconfig"
|
20
UnitTests/Config/Release.xcconfig
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2020 Vector Creations Ltd
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Configuration settings file format documentation can be found at:
|
||||||
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
|
#include "Common.xcconfig"
|
17
UnitTests/target.yml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
name: UnitTests
|
||||||
|
|
||||||
|
targets:
|
||||||
|
UnitTests:
|
||||||
|
type: bundle.unit-test
|
||||||
|
platform: iOS
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- target: ElementX
|
||||||
|
|
||||||
|
configFiles:
|
||||||
|
Debug: Config/Debug.xcconfig
|
||||||
|
Release: Config/Release.xcconfig
|
||||||
|
|
||||||
|
sources:
|
||||||
|
- path: Config
|
||||||
|
- path: Sources
|
31
project.yml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
name: ElementX
|
||||||
|
attributes:
|
||||||
|
ORGANIZATIONNAME: element.io
|
||||||
|
|
||||||
|
options:
|
||||||
|
groupSortPosition: bottom
|
||||||
|
createIntermediateGroups: true
|
||||||
|
|
||||||
|
include:
|
||||||
|
- path: ElementX/target.yml
|
||||||
|
- path: UnitTests/target.yml
|
||||||
|
|
||||||
|
packages:
|
||||||
|
MatrixRustSDK:
|
||||||
|
url: https://github.com/matrix-org/matrix-rust-components-swift.git
|
||||||
|
branch: main
|
||||||
|
DTCoreText:
|
||||||
|
url: https://github.com/Cocoanetics/DTCoreText
|
||||||
|
branch: develop
|
||||||
|
KeychainAccess:
|
||||||
|
url: https://github.com/kishikawakatsumi/KeychainAccess
|
||||||
|
branch: master
|
||||||
|
Kingfisher:
|
||||||
|
url: https://github.com/onevcat/Kingfisher
|
||||||
|
exactVersion: 7.2.0
|
||||||
|
Introspect:
|
||||||
|
url: https://github.com/siteline/SwiftUI-Introspect.git
|
||||||
|
branch: master
|
||||||
|
SwiftyBeaver:
|
||||||
|
url: https://github.com/SwiftyBeaver/SwiftyBeaver
|
||||||
|
exactVersion: 1.9.5
|