fix the logic of dismissing message info screen

pull/1061/head
Ryan ZHAO 2 months ago
parent 0bb45419e9
commit cb507f1ae8

@ -21,7 +21,7 @@ extension ContextMenuVC {
let actionType: ActionType let actionType: ActionType
let shouldDismissInfoScreen: Bool let shouldDismissInfoScreen: Bool
let accessibilityLabel: String? let accessibilityLabel: String?
let work: () -> Void let work: ((() -> Void)?) -> Void
enum ActionType { enum ActionType {
case emoji case emoji
@ -41,7 +41,7 @@ extension ContextMenuVC {
actionType: ActionType = .generic, actionType: ActionType = .generic,
shouldDismissInfoScreen: Bool = false, shouldDismissInfoScreen: Bool = false,
accessibilityLabel: String? = nil, accessibilityLabel: String? = nil,
work: @escaping () -> Void work: @escaping ((() -> Void)?) -> Void
) { ) {
self.icon = icon self.icon = icon
self.title = title self.title = title
@ -61,7 +61,7 @@ extension ContextMenuVC {
icon: UIImage(named: "ic_info"), icon: UIImage(named: "ic_info"),
title: "info".localized(), title: "info".localized(),
accessibilityLabel: "Message info" accessibilityLabel: "Message info"
) { delegate?.info(cellViewModel) } ) { _ in delegate?.info(cellViewModel) }
} }
static func retry(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func retry(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -72,7 +72,7 @@ extension ContextMenuVC {
"resend".localized() "resend".localized()
), ),
accessibilityLabel: (cellViewModel.state == .failedToSync ? "Resync message" : "Resend message") accessibilityLabel: (cellViewModel.state == .failedToSync ? "Resync message" : "Resend message")
) { delegate?.retry(cellViewModel) } ) { _ in delegate?.retry(cellViewModel) }
} }
static func reply(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func reply(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -81,7 +81,7 @@ extension ContextMenuVC {
title: "reply".localized(), title: "reply".localized(),
shouldDismissInfoScreen: true, shouldDismissInfoScreen: true,
accessibilityLabel: "Reply to message" accessibilityLabel: "Reply to message"
) { delegate?.reply(cellViewModel) } ) { _ in delegate?.reply(cellViewModel) }
} }
static func copy(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func copy(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -90,7 +90,7 @@ extension ContextMenuVC {
title: "copy".localized(), title: "copy".localized(),
feedback: "copied".localized(), feedback: "copied".localized(),
accessibilityLabel: "Copy text" accessibilityLabel: "Copy text"
) { delegate?.copy(cellViewModel) } ) { _ in delegate?.copy(cellViewModel) }
} }
static func copySessionID(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func copySessionID(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -99,7 +99,7 @@ extension ContextMenuVC {
title: "accountIDCopy".localized(), title: "accountIDCopy".localized(),
feedback: "copied".localized(), feedback: "copied".localized(),
accessibilityLabel: "Copy Session ID" accessibilityLabel: "Copy Session ID"
) { delegate?.copySessionID(cellViewModel) } ) { _ in delegate?.copySessionID(cellViewModel) }
} }
static func delete(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func delete(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -113,7 +113,7 @@ extension ContextMenuVC {
themeColor: .danger, themeColor: .danger,
shouldDismissInfoScreen: true, shouldDismissInfoScreen: true,
accessibilityLabel: "Delete message" accessibilityLabel: "Delete message"
) { delegate?.delete(cellViewModel) } ) { completion in delegate?.delete(cellViewModel, completion: completion) }
} }
static func save(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func save(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -122,7 +122,7 @@ extension ContextMenuVC {
title: "save".localized(), title: "save".localized(),
feedback: "saved".localized(), feedback: "saved".localized(),
accessibilityLabel: "Save attachment" accessibilityLabel: "Save attachment"
) { delegate?.save(cellViewModel) } ) { _ in delegate?.save(cellViewModel) }
} }
static func ban(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func ban(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -131,7 +131,7 @@ extension ContextMenuVC {
title: "banUser".localized(), title: "banUser".localized(),
themeColor: .danger, themeColor: .danger,
accessibilityLabel: "Ban user" accessibilityLabel: "Ban user"
) { delegate?.ban(cellViewModel) } ) { completion in delegate?.ban(cellViewModel, completion: completion) }
} }
static func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
@ -141,27 +141,27 @@ extension ContextMenuVC {
themeColor: .danger, themeColor: .danger,
shouldDismissInfoScreen: true, shouldDismissInfoScreen: true,
accessibilityLabel: "Ban user and delete" accessibilityLabel: "Ban user and delete"
) { delegate?.banAndDeleteAllMessages(cellViewModel) } ) { completion in delegate?.banAndDeleteAllMessages(cellViewModel, completion: completion) }
} }
static func react(_ cellViewModel: MessageViewModel, _ emoji: EmojiWithSkinTones, _ delegate: ContextMenuActionDelegate?) -> Action { static func react(_ cellViewModel: MessageViewModel, _ emoji: EmojiWithSkinTones, _ delegate: ContextMenuActionDelegate?) -> Action {
return Action( return Action(
title: emoji.rawValue, title: emoji.rawValue,
actionType: .emoji actionType: .emoji
) { delegate?.react(cellViewModel, with: emoji) } ) { _ in delegate?.react(cellViewModel, with: emoji) }
} }
static func emojiPlusButton(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { static func emojiPlusButton(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
return Action( return Action(
actionType: .emojiPlus, actionType: .emojiPlus,
accessibilityLabel: "Add emoji" accessibilityLabel: "Add emoji"
) { delegate?.showFullEmojiKeyboard(cellViewModel) } ) { _ in delegate?.showFullEmojiKeyboard(cellViewModel) }
} }
static func dismiss(_ delegate: ContextMenuActionDelegate?) -> Action { static func dismiss(_ delegate: ContextMenuActionDelegate?) -> Action {
return Action( return Action(
actionType: .dismiss actionType: .dismiss
) { delegate?.contextMenuDismissed() } ) { _ in delegate?.contextMenuDismissed() }
} }
} }
@ -308,10 +308,10 @@ protocol ContextMenuActionDelegate {
func reply(_ cellViewModel: MessageViewModel) func reply(_ cellViewModel: MessageViewModel)
func copy(_ cellViewModel: MessageViewModel) func copy(_ cellViewModel: MessageViewModel)
func copySessionID(_ cellViewModel: MessageViewModel) func copySessionID(_ cellViewModel: MessageViewModel)
func delete(_ cellViewModel: MessageViewModel) func delete(_ cellViewModel: MessageViewModel, completion: (() -> Void)?)
func save(_ cellViewModel: MessageViewModel) func save(_ cellViewModel: MessageViewModel)
func ban(_ cellViewModel: MessageViewModel) func ban(_ cellViewModel: MessageViewModel, completion: (() -> Void)?)
func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel) func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel, completion: (() -> Void)?)
func react(_ cellViewModel: MessageViewModel, with emoji: EmojiWithSkinTones) func react(_ cellViewModel: MessageViewModel, with emoji: EmojiWithSkinTones)
func showFullEmojiKeyboard(_ cellViewModel: MessageViewModel) func showFullEmojiKeyboard(_ cellViewModel: MessageViewModel)
func contextMenuDismissed() func contextMenuDismissed()

@ -161,7 +161,7 @@ extension ContextMenuVC {
} }
@objc private func handleTap() { @objc private func handleTap() {
action.work() action.work() {}
dismissWithTimerInvalidationIfNeeded() dismissWithTimerInvalidationIfNeeded()
} }

@ -48,7 +48,7 @@ extension ContextMenuVC {
// MARK: - Interaction // MARK: - Interaction
@objc private func handleTap() { @objc private func handleTap() {
action.work() action.work() {}
dismiss() dismiss()
} }
} }
@ -106,7 +106,7 @@ extension ContextMenuVC {
dismiss() dismiss()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: { [weak self] in DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: { [weak self] in
self?.action?.work() self?.action?.work() {}
}) })
} }
} }

@ -415,7 +415,7 @@ final class ContextMenuVC: UIViewController {
}, },
completion: { [weak self] _ in completion: { [weak self] _ in
self?.dismiss() self?.dismiss()
self?.actions.first(where: { $0.actionType == .dismiss })?.work() self?.actions.first(where: { $0.actionType == .dismiss })?.work(){}
} }
) )
} }

@ -2030,7 +2030,7 @@ extension ConversationVC:
} }
} }
func delete(_ cellViewModel: MessageViewModel) { func delete(_ cellViewModel: MessageViewModel, completion: (() -> Void)?) {
/// Retrieve the deletion actions for the selected message(s) of there are any /// Retrieve the deletion actions for the selected message(s) of there are any
let messagesToDelete: [MessageViewModel] = [cellViewModel] let messagesToDelete: [MessageViewModel] = [cellViewModel]
@ -2119,6 +2119,7 @@ extension ConversationVC:
) )
}, },
afterClosed: { [weak self] in afterClosed: { [weak self] in
completion?()
self?.becomeFirstResponder() self?.becomeFirstResponder()
} }
) )
@ -2192,7 +2193,7 @@ extension ConversationVC:
} }
} }
func ban(_ cellViewModel: MessageViewModel) { func ban(_ cellViewModel: MessageViewModel, completion: (() -> Void)?) {
guard cellViewModel.threadVariant == .community else { return } guard cellViewModel.threadVariant == .community else { return }
let threadId: String = self.viewModel.threadData.threadId let threadId: String = self.viewModel.threadData.threadId
@ -2248,13 +2249,16 @@ extension ConversationVC:
self?.becomeFirstResponder() self?.becomeFirstResponder()
}, },
afterClosed: { [weak self] in self?.becomeFirstResponder() } afterClosed: { [weak self] in
completion?()
self?.becomeFirstResponder()
}
) )
) )
self.present(modal, animated: true) self.present(modal, animated: true)
} }
func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel) { func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel, completion: (() -> Void)?) {
guard cellViewModel.threadVariant == .community else { return } guard cellViewModel.threadVariant == .community else { return }
let threadId: String = self.viewModel.threadData.threadId let threadId: String = self.viewModel.threadData.threadId
@ -2310,7 +2314,10 @@ extension ConversationVC:
self?.becomeFirstResponder() self?.becomeFirstResponder()
}, },
afterClosed: { [weak self] in self?.becomeFirstResponder() } afterClosed: { [weak self] in
completion?()
self?.becomeFirstResponder()
}
) )
) )
self.present(modal, animated: true) self.present(modal, animated: true)

@ -312,14 +312,15 @@ struct MessageInfoScreen: View {
let tintColor: ThemeValue = actions[index].themeColor let tintColor: ThemeValue = actions[index].themeColor
Button( Button(
action: { action: {
actions[index].work() actions[index].work() {
feedbackMessage = actions[index].feedback if actions[index].shouldDismissInfoScreen {
if actions[index].shouldDismissInfoScreen { let deadline: DispatchTime = .now() + (feedbackMessage?.isEmpty == false ? 2 : 0)
let deadline: DispatchTime = .now() + (feedbackMessage?.isEmpty == false ? 2 : 0) DispatchQueue.main.asyncAfter(deadline: deadline, execute: {
DispatchQueue.main.asyncAfter(deadline: deadline, execute: { dismiss()
dismiss() })
}) }
} }
feedbackMessage = actions[index].feedback
}, },
label: { label: {
HStack(spacing: Values.largeSpacing) { HStack(spacing: Values.largeSpacing) {

Loading…
Cancel
Save