| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- //
- // LNRoomChatMessageCell.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/11.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNRoomChatMessageCell: UITableViewCell {
- private let avatarView = UIImageView()
- private let nameLabel = UILabel()
- private let contentLabel = UILabel()
-
- private var curItem: LNRoomChatMessageItem?
-
- override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
- super.init(style: style, reuseIdentifier: reuseIdentifier)
-
- setupViews()
- }
-
- func update(_ message: LNRoomChatMessageItem) {
- contentLabel.text = message.text
- avatarView.sd_setImage(with: URL(string: message.avatar))
- nameLabel.text = message.name
-
- curItem = message
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNRoomChatMessageCell {
- private func showProfileCard() {
- guard let curItem else { return }
- let panel = LNRoomProfileCardPanel()
- panel.load(curItem.sender)
- panel.popup(self)
- }
- }
- extension LNRoomChatMessageCell {
- private func setupViews() {
- backgroundColor = .clear
-
- avatarView.layer.cornerRadius = 13
- avatarView.layer.borderColor = .fill
- avatarView.layer.borderWidth = 0.5
- avatarView.clipsToBounds = true
- avatarView.onTap { [weak self] in
- guard let self else { return }
- showProfileCard()
- }
- contentView.addSubview(avatarView)
- avatarView.snp.makeConstraints { make in
- make.leading.equalToSuperview()
- make.top.equalToSuperview().offset(8)
- make.width.height.equalTo(26)
- make.bottom.lessThanOrEqualToSuperview().offset(-8)
- }
-
- let bodyView = UIView()
- contentView.addSubview(bodyView)
- bodyView.snp.makeConstraints { make in
- make.leading.equalTo(avatarView.snp.trailing).offset(10)
- make.top.equalTo(avatarView)
- make.bottom.equalToSuperview().offset(-8)
- make.trailing.lessThanOrEqualToSuperview()
- }
-
- nameLabel.font = .heading_h5
- nameLabel.textColor = .text_2
- nameLabel.setContentHuggingPriority(.required, for: .vertical)
- nameLabel.onTap { [weak self] in
- guard let self else { return }
- showProfileCard()
- }
- bodyView.addSubview(nameLabel)
- nameLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.top.equalToSuperview()
- }
-
- let bubble = UIView()
- bubble.backgroundColor = .fill.withAlphaComponent(0.12)
- bubble.layer.cornerRadius = 12
- bodyView.addSubview(bubble)
- bubble.snp.makeConstraints { make in
- make.top.equalTo(nameLabel.snp.bottom).offset(4)
- make.leading.equalToSuperview()
- make.trailing.lessThanOrEqualToSuperview()
- make.bottom.equalToSuperview()
- }
-
- contentLabel.font = .body_s
- contentLabel.textColor = .text_1
- contentLabel.numberOfLines = 0
- bubble.addSubview(contentLabel)
- contentLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(9)
- make.verticalEdges.equalToSuperview().inset(8)
- }
- }
- }
|