TM-SGNL-iOS/SignalUI/Stories/NewStorySheet.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

117 lines
5.1 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import SignalServiceKit
import UIKit
public class NewStorySheet: OWSTableSheetViewController {
let selectItemsInParent: (([StoryConversationItem]) -> Void)?
public init(selectItemsInParent: (([StoryConversationItem]) -> Void)?) {
self.selectItemsInParent = selectItemsInParent
super.init()
tableViewController.defaultSeparatorInsetLeading =
OWSTableViewController2.cellHInnerMargin + 48 + OWSTableItem.iconSpacing
}
public override func updateTableContents(shouldReload: Bool = true) {
let contents = OWSTableContents()
defer { tableViewController.setContents(contents, shouldReload: shouldReload) }
let headerSection = OWSTableSection()
headerSection.customHeaderHeight = 2
headerSection.hasBackground = false
contents.add(headerSection)
headerSection.add(.init(customCellBlock: {
let label = UILabel()
label.font = UIFont.dynamicTypeHeadlineClamped
label.textColor = Theme.primaryTextColor
label.text = OWSLocalizedString("NEW_STORY_SHEET_TITLE", comment: "Title for the new story sheet")
label.textAlignment = .center
let cell = OWSTableItem.newCell()
cell.contentView.addSubview(label)
label.autoPinEdgesToSuperviewEdges()
return cell
}))
let optionsSection = OWSTableSection()
optionsSection.customHeaderHeight = 28
contents.add(optionsSection)
optionsSection.add(buildOptionItem(
icon: .genericStories,
title: OWSLocalizedString("NEW_STORY_SHEET_CUSTOM_STORY_TITLE",
comment: "Title for create custom story row on the 'new story sheet'"),
subtitle: OWSLocalizedString("NEW_STORY_SHEET_CUSTOM_STORY_SUBTITLE",
comment: "Subtitle for create custom story row on the 'new story sheet'"),
action: { [weak self] in
guard let self = self else { return }
let presentingViewController = self.presentingViewController
self.dismiss(animated: true) {
let vc = NewPrivateStoryRecipientsViewController(selectItemsInParent: self.selectItemsInParent)
presentingViewController?.presentFormSheet(OWSNavigationController(rootViewController: vc), animated: true)
}
}))
optionsSection.add(buildOptionItem(
icon: .genericGroup,
title: OWSLocalizedString("NEW_STORY_SHEET_GROUP_STORY_TITLE",
comment: "Title for create group story row on the 'new story sheet'"),
subtitle: OWSLocalizedString("NEW_STORY_SHEET_GROUP_STORY_SUBTITLE",
comment: "Subtitle for create group story row on the 'new story sheet'"),
action: { [weak self] in
guard let self = self else { return }
let presentingViewController = self.presentingViewController
self.dismiss(animated: true) {
let vc = NewGroupStoryViewController(selectItemsInParent: self.selectItemsInParent)
presentingViewController?.presentFormSheet(OWSNavigationController(rootViewController: vc), animated: true)
}
}))
}
func buildOptionItem(icon: ThemeIcon, title: String, subtitle: String, action: @escaping () -> Void) -> OWSTableItem {
.init {
let cell = OWSTableItem.newCell()
cell.preservesSuperviewLayoutMargins = true
cell.contentView.preservesSuperviewLayoutMargins = true
let iconView = OWSTableItem.buildIconInCircleView(
icon: icon,
iconSize: AvatarBuilder.standardAvatarSizePoints,
innerIconSize: 24,
iconTintColor: Theme.primaryTextColor
)
let rowTitleLabel = UILabel()
rowTitleLabel.text = title
rowTitleLabel.textColor = Theme.primaryTextColor
rowTitleLabel.font = .dynamicTypeBodyClamped
rowTitleLabel.numberOfLines = 0
let rowSubtitleLabel = UILabel()
rowSubtitleLabel.text = subtitle
rowSubtitleLabel.textColor = Theme.secondaryTextAndIconColor
rowSubtitleLabel.font = .dynamicTypeSubheadlineClamped
rowSubtitleLabel.numberOfLines = 0
let titleStack = UIStackView(arrangedSubviews: [ rowTitleLabel, rowSubtitleLabel ])
titleStack.axis = .vertical
titleStack.alignment = .leading
let contentRow = UIStackView(arrangedSubviews: [ iconView, titleStack ])
contentRow.spacing = ContactCellView.avatarTextHSpacing
contentRow.alignment = .center
cell.contentView.addSubview(contentRow)
contentRow.autoPinWidthToSuperviewMargins()
contentRow.autoPinHeightToSuperview(withMargin: 7)
return cell
} actionBlock: { action() }
}
}