Use the new strings for send failures when the unsigned devices are your own. (#3299)

This commit is contained in:
Doug 2024-09-18 10:48:16 +01:00 committed by GitHub
parent 16812e21ea
commit 63a0a99dbd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 57 additions and 8 deletions

View File

@ -23,18 +23,23 @@ enum ResolveVerifiedUserSendFailureScreenViewModelAction {
struct ResolveVerifiedUserSendFailureScreenViewState: BindableState { struct ResolveVerifiedUserSendFailureScreenViewState: BindableState {
var currentFailure: TimelineItemSendFailure.VerifiedUser var currentFailure: TimelineItemSendFailure.VerifiedUser
var currentMemberDisplayName: String var currentMemberDisplayName: String
var isYou: Bool
var title: String { var title: String {
switch currentFailure { switch currentFailure {
case .hasUnsignedDevice: L10n.screenResolveSendFailureUnsignedDeviceTitle(currentMemberDisplayName) case .hasUnsignedDevice:
case .changedIdentity: L10n.screenResolveSendFailureChangedIdentityTitle(currentMemberDisplayName) isYou ? L10n.screenResolveSendFailureYouUnsignedDeviceTitle : L10n.screenResolveSendFailureUnsignedDeviceTitle(currentMemberDisplayName)
case .changedIdentity:
L10n.screenResolveSendFailureChangedIdentityTitle(currentMemberDisplayName)
} }
} }
var subtitle: String { var subtitle: String {
switch currentFailure { switch currentFailure {
case .hasUnsignedDevice: L10n.screenResolveSendFailureUnsignedDeviceSubtitle(currentMemberDisplayName, currentMemberDisplayName) case .hasUnsignedDevice:
case .changedIdentity: L10n.screenResolveSendFailureChangedIdentitySubtitle(currentMemberDisplayName) isYou ? L10n.screenResolveSendFailureYouUnsignedDeviceSubtitle : L10n.screenResolveSendFailureUnsignedDeviceSubtitle(currentMemberDisplayName, currentMemberDisplayName)
case .changedIdentity:
L10n.screenResolveSendFailureChangedIdentitySubtitle(currentMemberDisplayName)
} }
} }

View File

@ -49,7 +49,8 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
} }
super.init(initialViewState: ResolveVerifiedUserSendFailureScreenViewState(currentFailure: failure, super.init(initialViewState: ResolveVerifiedUserSendFailureScreenViewState(currentFailure: failure,
currentMemberDisplayName: members[userID]?.displayName ?? userID)) currentMemberDisplayName: members[userID]?.displayName ?? userID,
isYou: userID == roomProxy.ownUserID))
} }
// MARK: Public // MARK: Public
@ -83,6 +84,7 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
if let (userID, failure) = iterator.next() { if let (userID, failure) = iterator.next() {
state.currentMemberDisplayName = members[userID]?.displayName ?? userID state.currentMemberDisplayName = members[userID]?.displayName ?? userID
state.currentFailure = failure state.currentFailure = failure
state.isYou = userID == roomProxy.ownUserID
} else { } else {
actionsSubject.send(.dismiss) actionsSubject.send(.dismiss)
} }

View File

@ -78,12 +78,16 @@ struct ResolveVerifiedUserSendFailureScreen: View {
struct ResolveVerifiedUserSendFailureScreen_Previews: PreviewProvider, TestablePreview { struct ResolveVerifiedUserSendFailureScreen_Previews: PreviewProvider, TestablePreview {
static let unsignedDeviceViewModel = makeViewModel(failure: .hasUnsignedDevice(devices: ["@alice:matrix.org": []])) static let unsignedDeviceViewModel = makeViewModel(failure: .hasUnsignedDevice(devices: ["@alice:matrix.org": []]))
static let ownUnsignedDeviceViewModel = makeViewModel(failure: .hasUnsignedDevice(devices: [RoomMemberProxyMock.mockMe.userID: []]))
static let changedIdentityViewModel = makeViewModel(failure: .changedIdentity(users: ["@alice:matrix.org"])) static let changedIdentityViewModel = makeViewModel(failure: .changedIdentity(users: ["@alice:matrix.org"]))
static var previews: some View { static var previews: some View {
ResolveVerifiedUserSendFailureScreen(context: unsignedDeviceViewModel.context) ResolveVerifiedUserSendFailureScreen(context: unsignedDeviceViewModel.context)
.previewDisplayName("Unsigned Device") .previewDisplayName("Unsigned Device")
ResolveVerifiedUserSendFailureScreen(context: ownUnsignedDeviceViewModel.context)
.previewDisplayName("Own Unsigned Device")
ResolveVerifiedUserSendFailureScreen(context: changedIdentityViewModel.context) ResolveVerifiedUserSendFailureScreen(context: changedIdentityViewModel.context)
.previewDisplayName("Identity Changed") .previewDisplayName("Identity Changed")
} }

View File

@ -93,7 +93,9 @@ struct TimelineItemMenu: View {
Divider() Divider()
.padding(.horizontal, -16) .padding(.horizontal, -16)
VerifiedUserSendFailureView(failure: failure, members: context.viewState.members) { VerifiedUserSendFailureView(failure: failure,
members: context.viewState.members,
ownUserID: context.viewState.ownUserID) {
send(.itemSendInfoTapped(itemID: item.id)) send(.itemSendInfoTapped(itemID: item.id))
} }
.padding(.bottom, 8) .padding(.bottom, 8)
@ -186,21 +188,26 @@ private struct VerifiedUserSendFailureView: View {
let action: () -> Void let action: () -> Void
private let memberDisplayName: String private let memberDisplayName: String
private let isYou: Bool
init(failure: TimelineItemSendFailure.VerifiedUser, init(failure: TimelineItemSendFailure.VerifiedUser,
members: [String: RoomMemberState], members: [String: RoomMemberState],
ownUserID: String,
action: @escaping () -> Void) { action: @escaping () -> Void) {
self.failure = failure self.failure = failure
self.action = action self.action = action
let userIDs = failure.affectedUserIDs let userIDs = failure.affectedUserIDs
memberDisplayName = userIDs.first.map { members[$0]?.displayName ?? $0 } ?? "" memberDisplayName = userIDs.first.map { members[$0]?.displayName ?? $0 } ?? ""
isYou = ownUserID == userIDs.first
} }
var title: String { var title: String {
switch failure { switch failure {
case .hasUnsignedDevice: L10n.screenTimelineItemMenuSendFailureUnsignedDevice(memberDisplayName) case .hasUnsignedDevice:
case .changedIdentity: L10n.screenTimelineItemMenuSendFailureChangedIdentity(memberDisplayName) isYou ? L10n.screenTimelineItemMenuSendFailureYouUnsignedDevice : L10n.screenTimelineItemMenuSendFailureUnsignedDevice(memberDisplayName)
case .changedIdentity:
L10n.screenTimelineItemMenuSendFailureChangedIdentity(memberDisplayName)
} }
} }
@ -241,6 +248,9 @@ struct TimelineItemMenu_Previews: PreviewProvider, TestablePreview {
static let (unsignedDevicesItem, _) = makeItem(deliveryStatus: .sendingFailed(.verifiedUser(.hasUnsignedDevice(devices: [ static let (unsignedDevicesItem, _) = makeItem(deliveryStatus: .sendingFailed(.verifiedUser(.hasUnsignedDevice(devices: [
"@alice:matrix.org": ["DEVICE1", "DEVICE2"] "@alice:matrix.org": ["DEVICE1", "DEVICE2"]
])))) ]))))
static let (ownUnsignedDevicesItem, _) = makeItem(deliveryStatus: .sendingFailed(.verifiedUser(.hasUnsignedDevice(devices: [
RoomMemberProxyMock.mockMe.userID: ["DEVICE1"]
]))))
static var previews: some View { static var previews: some View {
TimelineItemMenu(item: item, actions: actions) TimelineItemMenu(item: item, actions: actions)
@ -272,6 +282,10 @@ struct TimelineItemMenu_Previews: PreviewProvider, TestablePreview {
.environmentObject(viewModel.context) .environmentObject(viewModel.context)
.previewDisplayName("Unsigned Devices") .previewDisplayName("Unsigned Devices")
TimelineItemMenu(item: ownUnsignedDevicesItem, actions: actions)
.environmentObject(viewModel.context)
.previewDisplayName("Own Unsigned Devices")
TimelineItemMenu(item: identityChangedItem, actions: actions) TimelineItemMenu(item: identityChangedItem, actions: actions)
.environmentObject(viewModel.context) .environmentObject(viewModel.context)
.previewDisplayName("Identity Changed") .previewDisplayName("Identity Changed")