mirror of
https://github.com/confirmedcode/Lockdown-iOS.git
synced 2025-12-21 12:14:02 +01:00
172 lines
6.3 KiB
Swift
172 lines
6.3 KiB
Swift
//
|
||
// 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
|
||
}
|
||
}
|