333 lines
10 KiB
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()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|