Add Screen suffix to all screens. (#125)

This commit is contained in:
Doug
2022-06-30 16:48:46 +01:00
committed by GitHub
parent 0c21e0ddcb
commit e27f37c69f
20 changed files with 141 additions and 136 deletions

View File

@@ -16,54 +16,54 @@
import SwiftUI
struct TemplateSimpleScreenCoordinatorParameters {
let promptType: TemplateSimpleScreenPromptType
struct TemplateCoordinatorParameters {
let promptType: TemplatePromptType
}
enum TemplateSimpleScreenCoordinatorAction {
enum TemplateCoordinatorAction {
case accept
case cancel
}
final class TemplateSimpleScreenCoordinator: Coordinator, Presentable {
final class TemplateCoordinator: Coordinator, Presentable {
// MARK: - Properties
// MARK: Private
private let parameters: TemplateSimpleScreenCoordinatorParameters
private let templateSimpleScreenHostingController: UIViewController
private var templateSimpleScreenViewModel: TemplateSimpleScreenViewModelProtocol
private let parameters: TemplateCoordinatorParameters
private let templateHostingController: UIViewController
private var templateViewModel: TemplateViewModelProtocol
private var indicatorPresenter: UserIndicatorTypePresenterProtocol
private var loadingIndicator: UserIndicator?
private var activityIndicator: UserIndicator?
// MARK: Public
// Must be used only internally
var childCoordinators: [Coordinator] = []
var callback: ((TemplateSimpleScreenCoordinatorAction) -> Void)?
var callback: ((TemplateCoordinatorAction) -> Void)?
// MARK: - Setup
init(parameters: TemplateSimpleScreenCoordinatorParameters) {
init(parameters: TemplateCoordinatorParameters) {
self.parameters = parameters
let viewModel = TemplateSimpleScreenViewModel(promptType: parameters.promptType)
let view = TemplateSimpleScreen(context: viewModel.context)
templateSimpleScreenViewModel = viewModel
templateSimpleScreenHostingController = UIHostingController(rootView: view)
let viewModel = TemplateViewModel(promptType: parameters.promptType)
let view = TemplateScreen(context: viewModel.context)
templateViewModel = viewModel
templateHostingController = UIHostingController(rootView: view)
indicatorPresenter = UserIndicatorTypePresenter(presentingViewController: templateSimpleScreenHostingController)
indicatorPresenter = UserIndicatorTypePresenter(presentingViewController: templateHostingController)
}
// MARK: - Public
func start() {
MXLog.debug("[TemplateSimpleScreenCoordinator] did start.")
templateSimpleScreenViewModel.callback = { [weak self] action in
MXLog.debug("[TemplateCoordinator] did start.")
templateViewModel.callback = { [weak self] action in
guard let self = self else { return }
MXLog.debug("[TemplateSimpleScreenCoordinator] TemplateSimpleScreenViewModel did complete with result: \(action).")
MXLog.debug("[TemplateCoordinator] TemplateViewModel did complete with result: \(action).")
switch action {
case .accept:
self.callback?(.accept)
@@ -74,7 +74,7 @@ final class TemplateSimpleScreenCoordinator: Coordinator, Presentable {
}
func toPresentable() -> UIViewController {
templateSimpleScreenHostingController
templateHostingController
}
// MARK: - Private
@@ -84,11 +84,11 @@ final class TemplateSimpleScreenCoordinator: Coordinator, Presentable {
/// - label: The label to show on the indicator.
/// - isInteractionBlocking: Whether the indicator should block any user interaction.
private func startLoading(label: String = ElementL10n.loading, isInteractionBlocking: Bool = true) {
loadingIndicator = indicatorPresenter.present(.loading(label: label, isInteractionBlocking: isInteractionBlocking))
activityIndicator = indicatorPresenter.present(.loading(label: label, isInteractionBlocking: isInteractionBlocking))
}
/// Hide the currently displayed activity indicator.
private func stopLoading() {
loadingIndicator = nil
activityIndicator = nil
}
}

View File

@@ -18,12 +18,12 @@ import Foundation
// MARK: - Coordinator
enum TemplateSimpleScreenPromptType {
enum TemplatePromptType {
case regular
case upgrade
}
extension TemplateSimpleScreenPromptType: Identifiable, CaseIterable {
extension TemplatePromptType: Identifiable, CaseIterable {
var id: Self { self }
var title: String {
@@ -47,19 +47,19 @@ extension TemplateSimpleScreenPromptType: Identifiable, CaseIterable {
// MARK: View model
enum TemplateSimpleScreenViewModelAction {
enum TemplateViewModelAction {
case accept
case cancel
}
// MARK: View
struct TemplateSimpleScreenViewState: BindableState {
var promptType: TemplateSimpleScreenPromptType
struct TemplateViewState: BindableState {
var promptType: TemplatePromptType
var count: Int
}
enum TemplateSimpleScreenViewAction {
enum TemplateViewAction {
case incrementCount
case decrementCount
case accept

View File

@@ -16,9 +16,9 @@
import SwiftUI
typealias TemplateSimpleScreenViewModelType = StateStoreViewModel<TemplateSimpleScreenViewState, TemplateSimpleScreenViewAction>
typealias TemplateViewModelType = StateStoreViewModel<TemplateViewState, TemplateViewAction>
class TemplateSimpleScreenViewModel: TemplateSimpleScreenViewModelType, TemplateSimpleScreenViewModelProtocol {
class TemplateViewModel: TemplateViewModelType, TemplateViewModelProtocol {
// MARK: - Properties
@@ -26,17 +26,17 @@ class TemplateSimpleScreenViewModel: TemplateSimpleScreenViewModelType, Template
// MARK: Public
var callback: ((TemplateSimpleScreenViewModelAction) -> Void)?
var callback: ((TemplateViewModelAction) -> Void)?
// MARK: - Setup
init(promptType: TemplateSimpleScreenPromptType, initialCount: Int = 0) {
super.init(initialViewState: TemplateSimpleScreenViewState(promptType: promptType, count: 0))
init(promptType: TemplatePromptType, initialCount: Int = 0) {
super.init(initialViewState: TemplateViewState(promptType: promptType, count: 0))
}
// MARK: - Public
override func process(viewAction: TemplateSimpleScreenViewAction) async {
override func process(viewAction: TemplateViewAction) async {
switch viewAction {
case .accept:
callback?(.accept)

View File

@@ -17,7 +17,7 @@
import Foundation
@MainActor
protocol TemplateSimpleScreenViewModelProtocol {
var callback: ((TemplateSimpleScreenViewModelAction) -> Void)? { get set }
var context: TemplateSimpleScreenViewModelType.Context { get }
protocol TemplateViewModelProtocol {
var callback: ((TemplateViewModelAction) -> Void)? { get set }
var context: TemplateViewModelType.Context { get }
}

View File

@@ -16,35 +16,35 @@
import SwiftUI
struct TemplateSimpleScreen: View {
struct TemplateScreen: View {
// MARK: Private
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@Environment(\.colorScheme) private var colorScheme
private var horizontalPadding: CGFloat {
horizontalSizeClass == .regular ? 50 : 16
var counterColor: Color {
colorScheme == .light ? .element.secondaryContent : .element.tertiaryContent
}
// MARK: Public
@ObservedObject var context: TemplateSimpleScreenViewModel.Context
@ObservedObject var context: TemplateViewModel.Context
// MARK: Views
var body: some View {
GeometryReader { geometry in
VStack {
ScrollView {
mainContent
.padding(.top, 50)
.padding(.horizontal, horizontalPadding)
}
buttons
.padding(.horizontal, horizontalPadding)
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
}
ScrollView {
mainContent
.padding(.top, 50)
.padding(.horizontal)
.readableFrame()
}
.safeAreaInset(edge: .bottom) {
buttons
.padding(.horizontal)
.padding(.vertical)
.readableFrame()
.background(.regularMaterial)
}
}
@@ -52,6 +52,9 @@ struct TemplateSimpleScreen: View {
var mainContent: some View {
VStack(spacing: 36) {
Text(context.viewState.promptType.title)
.font(.element.title2B)
.multilineTextAlignment(.center)
.foregroundColor(.element.primaryContent)
.accessibilityIdentifier("title")
Image(systemName: context.viewState.promptType.imageSystemName)
@@ -61,14 +64,19 @@ struct TemplateSimpleScreen: View {
HStack {
Text("Counter: \(context.viewState.count)")
.font(.element.body)
.multilineTextAlignment(.center)
.foregroundColor(counterColor)
Button("-") {
Button("") {
context.send(viewAction: .decrementCount)
}
.buttonStyle(.elementGhost())
Button("+") {
context.send(viewAction: .incrementCount)
}
.buttonStyle(.elementGhost())
}
}
}
@@ -79,7 +87,7 @@ struct TemplateSimpleScreen: View {
Button { context.send(viewAction: .accept) } label: {
Text("Accept")
}
.frame(maxWidth: .infinity)
.buttonStyle(.elementAction(.xLarge))
Button { context.send(viewAction: .cancel) } label: {
Text("Cancel")
@@ -91,15 +99,15 @@ struct TemplateSimpleScreen: View {
// MARK: - Previews
struct TemplateSimpleScreen_Previews: PreviewProvider {
struct Template_Previews: PreviewProvider {
static var previews: some View {
Group {
let viewModel = TemplateSimpleScreenViewModel(promptType: .regular)
TemplateSimpleScreen(context: viewModel.context)
}
Group {
let viewModel = TemplateSimpleScreenViewModel(promptType: .upgrade)
TemplateSimpleScreen(context: viewModel.context)
let regularViewModel = TemplateViewModel(promptType: .regular)
TemplateScreen(context: regularViewModel.context)
let upgradeViewModel = TemplateViewModel(promptType: .upgrade)
TemplateScreen(context: upgradeViewModel.context)
}
.tint(.element.accent)
}
}

View File

@@ -17,7 +17,7 @@
import XCTest
import ElementX
class TemplateSimpleScreenUITests: XCTestCase {
class TemplateScreenUITests: XCTestCase {
func testRegularScreen() {
let app = Application.launch()
app.goToScreenWithIdentifier(.simpleRegular)

View File

@@ -19,16 +19,16 @@ import XCTest
@testable import ElementX
@MainActor
class TemplateSimpleScreenViewModelTests: XCTestCase {
class TemplateScreenViewModelTests: XCTestCase {
private enum Constants {
static let counterInitialValue = 0
}
var viewModel: TemplateSimpleScreenViewModelProtocol!
var context: TemplateSimpleScreenViewModelType.Context!
var viewModel: TemplateViewModelProtocol!
var context: TemplateViewModelType.Context!
@MainActor override func setUpWithError() throws {
viewModel = TemplateSimpleScreenViewModel(promptType: .regular, initialCount: Constants.counterInitialValue)
viewModel = TemplateViewModel(promptType: .regular, initialCount: Constants.counterInitialValue)
context = viewModel.context
}

View File

@@ -34,10 +34,10 @@ SCREEN_VAR_NAME=`echo $SCREEN_NAME | awk '{ print tolower(substr($0, 1, 1)) subs
function rename_files {
for file in $(find * -type f -print)
do
perl -p -i -e "s/TemplateSimpleScreen/"$SCREEN_NAME"/g" $file
perl -p -i -e "s/templateSimpleScreen/"$SCREEN_VAR_NAME"/g" $file
perl -p -i -e "s/Template/"$SCREEN_NAME"/g" $file
perl -p -i -e "s/template/"$SCREEN_VAR_NAME"/g" $file
mv ${file} ${file/TemplateSimpleScreen/$SCREEN_NAME}
mv ${file} ${file/Template/$SCREEN_NAME}
done
}
@@ -55,4 +55,4 @@ cd $UNIT_TESTS_DIR
rename_files
cd - > /dev/null
echo "Done"
echo "Done"