move RegistrationView into binder package

This commit is contained in:
Satindar Dhillon
2022-02-23 15:28:43 -08:00
parent 6e06111035
commit 6837d08fd4
9 changed files with 99 additions and 92 deletions

View File

@ -1,10 +1,27 @@
import AuthenticationServices
import Combine
import Models
import Services
import SwiftUI
import Utils
import Views
public final class RegistrationViewModel: ObservableObject {
@Published public var loginError: LoginError?
@Published public var createProfileViewModel: CreateProfileViewModel?
@Published public var newAppleSignupViewModel: NewAppleSignupViewModel?
public enum Action {
case googleButtonTapped
case appleSignInCompleted(result: Result<ASAuthorization, Error>)
}
public var subscriptions = Set<AnyCancellable>()
public let performActionSubject = PassthroughSubject<Action, Never>()
public init() {}
}
extension RegistrationViewModel {
static func make(services: Services) -> RegistrationViewModel {
let viewModel = RegistrationViewModel()
@ -114,3 +131,58 @@ private func presentingViewController() -> PlatformViewController? {
return nil
#endif
}
public struct RegistrationView: View {
@Environment(\.horizontalSizeClass) var horizontalSizeClass
@ObservedObject private var viewModel: RegistrationViewModel
public init(viewModel: RegistrationViewModel) {
self.viewModel = viewModel
}
var authenticationView: some View {
VStack(spacing: 0) {
VStack(spacing: 28) {
if horizontalSizeClass == .regular {
Spacer()
}
VStack(alignment: .center, spacing: 16) {
Text(LocalText.registrationViewHeadline)
.font(.appTitle)
.multilineTextAlignment(.center)
.padding(.bottom, horizontalSizeClass == .compact ? 0 : 50)
.padding(.top, horizontalSizeClass == .compact ? 30 : 0)
AppleSignInButton {
viewModel.performActionSubject.send(.appleSignInCompleted(result: $0))
}
if AppKeys.sharedInstance?.iosClientGoogleId != nil {
GoogleAuthButton {
viewModel.performActionSubject.send(.googleButtonTapped)
}
}
}
if let loginError = viewModel.loginError {
LoginErrorMessageView(loginError: loginError)
}
Spacer()
}
.frame(maxWidth: 316)
.padding(.horizontal, 16)
}
}
public var body: some View {
if let createProfileViewModel = viewModel.createProfileViewModel {
CreateProfileView(viewModel: createProfileViewModel)
} else if let newAppleSignupViewModel = viewModel.newAppleSignupViewModel {
NewAppleSignupView(viewModel: newAppleSignupViewModel)
} else {
authenticationView
}
}
}

View File

@ -0,0 +1,6 @@
import Foundation
public enum AuthFlow {
case signIn
case signUp
}

View File

@ -1,12 +1,16 @@
import AuthenticationServices
import SwiftUI
struct AppleSignInButton: View {
public struct AppleSignInButton: View {
@Environment(\.colorScheme) var colorScheme
let onCompletion: (Result<ASAuthorization, Error>) -> Void
var body: some View {
public init(onCompletion: @escaping (Result<ASAuthorization, Error>) -> Void) {
self.onCompletion = onCompletion
}
public var body: some View {
SignInWithAppleButton(
.continue,
onRequest: { request in

View File

@ -1,9 +1,13 @@
import SwiftUI
struct GoogleAuthButton: View {
public struct GoogleAuthButton: View {
let tapAction: () -> Void
var body: some View {
public init(tapAction: @escaping () -> Void) {
self.tapAction = tapAction
}
public var body: some View {
Button(action: tapAction) {
HStack(spacing: 8) {
Image.googleIcon

View File

@ -1,6 +1,6 @@
import Foundation
struct LocalText {
public enum LocalText {
static func localText(key: String, comment: String? = nil) -> String {
NSLocalizedString(key, bundle: .module, comment: comment ?? "no comment provided by developer")
}
@ -9,7 +9,7 @@ struct LocalText {
static let googleAuthButton = localText(key: "googleAuthButton")
static let registrationViewSignInHeadline = localText(key: "registrationViewSignInHeadline")
static let registrationViewSignUpHeadline = localText(key: "registrationViewSignUpHeadline")
static let registrationViewHeadline = localText(key: "registrationViewHeadline")
public static let registrationViewHeadline = localText(key: "registrationViewHeadline")
static let networkError = localText(key: "error.network")
static let genericError = localText(key: "error.generic")
static let invalidCredsLoginError = localText(key: "loginError.invalidCreds")

View File

@ -1,10 +1,14 @@
import Models
import SwiftUI
struct LoginErrorMessageView: View {
public struct LoginErrorMessageView: View {
let loginError: LoginError
var body: some View {
public init(loginError: LoginError) {
self.loginError = loginError
}
public var body: some View {
Text(loginError.message)
.font(.appBody)
.foregroundColor(.red)

View File

@ -1,59 +0,0 @@
import Combine
import Models
import SwiftUI
import Utils
public struct RegistrationView: View {
@Environment(\.horizontalSizeClass) var horizontalSizeClass
@ObservedObject private var viewModel: RegistrationViewModel
public init(viewModel: RegistrationViewModel) {
self.viewModel = viewModel
}
var authenticationView: some View {
VStack(spacing: 0) {
VStack(spacing: 28) {
if horizontalSizeClass == .regular {
Spacer()
}
VStack(alignment: .center, spacing: 16) {
Text(LocalText.registrationViewHeadline)
.font(.appTitle)
.multilineTextAlignment(.center)
.padding(.bottom, horizontalSizeClass == .compact ? 0 : 50)
.padding(.top, horizontalSizeClass == .compact ? 30 : 0)
AppleSignInButton {
viewModel.performActionSubject.send(.appleSignInCompleted(result: $0))
}
if AppKeys.sharedInstance?.iosClientGoogleId != nil {
GoogleAuthButton {
viewModel.performActionSubject.send(.googleButtonTapped)
}
}
}
if let loginError = viewModel.loginError {
LoginErrorMessageView(loginError: loginError)
}
Spacer()
}
.frame(maxWidth: 316)
.padding(.horizontal, 16)
}
}
public var body: some View {
if let createProfileViewModel = viewModel.createProfileViewModel {
CreateProfileView(viewModel: createProfileViewModel)
} else if let newAppleSignupViewModel = viewModel.newAppleSignupViewModel {
NewAppleSignupView(viewModel: newAppleSignupViewModel)
} else {
authenticationView
}
}
}

View File

@ -1,25 +0,0 @@
import AuthenticationServices
import Combine
import Models
import SwiftUI
enum AuthFlow {
case signIn
case signUp
}
public final class RegistrationViewModel: ObservableObject {
@Published public var loginError: LoginError?
@Published public var createProfileViewModel: CreateProfileViewModel?
@Published public var newAppleSignupViewModel: NewAppleSignupViewModel?
public enum Action {
case googleButtonTapped
case appleSignInCompleted(result: Result<ASAuthorization, Error>)
}
public var subscriptions = Set<AnyCancellable>()
public let performActionSubject = PassthroughSubject<Action, Never>()
public init() {}
}

View File

@ -1,3 +1,4 @@
import Models
import SwiftUI
struct ToggleAuthFlowButton: View {