allow copying blocked user id

This commit is contained in:
Mauro Romito
2026-08-26 13:43:14 +02:00
parent a139257967
commit f6f6538bd6
4 changed files with 34 additions and 0 deletions
@@ -21,6 +21,7 @@ struct BlockedUsersScreenViewStateBindings {
enum BlockedUsersScreenViewAction {
case unblockUser(UserProfile)
case copyUserID(UserProfile)
}
enum BlockedUsersScreenViewStateAlertType: Hashable {
@@ -51,6 +51,12 @@ class BlockedUsersScreenViewModel: BlockedUsersScreenViewModelType, BlockedUsers
self?.unblockUser(user)
},
secondaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil))
case .copyUserID(let user):
UIPasteboard.general.string = user.id
userIndicatorController.submitIndicator(UserIndicator(id: Self.copiedIndicatorIdentifier,
type: .toast,
title: L10n.commonCopiedToClipboard,
icon: \.check))
}
}
@@ -108,6 +114,7 @@ class BlockedUsersScreenViewModel: BlockedUsersScreenViewModelType, BlockedUsers
// MARK: Loading indicator
private static let loadingIndicatorIdentifier = "\(BlockedUsersScreenViewModel.self)-Loading"
private static let copiedIndicatorIdentifier = "\(BlockedUsersScreenViewModel.self)-Copied"
private func showLoadingIndicator() {
userIndicatorController.submitIndicator(UserIndicator(id: Self.loadingIndicatorIdentifier,
@@ -38,6 +38,13 @@ struct BlockedUsersScreen: View {
icon: avatar(for: user)),
details: .isWaiting(context.viewState.processingUserID == user.id),
kind: .button { context.send(viewAction: .unblockUser(user)) })
.contextMenu {
Button {
context.send(viewAction: .copyUserID(user))
} label: {
Label(L10n.actionCopy, icon: \.copy)
}
}
}
}
}
@@ -10,6 +10,7 @@ import Combine
@testable import ElementX
import Foundation
import Testing
import UIKit
@MainActor
struct BlockedUsersScreenViewModelTests {
@@ -42,4 +43,22 @@ struct BlockedUsersScreenViewModelTests {
#expect(!viewModel.context.viewState.blockedUsers.isEmpty)
#expect(clientProxy.profileForCalled)
}
@Test
func copyUserID() throws {
let clientProxy = ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID))
let userIndicatorController = UserIndicatorControllerMock()
let viewModel = BlockedUsersScreenViewModel(hideProfiles: true,
userSession: UserSessionMock(.init(clientProxy: clientProxy)),
userIndicatorController: userIndicatorController)
let user = try #require(viewModel.context.viewState.blockedUsers.first)
UIPasteboard.general.string = ""
viewModel.context.send(viewAction: .copyUserID(user))
#expect(UIPasteboard.general.string == user.id)
#expect(userIndicatorController.submitIndicatorDelayReceivedArguments?.indicator.title == L10n.commonCopiedToClipboard)
}
}