Aadded sender name when voiceover focuses a poll title (#4306)

* added sender name in poll voiceover

* improved the code

* code improvement
This commit is contained in:
Mauro
2025-07-08 16:37:27 +02:00
committed by GitHub
parent a61502b8df
commit c60fd88577
5 changed files with 28 additions and 12 deletions
@@ -15,5 +15,6 @@ extension Section where Parent == Color, Content == EmptyView, Footer == EmptyVi
} header: {
Color.clear
}
.accessibilityHidden(true)
}
}
@@ -59,7 +59,7 @@ struct RoomPollsHistoryScreen: View {
.font(.compound.bodySM)
.foregroundColor(.compound.textSecondary)
PollView(poll: pollTimelineItem.item.poll,
state: .full(isEditable: pollTimelineItem.item.isEditable)) { action in
state: .full(isEditable: pollTimelineItem.item.isEditable), sender: pollTimelineItem.item.sender) { action in
switch action {
case .selectOption(let optionID):
guard let pollStartID = pollTimelineItem.item.id.eventID else { return }
@@ -128,7 +128,6 @@ struct StartChatScreen: View {
}
} else {
Section.empty
.accessibilityHidden(true)
}
}
@@ -42,14 +42,15 @@ struct PollView: View {
let poll: Poll
let state: PollViewState
let sender: TimelineItemSender
let actionHandler: (PollViewAction) -> Void
var body: some View {
if state.isPreview {
questionView
accessibleQuestionView
} else {
VStack(alignment: .leading, spacing: 16) {
questionView
accessibleQuestionView
optionsView
summaryView
toolbarView
@@ -59,6 +60,20 @@ struct PollView: View {
}
// MARK: - Private
private var senderString: String { poll.createdByAccountOwner ? L10n.commonYou : sender.disambiguatedDisplayName ?? sender.id }
@ViewBuilder
private var accessibleQuestionView: some View {
questionView
.accessibilityRepresentation {
HStack(spacing: 0) {
Text(senderString)
questionView
}
.accessibilityElement(children: .combine)
}
}
private var questionView: some View {
HStack(alignment: .top, spacing: 12) {
@@ -166,31 +181,31 @@ private extension Poll {
struct PollView_Previews: PreviewProvider, TestablePreview {
static var previews: some View {
PollView(poll: .disclosed(), state: .full(isEditable: false)) { _ in }
PollView(poll: .disclosed(), state: .full(isEditable: false), sender: .test) { _ in }
.padding()
.previewDisplayName("Disclosed")
PollView(poll: .undisclosed(), state: .full(isEditable: false)) { _ in }
PollView(poll: .undisclosed(), state: .full(isEditable: false), sender: .test) { _ in }
.padding()
.previewDisplayName("Undisclosed")
PollView(poll: .endedDisclosed, state: .full(isEditable: false)) { _ in }
PollView(poll: .endedDisclosed, state: .full(isEditable: false), sender: .test) { _ in }
.padding()
.previewDisplayName("Ended, Disclosed")
PollView(poll: .endedUndisclosed, state: .full(isEditable: false)) { _ in }
PollView(poll: .endedUndisclosed, state: .full(isEditable: false), sender: .test) { _ in }
.padding()
.previewDisplayName("Ended, Undisclosed")
PollView(poll: .disclosed(createdByAccountOwner: true), state: .full(isEditable: true)) { _ in }
PollView(poll: .disclosed(createdByAccountOwner: true), state: .full(isEditable: true), sender: .test) { _ in }
.padding()
.previewDisplayName("Creator, disclosed")
PollView(poll: .emptyDisclosed, state: .full(isEditable: true)) { _ in }
PollView(poll: .emptyDisclosed, state: .full(isEditable: true), sender: .test) { _ in }
.padding()
.previewDisplayName("Creator, no votes")
PollView(poll: .emptyDisclosed, state: .preview) { _ in }
PollView(poll: .emptyDisclosed, state: .preview, sender: .test) { _ in }
.padding()
.previewDisplayName("Preview")
}
@@ -22,7 +22,8 @@ struct PollRoomTimelineView: View {
var body: some View {
TimelineStyler(timelineItem: timelineItem) {
PollView(poll: poll,
state: state) { action in
state: state,
sender: timelineItem.sender) { action in
switch action {
case .selectOption(let optionID):
guard let eventID, let option = poll.options.first(where: { $0.id == optionID }), !option.isSelected else { return }