metatext/ViewModels/Sources/ViewModels/View Models/RegistrationViewModel.swift

72 lines
2.5 KiB
Swift
Raw Normal View History

2020-09-11 09:55:06 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Combine
import Foundation
import Mastodon
import ServiceLayer
public enum RegistrationError: Error {
case passwordConfirmationMismatch
}
public final class RegistrationViewModel: ObservableObject {
public let instance: Instance
public let serverRulesURL: URL
public let termsOfServiceURL: URL
@Published public var alertItem: AlertItem?
2021-01-18 02:42:03 +00:00
@Published public var registration = Registration(
locale: (Locale.preferred ?? Locale.current).languageCodeWithCoercedRegionCodeIfNecessary
?? Locale.fallbackLanguageCode)
2020-09-11 09:55:06 +00:00
@Published public var passwordConfirmation = ""
2020-09-12 02:50:42 +00:00
@Published public private(set) var registerDisabled = true
2020-09-11 09:55:06 +00:00
@Published public private(set) var registering = false
private let url: URL
private let allIdentitiesService: AllIdentitiesService
private var cancellables = Set<AnyCancellable>()
init(instance: Instance, url: URL, allIdentitiesService: AllIdentitiesService) {
self.instance = instance
self.url = url
self.serverRulesURL = url.appendingPathComponent("about").appendingPathComponent("more")
self.termsOfServiceURL = url.appendingPathComponent("terms")
self.allIdentitiesService = allIdentitiesService
2020-09-12 02:50:42 +00:00
$registration
.map {
$0.username.isEmpty
|| $0.email.isEmpty
|| $0.password.isEmpty
|| ($0.reason.isEmpty && instance.approvalRequired)
|| !$0.agreement
2020-09-11 09:55:06 +00:00
}
2020-09-12 02:50:42 +00:00
.assign(to: &$registerDisabled)
2020-09-11 09:55:06 +00:00
}
}
public extension RegistrationViewModel {
func registerTapped() {
2020-09-12 02:50:42 +00:00
guard registration.password == passwordConfirmation else {
2020-09-11 09:55:06 +00:00
alertItem = AlertItem(error: RegistrationError.passwordConfirmationMismatch)
return
}
2020-09-13 08:03:08 +00:00
allIdentitiesService.createIdentity(url: url, kind: .registration(registration))
2020-09-11 09:55:06 +00:00
.handleEvents(receiveSubscription: { [weak self] _ in self?.registering = true })
.mapError { error -> Error in
if error is URLError {
return AddIdentityError.unableToConnectToInstance
} else {
return error
}
}
.receive(on: DispatchQueue.main)
.assignErrorsToAlertItem(to: \.alertItem, on: self)
.sink { [weak self] _ in
self?.registering = false
} receiveValue: { _ in }
.store(in: &cancellables)
}
}