// // Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only // import Foundation import SafariServices import SignalServiceKit import UIKit public class GroupViewUtils { public static func formatGroupMembersLabel(memberCount: Int, isTerminated: Bool) -> String { let format: String if isTerminated { format = OWSLocalizedString( "CONVERSATION_SETTINGS_FORMER_MEMBERS_SECTION_TITLE_%d", tableName: "PluralAware", comment: "Format for the section title of the 'members' section in conversation settings view after a group has been terminated. Embeds: {{ the number of former group members }}.", ) } else { format = OWSLocalizedString( "GROUP_MEMBER_COUNT_LABEL_%d", tableName: "PluralAware", comment: "The 'group member count' indicator when there are no members in the group.", ) } return String.localizedStringWithFormat(format, memberCount) } @MainActor public static func updateGroupWithActivityIndicator( fromViewController: UIViewController, updateBlock: @escaping () async throws -> Void, completion: (() -> Void)?, ) { // GroupsV2 TODO: Should we allow cancel here? ModalActivityIndicatorViewController.present( fromViewController: fromViewController, title: CommonStrings.updatingModal, canCancel: false, asyncBlock: { modalActivityIndicator in do { try await GroupManager.waitForMessageFetchingAndProcessingWithTimeout() try await updateBlock() modalActivityIndicator.dismiss { completion?() } } catch { owsFailDebugUnlessNetworkFailure(error) modalActivityIndicator.dismiss { GroupViewUtils.showUpdateErrorUI(error: error) } } }, ) } public class func showUpdateErrorUI(error: Error) { AssertIsOnMainThread() if error.isNetworkFailureOrTimeout { OWSActionSheets.showActionSheet( title: OWSLocalizedString( "ERROR_NETWORK_FAILURE", comment: "Error indicating network connectivity problems.", ), message: OWSLocalizedString( "UPDATE_GROUP_FAILED_DUE_TO_NETWORK", comment: "Error indicating that a group could not be updated due to network connectivity problems.", ), ) } else { switch error { case GroupsV2Error.terminatedGroupInviteLink: OWSActionSheets.showActionSheet( title: nil, message: OWSLocalizedString( "END_GROUP_ACTION_ERROR", comment: "Description for error sheet that says the user can no longer take this action because the group has ended.", ), ) default: OWSActionSheets.showActionSheet(title: OWSLocalizedString( "UPDATE_GROUP_FAILED", comment: "Error indicating that a group could not be updated.", )) } } } public static func showInvalidGroupMemberAlert(fromViewController: UIViewController) { let actionSheet = ActionSheetController( title: CommonStrings.errorAlertTitle, message: OWSLocalizedString( "EDIT_GROUP_ERROR_CANNOT_ADD_MEMBER", comment: "Error message indicating the a user can't be added to a group.", ), ) actionSheet.addAction(ActionSheetAction( title: CommonStrings.learnMore, style: .default, ) { _ in self.showCantAddMemberView(fromViewController: fromViewController) }) actionSheet.addAction(OWSActionSheets.okayAction) fromViewController.presentActionSheet(actionSheet) } private static func showCantAddMemberView(fromViewController: UIViewController) { let vc = SFSafariViewController(url: URL.Support.groups) fromViewController.present(vc, animated: true, completion: nil) } }