I have multiple register screen in swiftUI, I did not understand how I will connect first register screen to second register screen, normally first register screen connect to main screen, but I want to connect first register screen to second register screen, and connect second register screen to main screen, how can I do it, any idea?
StatusViewModel:
class StatusViewModel: Identifiable, ObservableObject {
var title: String
var message: String
init(title: String = "", message: String = "") {
self.title = title
self.message = message
}
static var signUpSuccessStatus: StatusViewModel {
return StatusViewModel(title: "Successful", message: "Your account has been created successfully")
}
static var logInSuccessStatus: StatusViewModel {
return StatusViewModel(title: "Successful", message: "Your account has been logged in successfully")
}
static var errorStatus: StatusViewModel {
return StatusViewModel(title: "Error", message: "Oops! Something went wrong. Please try again.")
}
}
RegisterViewModel:
import Foundation
import Combine
class RegisterViewModel: ObservableObject {
@Published var email: String = ""
@Published var password: String = ""
@Published var statusViewModel: StatusViewModel?
@Published var state: AppState
private var cancellableBag = Set<AnyCancellable>()
private let authAPI: AuthAPI
init(authAPI: AuthAPI, state: AppState) {
self.authAPI = authAPI
self.state = state
}
func signUp() {
authAPI.signUp(email: email, password: password)
.receive(on: RunLoop.main)
.map(resultMapper)
.replaceError(with: StatusViewModel.errorStatus)
.assign(to: \.statusViewModel, on: self)
.store(in: &cancellableBag)
}
}
extension RegisterViewModel {
private func resultMapper(with user: User?) -> StatusViewModel {
if user != nil {
state.currentUser = user
return StatusViewModel.signUpSuccessStatus
} else {
return StatusViewModel.errorStatus
}
}
}
first register screen:
struct Register: View {
@ObservedObject private var viewModel: RegisterViewModel
@State var pushActive = false
init(state: AppState) {
self.viewModel = RegisterViewModel(authAPI: AuthService(), state: state)
}
var body: some View {
VStack(){
TextField("Email Address",text:$viewModel.email)
.autocapitalization(.none)
.padding()
HStack(spacing: 15){
TextField("Password", text: $viewModel.password)
.autocapitalization(.none)
}
NavigationLink(destination: HomeView(state: viewModel.state),
isActive: self.$pushActive) {
Button {
self.viewModel.signUp()
} label: {
Text("Register")
.padding()
}
}
}
}
second register screen:
struct SecondRegister: View {
var body: some View {
GeometryReader { geometry in
ZStack{
VStack(alignment: .center, spacing: 3){
TextField("First Name",text:self.$first_name)
.autocapitalization(.none)
.padding()
TextField("Last Name", text: self.$last_name)
.autocapitalization(.none)
.padding()
}
Button {
} label: {
Text("Next")
.padding()
}
}
}.padding()
}.padding(.top,60)
}
}