improved a11y in CollapsibleRoomTimelineView

This commit is contained in:
Mauro Romito
2025-06-16 18:23:20 +02:00
committed by Mauro
parent 7e801c3e58
commit 6c5813b534
4 changed files with 45 additions and 5 deletions
@@ -8,10 +8,16 @@
import SwiftUI
struct CollapsibleRoomTimelineView: View {
enum AccessibilityFocus {
case disclosure
case events
}
private let timelineItem: CollapsibleTimelineItem
private let groupedViewStates: [RoomTimelineItemViewState]
@State private var isExpanded = false
@AccessibilityFocusState private var accessibilityFocusState: AccessibilityFocus?
init(timelineItem: CollapsibleTimelineItem) {
self.timelineItem = timelineItem
@@ -21,13 +27,18 @@ struct CollapsibleRoomTimelineView: View {
var body: some View {
VStack(spacing: 0.0) {
Button {
withElementAnimation {
if !UIAccessibility.isVoiceOverRunning {
withElementAnimation {
isExpanded.toggle()
}
} else {
isExpanded.toggle()
}
} label: {
HStack(alignment: .center, spacing: 8) {
Text(L10n.screenRoomTimelineStateChanges(timelineItem.items.count))
Text(Image(systemName: "chevron.forward"))
.accessibilityLabel(isExpanded ? L10n.screenRoomGroupedViewStatesReduce : L10n.screenRoomGroupedViewStatesExpand)
.rotationEffect(.degrees(isExpanded ? 90 : 0))
.animation(.elementDefault, value: isExpanded)
}
@@ -40,13 +51,21 @@ struct CollapsibleRoomTimelineView: View {
.buttonStyle(.plain)
.frame(maxWidth: .infinity)
.padding(.top, 8.0)
.accessibilityFocused($accessibilityFocusState, equals: .disclosure)
if isExpanded {
ForEach(groupedViewStates) { viewState in
RoomTimelineItemView(viewState: viewState)
VStack(spacing: 0.0) {
ForEach(groupedViewStates) { viewState in
RoomTimelineItemView(viewState: viewState)
}
}
.accessibilityElement(children: .contain)
.accessibilityFocused($accessibilityFocusState, equals: .events)
}
}
.onChange(of: isExpanded) { _, newValue in
accessibilityFocusState = newValue ? .events : .disclosure
}
}
}