Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/HomeView/Chat List/ArchivedConversationsCell.swift
1 views
//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

class ArchivedConversationsCell: UITableViewCell, ReusableTableViewCell {
    static let reuseIdentifier = "ArchivedConversationsCell"

    private let label = UILabel()
    private let disclosureImageView = UIImageView(image: UIImage(imageLiteralResourceName: "chevron-right-20"))

    var enabled = true {
        didSet {
            if enabled {
                label.textColor = .Signal.label
            } else {
                label.textColor = .Signal.secondaryLabel
            }
            disclosureImageView.tintColor = label.textColor
        }
    }

    // MARK: -

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func commonInit() {
        selectionStyle = .none

        var configuration = UIBackgroundConfiguration.clear()
        configuration.backgroundColor = .Signal.background
        backgroundConfiguration = configuration

        disclosureImageView.tintColor = .Signal.label
        disclosureImageView.setContentHuggingHigh()
        disclosureImageView.setCompressionResistanceHigh()

        label.text = OWSLocalizedString(
            "HOME_VIEW_ARCHIVED_CONVERSATIONS",
            comment: "Label for 'archived conversations' button.",
        )
        label.textAlignment = .center
        label.font = .dynamicTypeBody

        let stackView = UIStackView(arrangedSubviews: [label, disclosureImageView])
        stackView.axis = .horizontal
        stackView.spacing = 5
        stackView.alignment = .center
        stackView.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(stackView)
        contentView.addConstraints([
            stackView.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor),
            stackView.leadingAnchor.constraint(greaterThanOrEqualTo: contentView.layoutMarginsGuide.leadingAnchor),
            stackView.centerXAnchor.constraint(equalTo: contentView.layoutMarginsGuide.centerXAnchor),
            stackView.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor),
        ])

        accessibilityIdentifier = "archived_conversations"
        enabled = true
    }

    func configure(enabled: Bool) {
        self.enabled = enabled
        NotificationCenter.default.removeObserver(self)
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(multiSelectionModeDidChange),
            name: MultiSelectState.multiSelectionModeDidChange,
            object: nil,
        )
    }

    override func prepareForReuse() {
        NotificationCenter.default.removeObserver(self)
        super.prepareForReuse()
    }

    @objc
    private func multiSelectionModeDidChange(notification: Notification) {
        AssertIsOnMainThread()

        guard let multiSelectActive = notification.object as? Bool else {
            return
        }
        self.enabled = !multiSelectActive
    }
}