| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- //
- // LNEditInterestPanel.swift
- // Lanu
- //
- // Created by OneeChan on 2025/12/19.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNEditInterestPanel: LNPopupView {
- private var actegoryViews: [LNAutoFillStackView] = []
- private var curSelected: [LNGameCategoryItemVO] = []
- private let confirmButton = UIButton()
-
- private let maxCount = LNGameMateManager.gameSelectionMaxCount
- private var allInterests: [LNInterestItemView] = []
-
- var handler: (([LNGameCategoryItemVO]) -> Void)?
-
- init(selecteds: [String]) {
- super.init(frame: .zero)
-
- curSelected = selecteds.compactMap({
- LNGameMateManager.shared.gameCategory(for: $0)
- })
-
- setupViews()
-
- updateConfirmButton()
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNEditInterestPanel {
- private func updateConfirmButton() {
- if curSelected.isEmpty, confirmButton.isEnabled {
- confirmButton.isEnabled = false
- confirmButton.setBackgroundImage(nil, for: .normal)
- } else if !curSelected.isEmpty, !confirmButton.isEnabled {
- confirmButton.isEnabled = true
- confirmButton.setBackgroundImage(.primary_8, for: .normal)
- }
- }
-
- private func updateList() {
- allInterests.forEach { itemView in
- itemView.isSelected = curSelected.contains(where: { $0.code == itemView.curItem?.code })
- itemView.isEnable = itemView.isSelected || curSelected.count < LNGameMateManager.gameSelectionMaxCount
- }
- }
-
- private func setupViews() {
- container.clipsToBounds = true
-
- let background = UIImageView()
- background.image = .icLoginInterestBg
- container.addSubview(background)
- background.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.top.equalToSuperview()
- }
-
- let titleLabel = UILabel()
- titleLabel.font = .heading_h3
- titleLabel.textColor = .text_5
- titleLabel.text = .init(key: "A00186")
- container.addSubview(titleLabel)
- titleLabel.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.top.equalToSuperview().offset(16)
- }
-
- let descLabel = UILabel()
- descLabel.text = .init(key: "A00187")
- descLabel.font = .body_s
- descLabel.textColor = .text_4
- descLabel.textAlignment = .center
- container.addSubview(descLabel)
- descLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalTo(titleLabel.snp.bottom).offset(6)
- }
-
- let holder = UIView()
- holder.backgroundColor = .fill
- holder.layer.cornerRadius = 20
- container.addSubview(holder)
- holder.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalTo(descLabel.snp.bottom).offset(12)
- }
-
- let stackView = UIStackView()
- stackView.axis = .vertical
- stackView.spacing = 12
- holder.addSubview(stackView)
- stackView.snp.makeConstraints { make in
- make.edges.equalToSuperview().inset(14)
- }
- buildCategoryViews().forEach {
- stackView.addArrangedSubview($0)
- }
-
- confirmButton.setTitle(.init(key: "A00185"), for: .normal)
- confirmButton.setTitleColor(.text_1, for: .normal)
- confirmButton.titleLabel?.font = .heading_h3
- confirmButton.setBackgroundImage(.primary_8, for: .normal)
- confirmButton.layer.cornerRadius = 23.5
- confirmButton.clipsToBounds = true
- confirmButton.backgroundColor = .fill_4
- confirmButton.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- dismiss()
- handler?(curSelected)
- }), for: .touchUpInside)
- container.addSubview(confirmButton)
- confirmButton.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(12)
- make.top.equalTo(holder.snp.bottom).offset(16)
- make.bottom.equalToSuperview().offset(commonBottomInset)
- make.height.equalTo(47)
- }
- }
-
- private func buildCategoryViews() -> [UIView] {
- var views: [UIView] = []
-
- for category in LNGameMateManager.shared.curGameTypes {
- let container = UIView()
-
- let titleLabel = UILabel()
- titleLabel.text = category.name
- titleLabel.font = .heading_h4
- titleLabel.textColor = .text_5
- container.addSubview(titleLabel)
- titleLabel.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.top.equalToSuperview()
- }
-
- let multiLineView = LNAutoFillStackView()
- multiLineView.itemSpacing = 8
- multiLineView.spacing = 10
- container.addSubview(multiLineView)
- multiLineView.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.bottom.equalToSuperview()
- make.top.equalTo(titleLabel.snp.bottom).offset(10)
- }
-
- var itemViews: [UIView] = []
- category.children.forEach { item in
- let itemView = LNInterestItemView()
- itemView.update(item)
- itemView.onTap { [weak self] in
- guard let self else { return }
- if curSelected.contains(where: { $0.code == item.code }) {
- curSelected.removeAll { $0.code == item.code }
- } else if curSelected.count < LNGameMateManager.gameSelectionMaxCount{
- curSelected.append(item)
- }
- updateList()
- updateConfirmButton()
- }
- allInterests.append(itemView)
- itemViews.append(itemView)
- }
- multiLineView.update(itemViews)
-
- views.append(container)
- }
- updateList()
-
- return views
- }
- }
- private class LNInterestItemView: UIView {
- private let titleLabel = UILabel()
- private(set) var curItem: LNGameCategoryItemVO?
-
- var isSelected: Bool = false {
- didSet {
- if isSelected {
- titleLabel.font = .heading_h5
- titleLabel.textColor = .text_6
- backgroundColor = .fill_5
- } else {
- titleLabel.font = .body_s
- titleLabel.textColor = .text_4
- backgroundColor = .fill_1
- }
- }
- }
-
- var isEnable: Bool = true {
- didSet {
- alpha = isEnable ? 1.0 : 0.5
- isUserInteractionEnabled = isEnable
- }
- }
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- backgroundColor = .fill_1
- layer.cornerRadius = 12
- snp.makeConstraints { make in
- make.height.equalTo(24)
- }
-
- titleLabel.font = .body_s
- titleLabel.textColor = .text_4
- addSubview(titleLabel)
- titleLabel.snp.makeConstraints { make in
- make.center.equalToSuperview()
- make.horizontalEdges.equalToSuperview().inset(11)
- }
- }
-
- func update(_ item: LNGameCategoryItemVO) {
- titleLabel.text = item.name
- curItem = item
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
|