205 lines
8.8 KiB
Swift
205 lines
8.8 KiB
Swift
//
|
|
// SubscriptionDetailsTableViewCell.swift
|
|
// Earthquake Network
|
|
//
|
|
// Created by Andrea Busi on 18/06/24.
|
|
// Copyright © 2024 Earthquake Network. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
|
|
class SubscriptionDetailsTableViewCell: EQNBaseContainerTableViewCell {
|
|
|
|
var onTapPrivacy: () -> Void = { }
|
|
var onTapTerms: () -> Void = { }
|
|
var onTapPurchase: () -> Void = { }
|
|
var onChangePlan: (_ type: EQNInAppProducts.Plan) -> Void = { _ in }
|
|
|
|
override var isHeaderVisible: Bool { false }
|
|
|
|
// MARK: - UI
|
|
|
|
lazy var planSegmentedControl: UISegmentedControl = {
|
|
let control = UISegmentedControl(items: EQNInAppProducts.Plan.allCases.map(\.localizedTitle))
|
|
control.translatesAutoresizingMaskIntoConstraints = false
|
|
control.addTarget(self, action: #selector(onChangeSegmentedControl(_:)), for: .valueChanged)
|
|
return control
|
|
}()
|
|
|
|
lazy var productTitleLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
label.textColor = AppTheme.shared.cardTextColor
|
|
label.font = .preferredFont(forTextStyle: .title1)
|
|
label.textAlignment = .center
|
|
label.numberOfLines = 0
|
|
return label
|
|
}()
|
|
|
|
lazy var productImageView: UIImageView = {
|
|
let imageView = UIImageView(image: .init(named: "top_100k"))
|
|
imageView.translatesAutoresizingMaskIntoConstraints = false
|
|
imageView.contentMode = .scaleAspectFit
|
|
imageView.heightAnchor.constraint(greaterThanOrEqualToConstant: 50.0).isActive = true
|
|
return imageView
|
|
}()
|
|
|
|
lazy var subscriptionDetailsLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
label.textColor = AppTheme.shared.cardTextColor
|
|
label.font = .preferredFont(forTextStyle: .body)
|
|
label.textAlignment = .justified
|
|
label.numberOfLines = 0
|
|
return label
|
|
}()
|
|
|
|
lazy var openPrivacyButton: UIButton = {
|
|
let button = UIButton(type: .system)
|
|
button.translatesAutoresizingMaskIntoConstraints = false
|
|
button.addTarget(self, action: #selector(onTapOpenPrivacyButton(_:)), for: .touchUpInside)
|
|
button.contentHorizontalAlignment = .leading
|
|
return button
|
|
}()
|
|
|
|
lazy var openTermsButton: UIButton = {
|
|
let button = UIButton(type: .system)
|
|
button.translatesAutoresizingMaskIntoConstraints = false
|
|
button.addTarget(self, action: #selector(onTapOpenTermsButton(_:)), for: .touchUpInside)
|
|
button.contentHorizontalAlignment = .leading
|
|
return button
|
|
}()
|
|
|
|
lazy var purchaseRecapLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
label.textColor = AppTheme.shared.cardTextColor
|
|
label.font = .preferredFont(forTextStyle: .headline)
|
|
label.numberOfLines = 0
|
|
label.textAlignment = .center
|
|
return label
|
|
}()
|
|
|
|
lazy var productPriceLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.translatesAutoresizingMaskIntoConstraints = false
|
|
label.textColor = AppTheme.shared.cardTextColor
|
|
label.font = .preferredFont(forTextStyle: .largeTitle)
|
|
label.numberOfLines = 0
|
|
label.textAlignment = .center
|
|
return label
|
|
}()
|
|
|
|
lazy var purchaseButton: UIButton = {
|
|
let button = UIButton(type: .system)
|
|
button.translatesAutoresizingMaskIntoConstraints = false
|
|
button.addTarget(self, action: #selector(onTapPurchaseButton(_:)), for: .touchUpInside)
|
|
button.titleLabel?.font = .preferredFont(forTextStyle: .headline)
|
|
button.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
|
|
button.backgroundColor = .systemGroupedBackground
|
|
button.eqn_applyShadowAndRoundedCorners()
|
|
return button
|
|
}()
|
|
|
|
// MARK: - Internal
|
|
|
|
override func setupUI() {
|
|
super.setupUI()
|
|
|
|
containerView.addSubview(planSegmentedControl)
|
|
containerView.addSubview(productTitleLabel)
|
|
containerView.addSubview(productImageView)
|
|
containerView.addSubview(subscriptionDetailsLabel)
|
|
containerView.addSubview(openPrivacyButton)
|
|
containerView.addSubview(openTermsButton)
|
|
containerView.addSubview(purchaseRecapLabel)
|
|
containerView.addSubview(productPriceLabel)
|
|
containerView.addSubview(purchaseButton)
|
|
|
|
let leading: NSLayoutXAxisAnchor = planSegmentedControl.leadingAnchor
|
|
let trailing: NSLayoutXAxisAnchor = planSegmentedControl.trailingAnchor
|
|
planSegmentedControl.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: .cardVerticalSpacing).isActive = true
|
|
planSegmentedControl.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: .cardPadding).isActive = true
|
|
planSegmentedControl.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: .cardPadding.negative).isActive = true
|
|
|
|
productTitleLabel.topAnchor.constraint(equalTo: planSegmentedControl.bottomAnchor, constant: .cardVerticalSpacing).isActive = true
|
|
productTitleLabel.leadingAnchor.constraint(equalTo: leading, constant: .cardPadding).isActive = true
|
|
productTitleLabel.trailingAnchor.constraint(equalTo: trailing, constant: .cardPadding.negative).isActive = true
|
|
|
|
productImageView.topAnchor.constraint(equalTo: productTitleLabel.bottomAnchor, constant: .cardVerticalSpacing.x2).isActive = true
|
|
productImageView.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
productImageView.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
|
|
purchaseRecapLabel.topAnchor.constraint(equalTo: productImageView.bottomAnchor, constant: .cardVerticalSpacing.x2).isActive = true
|
|
purchaseRecapLabel.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
purchaseRecapLabel.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
productPriceLabel.topAnchor.constraint(equalTo: purchaseRecapLabel.bottomAnchor, constant: .cardVerticalSpacing).isActive = true
|
|
productPriceLabel.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
productPriceLabel.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
|
|
purchaseButton.topAnchor.constraint(equalTo: productPriceLabel.bottomAnchor, constant: .cardVerticalSpacing).isActive = true
|
|
purchaseButton.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
purchaseButton.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
|
|
subscriptionDetailsLabel.topAnchor.constraint(equalTo: purchaseButton.bottomAnchor, constant: .cardVerticalSpacing.x2).isActive = true
|
|
subscriptionDetailsLabel.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
subscriptionDetailsLabel.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
|
|
openPrivacyButton.topAnchor.constraint(equalTo: subscriptionDetailsLabel.bottomAnchor, constant: .cardVerticalSpacing.x2).isActive = true
|
|
openPrivacyButton.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
openPrivacyButton.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
|
|
openTermsButton.topAnchor.constraint(equalTo: openPrivacyButton.bottomAnchor, constant: .cardPadding).isActive = true
|
|
openTermsButton.leadingAnchor.constraint(equalTo: leading).isActive = true
|
|
openTermsButton.trailingAnchor.constraint(equalTo: trailing).isActive = true
|
|
openTermsButton.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: .cardVerticalSpacing.x2.negative).isActive = true
|
|
}
|
|
|
|
override func updateUI() {
|
|
super.updateUI()
|
|
|
|
openPrivacyButton.setTitle(NSLocalizedString("network_pro_privacy_disclaimer", comment: ""), for: .normal)
|
|
openTermsButton.setTitle(NSLocalizedString("network_pro_terms_conditions", comment: ""), for: .normal)
|
|
purchaseButton.setTitle(NSLocalizedString("inapp_purchase", comment: ""), for: .normal)
|
|
}
|
|
|
|
// MARK: - Actions
|
|
|
|
@objc private func onTapOpenPrivacyButton(_ sender: UIButton) {
|
|
onTapPrivacy()
|
|
}
|
|
|
|
@objc private func onTapOpenTermsButton(_ sender: UIButton) {
|
|
onTapTerms()
|
|
}
|
|
|
|
@objc private func onTapPurchaseButton(_ sender: UIButton) {
|
|
onTapPurchase()
|
|
}
|
|
|
|
@objc private func onChangeSegmentedControl(_ sender: UISegmentedControl) {
|
|
let type: EQNInAppProducts.Plan = .from(index: sender.selectedSegmentIndex)
|
|
onChangePlan(type)
|
|
}
|
|
}
|
|
|
|
|
|
extension EQNInAppProducts.Plan {
|
|
var index: Int {
|
|
switch self {
|
|
case .monthly: 0
|
|
case .yearly: 1
|
|
case .perpetual: 2
|
|
}
|
|
}
|
|
|
|
static func from(index: Int) -> Self {
|
|
switch index {
|
|
case 0: .monthly
|
|
case 1: .yearly
|
|
default: .perpetual
|
|
}
|
|
}
|
|
}
|