| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- //
- // LNSkillUserInfoView.swift
- // Lanu
- //
- // Created by OneeChan on 2025/12/15.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNSkillUserInfoView: UIView {
- private let userNameLabel = UILabel()
- private let genderView = LNGenderView()
- private let idLabel = UILabel()
- private let locationLabel = UILabel()
- private let languageLabel = UILabel()
-
- private let scoreLabel = UILabel()
- private let orderCountLabel = UILabel()
-
- private var curDetail: LNGameMateSkillDetailVO?
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- setupViews()
- }
-
- func update(_ detail: LNGameMateSkillDetailVO) {
- userNameLabel.text = detail.nickname
- genderView.update(detail.gender, detail.age)
- scoreLabel.text = "\(detail.star)"
- orderCountLabel.text = "\(detail.orderCount)"
- locationLabel.text = "\(detail.distance)km"
- idLabel.text = "ID \(detail.userNo)"
- languageLabel.text = detail.languageNames.joined(separator: " / ")
-
- curDetail = detail
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNSkillUserInfoView {
- private func setupViews() {
- let star = buildStarView()
- addSubview(star)
- star.snp.makeConstraints { make in
- make.trailing.equalToSuperview().offset(-16)
- make.bottom.equalToSuperview().offset(-8)
- }
-
- let userView = buildUserInfo()
- addSubview(userView)
- userView.snp.makeConstraints { make in
- make.leading.equalToSuperview().offset(16)
- make.verticalEdges.equalToSuperview()
- make.trailing.lessThanOrEqualTo(star.snp.leading).offset(-10)
- }
- }
-
- private func buildUserInfo() -> UIView {
- let userView = UIStackView()
- userView.axis = .vertical
- userView.spacing = 2
- userView.alignment = .leading
-
- let nameView = UIView()
- userView.addArrangedSubview(nameView)
-
- userNameLabel.font = .heading_h2
- userNameLabel.textColor = .text_1
- nameView.addSubview(userNameLabel)
- userNameLabel.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.verticalEdges.equalToSuperview()
- }
-
- nameView.addSubview(genderView)
- genderView.snp.makeConstraints { make in
- make.centerY.equalTo(userNameLabel)
- make.leading.equalTo(userNameLabel.snp.trailing).offset(4)
- make.trailing.lessThanOrEqualToSuperview()
- }
-
- let idView = UIView()
- userView.addArrangedSubview(idView)
-
- let locationIc = UIImageView()
- locationIc.image = .init(named: "ic_location")?.withRenderingMode(.alwaysTemplate)
- locationIc.tintColor = .text_2
- idView.addSubview(locationIc)
- locationIc.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.verticalEdges.equalToSuperview()
- make.width.height.equalTo(16)
- }
-
- locationLabel.font = .body_s
- locationLabel.textColor = .text_2
- idView.addSubview(locationLabel)
- locationLabel.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.leading.equalTo(locationIc.snp.trailing).offset(4)
- }
-
- idLabel.font = .body_s
- idLabel.textColor = .text_2
- idView.addSubview(idLabel)
- idLabel.snp.makeConstraints { make in
- make.leading.equalTo(locationLabel.snp.trailing).offset(13)
- make.centerY.equalToSuperview()
- }
-
- let copyButton = UIButton()
- copyButton.setImage(.init(named: "ic_copy_right"), for: .normal)
- copyButton.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- guard let curDetail else { return }
- let pasteboard = UIPasteboard.general
- pasteboard.string = curDetail.userNo
-
- showToast(.init(key: "A00047"))
- }), for: .touchUpInside)
- idView.addSubview(copyButton)
- copyButton.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.leading.equalTo(idLabel.snp.trailing).offset(4)
- make.trailing.equalToSuperview()
- make.width.height.equalTo(16)
- }
-
- let languageView = UIView()
- userView.addArrangedSubview(languageView)
-
- let languageIc = UIImageView()
- languageIc.image = .init(named: "ic_language")?.withRenderingMode(.alwaysTemplate)
- languageIc.tintColor = .text_2
- languageView.addSubview(languageIc)
- languageIc.snp.makeConstraints { make in
- make.leading.verticalEdges.equalToSuperview()
- }
-
- languageLabel.font = .body_s
- languageLabel.textColor = .text_2
- languageView.addSubview(languageLabel)
- languageLabel.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.trailing.lessThanOrEqualToSuperview()
- make.leading.equalTo(languageIc.snp.trailing).offset(4)
- }
-
- return userView
- }
-
- private func buildStarView() -> UIView {
- let container = UIView()
-
- scoreLabel.font = .heading_h2
- scoreLabel.textColor = .text_1
- container.addSubview(scoreLabel)
- scoreLabel.snp.makeConstraints { make in
- make.top.equalToSuperview()
- make.trailing.equalToSuperview()
- }
-
- let star = LNStarScoreView()
- star.icSize = 18
- star.score = 1.0
- container.addSubview(star)
- star.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.centerY.equalTo(scoreLabel)
- make.trailing.equalTo(scoreLabel.snp.leading).offset(-4)
- }
-
- let orderLabel = UILabel()
- orderLabel.text = .init(key: "A00041")
- orderLabel.font = .body_xs
- orderLabel.textColor = .text_1
- container.addSubview(orderLabel)
- orderLabel.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.bottom.equalToSuperview()
- make.top.equalTo(scoreLabel.snp.bottom)
- }
-
- orderCountLabel.font = .heading_h5
- orderCountLabel.textColor = .text_1
- orderCountLabel.textAlignment = .center
- container.addSubview(orderCountLabel)
- orderCountLabel.snp.makeConstraints { make in
- make.leading.equalTo(orderLabel.snp.trailing)
- make.centerY.equalTo(orderLabel)
- }
-
- return container
- }
- }
|