Skip to content

Commit

Permalink
feat: add register using mvvm
Browse files Browse the repository at this point in the history
  • Loading branch information
carissafarry committed Dec 27, 2023
1 parent ebddbbc commit 5ac4cbb
Show file tree
Hide file tree
Showing 14 changed files with 538 additions and 6 deletions.
322 changes: 320 additions & 2 deletions StudyFora.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildLocationStyle</key>
<string>UseAppPreferences</string>
<key>CustomBuildLocationType</key>
<string>RelativeToDerivedData</string>
<key>DerivedDataLocationStyle</key>
<string>Default</string>
<key>ShowSharedSchemesAutomaticallyEnabled</key>
<true/>
</dict>
</plist>
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
<integer>3</integer>
</dict>
<key>Promises (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
<integer>4</integer>
</dict>
<key>Promises (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
<integer>2</integer>
</dict>
<key>StudyFora.xcscheme_^#shared#^_</key>
<dict>
Expand Down
8 changes: 7 additions & 1 deletion StudyFora/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,18 @@
import SwiftUI

struct ContentView: View {
@EnvironmentObject var router: Router

var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")

Button("**Register Page**") {
router.navigate(to: .register)
}
.padding(.top, 12)
}
.padding()
}
Expand Down
13 changes: 13 additions & 0 deletions StudyFora/Core/Enum/StatesEnum.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// StatesEnum.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 23/12/23.
//

enum StatesEnum: String,Equatable {
case initiate = "Initiate"
case loading = "Loading"
case error = "Error"
case success = "Success"
}
13 changes: 13 additions & 0 deletions StudyFora/Features/Login/Domain/Model/LoginReponseModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// LoginReponseModel.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 27/12/23.
//

import Foundation

struct LoginResponseModel {
let uid: String
let email: String
}
18 changes: 18 additions & 0 deletions StudyFora/Features/Profile/Presentation/View/ProfileView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// ProfileView.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 26/12/23.
//

import SwiftUI

struct ProfileView: View {
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}

#Preview {
ProfileView()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//
// RegisterRepositoryImpl.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 26/12/23.
//

import Foundation
import FirebaseAuth

struct RegisterRepositoryImpl: RegisterRepository {
func doRegister(data: RegisterRequestModel, completion: @escaping (Result<AuthDataResult, Error>) -> Void) {
Auth.auth().createUser(withEmail: data.email, password: data.password) { authResult, error in
if let error = error {
completion(.failure(error))
} else if let authResult = authResult {
completion(.success(authResult))
} else {
fatalError("Unexpected nil value in authResult")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// RegisterRequestModel.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 27/12/23.
//

import Foundation

struct RegisterRequestModel {
let email: String
let password: String
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// RegisterRepository.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 26/12/23.
//

import FirebaseAuth

protocol RegisterRepository{
func doRegister(data: RegisterRequestModel, completion: @escaping (Result<AuthDataResult, Error>) -> Void)
}
29 changes: 29 additions & 0 deletions StudyFora/Features/Register/Domain/UseCase/RegisterUseCase.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// RegisterUseCase.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 26/12/23.
//

import Foundation
import Combine
import FirebaseAuth

struct RegisterUseCase {
var repository: RegisterRepository

func execute(data: RegisterRequestModel) async throws -> AuthDataResult? {
return try await withCheckedThrowingContinuation { continuation in
repository.doRegister(data:data) { result in
do {
let authResult = try result.get()
print("User registered successfully!")
continuation.resume(returning: authResult)
} catch {
print("Error registering user: \(error.localizedDescription)")
continuation.resume(throwing: error)
}
}
}
}
}
40 changes: 40 additions & 0 deletions StudyFora/Features/Register/Presentation/View/RegisterView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// RegisterView.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 23/12/23.
//

import SwiftUI

struct RegisterView: View {
@EnvironmentObject var router: Router

@StateObject var registerViewModel = RegisterViewModel()

@State private var email = ""
@State private var password = ""

var body: some View {
VStack {
Text("Register")
TextField("Email", text: self.$email)
TextField("Password", text: self.$password)
Button("Register") {
Task {
await registerViewModel.register(data: RegisterRequestModel(email: email, password: password))
print(email)
}
}
Button("Back") {
router.navigateBack()
}
}
.padding()
}
}

#Preview {
RegisterView()
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// RegisterViewModel.swift
// StudyFora
//
// Created by Carissa Farry Hilmi Az Zahra on 23/12/23.
//

import Foundation

class RegisterViewModel: ObservableObject {
private var registerUseCase = RegisterUseCase(repository: RegisterRepositoryImpl())

@Published var states: StatesEnum = .initiate
@Published var userLogin: LoginResponseModel?

func register(data: RegisterRequestModel) async {
do {
if let res = try await registerUseCase.execute(data: data) {
userLogin = LoginResponseModel(
uid: res.user.uid,
email: res.user.email!
)
}
} catch let error {
states = .error
}
}
}

0 comments on commit 5ac4cbb

Please sign in to comment.