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

179 lines
7.2 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
public import SignalServiceKit
public class ConversationPickerFailedRecipientsSheet: OWSTableSheetViewController {
let failedAttachments: [SignalAttachment]
let failedStoryConversationItems: [StoryConversationItem]
let remainingConversationItems: [ConversationItem]
let onApprove: () -> Void
public init(
failedAttachments: [SignalAttachment],
failedStoryConversationItems: [StoryConversationItem],
remainingConversationItems: [ConversationItem],
onApprove: @escaping () -> Void
) {
assert(failedAttachments.isEmpty.negated)
assert(failedStoryConversationItems.isEmpty.negated)
self.failedAttachments = failedAttachments
self.failedStoryConversationItems = failedStoryConversationItems
self.remainingConversationItems = remainingConversationItems
self.onApprove = onApprove
super.init()
}
public override func viewDidLoad() {
super.viewDidLoad()
tableViewController.tableView.register(
ConversationPickerCell.self,
forCellReuseIdentifier: ConversationPickerCell.reuseIdentifier
)
let doneButton = OWSButton(title: CommonStrings.okayButton) { [weak self] in
self?.dismiss(animated: true) {
self?.onApprove()
}
}
doneButton.dimsWhenHighlighted = true
doneButton.layer.cornerRadius = 8
doneButton.backgroundColor = .ows_accentBlue
doneButton.titleLabel?.font = UIFont.dynamicTypeBody.semibold()
footerStack.addArrangedSubview(doneButton)
doneButton.autoSetDimension(.height, toSize: 48)
doneButton.autoPinWidthToSuperview(withMargin: 48)
doneButton.autoHCenterInSuperview()
footerStack.addArrangedSubview(SpacerView(preferredHeight: 20))
}
public override func updateTableContents(shouldReload: Bool = true) {
let contents = generateTableContents()
self.tableViewController.setContents(contents, shouldReload: shouldReload)
}
private func generateTableContents() -> OWSTableContents {
let contents = OWSTableContents()
let headerSection = OWSTableSection()
headerSection.separatorInsetLeading = OWSTableViewController2.cellHInnerMargin + 32
let headerTitle: String
let headerSubtitle: String
if remainingConversationItems.isEmpty {
headerTitle = OWSLocalizedString(
"STORIES_SHARESHEET_UNABLE_TO_SEND_SEND_TITLE",
comment: "Title shown when failing to send an incompatible file to stories via the sharesheet."
)
headerSubtitle = OWSLocalizedString(
"STORIES_SHARESHEET_UNABLE_TO_SEND_SEND_SUBTITLE",
comment: "Subtitle shown when failing to send an incompatible file to stories via the sharesheet."
)
} else {
headerTitle = OWSLocalizedString(
"STORIES_SHARESHEET_PARTIAL_SEND_TITLE",
comment: "Title shown when failing to send an incompatible file to stories, but still sending to non-story conversations."
)
let subtitleFormat = OWSLocalizedString(
"STORIES_SHARESHEET_PARTIAL_SEND_SUBTITLE_%d",
tableName: "PluralAware",
comment: "Subtitle shown when failing to send a single incompatible file to stories via the sharesheet."
)
headerSubtitle = String.localizedStringWithFormat(
subtitleFormat,
failedStoryConversationItems.count
)
}
let headerView = SheetHeaderView(
title: headerTitle,
subtitle: headerSubtitle
)
headerSection.customHeaderView = headerView
contents.add(headerSection)
let failedStoriesSection = OWSTableSection()
failedStoriesSection.headerTitle = OWSLocalizedString(
"STORIES_SHARESHEET_PARTIAL_SEND_STORIES_SECTION_TITLE",
comment: "Section title shown when failing to send an incompatible file to stories, but still sending to non-story conversations."
)
for item in failedStoryConversationItems {
failedStoriesSection.add(OWSTableItem(dequeueCellBlock: { tableView in
guard let cell = tableView.dequeueReusableCell(withIdentifier: ConversationPickerCell.reuseIdentifier) as? ConversationPickerCell else {
return UITableViewCell()
}
SSKEnvironment.shared.databaseStorageRef.read {
cell.configure(conversationItem: item, transaction: $0)
}
cell.showsSelectionUI = false
return cell
}))
}
contents.add(failedStoriesSection)
if !remainingConversationItems.isEmpty {
let remainingConversationsSection = OWSTableSection()
remainingConversationsSection.headerTitle = OWSLocalizedString(
"STORIES_SHARESHEET_PARTIAL_SEND_REMAINING_SECTION_TITLE",
comment: "Section title shown when sending to non-story conversations but failing to send the file to stories."
)
for item in remainingConversationItems {
remainingConversationsSection.add(OWSTableItem(dequeueCellBlock: { tableView in
guard let cell = tableView.dequeueReusableCell(withIdentifier: ConversationPickerCell.reuseIdentifier) as? ConversationPickerCell else {
return UITableViewCell()
}
SSKEnvironment.shared.databaseStorageRef.read {
cell.configure(conversationItem: item, transaction: $0)
}
cell.showsSelectionUI = false
return cell
}))
}
contents.add(remainingConversationsSection)
}
return contents
}
private class SheetHeaderView: UIView {
let titleLabel = UILabel()
let subtitleLabel = UILabel()
init(title: String, subtitle: String) {
super.init(frame: .zero)
titleLabel.text = title
titleLabel.textAlignment = .center
titleLabel.font = .dynamicTypeTitle2.semibold()
titleLabel.textColor = Theme.primaryTextColor
addSubview(titleLabel)
subtitleLabel.numberOfLines = 0
subtitleLabel.text = subtitle
subtitleLabel.textAlignment = .center
subtitleLabel.font = .dynamicTypeSubheadline
subtitleLabel.textColor = Theme.primaryTextColor
addSubview(subtitleLabel)
titleLabel.autoPinWidthToSuperview(withMargin: 24)
titleLabel.autoPinTopToSuperviewMargin()
subtitleLabel.autoHCenterInSuperview()
subtitleLabel.autoPinWidthToSuperview(withMargin: 24)
subtitleLabel.autoPinBottomToSuperviewMargin()
subtitleLabel.autoPinEdge(.top, to: .bottom, of: titleLabel, withOffset: 8)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
return nil
}
}
}