Files
iOS/Sources/Shared/DesignSystem/Components/CollapsibleView.swift
Bruno Pantaleão Gonçalves 16f5a1bc75 Simplify and migrate onboarding screens to SwiftUI (#3527)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->



https://github.com/user-attachments/assets/e79c6e4d-13ff-405a-9463-02e597ce4996
2025-04-08 23:54:34 +02:00

79 lines
2.3 KiB
Swift

import SwiftUI
public struct CollapsibleView<CollapsedContent: View, ExpandedContent: View>: View {
@State private var expanded = false
@ViewBuilder public let collapsedContent: () -> CollapsedContent
@ViewBuilder public let expandedContent: () -> ExpandedContent
private let startExpanded: Bool
public init(
startExpanded: Bool = false,
@ViewBuilder collapsedContent: @escaping () -> CollapsedContent,
@ViewBuilder expandedContent: @escaping () -> ExpandedContent
) {
self.collapsedContent = collapsedContent
self.expandedContent = expandedContent
self.startExpanded = startExpanded
}
public var body: some View {
VStack(alignment: .leading) {
HStack {
collapsedContent()
Spacer()
Image(systemName: expanded ? "chevron.up" : "chevron.down")
.tint(.accentColor)
}
.frame(maxWidth: .infinity)
.animation(nil, value: expanded)
.onAppear {
expanded = startExpanded
}
.onTapGesture {
withAnimation(.easeInOut) {
expanded.toggle()
}
}
.accessibilityHint(
expanded ? L10n.Component.CollapsibleView.collapse : L10n.Component.CollapsibleView
.expand
)
.accessibilityLabel(
expanded ? L10n.Component.CollapsibleView.collapse : L10n.Component.CollapsibleView
.expand
)
VStack(alignment: .leading) {
if expanded {
expandedContent()
}
}
}
}
}
#Preview {
List {
CollapsibleView(collapsedContent: {
Text("abc")
}, expandedContent: {
VStack {
Text("abc")
Text("abc")
Text("abc")
Text("abc")
}
})
CollapsibleView(collapsedContent: {
Text("abc")
}, expandedContent: {
VStack {
Text("abc")
Text("abc")
Text("abc")
Text("abc")
}
})
}
}