139 lines
5.0 KiB
Swift
139 lines
5.0 KiB
Swift
//
|
|
// CardsServiceCard.swift
|
|
// Wallet
|
|
//
|
|
// Created by Igor on 13.01.2021.
|
|
// Copyright © 2021 AM. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Alamofire
|
|
import RealmSwift
|
|
import struct Resolver.Injected
|
|
|
|
extension Cards.Service {
|
|
class Card {
|
|
|
|
@Injected var countries: Results<P2PCountry>
|
|
@Injected var banks: Results<P2PBank>
|
|
|
|
let uuid: String
|
|
|
|
private(set) var number = ""
|
|
var country: (id: Int, title: String)? { didSet { bank = nil; update() } }
|
|
var canEditCountry: Bool { (country?.id ?? -1) == 1 }
|
|
var bank: (id: Int, title: String)? { didSet { update() } }
|
|
var canEditBank: Bool { country != nil && (bank?.id ?? -1) == 1 }
|
|
|
|
var isDefault: Bool = false
|
|
let isDefaultEditable: Bool
|
|
|
|
private(set) var isValidCard = false
|
|
private(set) var isValid = true
|
|
|
|
var didUpdate: (() -> Void)?
|
|
var willReload: (() -> Void)?
|
|
var didReload: (() -> Void)?
|
|
|
|
private var type = Cards.Model.Kind.UNKNOWN
|
|
|
|
let isEditing: Bool
|
|
|
|
init(card: Cards.Model) {
|
|
uuid = card.uuid
|
|
type = card.type
|
|
isEditing = true
|
|
isDefaultEditable = Cards.shared.collection.count > 1
|
|
country = (card.countryId, card.country)
|
|
bank = (card.bankId, card.bank)
|
|
number = Cards.Model.formmated(number: card.number)
|
|
isDefault = Cards.shared.default?.uuid == uuid
|
|
isValidCard = CCValidator.validate(creditCardNumber: Cards.Model.cleaned(number: number), validatePrefix: false, validateLength: true, useLuhnAlgorithm: true)
|
|
update()
|
|
}
|
|
|
|
init() {
|
|
uuid = UUID().uuidString
|
|
isEditing = false
|
|
isDefault = Cards.shared.collection.isEmpty
|
|
isDefaultEditable = !Cards.shared.collection.isEmpty
|
|
isValidCard = false
|
|
update()
|
|
}
|
|
|
|
private func update() {
|
|
isValid = isValidCard && country != nil && bank != nil
|
|
didUpdate?()
|
|
}
|
|
|
|
func update(number: String) {
|
|
let number = number
|
|
// .trimmingCharacters(in: .whitespacesAndNewlines)
|
|
.replacingOccurrences(of: " ", with: "").count <= 19 ? number : self.number
|
|
// let tempNumber = self.number
|
|
// guard number.trimmingCharacters(in: .whitespacesAndNewlines).count <= 19 else {
|
|
// self.number = tempNumber
|
|
// update()
|
|
// return
|
|
// }
|
|
self.number = Cards.Model.formmated(number: number)
|
|
country = nil
|
|
bank = nil
|
|
isValidCard = CCValidator.validate(creditCardNumber: Cards.Model.cleaned(number: number), validatePrefix: false, validateLength: true, useLuhnAlgorithm: true)
|
|
if isValidCard {
|
|
validate(number: number)
|
|
}
|
|
update()
|
|
}
|
|
|
|
private func validate(number: String) {
|
|
willReload?()
|
|
let variables = P2PCardsGraphQLRequest.Variables(iins: [Cards.Model.cleaned(number: number)])
|
|
|
|
let environment = ApplicationEnvironment.shared().current
|
|
AF.request(
|
|
environment.backend.urlPath,
|
|
method: .post,
|
|
parameters: P2PCardsGraphQLRequest(variables: variables),
|
|
encoder: JSONParameterEncoder.default,
|
|
headers: HTTPHeaders(environment.headers)
|
|
).responseDecodable(of: GraphQLResponse<P2PCardsGraphQLRequest.ResponseData>.self) { [weak self] response in
|
|
switch response.result {
|
|
case let .success(value):
|
|
if let error = value.errorsDescription {
|
|
print(error)
|
|
self?.didReload?()
|
|
self?.update()
|
|
} else {
|
|
let cards = value.data?.checkBankCards?.cards ?? []
|
|
guard let card = cards.first else { return }
|
|
self?.country = (card.countryId, card.country)
|
|
self?.bank = (card.bankId, card.bank.name)
|
|
self?.type = Cards.Model.Kind(rawValue: card.brand ?? "") ?? .UNKNOWN
|
|
self?.didReload?()
|
|
self?.update()
|
|
}
|
|
case let .failure(error):
|
|
print(error)
|
|
self?.didReload?()
|
|
self?.update()
|
|
}
|
|
}
|
|
}
|
|
|
|
var card: Cards.Model {
|
|
Cards.Model(uuid: uuid, number: Cards.Model.formmated(number: number),
|
|
countryId: country?.id ?? 1, country: country?.title ?? "",
|
|
bankId: bank?.id ?? 1, bank: bank?.title ?? "", type: type)
|
|
}
|
|
|
|
func submit() {
|
|
Cards.shared.save(card: card)
|
|
if isDefault {
|
|
Cards.shared.default = card
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|