310 lines
9.4 KiB
Swift
310 lines
9.4 KiB
Swift
//
|
|
// NRDetailRechargeView.swift
|
|
// ReaderHive
|
|
//
|
|
// Created by 澜声世纪 on 2025/12/8.
|
|
//
|
|
|
|
import UIKit
|
|
import HWPanModal
|
|
import SnapKit
|
|
|
|
class NRDetailRechargeView: NRPanModalContentView {
|
|
|
|
var buyFinishHandle: (() -> Void)?
|
|
var didDismissHandle: (() -> Void)?
|
|
|
|
var payModel: NRPayDateModel? {
|
|
didSet {
|
|
self.stackView.nr_removeAllArrangedSubview()
|
|
self.vipView.dataArr = payModel?.list_sub_vip ?? []
|
|
self.coinsView.setDataArr(payModel?.list_coins ?? [])
|
|
|
|
if let sort = payModel?.sort, sort.count > 0 {
|
|
sort.forEach {
|
|
if $0 == .vip, payModel?.list_sub_vip?.isEmpty == false {
|
|
self.stackView.addArrangedSubview(self.vipView)
|
|
} else if $0 == .coin, payModel?.list_coins?.isEmpty == false {
|
|
self.stackView.addArrangedSubview(self.coinsView)
|
|
}
|
|
}
|
|
} else {
|
|
if payModel?.list_sub_vip?.isEmpty == false {
|
|
self.stackView.addArrangedSubview(self.vipView)
|
|
}
|
|
if payModel?.list_coins?.isEmpty == false {
|
|
self.stackView.addArrangedSubview(self.coinsView)
|
|
}
|
|
}
|
|
|
|
// self.stackView.addArrangedSubview(self.tipView)
|
|
|
|
self.setNeedsLayoutUpdate()
|
|
}
|
|
}
|
|
|
|
var worksId: String? {
|
|
didSet {
|
|
coinsView.shortPlayId = worksId
|
|
vipView.shortPlayId = worksId
|
|
self.requestRestore()
|
|
}
|
|
}
|
|
|
|
var chapterId: String? {
|
|
didSet {
|
|
coinsView.videoId = chapterId
|
|
vipView.videoId = chapterId
|
|
self.requestRestore()
|
|
}
|
|
}
|
|
|
|
var price: Int? {
|
|
didSet {
|
|
priceLabel.text = "\(price ?? 0)"
|
|
}
|
|
}
|
|
|
|
|
|
private lazy var bgView: UIView = {
|
|
let view = UIImageView(image: UIImage(named: "bg_image_01"))
|
|
return view
|
|
}()
|
|
|
|
private lazy var coinsTitleLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .font(ofSize: 12, weight: .regular)
|
|
label.textColor = .black
|
|
label.text = "Balance".localized + ":"
|
|
return label
|
|
}()
|
|
|
|
private lazy var coinsIconView: UIImageView = UIImageView(image: UIImage(named: "coins_icon_04"))
|
|
|
|
private lazy var coinsLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .font(ofSize: 14, weight: .bold)
|
|
label.textColor = .F_9710_D
|
|
label.text = "\(NRLoginManager.manager.userInfo?.totalCoins ?? 0)"
|
|
return label
|
|
}()
|
|
|
|
private lazy var closeButton: UIButton = {
|
|
let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in
|
|
guard let self = self else { return }
|
|
NRStatAPI.nr_requestEventStat(orderCode: nil, shortPlayId: self.worksId, videoId: self.chapterId, eventKey: .payTemplateDialog, errorMsg: nil, otherParamenters: [
|
|
"event_name" : "pay cancel"
|
|
])
|
|
|
|
Task {
|
|
await self.dismiss(animated: true)
|
|
}
|
|
self.didDismissHandle?()
|
|
}))
|
|
button.setImage(UIImage(named: "close_icon_02"), for: .normal)
|
|
return button
|
|
}()
|
|
|
|
private lazy var priceTitleLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .font(ofSize: 12, weight: .regular)
|
|
label.textColor = .black
|
|
label.text = "Chapter Price".localized + ":"
|
|
return label
|
|
}()
|
|
|
|
private lazy var priceIconView: UIImageView = UIImageView(image: UIImage(named: "coins_icon_04"))
|
|
|
|
private lazy var priceLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .font(ofSize: 14, weight: .bold)
|
|
label.textColor = .F_9710_D
|
|
label.text = "0"
|
|
return label
|
|
}()
|
|
|
|
private lazy var coinsLineView: UIView = {
|
|
let view = UIView()
|
|
view.backgroundColor = .black.withAlphaComponent(0.15)
|
|
return view
|
|
}()
|
|
|
|
private lazy var lineView: UIView = {
|
|
let view = UIView()
|
|
view.backgroundColor = .black.withAlphaComponent(0.15)
|
|
return view
|
|
}()
|
|
|
|
private lazy var scrollView: NRScrollView = {
|
|
let scrollView = NRScrollView()
|
|
return scrollView
|
|
}()
|
|
|
|
private lazy var stackView: UIStackView = {
|
|
let view = UIStackView()
|
|
view.axis = .vertical
|
|
view.spacing = 12
|
|
return view
|
|
}()
|
|
|
|
private lazy var coinsView: NRStoreCoinsView = {
|
|
let view = NRStoreCoinsView()
|
|
view.isShowTitle = false
|
|
view.buyFinishHandle = { [weak self] in
|
|
self?.buyFinish()
|
|
}
|
|
return view
|
|
}()
|
|
|
|
private lazy var vipView: NRStoreVipView = {
|
|
let view = NRStoreVipView()
|
|
view.isShowTitle = false
|
|
view.buyFinishHandle = { [weak self] in
|
|
self?.buyFinish()
|
|
}
|
|
return view
|
|
}()
|
|
|
|
@MainActor deinit {
|
|
NotificationCenter.default.removeObserver(self)
|
|
}
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
contentHeight = UIScreen.height - UIScreen.navBarHeight
|
|
mainScrollView = self.scrollView
|
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(userInfoUpdateNotification), name: NRLoginManager.userInfoUpdateNotification, object: nil)
|
|
|
|
nr_setupUI()
|
|
}
|
|
|
|
@MainActor required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
@objc private func userInfoUpdateNotification() {
|
|
coinsLabel.text = "\(NRLoginManager.manager.userInfo?.totalCoins ?? 0)"
|
|
}
|
|
|
|
private func buyFinish() {
|
|
Task {
|
|
await self.dismiss(animated: true)
|
|
}
|
|
Task {
|
|
await NRLoginManager.manager.updateUserInfo()
|
|
self.buyFinishHandle?()
|
|
}
|
|
}
|
|
|
|
override func allowsTapBackgroundToDismiss() -> Bool {
|
|
return false
|
|
}
|
|
|
|
}
|
|
|
|
extension NRDetailRechargeView {
|
|
|
|
private func nr_setupUI() {
|
|
addSubview(bgView)
|
|
addSubview(coinsTitleLabel)
|
|
addSubview(coinsIconView)
|
|
addSubview(coinsLabel)
|
|
addSubview(coinsLineView)
|
|
addSubview(priceTitleLabel)
|
|
addSubview(priceIconView)
|
|
addSubview(priceLabel)
|
|
addSubview(closeButton)
|
|
addSubview(lineView)
|
|
addSubview(scrollView)
|
|
scrollView.addSubview(stackView)
|
|
|
|
bgView.snp.makeConstraints { make in
|
|
make.left.right.top.equalToSuperview()
|
|
}
|
|
|
|
coinsTitleLabel.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalToSuperview().offset(16)
|
|
}
|
|
|
|
coinsIconView.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalTo(coinsTitleLabel.snp.right).offset(4)
|
|
}
|
|
|
|
coinsLabel.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalTo(coinsIconView.snp.right).offset(4)
|
|
}
|
|
|
|
coinsLineView.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalTo(coinsLabel.snp.right).offset(8)
|
|
make.width.equalTo(1)
|
|
make.height.equalTo(12)
|
|
}
|
|
|
|
priceTitleLabel.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalTo(coinsLineView.snp.right).offset(8)
|
|
}
|
|
|
|
priceIconView.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalTo(priceTitleLabel.snp.right).offset(4)
|
|
}
|
|
|
|
priceLabel.snp.makeConstraints { make in
|
|
make.centerY.equalTo(closeButton)
|
|
make.left.equalTo(priceIconView.snp.right).offset(4)
|
|
}
|
|
|
|
closeButton.snp.makeConstraints { make in
|
|
make.top.equalToSuperview().offset(6)
|
|
make.right.equalToSuperview().offset(-6)
|
|
make.width.height.equalTo(44)
|
|
}
|
|
|
|
lineView.snp.makeConstraints { make in
|
|
make.left.equalToSuperview().offset(16)
|
|
make.centerX.equalToSuperview()
|
|
make.top.equalToSuperview().offset(52)
|
|
make.height.equalTo(1)
|
|
}
|
|
|
|
scrollView.snp.makeConstraints { make in
|
|
make.left.right.bottom.equalToSuperview()
|
|
// make.top.equalToSuperview().offset(52)
|
|
make.top.equalTo(lineView.snp.bottom).offset(12)
|
|
}
|
|
|
|
stackView.snp.makeConstraints { make in
|
|
make.left.centerX.equalToSuperview()
|
|
make.top.equalToSuperview()
|
|
make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 10))
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
extension NRDetailRechargeView {
|
|
|
|
@objc private func requestRestore() {
|
|
guard let shortPlayId = self.worksId, let videoId = self.chapterId else { return }
|
|
|
|
NRIapManager.manager.restore(isLoding: false, shortPlayId: shortPlayId, videoId: videoId) { [weak self] isFinish, buyType in
|
|
if isFinish {
|
|
Task {
|
|
await NRLoginManager.manager.updateUserInfo()
|
|
}
|
|
self?.buyFinishHandle?()
|
|
Task {
|
|
await self?.dismiss(animated: true)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|