mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-05 20:09:04 +00:00
@@ -100,9 +100,9 @@ class MockScreen: Identifiable {
|
|||||||
credentials: credentials,
|
credentials: credentials,
|
||||||
keyBackupNeeded: false))
|
keyBackupNeeded: false))
|
||||||
case .simpleRegular:
|
case .simpleRegular:
|
||||||
return TemplateCoordinator(parameters: .init(promptType: .regular))
|
return TemplateScreenCoordinator(parameters: .init(promptType: .regular))
|
||||||
case .simpleUpgrade:
|
case .simpleUpgrade:
|
||||||
return TemplateCoordinator(parameters: .init(promptType: .upgrade))
|
return TemplateScreenCoordinator(parameters: .init(promptType: .upgrade))
|
||||||
case .home:
|
case .home:
|
||||||
let navigationStackCoordinator = NavigationStackCoordinator()
|
let navigationStackCoordinator = NavigationStackCoordinator()
|
||||||
let session = MockUserSession(clientProxy: MockClientProxy(userID: "@mock:matrix.org"),
|
let session = MockUserSession(clientProxy: MockClientProxy(userID: "@mock:matrix.org"),
|
||||||
|
|||||||
+10
-10
@@ -17,31 +17,31 @@
|
|||||||
import Combine
|
import Combine
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct TemplateCoordinatorParameters {
|
struct TemplateScreenCoordinatorParameters {
|
||||||
let promptType: TemplatePromptType
|
let promptType: TemplateScreenPromptType
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TemplateCoordinatorAction {
|
enum TemplateScreenCoordinatorAction {
|
||||||
case accept
|
case accept
|
||||||
case cancel
|
case cancel
|
||||||
|
|
||||||
// Consider adding CustomStringConvertible conformance if the actions contain PII
|
// Consider adding CustomStringConvertible conformance if the actions contain PII
|
||||||
}
|
}
|
||||||
|
|
||||||
final class TemplateCoordinator: CoordinatorProtocol {
|
final class TemplateScreenCoordinator: CoordinatorProtocol {
|
||||||
private let parameters: TemplateCoordinatorParameters
|
private let parameters: TemplateScreenCoordinatorParameters
|
||||||
private var viewModel: TemplateViewModelProtocol
|
private var viewModel: TemplateScreenViewModelProtocol
|
||||||
private let actionsSubject: PassthroughSubject<TemplateCoordinatorAction, Never> = .init()
|
private let actionsSubject: PassthroughSubject<TemplateScreenCoordinatorAction, Never> = .init()
|
||||||
private var cancellables: Set<AnyCancellable> = .init()
|
private var cancellables: Set<AnyCancellable> = .init()
|
||||||
|
|
||||||
var actions: AnyPublisher<TemplateCoordinatorAction, Never> {
|
var actions: AnyPublisher<TemplateScreenCoordinatorAction, Never> {
|
||||||
actionsSubject.eraseToAnyPublisher()
|
actionsSubject.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
init(parameters: TemplateCoordinatorParameters) {
|
init(parameters: TemplateScreenCoordinatorParameters) {
|
||||||
self.parameters = parameters
|
self.parameters = parameters
|
||||||
|
|
||||||
viewModel = TemplateViewModel(promptType: parameters.promptType)
|
viewModel = TemplateScreenViewModel(promptType: parameters.promptType)
|
||||||
}
|
}
|
||||||
|
|
||||||
func start() {
|
func start() {
|
||||||
+6
-6
@@ -16,12 +16,12 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum TemplatePromptType {
|
enum TemplateScreenPromptType {
|
||||||
case regular
|
case regular
|
||||||
case upgrade
|
case upgrade
|
||||||
}
|
}
|
||||||
|
|
||||||
extension TemplatePromptType: Identifiable, CaseIterable {
|
extension TemplateScreenPromptType: Identifiable, CaseIterable {
|
||||||
var id: Self { self }
|
var id: Self { self }
|
||||||
|
|
||||||
var title: String {
|
var title: String {
|
||||||
@@ -43,19 +43,19 @@ extension TemplatePromptType: Identifiable, CaseIterable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TemplateViewModelAction {
|
enum TemplateScreenViewModelAction {
|
||||||
case accept
|
case accept
|
||||||
case cancel
|
case cancel
|
||||||
|
|
||||||
// Consider adding CustomStringConvertible conformance if the actions contain PII
|
// Consider adding CustomStringConvertible conformance if the actions contain PII
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TemplateViewState: BindableState {
|
struct TemplateScreenViewState: BindableState {
|
||||||
var promptType: TemplatePromptType
|
var promptType: TemplateScreenPromptType
|
||||||
var count: Int
|
var count: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TemplateViewAction {
|
enum TemplateScreenViewAction {
|
||||||
case incrementCount
|
case incrementCount
|
||||||
case decrementCount
|
case decrementCount
|
||||||
case accept
|
case accept
|
||||||
+7
-7
@@ -17,22 +17,22 @@
|
|||||||
import Combine
|
import Combine
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
typealias TemplateViewModelType = StateStoreViewModel<TemplateViewState, TemplateViewAction>
|
typealias TemplateScreenViewModelType = StateStoreViewModel<TemplateScreenViewState, TemplateScreenViewAction>
|
||||||
|
|
||||||
class TemplateViewModel: TemplateViewModelType, TemplateViewModelProtocol {
|
class TemplateScreenViewModel: TemplateScreenViewModelType, TemplateScreenViewModelProtocol {
|
||||||
private var actionsSubject: PassthroughSubject<TemplateViewModelAction, Never> = .init()
|
private var actionsSubject: PassthroughSubject<TemplateScreenViewModelAction, Never> = .init()
|
||||||
|
|
||||||
var actions: AnyPublisher<TemplateViewModelAction, Never> {
|
var actions: AnyPublisher<TemplateScreenViewModelAction, Never> {
|
||||||
actionsSubject.eraseToAnyPublisher()
|
actionsSubject.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
init(promptType: TemplatePromptType, initialCount: Int = 0) {
|
init(promptType: TemplateScreenPromptType, initialCount: Int = 0) {
|
||||||
super.init(initialViewState: TemplateViewState(promptType: promptType, count: 0))
|
super.init(initialViewState: TemplateScreenViewState(promptType: promptType, count: 0))
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Public
|
// MARK: - Public
|
||||||
|
|
||||||
override func process(viewAction: TemplateViewAction) {
|
override func process(viewAction: TemplateScreenViewAction) {
|
||||||
switch viewAction {
|
switch viewAction {
|
||||||
case .accept:
|
case .accept:
|
||||||
actionsSubject.send(.accept)
|
actionsSubject.send(.accept)
|
||||||
+3
-3
@@ -17,7 +17,7 @@
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
protocol TemplateViewModelProtocol {
|
protocol TemplateScreenViewModelProtocol {
|
||||||
var actions: AnyPublisher<TemplateViewModelAction, Never> { get }
|
var actions: AnyPublisher<TemplateScreenViewModelAction, Never> { get }
|
||||||
var context: TemplateViewModelType.Context { get }
|
var context: TemplateScreenViewModelType.Context { get }
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ struct TemplateScreen: View {
|
|||||||
colorScheme == .light ? .element.secondaryContent : .element.tertiaryContent
|
colorScheme == .light ? .element.secondaryContent : .element.tertiaryContent
|
||||||
}
|
}
|
||||||
|
|
||||||
@ObservedObject var context: TemplateViewModel.Context
|
@ObservedObject var context: TemplateScreenViewModel.Context
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
@@ -92,9 +92,9 @@ struct TemplateScreen: View {
|
|||||||
|
|
||||||
// MARK: - Previews
|
// MARK: - Previews
|
||||||
|
|
||||||
struct Template_Previews: PreviewProvider {
|
struct TemplateScreen_Previews: PreviewProvider {
|
||||||
static let regularViewModel = TemplateViewModel(promptType: .regular)
|
static let regularViewModel = TemplateScreenViewModel(promptType: .regular)
|
||||||
static let upgradeViewModel = TemplateViewModel(promptType: .upgrade)
|
static let upgradeViewModel = TemplateScreenViewModel(promptType: .upgrade)
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
TemplateScreen(context: regularViewModel.context)
|
TemplateScreen(context: regularViewModel.context)
|
||||||
.previewDisplayName("Regular")
|
.previewDisplayName("Regular")
|
||||||
|
|||||||
+3
-3
@@ -24,14 +24,14 @@ class TemplateScreenViewModelTests: XCTestCase {
|
|||||||
static let counterInitialValue = 0
|
static let counterInitialValue = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
var viewModel: TemplateViewModelProtocol!
|
var viewModel: TemplateScreenViewModelProtocol!
|
||||||
|
|
||||||
var context: TemplateViewModelType.Context {
|
var context: TemplateScreenViewModelType.Context {
|
||||||
viewModel.context
|
viewModel.context
|
||||||
}
|
}
|
||||||
|
|
||||||
override func setUpWithError() throws {
|
override func setUpWithError() throws {
|
||||||
viewModel = TemplateViewModel(promptType: .regular, initialCount: Constants.counterInitialValue)
|
viewModel = TemplateScreenViewModel(promptType: .regular, initialCount: Constants.counterInitialValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testInitialState() {
|
func testInitialState() {
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [ ! $# -eq 2 ]; then
|
GREEN='\033[0;32m'
|
||||||
echo "Usage: ./createScreen.sh Folder MyScreenName"
|
NOCOLOR='\033[0m'
|
||||||
|
|
||||||
|
if [ ! $# -eq 1 ]; then
|
||||||
|
echo -e "Usage: ${GREEN}./createScreen.sh Name${NOCOLOR}"
|
||||||
|
echo -e "For example ${GREEN}./createScreen.sh Home${NOCOLOR} will create ${GREEN}HomeScreen${NOCOLOR}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
SCREENS_DIR="../../ElementX/Sources/Screens"/$1
|
SCREENS_DIR="../../ElementX/Sources/Screens"/$1Screen
|
||||||
UI_TESTS_DIR="../../UITests/Sources"
|
UI_TESTS_DIR="../../UITests/Sources"
|
||||||
UNIT_TESTS_DIR="../../UnitTests/Sources"
|
UNIT_TESTS_DIR="../../UnitTests/Sources"
|
||||||
|
|
||||||
@@ -28,7 +32,7 @@ cp -R "Templates/SimpleScreenExample/Tests/UI/" $UI_TESTS_DIR/
|
|||||||
|
|
||||||
cp -R "Templates/SimpleScreenExample/Tests/Unit/" $UNIT_TESTS_DIR/
|
cp -R "Templates/SimpleScreenExample/Tests/Unit/" $UNIT_TESTS_DIR/
|
||||||
|
|
||||||
SCREEN_NAME=$2
|
SCREEN_NAME=$1
|
||||||
SCREEN_VAR_NAME=`echo $SCREEN_NAME | awk '{ print tolower(substr($0, 1, 1)) substr($0, 2) }'`
|
SCREEN_VAR_NAME=`echo $SCREEN_NAME | awk '{ print tolower(substr($0, 1, 1)) substr($0, 2) }'`
|
||||||
|
|
||||||
function rename_files {
|
function rename_files {
|
||||||
|
|||||||
Reference in New Issue
Block a user