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

import SignalServiceKit
import SignalUI

protocol GroupNameViewControllerDelegate: AnyObject {
    func groupNameViewControllerDidComplete(groupName: String?)
}

class GroupNameViewController: OWSTableViewController2 {
    private let helper: GroupAttributesEditorHelper

    weak var nameDelegate: GroupNameViewControllerDelegate?

    init(groupModel: TSGroupModel, groupNameCurrent: String? = nil) {
        self.helper = GroupAttributesEditorHelper(groupModel: groupModel)

        if let groupNameCurrent {
            self.helper.groupNameOriginal = groupNameCurrent
        }

        super.init()

        shouldAvoidKeyboard = true
    }

    // MARK: -

    override func viewDidLoad() {
        super.viewDidLoad()

        helper.delegate = self
        helper.buildContents()

        title = OWSLocalizedString(
            "GROUP_NAME_VIEW_TITLE",
            comment: "Title for the group name view.",
        )

        navigationItem.leftBarButtonItem = .cancelButton(
            dismissingFrom: self,
            hasUnsavedChanges: { [weak self] in self?.helper.hasUnsavedChanges },
        )

        navigationItem.rightBarButtonItem = .setButton { [weak self] in
            self?.didTapDone()
        }

        updateNavigation()
        updateTableContents()
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)

        coordinator.animate(alongsideTransition: { _ in
            self.helper.descriptionTextView.scrollToFocus(in: self.tableView, animated: true)
        }, completion: nil)
    }

    // Don't allow interactive dismiss when there are unsaved changes.
    override var isModalInPresentation: Bool {
        get { helper.hasUnsavedChanges }
        set {}
    }

    private func updateNavigation() {
        navigationItem.rightBarButtonItem?.isEnabled = helper.hasUnsavedChanges
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        updateNavigation()

        helper.nameTextField.becomeFirstResponder()
    }

    func updateTableContents() {
        let contents = OWSTableContents()

        let nameTextField = helper.nameTextField

        let section = OWSTableSection()
        section.add(.init(
            customCellBlock: {
                let cell = OWSTableItem.newCell()

                cell.selectionStyle = .none

                nameTextField.font = .dynamicTypeBodyClamped
                nameTextField.textColor = Theme.primaryTextColor

                cell.contentView.addSubview(nameTextField)
                nameTextField.autoPinEdgesToSuperviewMargins()

                return cell
            },
            actionBlock: {
                nameTextField.becomeFirstResponder()
            },
        ))

        contents.add(section)

        self.contents = contents
    }

    private func didTapDone() {
        helper.nameTextField.acceptAutocorrectSuggestion()
        nameDelegate?.groupNameViewControllerDidComplete(groupName: helper.groupNameCurrent)
        dismiss(animated: true)
    }
}

extension GroupNameViewController: GroupAttributesEditorHelperDelegate {
    func groupAttributesEditorContentsDidChange() {
        updateNavigation()
    }
}