Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/ConversationView/Components/CVComponentContactShare.swift
1 views
//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
public import SignalUI

public class CVComponentContactShare: CVComponentBase, CVComponent {

    public var componentKey: CVComponentKey { .contactShare }

    private let contactShareState: CVComponentState.ContactShare

    private var contactShare: ContactShareViewModel {
        contactShareState.state.contactShare
    }

    init(itemModel: CVItemModel, contactShareState: CVComponentState.ContactShare) {
        self.contactShareState = contactShareState

        super.init(itemModel: itemModel)
    }

    public func buildComponentView(componentDelegate: CVComponentDelegate) -> CVComponentView {
        CVComponentViewContactShare()
    }

    public func configureForRendering(
        componentView componentViewParam: CVComponentView,
        cellMeasurement: CVCellMeasurement,
        componentDelegate: CVComponentDelegate,
    ) {
        guard let componentView = componentViewParam as? CVComponentViewContactShare else {
            owsFailDebug("Unexpected componentView.")
            componentViewParam.reset()
            return
        }

        let contactShareView = componentView.contactShareView
        contactShareView.configureForRendering(
            state: contactShareState.state,
            cellMeasurement: cellMeasurement,
        )
    }

    public func measure(maxWidth: CGFloat, measurementBuilder: CVCellMeasurement.Builder) -> CGSize {
        owsAssertDebug(maxWidth > 0)

        return CVContactShareView.measure(
            maxWidth: maxWidth,
            measurementBuilder: measurementBuilder,
            state: contactShareState.state,
        )
    }

    override public func handleTap(
        sender: UIGestureRecognizer,
        componentDelegate: CVComponentDelegate,
        componentView: CVComponentView,
        renderItem: CVRenderItem,
    ) -> Bool {

        componentDelegate.didTapContactShare(contactShare)
        return true
    }

    // MARK: -

    // Used for rendering some portion of an Conversation View item.
    // It could be the entire item or some part thereof.
    public class CVComponentViewContactShare: NSObject, CVComponentView {

        fileprivate let contactShareView = CVContactShareView(name: "CVContactShareView")

        public var isDedicatedCellView = false

        public var rootView: UIView {
            contactShareView
        }

        public func setIsCellVisible(_ isCellVisible: Bool) {}

        public func reset() {
            contactShareView.reset()
        }

    }
}

// MARK: -

extension CVComponentContactShare: CVAccessibilityComponent {
    public var accessibilityDescription: String {
        if let contactName = contactShare.displayName.filterForDisplay.nilIfEmpty {
            let format = OWSLocalizedString(
                "ACCESSIBILITY_LABEL_CONTACT_FORMAT",
                comment: "Accessibility label for contact. Embeds: {{ the contact name }}.",
            )
            return String.nonPluralLocalizedStringWithFormat(format, contactName)
        } else {
            return OWSLocalizedString(
                "ACCESSIBILITY_LABEL_CONTACT",
                comment: "Accessibility label for contact.",
            )
        }
    }
}