| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // LoopFollow
- // OverviewStepView.swift
- import SwiftUI
- /// A quick map of what the rest of setup covers, so the user knows what to
- /// expect. The list reflects the phases that will actually run — a returning
- /// user who's already connected won't see "Connect your data" — and collapses to
- /// a short "you're all set" when there's nothing left to configure.
- struct OverviewStepView: View {
- @ObservedObject var onboarding: OnboardingViewModel
- private struct Item: Identifiable {
- let id = UUID()
- let icon: String
- let title: String
- let detail: String
- }
- /// The overview rows, derived from the phases that will actually run.
- private var items: [Item] {
- let steps = onboarding.activeSteps
- var result: [Item] = []
- if steps.contains(.connect) {
- result.append(Item(icon: "antenna.radiowaves.left.and.right",
- title: "Connect your data",
- detail: "Link a Nightscout site or a Dexcom Share account."))
- }
- if steps.contains(.units) {
- result.append(Item(icon: "ruler",
- title: "Units & metrics",
- detail: "Choose how glucose and statistics are shown."))
- }
- if steps.contains(.alarms) {
- result.append(Item(icon: "bell.badge.fill",
- title: "Recommended alarms",
- detail: "Turn on a few useful alarms with sensible defaults."))
- }
- if steps.contains(.tabOrder) {
- result.append(Item(icon: "square.grid.2x2",
- title: "Finish up",
- detail: "Arrange your tabs and set notification preferences."))
- }
- return result
- }
- var body: some View {
- VStack(spacing: 0) {
- if onboarding.hasNothingToSetUp {
- allSet
- } else {
- checklist
- }
- footer
- }
- }
- // MARK: - Content
- private var checklist: some View {
- ScrollView {
- VStack(alignment: .leading, spacing: 24) {
- OnboardingStepHeader(
- systemImage: "list.bullet.rectangle",
- title: "Here's what we'll do",
- subtitle: "A quick, straightforward setup — about 5 minutes. You can change anything later in Settings."
- )
- .padding(.horizontal)
- VStack(spacing: 14) {
- ForEach(items) { item in
- HStack(alignment: .top, spacing: 14) {
- Image(systemName: item.icon)
- .font(.title3)
- .foregroundStyle(Color.accentColor)
- .frame(width: 32)
- VStack(alignment: .leading, spacing: 4) {
- Text(item.title)
- .font(.headline)
- Text(item.detail)
- .font(.subheadline)
- .foregroundColor(.secondary)
- .multilineTextAlignment(.leading)
- }
- Spacer(minLength: 0)
- }
- .frame(maxWidth: .infinity, alignment: .leading)
- .padding()
- .background(
- RoundedRectangle(cornerRadius: 14, style: .continuous)
- .fill(Color(.secondarySystemGroupedBackground))
- )
- }
- }
- .padding(.horizontal)
- }
- .padding(.bottom, 24)
- }
- }
- private var allSet: some View {
- ScrollView {
- OnboardingStepHeader(
- systemImage: "checkmark.circle",
- title: "You're all set",
- subtitle: "Your data source is connected and your alarms are in place — there's nothing to set up here. You can fine-tune anything later in Settings."
- )
- .padding(.horizontal)
- .padding(.top, 24)
- }
- }
- // MARK: - Footer
- private var footer: some View {
- OnboardingNavFooter(
- continueTitle: onboarding.hasNothingToSetUp ? "Done" : "Continue",
- continueEnabled: true,
- showBack: onboarding.canGoBack,
- onBack: { onboarding.goBack() },
- onContinue: {
- if onboarding.hasNothingToSetUp {
- onboarding.finish()
- } else {
- onboarding.advance()
- }
- }
- )
- }
- }
|