element-ios/RiotSwiftUI/Modules/Authentication/Terms/View/AuthenticationTermsListItem...

82 lines
2.6 KiB
Swift

//
// Copyright 2022-2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only
// Please see LICENSE in the repository root for full details.
//
import SwiftUI
struct AuthenticationTermsListItem: View {
// MARK: - Properties
// MARK: Private
@Environment(\.theme) private var theme
// MARK: Public
@Binding var policy: AuthenticationTermsPolicy
let action: () -> Void
// MARK: - Views
var body: some View {
Button(action: action) {
label
.padding(.vertical, 14)
.overlay(separator, alignment: .bottom)
}
.buttonStyle(FormItemButtonStyle())
}
/// The content to be shown in the list row.
var label: some View {
HStack(spacing: 16) {
Toggle(VectorL10n.accept, isOn: $policy.accepted)
.toggleStyle(AuthenticationTermsToggleStyle())
.accessibilityLabel(VectorL10n.accept)
VStack(alignment: .leading, spacing: 0) {
Text(policy.title)
.font(theme.fonts.body)
.foregroundColor(theme.colors.primaryContent)
Text(policy.subtitle)
.font(theme.fonts.subheadline)
.foregroundColor(theme.colors.tertiaryContent)
}
.frame(maxWidth: .infinity, alignment: .leading)
Image(systemName: "chevron.forward")
.foregroundColor(theme.colors.tertiaryContent)
}
.padding(.horizontal, 16)
}
/// The separator shown beneath the item.
var separator: some View {
Rectangle()
.frame(height: 1)
.foregroundColor(theme.colors.system)
.padding(.leading)
}
}
struct Previews_AuthenticationTermsListItem_Previews: PreviewProvider {
static var unaccepted = AuthenticationTermsPolicy(url: "",
title: "Terms and Conditions",
subtitle: "matrix.org")
static var accepted = AuthenticationTermsPolicy(url: "",
title: "Terms and Conditions",
subtitle: "matrix.org",
accepted: true)
static var previews: some View {
VStack(spacing: 0) {
AuthenticationTermsListItem(policy: .constant(unaccepted)) { }
AuthenticationTermsListItem(policy: .constant(accepted)) { }
}
}
}