FrontPageView.swift 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import SwiftUI
  2. struct FrontPageView: View {
  3. @State private var viewModel = FrontPageViewModel()
  4. @State private var postGeneratorViewModel = PostGeneratorViewModel()
  5. @State private var titleOptimizerViewModel = TitleOptimizerViewModel()
  6. var body: some View {
  7. HStack(spacing: 0) {
  8. SidebarView(viewModel: viewModel)
  9. mainContent
  10. .frame(maxWidth: .infinity, maxHeight: .infinity)
  11. }
  12. .frame(minWidth: AppWindow.minWidth, minHeight: AppWindow.minHeight)
  13. .background(AppTheme.background)
  14. }
  15. @ViewBuilder
  16. private var mainContent: some View {
  17. ZStack {
  18. RedditWebView(
  19. url: viewModel.redditURL,
  20. reloadTrigger: viewModel.redditReloadTrigger
  21. )
  22. .id("reddit-webview")
  23. .frame(maxWidth: .infinity, maxHeight: .infinity)
  24. .allowsHitTesting(viewModel.isRedditActive)
  25. .accessibilityHidden(!viewModel.isRedditActive)
  26. if !viewModel.isRedditActive, let item = viewModel.selectedNavItem {
  27. toolContent(for: item)
  28. }
  29. }
  30. .background(AppTheme.background)
  31. }
  32. @ViewBuilder
  33. private func toolContent(for item: SidebarNavItem) -> some View {
  34. switch item.iconKind {
  35. case .postGenerator:
  36. PostGeneratorView(viewModel: postGeneratorViewModel)
  37. case .titleOptimizer:
  38. TitleOptimizerView(viewModel: titleOptimizerViewModel)
  39. default:
  40. ToolPlaceholderView(item: item)
  41. }
  42. }
  43. }
  44. private struct ToolPlaceholderView: View {
  45. let item: SidebarNavItem
  46. var body: some View {
  47. VStack(spacing: 12) {
  48. ModernSidebarIconView(kind: item.iconKind, size: 56)
  49. Text(item.title)
  50. .font(.system(size: 20, weight: .semibold))
  51. .foregroundStyle(AppTheme.textPrimary)
  52. Text(item.subtitle)
  53. .font(.system(size: 13))
  54. .foregroundStyle(AppTheme.textSecondary)
  55. }
  56. .frame(maxWidth: .infinity, maxHeight: .infinity)
  57. .background(AppTheme.background)
  58. }
  59. }
  60. #Preview {
  61. FrontPageView()
  62. .frame(width: AppWindow.width, height: AppWindow.height)
  63. }