Signal-iOS/Signal/src/ViewControllers/GroupLinkPromotionActionSheet.swift
2021-01-12 20:16:24 -08:00

230 lines
9.2 KiB
Swift

//
// Copyright (c) 2021 Open Whisper Systems. All rights reserved.
//
import Foundation
import UIKit
import PromiseKit
class CustomActionSheet: ActionSheetController {
public override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
}
}
@objc
public class GroupLinkPromotionActionSheet: UIView {
private weak var conversationViewController: ConversationViewController?
private let groupThread: TSGroupThread
weak var actionSheetController: ActionSheetController?
private let stackView = UIStackView()
required init(groupThread: TSGroupThread,
conversationViewController: ConversationViewController) {
self.groupThread = groupThread
self.conversationViewController = conversationViewController
super.init(frame: .zero)
configure()
}
required init(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc
public func present(fromViewController: UIViewController) {
let actionSheetController = CustomActionSheet()
actionSheetController.customHeader = self
actionSheetController.isCancelable = true
fromViewController.presentActionSheet(actionSheetController)
self.actionSheetController = actionSheetController
}
@objc
public func configure() {
let subviews = buildContents()
let stackView = UIStackView(arrangedSubviews: subviews)
stackView.axis = .vertical
stackView.alignment = .fill
stackView.layoutMargins = UIEdgeInsets(top: 24, leading: 24, bottom: 8, trailing: 24)
stackView.isLayoutMarginsRelativeArrangement = true
stackView.addBackgroundView(withBackgroundColor: Theme.actionSheetBackgroundColor)
layoutMargins = .zero
addSubview(stackView)
stackView.autoPinEdgesToSuperviewMargins()
stackView.setContentHuggingHorizontalLow()
}
private var isGroupLinkEnabled: Bool {
guard let groupModel = groupThread.groupModel as? TSGroupModelV2 else {
owsFailDebug("Invalid groupModel.")
return false
}
switch groupModel.groupInviteLinkMode {
case .disabled:
return false
case .enabledWithApproval, .enabledWithoutApproval:
return true
}
}
private let memberApprovalSwitch = UISwitch()
private func buildContents() -> [UIView] {
let builder = ActionSheetContentBuilder()
builder.add(builder.buildTitleLabel(text: NSLocalizedString("GROUP_LINK_PROMOTION_ALERT_TITLE",
comment: "Title for the 'group link promotion' alert view.")))
builder.addVerticalSpacer(height: 2)
builder.add(builder.buildLabel(text: NSLocalizedString("GROUP_LINK_PROMOTION_ALERT_SUBTITLE",
comment: "Subtitle for the 'group link promotion' alert view."),
textAlignment: .center))
let isGroupLinkEnabled = self.isGroupLinkEnabled
if isGroupLinkEnabled {
builder.addVerticalSpacer(height: 88)
builder.addBottomButton(title: NSLocalizedString("GROUP_LINK_PROMOTION_ALERT_SHARE_LINK",
comment: "Label for the 'share link' button in the 'group link promotion' alert view."),
titleColor: .white,
backgroundColor: .ows_accentBlue,
target: self,
selector: #selector(dismissAndShareLink))
} else {
builder.addVerticalSpacer(height: 32)
let memberApprovalStack = UIStackView()
memberApprovalStack.axis = .horizontal
memberApprovalStack.alignment = .center
memberApprovalStack.distribution = .fill
memberApprovalStack.layoutMargins = UIEdgeInsets(hMargin: 16, vMargin: 10)
memberApprovalStack.isLayoutMarginsRelativeArrangement = true
memberApprovalStack.addBackgroundView(withBackgroundColor: Theme.isDarkThemeEnabled ? .ows_gray65 : .ows_gray02, cornerRadius: 8)
let switchLabel = builder.buildLabel(text: NSLocalizedString("GROUP_LINK_PROMOTION_ALERT_APPROVE_NEW_MEMBERS_SWITCH",
comment: "Label for the 'approve new group members' switch."))
memberApprovalStack.addArrangedSubview(switchLabel)
switchLabel.setCompressionResistanceHorizontalHigh()
memberApprovalStack.addArrangedSubview(UIView.hStretchingSpacer())
memberApprovalStack.addArrangedSubview(memberApprovalSwitch)
memberApprovalSwitch.setCompressionResistanceHorizontalHigh()
builder.add(memberApprovalStack)
builder.addVerticalSpacer(height: 8)
let captionLabel = builder.buildLabel(text: NSLocalizedString("GROUP_LINK_PROMOTION_ALERT_APPROVE_NEW_MEMBERS_EXPLANATION",
comment: "Explanation of the 'approve new group members' switch."),
textColor: Theme.secondaryTextAndIconColor,
font: .ows_dynamicTypeCaption1)
let captionContainer = UIView()
captionContainer.layoutMargins = UIEdgeInsets(hMargin: 8, vMargin: 0)
captionContainer.addSubview(captionLabel)
captionLabel.autoPinEdgesToSuperviewMargins()
builder.add(captionContainer)
builder.addVerticalSpacer(height: 44)
builder.addBottomButton(title: NSLocalizedString("GROUP_LINK_PROMOTION_ALERT_ENABLE_AND_SHARE_LINK",
comment: "Label for the 'enable and share link' button in the 'group link promotion' alert view."),
titleColor: .white,
backgroundColor: .ows_accentBlue,
target: self,
selector: #selector(enableAndShareLink))
}
builder.addVerticalSpacer(height: 5)
builder.addBottomButton(title: CommonStrings.cancelButton,
titleColor: Theme.secondaryTextAndIconColor,
backgroundColor: .clear,
target: self,
selector: #selector(dismissAlert))
return builder.subviews
}
// MARK: - Events
@objc
func dismissAlert() {
actionSheetController?.dismiss(animated: true)
}
}
// MARK: -
private extension GroupLinkPromotionActionSheet {
@objc
func enableAndShareLink() {
guard let actionSheetController = actionSheetController else {
owsFailDebug("Missing actionSheetController.")
return
}
guard let groupModelV2 = groupThread.groupModel as? TSGroupModelV2 else {
owsFailDebug("Invalid groupModel.")
return
}
let approveNewMembers = memberApprovalSwitch.isOn
let linkMode = GroupLinkViewUtils.linkMode(isGroupInviteLinkEnabled: true,
approveNewMembers: approveNewMembers)
GroupLinkViewUtils.updateLinkMode(groupModelV2: groupModelV2,
linkMode: linkMode,
description: self.logTag,
fromViewController: actionSheetController) { [weak self] (groupThread) in
guard let groupModelV2 = groupThread.groupModel as? TSGroupModelV2 else {
owsFailDebug("Invalid groupModel.")
return
}
self?.dismissActionSheetAndShareLink(groupModelV2: groupModelV2)
}
}
@objc
func dismissAndShareLink() {
guard let groupModelV2 = groupThread.groupModel as? TSGroupModelV2 else {
owsFailDebug("Invalid groupModel.")
return
}
dismissActionSheetAndShareLink(groupModelV2: groupModelV2)
}
private func dismissActionSheetAndShareLink(groupModelV2: TSGroupModelV2) {
guard let actionSheetController = actionSheetController else {
owsFailDebug("Missing actionSheetController.")
return
}
actionSheetController.dismiss(animated: true) {
self.showShareLinkActionSheet(groupModelV2: groupModelV2)
}
}
private func showShareLinkActionSheet(groupModelV2: TSGroupModelV2) {
guard let conversationViewController = conversationViewController else {
owsFailDebug("Missing conversationViewController.")
return
}
let sendMessageController = SendMessageController(fromViewController: conversationViewController)
conversationViewController.sendMessageController = sendMessageController
GroupLinkViewUtils.showShareLinkAlert(groupModelV2: groupModelV2,
fromViewController: conversationViewController,
sendMessageController: sendMessageController)
}
}