FrontPageView.swift 2.5 KB

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