418 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Swift
		
	
	
	
		
		
			
		
	
	
			418 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Swift
		
	
	
	
|  | // | |||
|  | //  MeetMatchedController.swift | |||
|  | //  Crush | |||
|  | // | |||
|  | //  Created by Leon on 2025/9/10. | |||
|  | // | |||
|  | 
 | |||
|  | import UIKit | |||
|  | 
 | |||
|  | class MeetMatchedController: CLBaseViewController { | |||
|  |     var bgImageView: CLImageView! | |||
|  |     var effectView: UIVisualEffectView! | |||
|  | 
 | |||
|  |     var titleWordsContainer: UIView! | |||
|  |     var nameAndAgeLabel: CLLabel! | |||
|  |     var likeAndCountLabel: CLIconLabel! | |||
|  | 
 | |||
|  |     var bottomButtonsStackV: UIStackView! | |||
|  |     var chatButton: StyleButton! | |||
|  |     var cancelButton: StyleButton! | |||
|  | 
 | |||
|  |     // -- 中间部分 | |||
|  |     var middleContainer: UIView! | |||
|  |     var middleStackV: UIStackView! | |||
|  |     // - Avatar | |||
|  |     var avatarsContainer: UIView! | |||
|  |     var avatarsStackH: UIStackView! | |||
|  |     var leftAvatar: CLImageView! | |||
|  |     var rightAvatar: CLImageView! | |||
|  |     var heartIcon: UIImageView! | |||
|  |     // - Gift (可选) | |||
|  |     var giftIcon: UIImageView! | |||
|  |     // 赠送的礼物数量(可选 | |||
|  |     var giftCountBadge: BadgeView! | |||
|  |     // - Matched | |||
|  |     var matchedContainer: UIView! | |||
|  |     var matchedLabel: ColorLabel! | |||
|  |     // - Desc | |||
|  |     var descLabel: CLLabel! | |||
|  |      | |||
|  |     // - Data | |||
|  |     var card: MeetCard? | |||
|  |     var info: MeetMatchInfo? | |||
|  |      | |||
|  |     // 可选 | |||
|  |     var gift: GiftDictModel? | |||
|  |     // 礼物数量 | |||
|  |     var giftCount: Int = 0 | |||
|  |      | |||
|  | 
 | |||
|  |     override func viewDidLoad() { | |||
|  |         super.viewDidLoad() | |||
|  | 
 | |||
|  |         // Do any additional setup after loading the view. | |||
|  | 
 | |||
|  |         setupViews() | |||
|  |         setupDatas() | |||
|  |         setupEvents() | |||
|  |     } | |||
|  | 
 | |||
|  |     private func setupViews() { | |||
|  |         navigationView.backButton.isHidden = true | |||
|  |         navigationView.bgView.alpha = 0 | |||
|  |          | |||
|  |         bgImageView = { | |||
|  |             let v = CLImageView() | |||
|  |             view.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.edges.equalToSuperview() | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         effectView = { | |||
|  |             let v = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) | |||
|  |             v.alpha = 1 | |||
|  |             view.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.edges.equalToSuperview() | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         titleWordsContainer = { | |||
|  |             let v = UIView() | |||
|  |             view.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.leading.trailing.equalToSuperview() | |||
|  |                 make.top.equalTo(navigationView.snp.bottom) | |||
|  |                 make.height.equalTo(60) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         nameAndAgeLabel = { | |||
|  |             let v = CLLabel() | |||
|  |             v.font = .t.ttm | |||
|  |             v.textAlignment = .center | |||
|  |             titleWordsContainer.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.leading.equalToSuperview().offset(16) | |||
|  |                 make.trailing.equalToSuperview().offset(-16) | |||
|  |                 make.top.equalToSuperview() | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         likeAndCountLabel = { | |||
|  |             let v = CLIconLabel() | |||
|  |             v.iconSize = CGSize(width: 20, height: 20) | |||
|  |             v.iconImageView.image = MWIconFont.image(fromIcon: .like, size: CGSize(width: 20, height: 20), color: .white) | |||
|  |             v.contentLabel.font = .t.tnds | |||
|  |             v.contentLabel.text = "-" | |||
|  |             titleWordsContainer.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.bottom.equalToSuperview() | |||
|  |                 make.centerX.equalToSuperview() | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         bottomButtonsStackV = { | |||
|  |             let v = UIStackView() | |||
|  |             v.axis = .vertical | |||
|  |             v.spacing = 24 | |||
|  |             view.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.leading.equalToSuperview().offset(48) | |||
|  |                 make.trailing.equalToSuperview().offset(-48) | |||
|  |                 make.bottom.equalToSuperview().offset(-16 - UIWindow.safeAreaBottom * 0.5) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         chatButton = { | |||
|  |             let v = StyleButton() | |||
|  |             v.primary(size: .large) | |||
|  |             v.addTarget(self, action: #selector(chatButtonAction), for: .touchUpInside) | |||
|  |             bottomButtonsStackV.addArrangedSubview(v) | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         cancelButton = { | |||
|  |             let v = StyleButton() | |||
|  |             v.tertiary(size: .large) | |||
|  |             v.addTarget(self, action: #selector(cancelButtonAction), for: .touchUpInside) | |||
|  |             bottomButtonsStackV.addArrangedSubview(v) | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         middleContainer = { | |||
|  |             let v = UIView() | |||
|  |             view.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.leading.trailing.equalToSuperview() | |||
|  |                 make.top.equalTo(titleWordsContainer.snp.bottom) | |||
|  |                 make.bottom.equalTo(bottomButtonsStackV.snp.top).offset(0) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         middleStackV = { | |||
|  |             let v = UIStackView() | |||
|  |             v.axis = .vertical | |||
|  |             v.alignment = .center | |||
|  |             middleContainer.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 //make.centerX.equalToSuperview() | |||
|  |                 make.leading.equalToSuperview().offset(48) | |||
|  |                 make.trailing.equalToSuperview().offset(-48) | |||
|  |                 make.centerY.equalToSuperview() | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  |          | |||
|  |         avatarsContainer = { | |||
|  |             let v = UIView() | |||
|  |             middleStackV.addArrangedSubview(v) | |||
|  | //            v.snp.makeConstraints { make in | |||
|  | //                make.height.equalTo(128) | |||
|  | //            } | |||
|  |             return v | |||
|  |         }() | |||
|  |          | |||
|  |         avatarsStackH = { | |||
|  |             let v = UIStackView() | |||
|  |             v.axis = .horizontal | |||
|  |             v.spacing = 16 | |||
|  |             avatarsContainer.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.edges.equalToSuperview() | |||
|  |                 make.height.equalTo(128) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  |          | |||
|  |         leftAvatar = { | |||
|  |             let v = CLImageView() | |||
|  |             v.cornerRadius = 64 | |||
|  |             avatarsStackH.addArrangedSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.width.equalTo(128) | |||
|  |                 make.height.equalTo(128) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         rightAvatar = { | |||
|  |             let v = CLImageView() | |||
|  |             v.cornerRadius = 64 | |||
|  |             avatarsStackH.addArrangedSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.width.equalTo(128) | |||
|  |                 make.height.equalTo(128) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         heartIcon = { | |||
|  |             let v = UIImageView() | |||
|  |             v.image = UIImage(named: "chat_level_heart") | |||
|  |             avatarsContainer.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  | //                make.centerX.equalToSuperview() | |||
|  |                 make.center.equalToSuperview() | |||
|  |                 make.size.equalTo(CGSize(width:60, height: 60)) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         giftIcon = { | |||
|  |             let v = UIImageView() | |||
|  |             v.image = UIImage(named: "chat_level_gift") | |||
|  |             middleStackV.addArrangedSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.size.equalTo(CGSize(width:72, height: 72)) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  |          | |||
|  |         giftCountBadge = { | |||
|  |             let v = BadgeView() | |||
|  |             giftIcon.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.trailing.equalToSuperview() | |||
|  |                 make.top.equalToSuperview().offset(4) | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         matchedContainer = { | |||
|  |             let v = UIView() | |||
|  |             middleStackV.addArrangedSubview(v) | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         matchedLabel = { | |||
|  |             let v = ColorLabel() | |||
|  |             v.applyGradient(.theme) | |||
|  |             v.font = .t.tdxl | |||
|  |             v.textColor = .white | |||
|  |             matchedContainer.addSubview(v) | |||
|  |             v.snp.makeConstraints { make in | |||
|  |                 make.leading.trailing.equalToSuperview() | |||
|  |                 make.top.equalToSuperview().offset(24) | |||
|  |                 make.bottom.equalToSuperview() | |||
|  |             } | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  |         descLabel = { | |||
|  |             let v = CLLabel() | |||
|  |             v.font = .t.tbm | |||
|  |             v.textAlignment = .center | |||
|  |             v.textColor = .white | |||
|  |             v.numberOfLines = 2 | |||
|  |             middleStackV.addArrangedSubview(v) | |||
|  |             return v | |||
|  |         }() | |||
|  | 
 | |||
|  | //        view.backgroundColor = .clear | |||
|  |          | |||
|  |         chatButton.setTitle("Chat", for: .normal) | |||
|  |         cancelButton.setTitle("Cancel", for: .normal) | |||
|  |         matchedLabel.text = "Matched" | |||
|  |          | |||
|  | //        #warning("test") | |||
|  | //        testData() | |||
|  |     } | |||
|  |      | |||
|  |     private func testData(){ | |||
|  |         nameAndAgeLabel.text = "Angelique, 28" | |||
|  |         giftCountBadge.badgeValue = 99 | |||
|  |         descLabel.text = "Thank you for your 99 gift names" | |||
|  |         likeAndCountLabel.contentLabel.text = "1.2k" | |||
|  |     } | |||
|  | 
 | |||
|  |     private func setupDatas() { | |||
|  |          | |||
|  |         rightAvatar.loadImage(UserCore.shared.user?.headImage) | |||
|  |          | |||
|  |         // 配置数据 | |||
|  |         configCardData() | |||
|  |         configGiftData() | |||
|  |     } | |||
|  | 
 | |||
|  |     private func setupEvents() { | |||
|  |     } | |||
|  | 
 | |||
|  |     // MARK: - Data Configuration | |||
|  |      | |||
|  |     /// 配置卡片数据 | |||
|  |     private func configCardData() { | |||
|  |          | |||
|  |         if let data = self.card { | |||
|  |             // 配置姓名和年龄 | |||
|  |             if let nickname = data.nickname, let age = data.age { | |||
|  |                 nameAndAgeLabel.text = "\(nickname), \(age)" | |||
|  |                  | |||
|  |             } else if let nickname = data.nickname { | |||
|  |                 nameAndAgeLabel.text = nickname | |||
|  |             } | |||
|  |              | |||
|  |             descLabel.text = "You and \(data.nickname ?? "-") are moved by each other" | |||
|  |              | |||
|  |             // 配置点赞数 | |||
|  |             if let likedCount = data.likedCount { | |||
|  |                 let displayCount = String.displayNumber(NSNumber(value: likedCount), scale: 1) | |||
|  |                 likeAndCountLabel.contentLabel.text = displayCount | |||
|  |             } | |||
|  |              | |||
|  |             bgImageView.loadImage(data.imageUrl) | |||
|  |             leftAvatar.loadImage(data.headImg) | |||
|  |         } | |||
|  |         else if let data = info{ | |||
|  |             if let nickname = data.nickname, let birthday = data.birthday { | |||
|  |                 let date = Date.dateFromMilliseconds(Int64(birthday)) | |||
|  |                 let ageYears = Date().years(from: date) | |||
|  |                 nameAndAgeLabel.text = "\(nickname), \(ageYears)" | |||
|  |                  | |||
|  |             } else if let nickname = data.nickname { | |||
|  |                 nameAndAgeLabel.text = nickname | |||
|  |             } | |||
|  |              | |||
|  |             descLabel.text = "You and \(data.nickname ?? "-") are moved by each other" | |||
|  |              | |||
|  |             // 配置点赞数 | |||
|  |             if let likedCount = data.likedCount { | |||
|  |                 let displayCount = String.displayNumber(NSNumber(value: likedCount), scale: 1) | |||
|  |                 likeAndCountLabel.contentLabel.text = displayCount | |||
|  |             } | |||
|  |              | |||
|  |             bgImageView.loadImage(data.homeImageUrl) | |||
|  |             leftAvatar.loadImage(data.headImg) | |||
|  |         } | |||
|  |     } | |||
|  |      | |||
|  |     /// 配置礼物数据 | |||
|  |     private func configGiftData() { | |||
|  |         guard let gift = gift else { | |||
|  |             // 如果没有礼物,隐藏礼物相关UI | |||
|  |             giftIcon.isHidden = true | |||
|  |             giftCountBadge.isHidden = true | |||
|  |             return | |||
|  |         } | |||
|  |          | |||
|  |         // 显示礼物图标 | |||
|  |         giftIcon.isHidden = false | |||
|  |         giftIcon.loadImage(gift.icon, bgColor: .clear) | |||
|  |          | |||
|  |         // 配置礼物数量徽章 | |||
|  |         if giftCount > 0 { | |||
|  |             giftCountBadge.isHidden = false | |||
|  |             giftCountBadge.badgeValue = giftCount | |||
|  |         } else { | |||
|  |             giftCountBadge.isHidden = true | |||
|  |         } | |||
|  |          | |||
|  |         // 更新描述文本,包含礼物信息 | |||
|  |         if let giftName = gift.name, giftCount > 0 { | |||
|  |             let giftText = "Thank you for your \(giftCount) \(giftName)" | |||
|  |             descLabel.text = giftText | |||
|  |         }else if let giftName = gift.name{ | |||
|  |             let giftText = "Thank you for your \(giftName)" | |||
|  |             descLabel.text = giftText | |||
|  |         } | |||
|  |     } | |||
|  |      | |||
|  |     /// 公共方法:配置页面数据 | |||
|  |     func configData(card: MeetCard?, gift: GiftDictModel?, giftCount: Int = 0) { | |||
|  |         self.card = card | |||
|  |         self.gift = gift | |||
|  |         self.giftCount = giftCount | |||
|  |          | |||
|  |         // 重新配置数据 | |||
|  |         configCardData() | |||
|  |         configGiftData() | |||
|  |     } | |||
|  | 
 | |||
|  |     // MARK: - Action | |||
|  | 
 | |||
|  |     @objc func chatButtonAction() { | |||
|  |         guard let aiId = card?.aiId else{ | |||
|  |             dismiss(animated: false) | |||
|  |             return | |||
|  |         } | |||
|  |         self.dismiss(animated: true) { | |||
|  |             AppRouter.goChatVC(aiId: aiId) | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     @objc func cancelButtonAction() { | |||
|  | //        self.removeFromParent() | |||
|  | //        self.view.removeFromSuperview() | |||
|  |         close() | |||
|  |     } | |||
|  | } |