SynthReel/SynthReel/Class/Player/V/SRVideoRechargeView.swift
2025-12-08 10:34:34 +08:00

321 lines
10 KiB
Swift

//
// SRVideoRechargeView.swift
// SynthReel
//
// Created by CSGY on 2025/12/5.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
class SRVideoRechargeView: SRPanModalContentView {
var buyFinishHandle: (() -> Void)?
var didDismissHandle: (() -> Void)?
var model: SRPayDateModel? {
didSet {
self.stackView.sr_removeAllArrangedSubview()
self.vipView.dataArr = model?.list_sub_vip ?? []
self.coinsView.setDataArr(model?.list_coins ?? [])
if let sort = model?.sort, sort.count > 0 {
sort.forEach {
if $0 == .vip, model?.list_sub_vip?.isEmpty == false {
self.stackView.addArrangedSubview(self.vipView)
} else if $0 == .coin, model?.list_coins?.isEmpty == false {
self.stackView.addArrangedSubview(self.coinsView)
}
}
} else {
if model?.list_sub_vip?.isEmpty == false {
self.stackView.addArrangedSubview(self.vipView)
}
if model?.list_coins?.isEmpty == false {
self.stackView.addArrangedSubview(self.coinsView)
}
}
self.stackView.addArrangedSubview(self.tipView)
self.setNeedsLayoutUpdate()
}
}
var videoInfo: SRVideoInfoModel? {
didSet {
self.coinsView.videoId = videoInfo?.short_play_video_id
self.coinsView.shortPlayId = videoInfo?.short_play_id
self.vipView.videoId = videoInfo?.short_play_video_id
self.vipView.shortPlayId = videoInfo?.short_play_id
videoCoinsView.coins = videoInfo?.coins ?? 0
self.requestRestore()
}
}
private lazy var closeButton: UIButton = {
let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in
guard let self = self else { return }
// FAStatAPI.requestEventStat(orderCode: nil, shortPlayId: self.videoInfo?.short_play_id, videoId: self.videoInfo?.short_play_video_id, eventKey: .payTemplateDialog, errorMsg: nil, otherParamenters: [
// "event_name" : "pay cancel"
// ])
Task {
await self.dismiss(animated: true)
}
self.didDismissHandle?()
}))
button.setImage(UIImage(named: "Close"), for: .normal)
return button
}()
private lazy var scrollView: SRScrollView = {
let scrollView = SRScrollView()
// scrollView.clipsToBounds = false
return scrollView
}()
private lazy var stackView: UIStackView = {
let view = UIStackView()
view.axis = .vertical
view.spacing = 18
return view
}()
private lazy var coinsView: SRStoreCoinsView = {
let view = SRStoreCoinsView()
view.buyFinishHandle = { [weak self] in
self?.buyFinishHandle?()
Task {
await self?.dismiss(animated: true)
}
}
return view
}()
private lazy var vipView: SRStoreVipView = {
let view = SRStoreVipView()
view.buyFinishHandle = { [weak self] in
self?.buyFinishHandle?()
Task {
await self?.dismiss(animated: true)
}
}
return view
}()
private lazy var videoCoinsView: SRVideoRechargeView.CoinsView = {
let view = SRVideoRechargeView.CoinsView()
view.title = "synthreel_price".localized + ":"
return view
}()
private lazy var totalCoinsView: SRVideoRechargeView.CoinsView = {
let view = SRVideoRechargeView.CoinsView()
view.title = "synthreel_balance".localized + ":"
view.coins = SRLogin.manager.userInfo?.totalCoins ?? 0
return view
}()
private lazy var tipView: UIView = {
let view = UIView()
view.addSubview(tipTitleLabel)
view.addSubview(tipTextLabel)
tipTitleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(7)
make.left.equalToSuperview().offset(16)
}
tipTextLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.right.lessThanOrEqualToSuperview().offset(-16)
make.top.equalTo(tipTitleLabel.snp.bottom).offset(4)
make.bottom.equalToSuperview()
}
return view
}()
private lazy var tipTitleLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 12, weight: .medium)
label.textColor = .white
label.text = "synthreel_tips".localized
return label
}()
private lazy var tipTextLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 10, weight: .regular)
label.textColor = .white
label.text = "store_tips".localized
label.numberOfLines = 0
return label
}()
deinit {
NotificationCenter.default.removeObserver(self)
}
override init(frame: CGRect) {
super.init(frame: frame)
NotificationCenter.default.addObserver(self, selector: #selector(userInfoUpdateNotification), name: SRLogin.userInfoUpdateNotification, object: nil)
self.contentHeight = UIScreen.height - UIScreen.safeTop
// self.backgroundColor = ._000000.withAlphaComponent(0.6)
self.backgroundColor = .clear
self.mainScrollView = self.scrollView
fa_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc private func userInfoUpdateNotification() {
totalCoinsView.coins = SRLogin.manager.userInfo?.totalCoins ?? 0
}
override func present(in view: UIView?) {
super.present(in: view)
// self.hw_contentView.sr_addEffectView(style: .dark)
// self.hw_contentView.sr_setRoundedCorner(topLeft: 24, topRight: 24, bottomLeft: 0, bottomRight: 0)
}
override func allowsTapBackgroundToDismiss() -> Bool {
return false
}
}
extension SRVideoRechargeView {
private func fa_setupLayout() {
addSubview(closeButton)
addSubview(videoCoinsView)
addSubview(totalCoinsView)
// addSubview(titleLabel)
addSubview(scrollView)
scrollView.addSubview(stackView)
closeButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-16)
make.top.equalToSuperview().offset(12)
}
videoCoinsView.snp.makeConstraints { make in
make.centerY.equalTo(closeButton)
make.left.equalToSuperview().offset(16)
}
totalCoinsView.snp.makeConstraints { make in
make.centerY.equalTo(closeButton)
make.left.equalTo(videoCoinsView.snp.right).offset(15)
}
// titleLabel.snp.makeConstraints { make in
// make.left.equalToSuperview().offset(16)
// make.top.equalToSuperview().offset(39)
// }
scrollView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalToSuperview().offset(74)
make.bottom.equalToSuperview()
}
stackView.snp.makeConstraints { make in
make.left.centerX.equalToSuperview()
make.top.equalToSuperview()
make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 10))
}
}
}
extension SRVideoRechargeView {
@objc private func requestRestore() {
guard let shortPlayId = self.videoInfo?.short_play_id, let videoId = self.videoInfo?.short_play_video_id else { return }
SRIapManager.manager.restore(isLoding: false, shortPlayId: shortPlayId, videoId: videoId) { [weak self] isFinish, buyType in
if isFinish {
Task {
await SRLogin.manager.requestUserInfo(completer: nil)
self?.buyFinishHandle?()
await self?.dismiss(animated: true)
}
}
}
}
}
extension SRVideoRechargeView {
class CoinsView: UIView {
var title: String? {
didSet {
titleLabel.text = title
}
}
var coins: Int = 0 {
didSet {
coinsLabel.text = "\(coins)"
}
}
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 14, weight: .regular)
label.textColor = .white
return label
}()
private lazy var iconImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "bigCoins"))
return imageView
}()
private lazy var coinsLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 14, weight: .bold)
label.textColor = .white
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(titleLabel)
addSubview(iconImageView)
addSubview(coinsLabel)
titleLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.bottom.lessThanOrEqualToSuperview()
make.left.equalToSuperview()
}
iconImageView.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.bottom.lessThanOrEqualToSuperview()
make.left.equalTo(titleLabel.snp.right).offset(6)
}
coinsLabel.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.bottom.lessThanOrEqualToSuperview()
make.left.equalTo(iconImageView.snp.right).offset(4)
make.right.equalToSuperview()
}
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
}