| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 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()
- 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)
- }
- @ViewBuilder
- private var mainContent: some View {
- ZStack {
- RedditWebView(
- url: viewModel.redditLoadURL,
- reloadTrigger: viewModel.redditReloadTrigger
- )
- .id("reddit-webview")
- .frame(maxWidth: .infinity, maxHeight: .infinity)
- .allowsHitTesting(viewModel.isRedditActive)
- .accessibilityHidden(!viewModel.isRedditActive)
- if viewModel.isSettingsActive {
- SettingsView()
- } 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) { url in
- viewModel.openReddit(at: url)
- }
- 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)
- }
|