diff --git a/apple/OmnivoreKit/Sources/Binders/Scenes/RegistrationScene.swift b/apple/OmnivoreKit/Sources/Binders/Scenes/RegistrationScene.swift index 3ff2640c0..9139fc21c 100644 --- a/apple/OmnivoreKit/Sources/Binders/Scenes/RegistrationScene.swift +++ b/apple/OmnivoreKit/Sources/Binders/Scenes/RegistrationScene.swift @@ -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) + } + + public var subscriptions = Set() + public let performActionSubject = PassthroughSubject() + + 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 + } + } +} diff --git a/apple/OmnivoreKit/Sources/Models/AuthFlow.swift b/apple/OmnivoreKit/Sources/Models/AuthFlow.swift new file mode 100644 index 000000000..78dfc11ff --- /dev/null +++ b/apple/OmnivoreKit/Sources/Models/AuthFlow.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum AuthFlow { + case signIn + case signUp +} diff --git a/apple/OmnivoreKit/Sources/Views/Buttons/AppleSignInButton.swift b/apple/OmnivoreKit/Sources/Views/Buttons/AppleSignInButton.swift index 2383a6251..b8381201f 100644 --- a/apple/OmnivoreKit/Sources/Views/Buttons/AppleSignInButton.swift +++ b/apple/OmnivoreKit/Sources/Views/Buttons/AppleSignInButton.swift @@ -1,12 +1,16 @@ import AuthenticationServices import SwiftUI -struct AppleSignInButton: View { +public struct AppleSignInButton: View { @Environment(\.colorScheme) var colorScheme let onCompletion: (Result) -> Void - var body: some View { + public init(onCompletion: @escaping (Result) -> Void) { + self.onCompletion = onCompletion + } + + public var body: some View { SignInWithAppleButton( .continue, onRequest: { request in diff --git a/apple/OmnivoreKit/Sources/Views/Buttons/GoogleAuthButton.swift b/apple/OmnivoreKit/Sources/Views/Buttons/GoogleAuthButton.swift index d76d69df4..9296252c7 100644 --- a/apple/OmnivoreKit/Sources/Views/Buttons/GoogleAuthButton.swift +++ b/apple/OmnivoreKit/Sources/Views/Buttons/GoogleAuthButton.swift @@ -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 diff --git a/apple/OmnivoreKit/Sources/Views/LocalText.swift b/apple/OmnivoreKit/Sources/Views/LocalText.swift index 8bf363319..3e7b9d015 100644 --- a/apple/OmnivoreKit/Sources/Views/LocalText.swift +++ b/apple/OmnivoreKit/Sources/Views/LocalText.swift @@ -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") diff --git a/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift b/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift index a475ee0f9..4e3ccf36c 100644 --- a/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift +++ b/apple/OmnivoreKit/Sources/Views/RegistrationViews/LoginErrorMessageView.swift @@ -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) diff --git a/apple/OmnivoreKit/Sources/Views/RegistrationViews/RegistrationView.swift b/apple/OmnivoreKit/Sources/Views/RegistrationViews/RegistrationView.swift deleted file mode 100644 index 528cb744c..000000000 --- a/apple/OmnivoreKit/Sources/Views/RegistrationViews/RegistrationView.swift +++ /dev/null @@ -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 - } - } -} diff --git a/apple/OmnivoreKit/Sources/Views/RegistrationViews/RegistrationViewModel.swift b/apple/OmnivoreKit/Sources/Views/RegistrationViews/RegistrationViewModel.swift deleted file mode 100644 index 9fc277e2a..000000000 --- a/apple/OmnivoreKit/Sources/Views/RegistrationViews/RegistrationViewModel.swift +++ /dev/null @@ -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) - } - - public var subscriptions = Set() - public let performActionSubject = PassthroughSubject() - - public init() {} -} diff --git a/apple/OmnivoreKit/Sources/Views/RegistrationViews/ToggleAuthFlowButton.swift b/apple/OmnivoreKit/Sources/Views/RegistrationViews/ToggleAuthFlowButton.swift index a62c9feb8..f7c417fd3 100644 --- a/apple/OmnivoreKit/Sources/Views/RegistrationViews/ToggleAuthFlowButton.swift +++ b/apple/OmnivoreKit/Sources/Views/RegistrationViews/ToggleAuthFlowButton.swift @@ -1,3 +1,4 @@ +import Models import SwiftUI struct ToggleAuthFlowButton: View {