Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift
1 views
//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit
import SignalUI

// TODO: Rename to NewGroupViewController; remove old view.
public class NewGroupMembersViewController: BaseGroupMemberViewController {

    private var newGroupState = NewGroupState()

    override public init() {
        super.init()

        groupMemberViewDelegate = self
    }

    // MARK: - View Lifecycle

    override public func viewDidLoad() {
        super.viewDidLoad()
        updateBarButtons()
    }

    private func updateBarButtons() {
        let hasMembers = !newGroupState.recipientSet.isEmpty
        let buttonTitle = (
            hasMembers
                ? CommonStrings.nextButton
                : CommonStrings.skipButton,
        )
        let rightBarButtonItem = UIBarButtonItem(
            title: buttonTitle,
            style: .plain,
            target: self,
            action: #selector(nextButtonPressed),
            accessibilityIdentifier: UIView.accessibilityIdentifier(in: self, name: "next"),
        )
        rightBarButtonItem.imageInsets = UIEdgeInsets(top: 0, left: -1, bottom: 0, right: 10)
        rightBarButtonItem.accessibilityLabel
            = OWSLocalizedString("FINISH_GROUP_CREATION_LABEL", comment: "Accessibility label for finishing new group")
        navigationItem.rightBarButtonItem = rightBarButtonItem
        if hasMembers {
            let format = OWSLocalizedString("NEW_GROUP_MEMBERS_VIEW_TITLE_%d", tableName: "PluralAware", comment: "The title for the 'select members for new group' view if already some members are selected. Embeds {{number}} of members.")
            title = String.localizedStringWithFormat(format, newGroupState.recipientSet.count)
        } else {
            title = OWSLocalizedString("NEW_GROUP_SELECT_MEMBERS_VIEW_TITLE", comment: "The title for the 'select members for new group' view.")
        }
    }

    // MARK: - Actions

    @objc
    private func nextButtonPressed() {
        AssertIsOnMainThread()

        let confirmViewController = NewGroupConfirmViewController(newGroupState: newGroupState)
        navigationController?.pushViewController(confirmViewController, animated: true)
    }
}

// MARK: -

extension NewGroupMembersViewController: GroupMemberViewDelegate {

    var groupMemberViewRecipientSet: OrderedSet<PickedRecipient> {
        newGroupState.recipientSet
    }

    var groupMemberViewHasUnsavedChanges: Bool {
        newGroupState.hasUnsavedChanges
    }

    func groupMemberViewRemoveRecipient(_ recipient: PickedRecipient) {
        newGroupState.recipientSet.remove(recipient)
        updateBarButtons()
    }

    func groupMemberViewAddRecipient(_ recipient: PickedRecipient) {
        newGroupState.recipientSet.append(recipient)
        updateBarButtons()
    }

    func groupMemberViewShouldShowMemberCount() -> Bool {
        false
    }

    func groupMemberViewGroupMemberCountForDisplay() -> Int {
        groupMemberViewGroupMemberCount(withSelf: false)
    }

    private func groupMemberViewGroupMemberCount(withSelf: Bool) -> Int {
        // We sometimes add one for the local user.
        newGroupState.recipientSet.count + (withSelf ? 1 : 0)
    }

    func groupMemberViewIsGroupFull_HardLimit() -> Bool {
        groupMemberViewGroupMemberCount(withSelf: true) >= RemoteConfig.current.maxGroupSizeHardLimit
    }

    func groupMemberViewIsGroupFull_RecommendedLimit() -> Bool {
        groupMemberViewGroupMemberCount(withSelf: true) >= RemoteConfig.current.maxGroupSizeRecommended
    }

    func groupMemberViewIsPreExistingMember(
        _ recipient: PickedRecipient,
        transaction: DBReadTransaction,
    ) -> Bool {
        false
    }

    func groupMemberViewDismiss() {
        dismiss(animated: true)
    }

    var isNewGroup: Bool {
        true
    }

    var groupThreadForGroupMemberView: TSGroupThread? {
        nil
    }
}