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

import SignalServiceKit

public protocol NewStoryHeaderDelegate: AnyObject, OWSTableViewController2 {
    func newStoryHeaderView(_ newStoryHeaderView: NewStoryHeaderView, didCreateNewStoryItems items: [StoryConversationItem])
}

public class NewStoryHeaderView: UIStackView {
    weak var delegate: NewStoryHeaderDelegate!

    public init(
        title: String,
        showsNewStoryButton: Bool = true,
        delegate: NewStoryHeaderDelegate,
    ) {
        self.delegate = delegate

        super.init(frame: .zero)

        axis = .horizontal
        isLayoutMarginsRelativeArrangement = true
        layoutMargins = .init(
            top: 11,
            leading: OWSTableViewController2.cellHInnerMargin * 0.5,
            bottom: 14,
            trailing: 0,
        )
        layoutMargins.left += delegate.tableView.safeAreaInsets.left
        layoutMargins.right += delegate.tableView.safeAreaInsets.right

        let textView = UILabel()
        textView.textColor = UIColor.Signal.label
        textView.font = UIFont.dynamicTypeHeadlineClamped
        textView.text = title

        addArrangedSubview(textView)
        addArrangedSubview(.hStretchingSpacer())

        // TODO: Replace with ContextMenuButton
        let newStoryButton = OWSFlatButton.button(
            title: OWSLocalizedString(
                "NEW_STORY_HEADER_VIEW_ADD_NEW_STORY_BUTTON",
                comment: "table section header button to add a new story",
            ),
            font: UIFont.dynamicTypeFootnoteClamped.semibold(),
            titleColor: Theme.isDarkThemeEnabled ? UIColor.ows_gray05 : UIColor.ows_gray90,
            backgroundColor: delegate.cellBackgroundColor,
            target: self,
            selector: #selector(didTapNewStory),
        )
        newStoryButton.setImage(UIImage(imageLiteralResourceName: "plus-extra-small"))
        newStoryButton.contentEdgeInsets = UIEdgeInsets(top: 6, leading: 12, bottom: 6, trailing: 18)
        newStoryButton.titleEdgeInsets = UIEdgeInsets(top: 0, leading: 6, bottom: 0, trailing: -6)
        newStoryButton.tintColor = Theme.primaryIconColor
        newStoryButton.clipsToBounds = true
        newStoryButton.isHidden = !showsNewStoryButton

        let pillWrapper = ManualLayoutView(name: "PillWrapper")
        pillWrapper.shouldDeactivateConstraints = false

        pillWrapper.addSubview(newStoryButton) { view in
            newStoryButton.layer.cornerRadius = view.height / 2
        }
        newStoryButton.autoPinEdgesToSuperviewEdges()

        addArrangedSubview(pillWrapper)
    }

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

    @objc
    private func didTapNewStory() {
        let vc = NewStorySheet { [weak self] items in
            guard let self else { return }
            self.delegate.newStoryHeaderView(self, didCreateNewStoryItems: items)
        }
        delegate.present(vc, animated: true)
    }
}