// // 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 } } }