Visual_Novel_iOS/crush/Crush/Src/Components/UI/Sheet/RetrieveHeartbeatSheet.swift

333 lines
10 KiB
Swift

//
// RetrieveHeartbeatSheet.swift
// Crush
//
// Created by Leon on 2025/8/16.
//
import UIKit
class RetrieveHeartbeatSheet: EGPopBaseView {
var closeButton: EPIconTertiaryButton!
var heartWave : HeartBeatAnimationView!
var titleLabel:UILabel!
var stackV : UIStackView!
// content 1: numberscontent
var priceLabel: UILabel!
var quantityContentLabel: UILabel!
// content 3: total Price
var totalPriceLabel: UILabel!
var button:StyleButton!
var aiId: Int?
// @Requrired
var data: AIUserHeartBeatRelation?
init() {
super.init(direction: .bottom)
contentView.backgroundColor = .c.cbd
contentLength = 444 + UIWindow.safeAreaBottom
closeButton = {
let v = EPIconTertiaryButton(radius: .round, iconSize: .small, iconCode: .delete)
v.addTarget(self, action: #selector(bgButtonPressed), for: .touchUpInside)
contentView.addSubview(v)
v.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.size.equalTo(v.bgImageSize())
make.trailing.equalToSuperview().offset(-16)
}
return v
}()
heartWave = {
let v = HeartBeatAnimationView()
contentView.insertSubview(v, at: 0)
v.snp.makeConstraints { make in
make.leading.trailing.equalToSuperview()
make.top.equalToSuperview().offset(-84)
}
return v
}()
titleLabel = {
let v = UILabel()
contentView.addSubview(v)
v.text = "Retrieve heart value"
v.font = .t.tts
v.textColor = .text
v.textAlignment = .center
v.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(24)
make.trailing.equalToSuperview().offset(-24)
make.top.equalToSuperview().offset(156)
}
v.numberOfLines = 0
return v
}()
stackV = {
let v = UIStackView()
v.axis = .vertical
v.spacing = 0
contentView.addSubview(v)
v.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(24)
make.trailing.equalToSuperview().offset(-24)
make.top.equalTo(titleLabel.snp.bottom).offset(24)
}
return v
}()
do{
let priceView = {
let v = UIView()
stackV.addArrangedSubview(v)
v.snp.makeConstraints { make in
make.height.equalTo(48)
}
return v
}()
let tipLabel = {
let label = UILabel()
label.font = .t.tll
label.textColor = .text
priceView.addSubview(label)
label.snp.makeConstraints { make in
make.leading.equalToSuperview()
make.centerY.equalToSuperview()
}
return label
}()
tipLabel.text = "Unit price"
priceLabel = {
let v = UILabel()
v.font = .t.tll
v.textColor = .text
priceView.addSubview(v)
v.snp.makeConstraints { make in
make.trailing.equalToSuperview()
make.centerY.equalToSuperview()
}
return v
}()
let coinIv = {
let v = UIImageView()
priceView.addSubview(v)
v.snp.makeConstraints { make in
make.trailing.equalTo(priceLabel.snp.leading).offset(-8)
make.centerY.equalToSuperview()
}
return v
}()
coinIv.image = UIImage(named: "icon_16_diamond")
}
setupQuantityView()
do{
let priceView = {
let v = UIView()
stackV.addArrangedSubview(v)
v.snp.makeConstraints { make in
make.height.equalTo(48)
}
return v
}()
let tipLabel = {
let label = UILabel()
label.font = .t.tll
label.textColor = .text
priceView.addSubview(label)
label.snp.makeConstraints { make in
make.leading.equalToSuperview()
make.centerY.equalToSuperview()
}
return label
}()
tipLabel.text = "Total"
totalPriceLabel = {
let v = UILabel()
v.font = .t.tll
v.textColor = .text
priceView.addSubview(v)
v.snp.makeConstraints { make in
make.trailing.equalToSuperview()
make.centerY.equalToSuperview()
}
v.text = "0"
return v
}()
let coinIv = {
let v = UIImageView()
v.image = UIImage(named: "icon_16_diamond")
priceView.addSubview(v)
v.snp.makeConstraints { make in
make.trailing.equalTo(totalPriceLabel.snp.leading).offset(-8)
make.centerY.equalToSuperview()
}
return v
}()
coinIv.isHidden = false
}
button = {
let v = StyleButton()
v.primary(size: .large)
contentView.addSubview(v)
v.setTitle("Purchase", for: .normal)
v.addTarget(self, action: #selector(operateAction), for: .touchUpInside)
v.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(24)
make.trailing.equalToSuperview().offset(-24)
//make.top.equalTo(titleLabel.snp.bottom).offset(24)
make.bottom.equalToSuperview().offset(-16-UIWindow.safeAreaBottom*0.5)
}
return v
}()
let price = 5
let priceLabelText = "\(price)"
priceLabel.text = priceLabelText
setupEvent()
//#warning("test")
// testData()
}
private func setupQuantityView(){
let quantityView = {
let v = UIView()
stackV.addArrangedSubview(v)
v.snp.makeConstraints { make in
make.height.equalTo(72)
}
return v
}()
let quantityLabel = {
let v = UILabel()
v.font = .t.tll
v.textColor = .text
quantityView.addSubview(v)
v.snp.makeConstraints { make in
make.leading.equalToSuperview()
make.centerY.equalToSuperview()
}
return v
}()
quantityContentLabel = {
let v = UILabel()
v.font = .t.tll
v.textColor = .text
quantityView.addSubview(v)
v.snp.makeConstraints { make in
make.trailing.equalToSuperview()
make.centerY.equalToSuperview()
}
return v
}()
quantityLabel.text = "Quantity"
quantityContentLabel.text = "-℃"
}
private func setupEvent(){
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChanged(noti:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}
private func testData(){
let price = 5
let priceLabelText = "\(price)"
//let coinLabelText = "\(coin) Coins"
priceLabel.text = priceLabelText
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Public
override func show() {
super.show()
}
func config(_ data: AIUserHeartBeatRelation?){
self.data = data
//
let unitPrice = data?.price ?? 500
let unitCoin = Coin(cents: unitPrice)
priceLabel.text = unitCoin.formatted
let heartPercent = data?.getHeartbeatWavePercent() ?? 0.1
heartWave.percent = heartPercent
quantityContentLabel.text = data?.fixedSubtractHeartbeatValDisplay ?? "-"
let quality = data?.fixedSubtractHeartbeatVal ?? 0
let price = quality * Double(unitPrice)
var fixPrice = price * 0.01
if fixPrice > 1{
fixPrice = floor(fixPrice)
}else{
fixPrice = max(1, fixPrice)
}
let coin = Coin(usd: fixPrice)
totalPriceLabel.text = coin.formatted
}
// MARK: - Action
@objc func operateAction(){
// guard let aiId = data
guard let subtractHeartbeatVal = data?.subtractHeartbeatVal, let theAiId = aiId else{
return
}
Hud.showIndicator()
AIRoleProvider.request(.heartBeatPurchase(aiId: theAiId, heartBeatVal: subtractHeartbeatVal), modelType: EmptyModel.self) {[weak self] result in
Hud.hideIndicator()
switch result {
case .success:
NotificationCenter.post(name: .aiRoleRelationInfoUpdated)
self?.dismiss()
case .failure:
break
}
}
}
@objc func keyboardWillChanged(noti: Notification) {
guard let userInfo = noti.userInfo else { return }
//let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
if endFrame.origin.y >= UIScreen.main.bounds.height {
bottomKeyboardHeight = 0
refreshLPositon()
}else{
bottomKeyboardHeight = endFrame.height
refreshLPositon()
}
}
}