| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- //
- // InformationView.swift
- // LoopKitUI
- //
- // Created by Anna Quinlan on 7/1/20.
- // Copyright © 2020 LoopKit Authors. All rights reserved.
- //
- import SwiftUI
- struct InformationView<InformationalContent: View> : View {
- var informationalContent: InformationalContent
- var title: Text
- var buttonText: Text
- var onExit: (() -> Void)
- let mode: SettingsPresentationMode
-
- init(
- title: Text,
- buttonText: Text,
- @ViewBuilder informationalContent: () -> InformationalContent,
- onExit: @escaping () -> Void,
- mode: SettingsPresentationMode
- ) {
- self.title = title
- self.buttonText = buttonText
- self.informationalContent = informationalContent()
- self.onExit = onExit
- self.mode = mode
- }
-
- // Convenience initializer for info view w/next page button
- init(
- title: Text,
- @ViewBuilder informationalContent: () -> InformationalContent,
- onExit: @escaping () -> Void,
- mode: SettingsPresentationMode = .acceptanceFlow
- ) {
- self.init(
- title: title,
- buttonText: Text(LocalizedString("Continue", comment: "Button to advance to setting editor")),
- informationalContent: informationalContent,
- onExit: onExit,
- mode: mode
- )
- }
-
- var body: some View {
- GeometryReader { geometry in
- ScrollView {
- bodyForMode
- .padding()
- .frame(minHeight: geometry.size.height)
- }
- }
- }
- @ViewBuilder
- private var bodyForMode: some View {
- switch mode {
- case .acceptanceFlow:
- bodyForAcceptanceFlow
- case .settings:
- bodyForSettings
- }
- }
-
- private var bodyForAcceptanceFlow: some View {
- VStack(alignment: .leading, spacing: 20) {
- titleView
- Divider()
- informationalContent
- Spacer()
- nextPageButton
- }
- }
-
- private var bodyForSettings: some View {
- VStack(alignment: .leading, spacing: 20) {
- informationalContent
- Spacer()
- }
- .toolbar {
- ToolbarItem(placement: .navigationBarTrailing) {
- cancelButton
- }
- }
- .navigationBarTitle(title, displayMode: .large)
- }
- private var titleView: some View {
- title
- .font(.largeTitle)
- .bold()
- .fixedSize(horizontal: false, vertical: true)
- }
-
- private var cancelButton: some View {
- Button(action: onExit, label: { Text(LocalizedString("Close", comment: "Text to close informational page")) })
- }
-
- private var nextPageButton: some View {
- Button(action: onExit) {
- buttonText
- .actionButtonStyle(.primary)
- }
- }
- }
|