import SwiftUI struct FrontPageView: View { @EnvironmentObject private var subscriptions: SubscriptionManager @State private var viewModel = FrontPageViewModel() @State private var paywallViewModel = PaywallViewModel() @State private var postGeneratorViewModel = PostGeneratorViewModel() @State private var titleOptimizerViewModel = TitleOptimizerViewModel() @State private var commentWriterViewModel = CommentWriterViewModel() @State private var settingsViewModel = SettingsViewModel() var body: some View { ZStack { HStack(spacing: 0) { SidebarView( viewModel: viewModel, isPremium: subscriptions.hasPremiumAccess ) mainContent .frame(maxWidth: .infinity, maxHeight: .infinity) .environment(\.requirePremiumAccess, { if subscriptions.hasPremiumAccess { return true } viewModel.showPaywall() return false }) } if viewModel.isPaywallPresented { PaywallView(viewModel: paywallViewModel) { viewModel.dismissPaywall() } .frame(maxWidth: .infinity, maxHeight: .infinity) .ignoresSafeArea() .zIndex(1) .transition(.opacity) } } .animation(.easeInOut(duration: 0.2), value: viewModel.isPaywallPresented) .onChange(of: subscriptions.hasPremiumAccess) { hasPremium in if hasPremium { viewModel.dismissPaywall() } } .frame(minWidth: AppWindow.minWidth, minHeight: AppWindow.minHeight) .background(AppTheme.background) .alert("Sign-in issue", isPresented: authErrorBinding) { Button("OK") { viewModel.clearAuthError() } } message: { Text(viewModel.authErrorMessage ?? "") } } private var authErrorBinding: Binding { Binding( get: { viewModel.authErrorMessage != nil }, set: { isPresented in if !isPresented { viewModel.clearAuthError() } } ) } @ViewBuilder private var mainContent: some View { VStack(spacing: 0) { if viewModel.isRedditActive, viewModel.redditCanGoBack { RedditWebBackBar( canGoBack: true, onBack: { viewModel.goBackInReddit() } ) } ZStack { RedditWebView( url: viewModel.redditLoadURL, reloadTrigger: viewModel.redditReloadTrigger, goBackTrigger: viewModel.redditGoBackTrigger, onCanGoBackChange: { viewModel.updateRedditCanGoBack($0) }, onAuthError: { viewModel.showAuthError($0) } ) .id("reddit-webview") .frame(maxWidth: .infinity, maxHeight: .infinity) .allowsHitTesting(viewModel.isRedditActive) .accessibilityHidden(!viewModel.isRedditActive) if viewModel.isSettingsActive { SettingsView(viewModel: settingsViewModel) } else if !viewModel.isRedditActive, let item = viewModel.selectedNavItem { toolContent(for: item) } } } .background(AppTheme.background) } @ViewBuilder private func toolContent(for item: SidebarNavItem) -> some View { switch item.iconKind { case .postGenerator: PostGeneratorView(viewModel: postGeneratorViewModel) { url in viewModel.openReddit(at: url) } case .titleOptimizer: TitleOptimizerView(viewModel: titleOptimizerViewModel) case .commentWriter: CommentWriterView(viewModel: commentWriterViewModel) default: ToolPlaceholderView(item: item) } } } private struct ToolPlaceholderView: View { let item: SidebarNavItem var body: some View { VStack(spacing: 12) { ModernSidebarIconView(kind: item.iconKind, size: 56) Text(item.title) .font(.system(size: 20, weight: .semibold)) .foregroundStyle(AppTheme.textPrimary) Text(item.subtitle) .font(.system(size: 13)) .foregroundStyle(AppTheme.textSecondary) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(AppTheme.background) } } #Preview { FrontPageView() .environmentObject(SubscriptionManager()) .frame(width: AppWindow.width, height: AppWindow.height) }