Files
lockdown-iOS-mirror/LockdowniOS/PaywallView.swift
2024-05-16 13:32:09 +02:00

172 lines
6.3 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// AdvancedWallView.swift
// LockdownSandbox
//
// Created by Алишер Ахметжанов on 28.04.2023.
//
import UIKit
import Foundation
final class PaywallView: UIView {
//MARK: Properties
private let model: PaywallViewModel
var isSelected: Bool = false
lazy var scrollView: UIScrollView = {
let view = UIScrollView()
view.isScrollEnabled = true
view.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 17, right: 0)
return view
}()
lazy var contentView: UIView = {
let view = UIView()
view.anchors.height.equal(400)
return view
}()
lazy var headlineLabel: PaywallDescriptionLabel = {
let label = PaywallDescriptionLabel()
label.titleLabel.text = model.title
label.subtitleLabel.text = model.subtitle
return label
}()
private lazy var bulletsStackView: UIStackView = {
let stackView = UIStackView()
stackView.addArrangedSubview(headlineLabel)
model.bulletPoints.forEach {
stackView.addArrangedSubview(bulletView(forTitle: $0))
}
stackView.axis = .vertical
stackView.spacing = 8
return stackView
}()
lazy var trialDescriptionLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.font = fontRegular12
label.textColor = .white
label.textAlignment = .center
let anualPrice = VPNSubscription.getProductIdPrice(productId: model.annualProductId)
let monthlyPrice = VPNSubscription.getProductIdPriceMonthly(productId: model.annualProductId)
let trialDuation = VPNSubscription.trialDuration(productId: model.annualProductId) ?? ""
let title = trialDuation + " " + NSLocalizedString("free trial", comment: "") + "," + " then \(anualPrice) (\(monthlyPrice)/mo)"
label.text = title
return label
}()
lazy var bottomProduct: ProductButton = {
let descriptionLabelPrice1 = VPNSubscription.getProductIdPrice(productId: model.mounthProductId)
let trialDuation = VPNSubscription.trialDuration(productId: model.annualProductId) ?? ""
let title = trialDuation + " " + NSLocalizedString("trial", comment: "")
var descriptionTitle = trialDuation.isEmpty ? "" : NSLocalizedString("then", comment: "") + " "
descriptionTitle += descriptionLabelPrice1 + NSLocalizedString("/year", comment: "")
let button = ProductButton(title: "Monthly", subtitle: descriptionLabelPrice1, toHighlight: descriptionLabelPrice1)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
lazy var topProduct: ProductButton = {
let annyalPrice = VPNSubscription.getProductIdPrice(productId: model.annualProductId)
let monthlyPrice = VPNSubscription.getProductIdPriceMonthly(productId: model.annualProductId)
var descriptionTitle = "\(annyalPrice)" + " (\(monthlyPrice)/mo)"
let button = ProductButton(title: "Yearly", subtitle: descriptionTitle, toHighlight: annyalPrice, isSelected: true)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
func updateCTATitle(for productID: String) {
let hasTrial = VPNSubscription.trialDuration(productId: productID) != nil
let title = hasTrial ? "Start for Free" : "Continue"
actionButton.setTitle(title, for: .normal)
}
lazy var actionButton: UIButton = {
let button = UIButton(type: .system)
button.tintColor = .white
button.backgroundColor = .tunnelsBlue
button.layer.cornerRadius = 28
let title = "Start for Free"
button.titleLabel?.font = fontSemiBold17
button.setTitle(title, for: .normal)
return button
}()
//MARK: Initialization
init(model: PaywallViewModel) {
self.model = model
super.init(frame: .zero)
configureUI()
}
override init(frame: CGRect) {
model = .empty()
super.init(frame: frame)
configureUI()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK: ConfigureUI
private func configureUI() {
addSubview(actionButton)
actionButton.anchors.bottom.pin()
actionButton.anchors.leading.marginsPin()
actionButton.anchors.trailing.marginsPin()
actionButton.anchors.height.equal(58)
addSubview(trialDescriptionLabel)
trialDescriptionLabel.anchors.leading.marginsPin()
trialDescriptionLabel.anchors.trailing.marginsPin()
trialDescriptionLabel.anchors.bottom.spacing(10, to: actionButton.anchors.top)
addSubview(bottomProduct)
bottomProduct.anchors.bottom.spacing(35, to: actionButton.anchors.top)
bottomProduct.anchors.leading.marginsPin()
bottomProduct.anchors.trailing.marginsPin()
bottomProduct.anchors.height.equal(60)
addSubview(topProduct)
topProduct.anchors.bottom.spacing(16, to: bottomProduct.anchors.top)
topProduct.anchors.leading.marginsPin()
topProduct.anchors.trailing.marginsPin()
topProduct.anchors.height.equal(60)
addSubview(scrollView)
scrollView.anchors.top.pin()
scrollView.anchors.leading.pin(inset: 16)
scrollView.anchors.trailing.pin()
scrollView.showsVerticalScrollIndicator = false
scrollView.anchors.bottom.spacing(8, to: topProduct.anchors.top)
scrollView.addSubview(contentView)
contentView.anchors.top.pin()
contentView.anchors.centerX.align()
contentView.anchors.width.equal(scrollView.anchors.width)
contentView.anchors.bottom.pin()
contentView.addSubview(bulletsStackView)
bulletsStackView.anchors.top.marginsPin()
bulletsStackView.anchors.leading.marginsPin()
bulletsStackView.anchors.trailing.marginsPin()
}
private func bulletView(forTitle title: String) -> BulletView {
let view = BulletView()
view.configure(with: BulletViewModel(image: UIImage(named: "Checkbox")!, title: title))
return view
}
}