//
// 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)
}
}