move RegistrationView into binder package
This commit is contained in:
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
6
apple/OmnivoreKit/Sources/Models/AuthFlow.swift
Normal file
6
apple/OmnivoreKit/Sources/Models/AuthFlow.swift
Normal file
@ -0,0 +1,6 @@
|
||||
import Foundation
|
||||
|
||||
public enum AuthFlow {
|
||||
case signIn
|
||||
case signUp
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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() {}
|
||||
}
|
||||
@ -1,3 +1,4 @@
|
||||
import Models
|
||||
import SwiftUI
|
||||
|
||||
struct ToggleAuthFlowButton: View {
|
||||
|
||||
Reference in New Issue
Block a user