diff --git a/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings b/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings index d78453774a..9068cd7648 100644 --- a/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings @@ -21,6 +21,7 @@ "a11y_user_menu" = "User menu"; "a11y_voice_message_record" = "Record voice message."; "a11y_voice_message_stop_recording" = "Stop recording"; +"a11y.view_details" = "View details"; "action_accept" = "Accept"; "action_add_caption" = "Add caption"; "action_add_to_timeline" = "Add to timeline"; @@ -440,6 +441,7 @@ "screen_room_single_knock_request_title" = "%1$@ wants to join this room"; "screen_room_single_knock_request_view_button_title" = "View"; "screen_room_details_pinned_events_row_title" = "Pinned messages"; +"screen_room_details_profile_row_title" = "Profile"; "screen_room_details_requests_to_join_title" = "Requests to join"; "screen_room_details_security_and_privacy_title" = "Security & privacy"; "screen_roomlist_knock_event_sent_description" = "Request to join sent"; diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.strings b/ElementX/Resources/Localizations/en.lproj/Localizable.strings index 0345d1665b..4e17cf27cf 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.strings @@ -21,6 +21,7 @@ "a11y_user_menu" = "User menu"; "a11y_voice_message_record" = "Record voice message."; "a11y_voice_message_stop_recording" = "Stop recording"; +"a11y.view_details" = "View details"; "action_accept" = "Accept"; "action_add_caption" = "Add caption"; "action_add_to_timeline" = "Add to timeline"; @@ -440,6 +441,7 @@ "screen_room_single_knock_request_title" = "%1$@ wants to join this room"; "screen_room_single_knock_request_view_button_title" = "View"; "screen_room_details_pinned_events_row_title" = "Pinned messages"; +"screen_room_details_profile_row_title" = "Profile"; "screen_room_details_requests_to_join_title" = "Requests to join"; "screen_room_details_security_and_privacy_title" = "Security & privacy"; "screen_roomlist_knock_event_sent_description" = "Request to join sent"; diff --git a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift index cd215d7862..e375b494d5 100644 --- a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift @@ -861,6 +861,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { stateMachine.tryEvent(.presentMediaEventsTimeline) case .presentSecurityAndPrivacyScreen: stateMachine.tryEvent(.presentSecurityAndPrivacyScreen) + case .presentRecipientDetails(let userID): + stateMachine.tryEvent(.presentRoomMemberDetails(userID: userID)) } } .store(in: &cancellables) diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index a1d25f7749..4a1e21c424 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -1896,6 +1896,8 @@ internal enum L10n { internal static var screenRoomDetailsNotificationTitle: String { return L10n.tr("Localizable", "screen_room_details_notification_title") } /// Pinned messages internal static var screenRoomDetailsPinnedEventsRowTitle: String { return L10n.tr("Localizable", "screen_room_details_pinned_events_row_title") } + /// Profile + internal static var screenRoomDetailsProfileRowTitle: String { return L10n.tr("Localizable", "screen_room_details_profile_row_title") } /// Requests to join internal static var screenRoomDetailsRequestsToJoinTitle: String { return L10n.tr("Localizable", "screen_room_details_requests_to_join_title") } /// Roles and permissions @@ -2781,6 +2783,11 @@ internal enum L10n { /// Check UnifiedPush internal static var troubleshootNotificationsTestUnifiedPushTitle: String { return L10n.tr("Localizable", "troubleshoot_notifications_test_unified_push_title") } + internal enum A11y { + /// View details + internal static var viewDetails: String { return L10n.tr("Localizable", "a11y.view_details") } + } + internal enum Common { /// Copied to clipboard internal static var copiedToClipboard: String { return L10n.tr("Localizable", "common.copied_to_clipboard") } diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift index 7214d9eca6..a57719477e 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenCoordinator.swift @@ -22,6 +22,7 @@ struct RoomDetailsScreenCoordinatorParameters { enum RoomDetailsScreenCoordinatorAction { case leftRoom case presentRoomMembersList + case presentRecipientDetails(userID: String) case presentRoomDetailsEditScreen case presentNotificationSettingsScreen case presentInviteUsersScreen @@ -88,6 +89,8 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol { actionsSubject.send(.presentKnockingRequestsListScreen) case .displaySecurityAndPrivacy: actionsSubject.send(.presentSecurityAndPrivacyScreen) + case .requestRecipientDetailsPresentation(let userID): + actionsSubject.send(.presentRecipientDetails(userID: userID)) } } .store(in: &cancellables) diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenModels.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenModels.swift index 3ca5f751c8..80bf2c5fe1 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenModels.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenModels.swift @@ -15,6 +15,7 @@ import SwiftUI enum RoomDetailsScreenViewModelAction { case requestNotificationSettingsPresentation case requestMemberDetailsPresentation + case requestRecipientDetailsPresentation(userID: String) case requestInvitePeoplePresentation case leftRoom case requestEditDetailsPresentation @@ -198,6 +199,7 @@ enum RoomDetailsScreenViewAction { case ignoreConfirmed case unignoreConfirmed case processTapNotifications + case processTapRecipientProfile case processToggleMuteNotifications case displayAvatar(URL) case processTapPolls diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift index 49886cfa34..baba3beb9b 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift @@ -170,6 +170,11 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr actionsSubject.send(.displayKnockingRequests) case .processTapSecurityAndPrivacy: actionsSubject.send(.displaySecurityAndPrivacy) + case .processTapRecipientProfile: + guard let userID = dmRecipient?.userID else { + return + } + actionsSubject.send(.requestRecipientDetailsPresentation(userID: userID)) } } diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift b/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift index bf1a51f764..2cc669363d 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/View/RoomDetailsScreen.swift @@ -15,10 +15,8 @@ struct RoomDetailsScreen: View { var body: some View { Form { - if let recipient = context.viewState.dmRecipient, - let accountOwner = context.viewState.accountOwner { - dmHeaderSection(accountOwner: accountOwner, - recipient: recipient) + if let recipient = context.viewState.dmRecipient { + dmHeaderSection(recipient: recipient) } else { normalRoomHeaderSection } @@ -79,9 +77,9 @@ struct RoomDetailsScreen: View { .accessibilityIdentifier(A11yIdentifiers.roomDetailsScreen.avatar) } - private func dmHeaderSection(accountOwner: RoomMemberDetails, recipient: RoomMemberDetails) -> some View { - AvatarHeaderView(accountOwner: accountOwner, - dmRecipient: recipient, + private func dmHeaderSection(recipient: RoomMemberDetails) -> some View { + AvatarHeaderView(member: recipient, + avatarSize: .room(on: .details), mediaProvider: context.mediaProvider) { url in context.send(viewAction: .displayAvatar(url)) } footer: { @@ -204,6 +202,14 @@ struct RoomDetailsScreen: View { context.send(viewAction: .processTapSecurityAndPrivacy) }) } + + if let dmRecipient = context.viewState.dmRecipient { + ListRow(label: .default(title: L10n.screenRoomDetailsProfileRowTitle, + icon: \.userProfile), + kind: .navigationLink { + context.send(viewAction: .processTapRecipientProfile) + }) + } } } diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-en-GB.DM-Room.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-en-GB.DM-Room.png index 2eb2a00b78..f1b6ecdb74 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-en-GB.DM-Room.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-en-GB.DM-Room.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94c47ee747ccae418bfb137fa8d7c3dfe9ff0a213d750cfa6c4e7267921b9f73 -size 233395 +oid sha256:bb27e069d806fca75d9ec3dcd2dfb971f23a2d8b3907fd85201b18969193dfad +size 216303 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-pseudo.DM-Room.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-pseudo.DM-Room.png index 6f1f08408f..bf763907ee 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-pseudo.DM-Room.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPad-pseudo.DM-Room.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f1fa21072fc9fb7e5246d47c0b1fe52fc06451616edb4f5a85b5f8110a5113a -size 238539 +oid sha256:4c527af451f8e0ab6df4d1a052617daebab0af070fb2689e8e7d24dc9360d500 +size 221651 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-en-GB.DM-Room.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-en-GB.DM-Room.png index af9e87b6d9..7b9e57732e 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-en-GB.DM-Room.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-en-GB.DM-Room.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbad14cfc4ef11542ce1fcd25a63c4206326b9db1eb4ef4ecb4c9d07ae96ad3c -size 169529 +oid sha256:2a377fbd9c51d9a0c2d4e5616f2f77af02b0d177ced865f1df2831099793868f +size 156043 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-pseudo.DM-Room.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-pseudo.DM-Room.png index 11cf088d65..99b8bf4904 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-pseudo.DM-Room.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/test_roomDetailsScreen-iPhone-16-pseudo.DM-Room.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a84ba5be353189c201895cd8be4892d91a9c8da26145bcdaf20b0ae5c2939528 -size 181603 +oid sha256:555caaecce1cf60df56e7cf135790bb514c203fecd6788a2c44876770e1bcfee +size 165123