/
AuthViewModel.swift
117 lines (95 loc) · 3.81 KB
/
AuthViewModel.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//
// AuthViewModel.swift
// Hello Chat
//
// Created by leeesangheee on 2021/08/02.
//
import SwiftUI
import Firebase
class AuthViewModel: NSObject, ObservableObject {
@Published var didAuthenticateUser = false
@Published var userSession: FirebaseAuth.User?
@Published var currentUser: User?
private var tempCurrentUser: Firebase.User? // registration에서 프로필 사진 올리기 전 유저
@Published var showingErrorAlert = false
@Published var errorMessage = ""
static let shared = AuthViewModel()
override init() {
super.init()
userSession = Auth.auth().currentUser
fetchUser()
}
func showErrorMessage(_ errorMessage: String) {
self.showingErrorAlert = true
self.errorMessage = errorMessage
}
func login(withEmail email: String, password: String) {
self.errorMessage = ""
Auth.auth().signIn(withEmail: email, password: password) { result, error in
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}
guard let user = result?.user else { return }
self.userSession = user
self.fetchUser()
}
}
func register(withEmail email: String, username: String, fullname: String, password: String) {
self.errorMessage = ""
Auth.auth().createUser(withEmail: email, password: password) { result, error in
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}
guard let user = result?.user else { return }
self.tempCurrentUser = user
let data: [String: Any] = [KEY_EMAIL: email,
KEY_USERNAME: username,
KEY_FULLNAME: fullname,
KEY_STATUS: Status.available.rawValue]
COLLECTION_USERS.document(user.uid).setData(data) { error in
if let errorMessage = error?.localizedDescription {
self.showingErrorAlert = true
self.errorMessage = errorMessage
return
}
self.didAuthenticateUser = true
}
}
}
func signOut() {
self.didAuthenticateUser = false
self.currentUser = nil
self.userSession = nil
self.tempCurrentUser = nil
try? Auth.auth().signOut()
}
func fetchUser() {
guard let uid = userSession?.uid else { return }
COLLECTION_USERS.document(uid).getDocument { snapshot, error in
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}
guard let user = try? snapshot?.data(as: User.self) else { return }
self.currentUser = user
}
}
func uploadProfileImage(_ image: UIImage) {
guard let uid = tempCurrentUser?.uid else { return }
ImageUploader.uploadImage(image: image, folderName: FOLDER_PROFILE_IMAGES) { imageUrl in
let data: [String: Any] = [KEY_PROFILE_IMAGE_URL : imageUrl]
COLLECTION_USERS.document(uid).updateData(data) { error in
if let errorMessage = error?.localizedDescription {
self.showingErrorAlert = true
self.errorMessage = errorMessage
return
}
}
self.currentUser?.profileImageUrl = imageUrl
self.userSession = Auth.auth().currentUser
self.fetchUser()
}
}
}