203 lines
6.6 KiB
Swift
203 lines
6.6 KiB
Swift
|
|
//
|
|||
|
|
// HeartBeatLevelGridController.swift
|
|||
|
|
// Crush
|
|||
|
|
//
|
|||
|
|
// Created by Leon on 2025/8/16.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
import UIKit
|
|||
|
|
|
|||
|
|
class HeartBeatLevelGridController: CLViewController<HeartBeatLevelGridView> {
|
|||
|
|
var aiId: Int = 0
|
|||
|
|
|
|||
|
|
var relation: AIUserHeartBeatRelation?
|
|||
|
|
var heartBeatLevelAccessDicts: [HeartbeatLeveLDict] = [HeartbeatLeveLDict]()
|
|||
|
|
|
|||
|
|
|
|||
|
|
lazy var popover = PopoverHideRalationView()
|
|||
|
|
override func viewDidLoad() {
|
|||
|
|
super.viewDidLoad()
|
|||
|
|
|
|||
|
|
// Do any additional setup after loading the view.
|
|||
|
|
setupViews()
|
|||
|
|
setupDatas()
|
|||
|
|
setupEvents()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupViews() {
|
|||
|
|
//navigationView.alpha0Title = "Crush Level"
|
|||
|
|
navigationView.title = "Crush Level"
|
|||
|
|
navigationView.bgView.alpha = 0
|
|||
|
|
let queryButton = {
|
|||
|
|
let v = EPIconGhostButton(radius: .none, iconSize: .medium, iconCode: .faq)
|
|||
|
|
v.addTarget(self, action: #selector(queryAction), for: .touchUpInside)
|
|||
|
|
navigationView.rightStackH.addArrangedSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.size.equalTo(CGSize(width: 44, height: 44))
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
let moreButton = {
|
|||
|
|
let v = EPIconGhostButton(radius: .none, iconSize: .medium, iconCode: .more)
|
|||
|
|
v.addTarget(self, action: #selector(moreAction(sender:)), for: .touchUpInside)
|
|||
|
|
navigationView.rightStackH.addArrangedSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.size.equalTo(CGSize(width: 44, height: 44))
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
queryButton.isHidden = false
|
|||
|
|
moreButton.isHidden = false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupDatas() {
|
|||
|
|
loadHeartBeatLevel()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func loadHeartBeatLevel(){
|
|||
|
|
Hud.showIndicator()
|
|||
|
|
AIRoleProvider.request(.heartBeatLevelGet(aiId: aiId), modelType: HeartBeatLevelRelation.self) {[weak self] result in
|
|||
|
|
Hud.hideIndicator()
|
|||
|
|
switch result {
|
|||
|
|
case .success(let model):
|
|||
|
|
self?.heartBeatLevelAccessDicts = model?.heartbeatLeveLDictList ?? []
|
|||
|
|
self?.relation = model?.aiUserHeartbeatRelation
|
|||
|
|
self?.reloadViewDatas()
|
|||
|
|
case .failure:
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupEvents() {
|
|||
|
|
container.headView.retrieveButton.addTarget(self, action: #selector(tapRetrieveButton), for: .touchUpInside)
|
|||
|
|
popover.controlSwitch.addTarget(self, action: #selector(tapPopoverControlSwitch), for: .valueChanged)
|
|||
|
|
NotificationCenter.default.addObserver(self, selector: #selector(notifiyRelationInfoUpdate), name: AppNotificationName.aiRoleRelationInfoUpdated.notificationName, object: nil)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@objc func notifiyRelationInfoUpdate(){
|
|||
|
|
loadHeartBeatLevel()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: Functions
|
|||
|
|
private func reloadViewDatas(){
|
|||
|
|
container.headView.config(relation)
|
|||
|
|
container.config(heartBeatLevelAccessDicts)
|
|||
|
|
|
|||
|
|
popover.controlSwitch.isOn = !(relation?.isShow ?? false)
|
|||
|
|
//..
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: Action
|
|||
|
|
|
|||
|
|
@objc private func queryAction() {
|
|||
|
|
let content = "*通过聊天或送礼增加心动值,24小时不联系心动值会自动扣减\n\n*心动值会提升心动等级,通过升级解锁称号,功能,以及不同的角色对话阶段\n\n *虚拟角色会根据对话的情绪感受,酌情判断增加或者减少心动值"
|
|||
|
|
let alert = Alert(title: "Tips", text: content)
|
|||
|
|
let action1 = AlertAction(title: "Got it", actionStyle: .confirm)
|
|||
|
|
alert.addAction(action1)
|
|||
|
|
alert.show()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@objc private func moreAction(sender: UIButton) {
|
|||
|
|
let popover = p_createPopoverView()
|
|||
|
|
popover.present(fromView: sender)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@objc private func tapRetrieveButton(){
|
|||
|
|
let sheet = RetrieveHeartbeatSheet()
|
|||
|
|
sheet.aiId = aiId
|
|||
|
|
sheet.config(self.relation)
|
|||
|
|
sheet.show()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@objc private func tapPopoverControlSwitch(sender: UISwitch) {
|
|||
|
|
let onOfSwitch = !sender.isOn
|
|||
|
|
//dlog("on\(onOfSwitch)")
|
|||
|
|
Hud.showIndicator()
|
|||
|
|
AIRoleProvider.request(.heartBeatRelationSwitch(aiId: aiId, isShow: onOfSwitch), modelType: EmptyModel.self) {[weak self] result in
|
|||
|
|
Hud.hideIndicator()
|
|||
|
|
switch result {
|
|||
|
|
case .success:
|
|||
|
|
self?.loadHeartBeatLevel() // Refresh
|
|||
|
|
NotificationCenter.post(name: .heartbeatRelationHiddenUpdate)
|
|||
|
|
case .failure:
|
|||
|
|
sender.isOn = !onOfSwitch
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func p_createPopoverView() -> FSPopoverView {
|
|||
|
|
let popoverView = FSPopoverView()
|
|||
|
|
popoverView.dataSource = self
|
|||
|
|
popoverView.showsArrow = false
|
|||
|
|
popoverView.showsDimBackground = false
|
|||
|
|
return popoverView
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
extension HeartBeatLevelGridController: FSPopoverViewDataSource {
|
|||
|
|
func contentView(for popoverView: FSPopoverView) -> UIView? {
|
|||
|
|
return popover
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func contentSize(for popoverView: FSPopoverView) -> CGSize {
|
|||
|
|
// return CGSize(width: 100, height: 60)
|
|||
|
|
let calSize = popover.label.sizeThatFits(CGSize(width: CGFLOAT_MAX, height: 20))
|
|||
|
|
let size = CGSize(width: calSize.width + 16 + 84, height: 60)
|
|||
|
|
dlog("hoee: \(size)")
|
|||
|
|
return size
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func containerSafeAreaInsets(for popoverView: FSPopoverView) -> UIEdgeInsets {
|
|||
|
|
var insets = view.safeAreaInsets
|
|||
|
|
insets.left = 10.0
|
|||
|
|
insets.right = 10.0
|
|||
|
|
return insets
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class PopoverHideRalationView: UIView {
|
|||
|
|
var controlSwitch: UISwitch!
|
|||
|
|
var label: UILabel!
|
|||
|
|
override init(frame: CGRect) {
|
|||
|
|
super.init(frame: frame)
|
|||
|
|
setupViews()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
required init?(coder: NSCoder) {
|
|||
|
|
fatalError("init(coder:) has not been implemented")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupViews() {
|
|||
|
|
snp.makeConstraints { make in
|
|||
|
|
make.height.equalTo(60)
|
|||
|
|
}
|
|||
|
|
controlSwitch = {
|
|||
|
|
let v = UISwitch()
|
|||
|
|
addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.trailing.equalToSuperview().offset(-16)
|
|||
|
|
make.centerY.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
label = {
|
|||
|
|
let v = UILabel()
|
|||
|
|
v.font = .t.tll
|
|||
|
|
v.textColor = .text
|
|||
|
|
addSubview(v)
|
|||
|
|
v.snp.makeConstraints { make in
|
|||
|
|
make.centerY.equalToSuperview()
|
|||
|
|
make.leading.equalToSuperview().offset(16)
|
|||
|
|
make.trailing.equalTo(controlSwitch.snp.leading).offset(-16)
|
|||
|
|
}
|
|||
|
|
return v
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
label.text = "Hide Relations"
|
|||
|
|
}
|
|||
|
|
}
|