Add template to xcodegen, fix build and tests

This commit is contained in:
Stefan Ceriu
2022-05-12 12:30:24 +03:00
committed by Stefan Ceriu
parent b74f6c41a2
commit abca946a23
15 changed files with 240 additions and 77 deletions

View File

@@ -15,7 +15,6 @@
//
import SwiftUI
import CommonKit
struct TemplateSimpleScreenCoordinatorParameters {
let promptType: TemplateSimpleScreenPromptType
@@ -42,14 +41,13 @@ final class TemplateSimpleScreenCoordinator: Coordinator, Presentable {
// MARK: - Setup
@available(iOS 14.0, *)
init(parameters: TemplateSimpleScreenCoordinatorParameters) {
self.parameters = parameters
let viewModel = TemplateSimpleScreenViewModel(promptType: parameters.promptType)
let view = TemplateSimpleScreen(viewModel: viewModel.context)
let view = TemplateSimpleScreen(context: viewModel.context)
templateSimpleScreenViewModel = viewModel
templateSimpleScreenHostingController = VectorHostingController(rootView: view)
templateSimpleScreenHostingController = UIHostingController(rootView: view)
indicatorPresenter = UserIndicatorTypePresenter(presentingViewController: templateSimpleScreenHostingController)
}
@@ -75,7 +73,7 @@ final class TemplateSimpleScreenCoordinator: Coordinator, Presentable {
/// - Parameters:
/// - label: The label to show on the indicator.
/// - isInteractionBlocking: Whether the indicator should block any user interaction.
private func startLoading(label: String = VectorL10n.loading, isInteractionBlocking: Bool = true) {
private func startLoading(label: String = ElementL10n.loading, isInteractionBlocking: Bool = true) {
loadingIndicator = indicatorPresenter.present(.loading(label: label, isInteractionBlocking: isInteractionBlocking))
}

View File

@@ -29,18 +29,18 @@ extension TemplateSimpleScreenPromptType: Identifiable, CaseIterable {
var title: String {
switch self {
case .regular:
return VectorL10n.roomCreationMakePublicPromptTitle
return "Make this chat public?"
case .upgrade:
return VectorL10n.roomDetailsHistorySectionPromptTitle
return "Privacy warning"
}
}
var image: ImageAsset {
var imageSystemName: String {
switch self {
case .regular:
return Asset.Images.appSymbol
return "app.gift"
case .upgrade:
return Asset.Images.keyVerificationSuccessShield
return "shield"
}
}
}

View File

@@ -16,14 +16,10 @@
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 {
@@ -32,7 +28,7 @@ struct TemplateSimpleScreen: View {
// MARK: Public
@ObservedObject var viewModel: TemplateSimpleScreenViewModel.Context
@ObservedObject var context: TemplateSimpleScreenViewModel.Context
// MARK: Views
@@ -50,52 +46,43 @@ struct TemplateSimpleScreen: View {
.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)
Text(context.viewState.promptType.title)
.accessibilityIdentifier("title")
Image(viewModel.viewState.promptType.image.name)
Image(systemName: context.viewState.promptType.imageSystemName)
.resizable()
.scaledToFit()
.frame(width:100)
.foregroundColor(theme.colors.accent)
HStack{
Text("Counter: \(viewModel.viewState.count)")
.foregroundColor(theme.colors.primaryContent)
Text("Counter: \(context.viewState.count)")
Button("-") {
viewModel.send(viewAction: .decrementCount)
context.send(viewAction: .decrementCount)
}
Button("+") {
viewModel.send(viewAction: .incrementCount)
context.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: {
Button { context.send(viewAction: .accept) } label: {
Text("Accept")
.font(theme.fonts.bodySB)
}
.buttonStyle(PrimaryActionButtonStyle())
.frame(maxWidth: .infinity)
Button { viewModel.send(viewAction: .cancel) } label: {
Button { context.send(viewAction: .cancel) } label: {
Text("Cancel")
.font(theme.fonts.body)
.padding(.vertical, 12)
}
}
@@ -104,10 +91,15 @@ struct TemplateSimpleScreen: View {
// MARK: - Previews
@available(iOS 14.0, *)
struct TemplateSimpleScreen_Previews: PreviewProvider {
static let stateRenderer = MockTemplateSimpleScreenScreenState.stateRenderer
static var previews: some View {
stateRenderer.screenGroup()
Group {
let viewModel = TemplateSimpleScreenViewModel(promptType: .regular)
TemplateSimpleScreen(context: viewModel.context)
}
Group {
let viewModel = TemplateSimpleScreenViewModel(promptType: .upgrade)
TemplateSimpleScreen(context: viewModel.context)
}
}
}

View File

@@ -15,31 +15,26 @@
//
import XCTest
import RiotSwiftUI
import ElementX
@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) {
class TemplateSimpleScreenUITests: XCTestCase {
func testRegularScreen() {
let app = Application.launch()
app.goToScreenWithIdentifier("Simple Screen - Regular")
let title = app.staticTexts["title"]
XCTAssert(title.exists)
XCTAssertEqual(title.label, promptType.title)
XCTAssertEqual(title.label, "Make this chat public?")
}
func testUpgradeScreen() {
let app = Application.launch()
app.goToScreenWithIdentifier("Simple Screen - Upgrade")
let title = app.staticTexts["title"]
XCTAssert(title.exists)
XCTAssertEqual(title.label, "Privacy warning")
}
}

View File

@@ -16,9 +16,8 @@
import XCTest
@testable import RiotSwiftUI
@testable import ElementX
@available(iOS 14.0, *)
class TemplateSimpleScreenViewModelTests: XCTestCase {
private enum Constants {
static let counterInitialValue = 0