import SwiftUI struct SettingsView: View { @Bindable var viewModel: SettingsViewModel @EnvironmentObject private var subscriptions: SubscriptionManager @EnvironmentObject private var appRating: AppRatingManager @Environment(AppearanceManager.self) private var appearance private enum Layout { static let horizontalPadding: CGFloat = 24 } var body: some View { VStack(spacing: 0) { header ScrollView { VStack(alignment: .leading, spacing: 12) { appearanceSection linksSection } .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, Layout.horizontalPadding) .padding(.top, 12) .padding(.bottom, 24) } } .background(AppTheme.background) } private var header: some View { VStack(spacing: 0) { HStack(spacing: 14) { ModernSidebarIconView(kind: .settings, size: 40) VStack(alignment: .leading, spacing: 2) { Text("Settings") .font(.system(size: 18, weight: .semibold)) .foregroundStyle(AppTheme.textPrimary) Text("Manage app preferences") .font(.system(size: 11)) .foregroundStyle(AppTheme.textSecondary) } Spacer() } .padding(.horizontal, 24) .padding(.vertical, 16) FullWidthDivider() } } private var appearanceSection: some View { PostFormCard( title: "Appearance", subtitle: "Customize how the app looks" ) { SettingsToggleRow( icon: "moon.fill", title: "Dark Mode", subtitle: appearance.isDarkMode ? "On" : "Off", isOn: Binding( get: { appearance.isDarkMode }, set: { appearance.isDarkMode = $0 } ) ) } } private var linksSection: some View { PostFormCard( title: "About", subtitle: "Website, legal, and help resources" ) { VStack(spacing: 8) { if subscriptions.hasPremiumAccess { SettingsLinkRow( icon: "star.fill", title: "Rate App", subtitle: "Leave a review on the App Store" ) { appRating.requestReviewFromSettings() } } SettingsLinkRow( icon: "globe", title: "Website", subtitle: AppLinks.website.host ) { viewModel.openWebsite() } SettingsLinkRow( icon: "hand.raised.fill", title: "Privacy Policy", subtitle: "How we handle your data" ) { viewModel.openPrivacyPolicy() } SettingsLinkRow( icon: "doc.text.fill", title: "Terms & Conditions", subtitle: "Terms of service" ) { viewModel.openTermsAndConditions() } SettingsLinkRow( icon: "lifepreserver.fill", title: "Support", subtitle: "Get help or send feedback" ) { viewModel.openSupport() } } } } } #Preview { SettingsView(viewModel: SettingsViewModel()) .environmentObject(SubscriptionManager()) .environmentObject(AppRatingManager()) .environment(AppearanceManager.shared) .frame(width: 800, height: 600) }