202 lines
6.2 KiB
Swift
202 lines
6.2 KiB
Swift
|
|
//
|
||
|
|
// 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)"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|