Signal-iOS/Signal/ConversationView/MemberRequestView.swift
Igor Solomennikov 80f858af77
Style updates for conversation's bottom panel.
• use primary text color
• for "Message Request" and "Group Request" panels don't use inset glass panel
background as double insets use too much screen estate.
2026-05-12 12:11:41 -07:00

130 lines
4.5 KiB
Swift

//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
import SignalUI
class MemberRequestView: ConversationBottomPanelView {
override var useGlassPanel: Bool {
false
}
private let thread: TSThread
private weak var fromViewController: UIViewController?
weak var delegate: MessageRequestDelegate?
init(threadViewModel: ThreadViewModel, fromViewController: UIViewController) {
self.thread = threadViewModel.threadRecord
owsAssertDebug(thread is TSGroupThread)
self.fromViewController = fromViewController
super.init(frame: .zero)
let label = UILabel()
label.font = .dynamicTypeSubheadlineClamped
label.textColor = .Signal.label
label.text = OWSLocalizedString(
"MESSAGE_REQUESTS_CONVERSATION_REQUEST_INDICATOR",
comment: "Indicator that you have requested to join this group.",
)
label.numberOfLines = 0
label.textAlignment = .center
label.lineBreakMode = .byWordWrapping
let cancelButton = UIButton(
configuration: .largeSecondary(title: OWSLocalizedString(
"MESSAGE_REQUESTS_CANCEL_REQUEST_BUTTON",
comment: "Label for button to cancel your request to join the group.",
)),
primaryAction: UIAction { [weak self] _ in
self?.didTapCancelButton()
},
)
cancelButton.configuration?.baseForegroundColor = .Signal.red
cancelButton.translatesAutoresizingMaskIntoConstraints = false
let cancelButtonContainer = UIView.container()
cancelButtonContainer.addSubview(cancelButton)
cancelButtonContainer.addConstraints([
cancelButton.topAnchor.constraint(equalTo: cancelButtonContainer.topAnchor),
cancelButton.leadingAnchor.constraint(equalTo: cancelButtonContainer.leadingAnchor, constant: 18),
cancelButton.centerXAnchor.constraint(equalTo: cancelButtonContainer.centerXAnchor),
cancelButton.bottomAnchor.constraint(equalTo: cancelButtonContainer.bottomAnchor),
])
let stackView = UIStackView(arrangedSubviews: [label, cancelButtonContainer])
stackView.axis = .vertical
stackView.spacing = 16
stackView.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(stackView)
addConstraints([
stackView.topAnchor.constraint(equalTo: contentLayoutGuide.topAnchor),
stackView.leadingAnchor.constraint(equalTo: contentLayoutGuide.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: contentLayoutGuide.trailingAnchor),
stackView.bottomAnchor.constraint(equalTo: contentLayoutGuide.bottomAnchor),
])
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: -
private func didTapCancelButton() {
showCancelRequestUI()
}
private func showCancelRequestUI() {
guard let fromViewController else {
owsFailDebug("Missing fromViewController.")
return
}
let title = OWSLocalizedString(
"MESSAGE_REQUESTS_CANCEL_REQUEST_CONFIRM_TITLE",
comment: "Title for the confirmation alert when cancelling your request to join the group.",
)
let actionSheet = ActionSheetController(title: title)
actionSheet.addAction(ActionSheetAction(
title: CommonStrings.yesButton,
style: .destructive,
) { [weak self] _ in
self?.cancelRequestToJoin()
})
actionSheet.addAction(ActionSheetAction(
title: CommonStrings.noButton,
style: .cancel,
) { _ in
// Do nothing.
})
fromViewController.presentActionSheet(actionSheet)
}
private func cancelRequestToJoin() {
guard
let fromViewController,
let groupThread = thread as? TSGroupThread,
let groupModelV2 = groupThread.groupModel as? TSGroupModelV2
else {
GroupViewUtils.showUpdateErrorUI(error: OWSAssertionError("Missing properties needed to update group"))
return
}
GroupViewUtils.updateGroupWithActivityIndicator(
fromViewController: fromViewController,
updateBlock: {
try await GroupManager.cancelRequestToJoin(groupModel: groupModelV2)
},
completion: nil,
)
}
}