ReaderHive/ReaderHive/Class/Novel/V/NRDetailRechargeView.swift
2026-01-04 09:12:50 +08:00

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