Visual_Novel_iOS/crush/Crush/Src/Modules/VIP/View/VIPPrivilegesViews.swift

202 lines
6.2 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// VIPPrivilegesViews.swift
// Crush
//
// Created by Leon on 2025/9/16.
//
class VIPPrivilegesListCell: UITableViewCell {
var block: UIView!
var gradientBorderContainer: GradientBorderView!
var icon: UIImageView!
var contentStackV: UIStackView!
var titleLabel: LineSpaceLabel!
var descLabel: LineSpaceLabel!
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = .none
backgroundColor = .clear
setupViews()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupViews() {
block = {
let v = UIView()
contentView.addSubview(v)
v.snp.makeConstraints { make in
make.leading.trailing.bottom.equalToSuperview()
make.top.equalToSuperview().offset(16)
}
return v
}()
gradientBorderContainer = {
let gradient = CLSystemToken.gradient(token: .ccvn)
let v = GradientBorderView(colors: gradient.colors(), gradientType: .leftToRight)
v.gBorderWidth = 1
v.layer.cornerRadius = 8
v.layer.masksToBounds = true
v.backgroundColor = .c.cbdi
block.addSubview(v)
v.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(24)
make.size.equalTo(CGSize(width: 160, height: 107))
make.top.greaterThanOrEqualToSuperview().offset(0)
make.bottom.lessThanOrEqualToSuperview()
}
return v
}()
icon = {
let v = UIImageView()
v.cornerRadius = 8
// block.addSubview(v)
// v.snp.makeConstraints { make in
// make.leading.equalToSuperview().offset(24)
// make.size.equalTo(CGSize(width: 160, height: 107))
// make.top.greaterThanOrEqualToSuperview().offset(0)
// make.bottom.lessThanOrEqualToSuperview()
// }
gradientBorderContainer.addSubview(v)
v.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
return v
}()
contentStackV = {
let v = UIStackView()
v.axis = .vertical
v.spacing = 4
block.addSubview(v)
v.snp.makeConstraints { make in
make.leading.equalTo(gradientBorderContainer.snp.trailing).offset(16)
make.trailing.equalToSuperview().offset(-24)
make.top.greaterThanOrEqualToSuperview()
make.bottom.lessThanOrEqualToSuperview()
make.centerY.equalToSuperview()
}
return v
}()
titleLabel = {
let v = LineSpaceLabel()
let typo = CLSystemToken.typography(token: .tts)
v.config(typo)
v.textColor = .text
contentStackV.addArrangedSubview(v)
return v
}()
descLabel = {
let v = LineSpaceLabel()
let typo = CLSystemToken.typography(token: .tbs)
v.config(typo)
v.textColor = .c.ctsn
contentStackV.addArrangedSubview(v)
return v
}()
// testData()
}
private func testData() {
icon.backgroundColor = .random
titleLabel.text = "Virtual character X5"
descLabel.text = "Add 4 virtual role creation opportunities"
}
func config(_ data: MemberPrivDict?){
guard let privilege = data else {return}
icon.loadImage(privilege.img, bgColor: .clear)
titleLabel.text = privilege.title
descLabel.text = privilege.desc
}
}
class VIPPrivilegesHeadView: UIView {
var gradientBg: GradientView!
var titleLabel: CLLabel!
var descLabel: LineSpaceLabel!
var vipIcon: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupViews() {
gradientBg = {
let gradient = CLSystemToken.gradient(token: .ccvn)
let v = GradientView(colors: gradient.colors(), gradientType: .leftToRight)
addSubview(v)
v.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
return v
}()
vipIcon = {
let v = UIImageView()
v.image = UIImage(named: "icon_vip_crown")
addSubview(v)
v.snp.makeConstraints { make in
make.size.equalTo(CGSize(width: 100, height: 100))
make.trailing.equalToSuperview().offset(-24)
make.bottom.equalToSuperview().offset(-24)
}
return v
}()
titleLabel = {
let v = CLLabel()
v.font = .t.tdl
addSubview(v)
v.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(24)
make.top.equalToSuperview().offset(UIWindow.navBarTotalHeight)
}
return v
}()
descLabel = {
let v = LineSpaceLabel()
let typo = CLSystemToken.typography(token: .tls)
v.config(typo)
addSubview(v)
v.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(24)
make.top.equalTo(titleLabel.snp.bottom).offset(4)
make.trailing.equalTo(vipIcon.snp.leading).offset(-16)
}
return v
}()
titleLabel.text = "Crushlevel VIP"
descLabel.text = "Only $5.99/month, enjoy more benefits"
}
func config(info: UserSubscription?){
guard let vip = info else {return}
if vip.getVIPValid(), let expTime = vip.expTime{
let dateString = Date.timerStyle(style: .DMYHM, millisecond: expTime)
descLabel.text = "VIP expired in \(dateString)"
}
}
}