// // LNPostSkillSelectPanel.swift // Lanu // // Created by OneeChan on 2025/12/16. // import Foundation import UIKit import SnapKit class LNPostSkillSelectPanel: LNPopupView { private let stackView = UIStackView() private let confirmButton = UIButton() private let maxSelection = 3 private var curSelecteds: [LNGameMateSkillVO] = [] var handler: (([LNGameMateSkillVO]) -> Void)? override init(frame: CGRect) { super.init(frame: frame) setupViews() } func setSkills(skills: [LNGameMateSkillVO], selecteds: [LNGameMateSkillVO]) { stackView.arrangedSubviews.forEach { stackView.removeArrangedSubview($0) $0.removeFromSuperview() } var itemViews: [UIView] = [] skills.forEach { skill in let isSelected = selecteds.contains { $0.id == skill.id } let itemView = buildSkillItem(skill, selected: isSelected) itemViews.append(itemView) } for index in (1.. UIView { let container = UIView() container.snp.makeConstraints { make in make.height.equalTo(48) } let checkIc = UIImageView() checkIc.image = selected ? .icCheck : .icUncheck container.addSubview(checkIc) checkIc.snp.makeConstraints { make in make.centerY.equalToSuperview() make.trailing.equalToSuperview().offset(-16) } let skillIc = UIImageView() skillIc.layer.cornerRadius = 12 skillIc.clipsToBounds = true skillIc.sd_setImage(with: URL(string: skill.icon)) container.addSubview(skillIc) skillIc.snp.makeConstraints { make in make.leading.equalToSuperview().offset(16) make.centerY.equalToSuperview() make.width.height.equalTo(24) } let titleLabel = UILabel() titleLabel.text = skill.name titleLabel.font = .heading_h4 titleLabel.textColor = .text_5 container.addSubview(titleLabel) titleLabel.snp.makeConstraints { make in make.leading.equalTo(skillIc.snp.trailing).offset(8) make.centerY.equalToSuperview() make.trailing.lessThanOrEqualTo(checkIc.snp.leading).offset(-5) } container.onTap { [weak self, weak checkIc] in guard let self, let checkIc else { return } if curSelecteds.contains(where: { $0.id == skill.id }) { curSelecteds.removeAll { $0.id == skill.id } checkIc.image = .icUncheck } else { if maxSelection == curSelecteds.count { showToast(.init(key: "A00224", maxSelection)) } else { curSelecteds.append(skill) checkIc.image = .icCheck } } updateConfirmButton() } return container } private func buildLine() -> UIView { let container = UIView() let line = UIView() line.backgroundColor = .fill_2 container.addSubview(line) line.snp.makeConstraints { make in make.verticalEdges.equalToSuperview() make.height.equalTo(1) make.horizontalEdges.equalToSuperview().inset(16) } return container } } #if DEBUG import SwiftUI struct LNPostSkillSelectPanelPreview: UIViewRepresentable { func makeUIView(context: Context) -> some UIView { let container = UIView() container.backgroundColor = .lightGray let view = LNPostSkillSelectPanel() view.popup(container) return container } func updateUIView(_ uiView: UIViewType, context: Context) { } } #Preview(body: { LNPostSkillSelectPanelPreview() }) #endif // DEBUG