Skip to content

Commit

Permalink
Build alert modifier and add it to view extension and use it to show …
Browse files Browse the repository at this point in the history
…error alert
  • Loading branch information
sanghee-dev committed Aug 23, 2021
1 parent ef66d27 commit f7017ca
Show file tree
Hide file tree
Showing 13 changed files with 91 additions and 25 deletions.
19 changes: 19 additions & 0 deletions Hello Chat/Utilities/Extensions.swift
Expand Up @@ -13,6 +13,25 @@ extension UIApplication {
}
}

extension View {
func showErrorMessage(_ message: String, showAlert: Binding<Bool>) -> some View {
self.modifier(ErrorAlertModifier(showAlert: showAlert, message: message))
}
}

struct ErrorAlertModifier: ViewModifier {
var showAlert: Binding<Bool>
let message: String

func body(content: Content) -> some View {
content.alert(isPresented: showAlert) {
Alert(title: Text("Error"),
message: Text(message),
dismissButton: .cancel(Text("OK")))
}
}
}

extension String {
var isSingleEmoji: Bool {
if unicodeScalars.count > 2 {
Expand Down
7 changes: 2 additions & 5 deletions Hello Chat/View/Auth/Login/LoginView.swift
Expand Up @@ -51,11 +51,6 @@ struct LoginView: View {
isIndicatorAnimating = true
viewModel.login(withEmail: email, password: password)
})
.alert(isPresented: $viewModel.showingErrorAlert) {
Alert(title: Text("Error"),
message: Text(viewModel.errorMessage),
dismissButton: .cancel(Text("OK")))
}

Spacer()

Expand All @@ -74,6 +69,8 @@ struct LoginView: View {
}
}
.padding(.top, -56)
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}
}

Expand Down
Expand Up @@ -57,6 +57,8 @@ struct ProfilePhotoSelectorView: View {
Spacer()
}
.navigationBarBackButtonHidden(true)
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}

func loadImage() {
Expand Down
7 changes: 2 additions & 5 deletions Hello Chat/View/Auth/Registration/RegistrationView.swift
Expand Up @@ -55,11 +55,6 @@ struct RegistrationView: View {
isIndicatorAnimating = true
viewModel.register(withEmail: email, username: username, fullname: fullname, password: password)
})
.alert(isPresented: $viewModel.showingErrorAlert) {
Alert(title: Text("Error"),
message: Text(viewModel.errorMessage),
dismissButton: .cancel(Text("OK")))
}

Spacer()

Expand All @@ -73,5 +68,7 @@ struct RegistrationView: View {
})
.padding(.bottom, 32)
}
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}
}
2 changes: 2 additions & 0 deletions Hello Chat/View/Chats/ChatPartners/ChatPartnersView.swift
Expand Up @@ -36,5 +36,7 @@ struct ChatPartnersView: View {
}
}
}
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}
}
2 changes: 2 additions & 0 deletions Hello Chat/View/Chats/Conversations/ConversationCell.swift
Expand Up @@ -40,6 +40,8 @@ struct ConversationCell: View {
CustomDivider(leadingSpace: 80)
}
}
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}
}
}
6 changes: 4 additions & 2 deletions Hello Chat/View/Chats/Conversations/ConversationsView.swift
Expand Up @@ -8,11 +8,11 @@
import SwiftUI

struct ConversationsView: View {
@ObservedObject var viewModel = ConversationsViewModel()
@State private var showMessageView = false
@State private var showConversationView = false
@State private var selectedUser: User?

@ObservedObject var viewModel = ConversationsViewModel()

var body: some View {
ZStack(alignment: .bottomTrailing) {
Expand All @@ -34,9 +34,11 @@ struct ConversationsView: View {
FloatingButton(show: $showMessageView)
.sheet(isPresented: $showMessageView, content: {
ChatPartnersView(showConversationView: $showConversationView, user: $selectedUser)
})
})
}
.onAppear{ viewModel.fetchRecentMessages() }
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}
}

Expand Down
2 changes: 2 additions & 0 deletions Hello Chat/View/Chats/Messages/ChatsView.swift
Expand Up @@ -48,6 +48,8 @@ struct ChatsView: View {
.navigationTitle(chatPartner.username)
.navigationBarTitleDisplayMode(.inline)
.padding(.vertical)
.modifier(ErrorAlertModifier(showAlert: $viewModel.showingErrorAlert,
message: viewModel.errorMessage))
}

func sendMessage() {
Expand Down
27 changes: 18 additions & 9 deletions Hello Chat/ViewModel/Auth/AuthViewModel.swift
Expand Up @@ -5,16 +5,16 @@
// Created by leeesangheee on 2021/08/02.
//

import UIKit
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 = ""
private var tempCurrentUser: Firebase.User? // registration에서 프로필 사진 올리기 전 유저

static let shared = AuthViewModel()

Expand All @@ -24,16 +24,20 @@ class AuthViewModel: NSObject, ObservableObject {
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.showingErrorAlert = true
self.errorMessage = errorMessage
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}

guard let user = result?.user else { return }
self.userSession = user
self.fetchUser()
Expand All @@ -44,9 +48,8 @@ class AuthViewModel: NSObject, ObservableObject {
self.errorMessage = ""

Auth.auth().createUser(withEmail: email, password: password) { result, error in
if let errorMessage = error?.localizedDescription {
self.showingErrorAlert = true
self.errorMessage = errorMessage
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}

Expand Down Expand Up @@ -81,6 +84,11 @@ class AuthViewModel: NSObject, ObservableObject {
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
}
Expand All @@ -106,3 +114,4 @@ class AuthViewModel: NSObject, ObservableObject {
}
}


Expand Up @@ -10,13 +10,21 @@ import Firebase

class ChatPartnersViewModel: ObservableObject {
@Published var users = [User]()
@Published var showingErrorAlert = false
@Published var errorMessage = ""

init() {
fetchUsers()
}

func fetchUsers() {
COLLECTION_USERS.getDocuments { snapshot, error in
if let errorMessage = error?.localizedDescription {
self.showingErrorAlert = true
self.errorMessage = errorMessage
return
}

guard let documents = snapshot?.documents else { return }
self.users = documents
.compactMap({ try? $0.data(as: User.self) })
Expand Down
Expand Up @@ -10,6 +10,8 @@ import Foundation
class ConversationCellViewModel: ObservableObject {
@Published var message: Message
@Published var chatPartner: User?
@Published var showingErrorAlert = false
@Published var errorMessage = ""

init(_ message: Message) {
self.message = message
Expand All @@ -32,6 +34,11 @@ class ConversationCellViewModel: ObservableObject {

func fetchChatPartner() {
COLLECTION_USERS.document(chatPartnerId).getDocument { snapshot, error in
if let errorMessage = error?.localizedDescription {
self.showingErrorAlert = true
self.errorMessage = errorMessage
return
}
self.chatPartner = try? snapshot?.data(as: User.self)
}
}
Expand Down
Expand Up @@ -10,7 +10,8 @@ import Firebase

class ConversationsViewModel: ObservableObject {
@Published var recentMessages = [Message]()
@Published var error: Error?
@Published var showingErrorAlert = false
@Published var errorMessage = ""

init() {
fetchRecentMessages()
Expand All @@ -24,8 +25,10 @@ class ConversationsViewModel: ObservableObject {
.order(by: "timestamp", descending: true)

query.getDocuments { snapshot, error in
if let error = error {
self.error = error
if let errorMessage = error?.localizedDescription {
self.showingErrorAlert = true
self.errorMessage = errorMessage
return
}

guard let documents = snapshot?.documents else { return }
Expand Down
18 changes: 17 additions & 1 deletion Hello Chat/ViewModel/Chats/Messages/ChatsViewModel.swift
Expand Up @@ -10,12 +10,19 @@ import Firebase
class ChatsViewModel: ObservableObject {
@Published var messages = [Message]()
let chatPartner: User
@Published var showingErrorAlert = false
@Published var errorMessage = ""

init(chatPartner: User) {
self.chatPartner = chatPartner
fetchMessages()
}

func showErrorMessage(_ errorMessage: String) {
self.showingErrorAlert = true
self.errorMessage = errorMessage
}

func fetchMessages() {
guard let currentUserId = AuthViewModel.shared.currentUser?.id else { return }
guard let chatPartnerId = chatPartner.id else { return }
Expand All @@ -26,12 +33,22 @@ class ChatsViewModel: ObservableObject {
.order(by: "timestamp", descending: false)

query.addSnapshotListener { snapshot, error in
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}

guard let changes = snapshot?.documentChanges.filter({ $0.type == .added }) else { return }
let addedMessages = changes.compactMap{ try? $0.document.data(as: Message.self) }
self.messages.append(contentsOf: addedMessages)
}

query.getDocuments { snapshot, error in
if let (errorMessage) = error?.localizedDescription {
self.showErrorMessage(errorMessage)
return
}

guard let documents = snapshot?.documents else { return }
self.messages = documents.compactMap{ try? $0.data(as: Message.self) }
}
Expand Down Expand Up @@ -70,4 +87,3 @@ class ChatsViewModel: ObservableObject {
recentChatPartnerRef.setData(data)
}
}

0 comments on commit f7017ca

Please sign in to comment.