Files
Termind/TFM/Features/Settings/DeveloperSettingsPage.swift
T

83 lines
2.6 KiB
Swift

import SwiftUI
struct DeveloperSettingsPage: View {
@Environment(AppModel.self) private var app
var body: some View {
Form {
Section {
ForEach(OnboardingStep.allCases) { step in
onboardingRow(step)
}
if app.onboarding.previewRequest != nil
|| app.onboarding.presentation?.mode == .preview
{
Button {
app.onboarding.cancelPreview()
} label: {
Text(verbatim: "Cancel Preview")
}
}
Button(role: .destructive) {
app.onboarding.resetAll()
} label: {
Text(verbatim: "Reset All Onboarding")
}
Text(
verbatim: "Preview bypasses completion and ordering but waits for a real "
+ "eligible context. Preview actions never change completion state."
)
.font(.caption)
.foregroundStyle(.secondary)
} header: {
Text(verbatim: "Onboarding")
}
}
.formStyle(.grouped)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
private func onboardingRow(_ step: OnboardingStep) -> some View {
let status = app.onboarding.developerStatus(for: step)
return VStack(alignment: .leading, spacing: Metrics.Space.s) {
HStack {
VStack(alignment: .leading, spacing: Metrics.Space.xxs) {
Text(verbatim: step.title)
Text(verbatim: status.label)
.font(.caption)
.foregroundStyle(onboardingStatusColor(status))
}
Spacer()
Button {
app.onboarding.preview(step)
} label: {
Text(verbatim: "Preview")
}
Button {
app.onboarding.reset(step)
} label: {
Text(verbatim: "Reset")
}
}
if case .waitingForContext(let reason) = status {
Text(verbatim: reason)
.font(.caption)
.foregroundStyle(.secondary)
}
}
}
private func onboardingStatusColor(_ status: OnboardingDeveloperStatus) -> Color {
switch status {
case .completed: .green
case .pending: .secondary
case .previewing: .orange
case .waitingForContext: .orange
}
}
}