UserSignInViewModel
unknown
plain_text
3 years ago
5.0 kB
2
Indexable
// // UserSignInViewModel.swift // TinderApp // // Created by Le Helen on 02/09/2022. // import Foundation import Combine import SwiftUI class UserSignInViewModel : ObservableObject{ @Published var username: String = "" @Published var password: String = "" @Published var userNameError: String? @Published var passwordError: String? @Published var isValid: Bool = false @Published var loggedInSuccessfully: Bool = false private var cancellableSet: Set<AnyCancellable> = [] //Return Attributed String and Hyperlink func getAttributedString(_ string: String) -> AttributedString { var attributedString = AttributedString(string) //Apllying bold and underline to hyperlink if let range = attributedString.range(of: "Điều Khoản") { attributedString[range].underlineStyle = .single attributedString[range].underlineColor = .white attributedString[range].font = .system(size: 17, weight: .bold) attributedString[range].link = .init(string: "https://policies.tinder.com/terms/intl/vi") attributedString[range].foregroundColor = .white } if let range = attributedString.range(of: "Chính sách Quyền Riêng Tư") { attributedString[range].underlineStyle = .single attributedString[range].underlineColor = .white attributedString[range].font = .system(size: 17, weight: .bold) attributedString[range].link = .init(string: "https://policies.tinder.com/privacy/intl/vi") attributedString[range].foregroundColor = .white } if let range = attributedString.range(of: "Chính sách Cookie") { attributedString[range].underlineStyle = .single attributedString[range].underlineColor = .white attributedString[range].font = .system(size: 17, weight: .bold) attributedString[range].link = .init(string: "https://policies.tinder.com/cookie-policy/intl/vi") attributedString[range].foregroundColor = .white } return attributedString } init() { isValidUserNamePublisher .receive(on: RunLoop.main) .map { usernameCheck in switch usernameCheck { case .emptyUsername: return "Username must not be empty." default: return "" } } .assign(to: \.userNameError, on: self) .store(in: &cancellableSet) isValidPasswordPublisher .receive(on: RunLoop.main) .map { passwordCheck in switch passwordCheck { case .emptyPassword: return "Password must not be empty." case .lessThanFiveCharacters: return "Password cannot be less than 5 characters." default: return "" } } .assign(to: \.passwordError, on: self) .store(in: &cancellableSet) Publishers.CombineLatest(self.isValidUserNamePublisher, self.isValidPasswordPublisher) .dropFirst() .sink { _usernameValidator, _passwordValidator in self.isValid = _usernameValidator.errorMessage == nil && _passwordValidator.errorMessage == nil } .store(in: &cancellableSet) isValidUserNamePublisher .dropFirst() .sink { (_usernameValidator) in self.userNameError = _usernameValidator.errorMessage } .store(in: &cancellableSet) isValidPasswordPublisher .dropFirst() .sink { (_paswordValidator) in self.passwordError = _paswordValidator.errorMessage } .store(in: &cancellableSet) } private var isValidUserNamePublisher: AnyPublisher<UsernameValidation, Never> { $username .debounce(for: 0.5, scheduler: RunLoop.main) .removeDuplicates() .map { _username in if _username.isEmpty{ return .emptyUsername } else { return .validUsername } } .eraseToAnyPublisher() } private var isValidPasswordPublisher: AnyPublisher<PasswordValidation, Never> { $password .debounce(for: 0.5, scheduler: RunLoop.main) .removeDuplicates() .map { _password in if _password.isEmpty{ return .emptyPassword } else { return .validPassword } } .eraseToAnyPublisher() } }
Editor is loading...