sendbird-uikit-ios/Sources/View/MessageThread/SBUMessageThreadTitleView.s...

117 lines
3.7 KiB
Swift

//
// SBUMessageThreadTitleView.swift
// SendbirdUIKit
//
// Created by Tez Park on 2022/11/06.
// Copyright © 2022 Sendbird, Inc. All rights reserved.
//
import UIKit
import SendbirdChatSDK
public protocol SBUMessageThreadTitleViewDelegate: AnyObject {
/// Called when channel name was tapped.
/// - Parameter messageThreadTitleView: The tapped thread info view.
func messageThreadTitleViewDidTap(_ messageThreadTitleView: SBUMessageThreadTitleView)
}
open class SBUMessageThreadTitleView: SBUView {
// MARK: - Logic properties (Public)
/// The channel object for displaying channel name.
public private(set) var channel: BaseChannel?
/// The object that acts as the delegate of the titleView. The delegate must adopt the `SBUMessageThreadTitleViewDelegate` protocol.
public weak var delegate: SBUMessageThreadTitleViewDelegate?
@SBUThemeWrapper(theme: SBUTheme.channelTheme)
public var theme: SBUChannelTheme
/// The created channel name.
public var channelName: String {
var baseChannelName = ""
if let channelName = channel?.name, SBUUtils.isValid(channelName: channelName) {
baseChannelName = channelName
} else {
if let groupChannel = channel as? GroupChannel {
baseChannelName = SBUUtils.generateChannelName(channel: groupChannel)
}
}
return baseChannelName
}
// MARK: - UI properties (Private)
private lazy var stackView = UIStackView()
private lazy var titleLabel = UILabel()
private lazy var channelNameLabel = UILabel()
// MARK: - Life cycle
public override init() {
super.init(frame: .zero)
}
public init(delegate: SBUMessageThreadTitleViewDelegate? = nil) {
super.init()
self.delegate = delegate
}
open override func setupViews() {
self.titleLabel.text = SBUStringSet.MessageThread.Header.title
self.titleLabel.textAlignment = .center
self.channelNameLabel.textAlignment = .center
self.channelNameLabel.isUserInteractionEnabled = false
self.stackView.alignment = .center
self.stackView.axis = .vertical
self.stackView.addArrangedSubview(self.titleLabel)
self.stackView.addArrangedSubview(self.channelNameLabel)
let tapGesture = UITapGestureRecognizer(
target: self,
action: #selector(onTapChannelName(sender:))
)
self.stackView.addGestureRecognizer(tapGesture)
self.addSubview(self.stackView)
}
open override func setupLayouts() {
self.stackView
.sbu_constraint(equalTo: self, leading: 0, trailing: -0, top: 0, bottom: 0)
.sbu_constraint_equalTo(
centerXAnchor: self.centerXAnchor,
centerX: 0,
centerYAnchor: self.centerYAnchor,
centerY: 0
)
}
open override func setupStyles() {
self.titleLabel.font = theme.messageThreadTitleFont
self.titleLabel.textColor = theme.messageThreadTitleColor
self.channelNameLabel.font = theme.messageThreadTitleChannelNameFont
self.channelNameLabel.textColor = theme.messageThreadTitleChannelNameColor
}
open override func layoutSubviews() {
super.layoutSubviews()
self.setupStyles()
}
// MARK: - Action
@objc
open func onTapChannelName(sender: UITapGestureRecognizer) {
self.delegate?.messageThreadTitleViewDidTap(self)
}
// MARK: - Common
open func configure(channel: BaseChannel?, title: String?) {
self.channel = channel
self.channelNameLabel.text = self.channelName
}
}