A11y: added a hint to inform the user that max selections have been reached (#4308)

* a11y added a hint to inform the user that max selections have been reached

* added string
This commit is contained in:
Mauro
2025-07-08 17:33:47 +02:00
committed by GitHub
parent c60fd88577
commit b816f0cf56
4 changed files with 31 additions and 10 deletions
@@ -17,6 +17,7 @@
"a11y_pin_field" = "PIN field"; "a11y_pin_field" = "PIN field";
"a11y_play" = "Play"; "a11y_play" = "Play";
"a11y_poll_end" = "Ended poll"; "a11y_poll_end" = "Ended poll";
"a11y_polls_will_remove_selection" = "Will remove previous selection";
"a11y_polls_winning_answer" = "This is the winning answer"; "a11y_polls_winning_answer" = "This is the winning answer";
"a11y_react_with" = "React with %1$@"; "a11y_react_with" = "React with %1$@";
"a11y_react_with_other_emojis" = "React with other emojis"; "a11y_react_with_other_emojis" = "React with other emojis";
+2
View File
@@ -62,6 +62,8 @@ internal enum L10n {
internal static func a11yPollsPercentOfTotal(_ p1: Int) -> String { internal static func a11yPollsPercentOfTotal(_ p1: Int) -> String {
return L10n.tr("Localizable", "a11y_polls_percent_of_total", p1) return L10n.tr("Localizable", "a11y_polls_percent_of_total", p1)
} }
/// Will remove previous selection
internal static var a11yPollsWillRemoveSelection: String { return L10n.tr("Localizable", "a11y_polls_will_remove_selection") }
/// This is the winning answer /// This is the winning answer
internal static var a11yPollsWinningAnswer: String { return L10n.tr("Localizable", "a11y_polls_winning_answer") } internal static var a11yPollsWinningAnswer: String { return L10n.tr("Localizable", "a11y_polls_winning_answer") }
/// React with %1$@ /// React with %1$@
@@ -92,6 +92,21 @@ struct PollView: View {
private var optionsView: some View { private var optionsView: some View {
ForEach(poll.options, id: \.id) { option in ForEach(poll.options, id: \.id) { option in
if #available(iOS 18, *) {
pollOption(option: option)
.accessibilityHint(L10n.a11yPollsWillRemoveSelection,
isEnabled: isRemovePreviousSelectionHintEnabled(option: option))
} else {
pollOption(option: option)
}
}
}
private func isRemovePreviousSelectionHintEnabled(option: Poll.Option) -> Bool {
!poll.hasEnded && poll.hasMaxSelections && !option.isSelected
}
private func pollOption(option: Poll.Option) -> some View {
Button { Button {
guard !option.isSelected else { return } guard !option.isSelected else { return }
actionHandler(.selectOption(optionID: option.id)) actionHandler(.selectOption(optionID: option.id))
@@ -104,7 +119,6 @@ struct PollView: View {
} }
.disabled(poll.hasEnded) .disabled(poll.hasEnded)
} }
}
@ViewBuilder @ViewBuilder
private var summaryView: some View { private var summaryView: some View {
@@ -38,6 +38,10 @@ struct Poll: Hashable {
case undisclosed case undisclosed
} }
var hasMaxSelections: Bool {
options.filter(\.isSelected).count == maxSelections
}
struct Option: Hashable { struct Option: Hashable {
let id: String let id: String
let text: String let text: String