| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- //
- // LNIMChatUserMenuView.swift
- // Lanu
- //
- // Created by OneeChan on 2025/12/10.
- //
- import Foundation
- import UIKit
- import SnapKit
- import Combine
- class LNIMChatUserMenuView: LNPopupView {
- private let muteSwitch = UISwitch()
- private let blackLabel = UILabel()
-
- var viewModel: LNIMChatViewModel? {
- didSet {
- viewModel?.$messageOpt.sink { [weak self] opt in
- guard let self else { return }
- muteSwitch.isOn = opt == .RECEIVE_NOT_NOTIFY_MESSAGE
- }.store(in: &cancellables)
- blackLabel.text = viewModel?.userId.isInMyBlackList != true ? .init(key: "A00044") : .init(key: "A00045")
- }
- }
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- setupViews()
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNIMChatUserMenuView {
- private func setupViews() {
- let stackView = UIStackView()
- stackView.axis = .vertical
- stackView.spacing = 0
- container.addSubview(stackView)
- stackView.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.top.equalToSuperview().offset(10)
- make.bottom.equalToSuperview().offset(commonBottomInset)
- }
-
- let menus = [
- buildMute(),
-
- buildLine(),
- buildRemark(),
-
- buildLine(),
- buildBlack(),
-
- buildLine(),
- buildReport()]
- menus.forEach {
- stackView.addArrangedSubview($0)
- }
- }
-
- private func buildMute() -> UIView {
- let scaleX: CGFloat = 40.0 / 51.0
- let scaleY: CGFloat = 24.5 / 31.0
- muteSwitch.onTintColor = .primary_5
- muteSwitch.transform = CGAffineTransform(scaleX: scaleX, y: scaleY)
- muteSwitch.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- viewModel?.updateMessageOpt(opt: muteSwitch.isOn ? .RECEIVE_NOT_NOTIFY_MESSAGE : .RECEIVE_MESSAGE)
- }), for: .valueChanged)
- return buildMenuItem(icon: .icImChatMenuMute, title: .init(key: "A00085"), contentView: muteSwitch)
- }
-
- private func buildRemark() -> UIView {
- let menu = buildMenuItem(icon: .icImChatMenuRemark, title: .init(key: "A00086"), contentView: nil)
- menu.onTap { [weak self] in
- guard let self else { return }
- let panel = LNIMChatUserRemarkPanel()
- panel.update(viewModel?.remark ?? "")
- panel.handler = { [weak self] remark in
- guard let self else { return }
- dismiss()
- viewModel?.updateRemark(remark)
- }
- panel.popup()
- }
-
- return menu
- }
-
- private func buildBlack() -> UIView {
- blackLabel.font = .body_m
- blackLabel.textColor = .text_5
- let menu = buildMenuItem(icon: .icImChatMenuBlack, titleView: blackLabel, contentView: nil)
-
- menu.onTap { [weak self] in
- guard let self else { return }
- guard let uid = viewModel?.userId else { return }
- dismiss()
- if viewModel?.userId.isInMyBlackList != true {
- LNCommonAlertView.showBlackAlert(uid: uid)
- } else {
- LNRelationManager.shared.blackListUser(uid: uid, black: false, handler: nil)
- }
- }
-
- return menu
- }
-
- private func buildReport() -> UIView {
- let menu = buildMenuItem(icon: .icImChatMenuRemark, title: .init(key: "A00043"), contentView: nil)
-
- menu.onTap { [weak self] in
- guard let self else { return }
- guard let uid = viewModel?.userId else { return }
- dismiss()
- pushToReport(uid: uid)
- }
-
- return menu
- }
-
- private func buildMenuItem(icon: UIImage, title: String, contentView: UIView?) -> UIView {
- let titleLabel = UILabel()
- titleLabel.text = title
- titleLabel.font = .body_m
- titleLabel.textColor = .text_5
-
- return buildMenuItem(icon: icon, titleView: titleLabel, contentView: contentView)
- }
-
- private func buildMenuItem(icon: UIImage, titleView: UIView, contentView: UIView?) -> UIView {
- let container = UIView()
- container.snp.makeConstraints { make in
- make.height.equalTo(52)
- }
-
- let ic = UIImageView()
- ic.image = icon
- container.addSubview(ic)
- ic.snp.makeConstraints { make in
- make.leading.equalToSuperview().offset(16)
- make.centerY.equalToSuperview()
- }
-
- container.addSubview(titleView)
- titleView.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.leading.equalTo(ic.snp.trailing).offset(10)
- }
-
- if let contentView {
- container.addSubview(contentView)
- contentView.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.trailing.equalToSuperview().offset(-16)
- }
- } else {
- let arrow = UIImageView()
- arrow.image = .init(systemName: "chevron.forward")
- arrow.tintColor = .text_4
- container.addSubview(arrow)
- arrow.snp.makeConstraints { make in
- make.centerY.equalToSuperview()
- make.trailing.equalToSuperview().offset(-16)
- }
- }
-
- 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
- }
- }
|