FrontPageView.swift 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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.isSettingsActive {
  28. SettingsView()
  29. } else if !viewModel.isRedditActive, let item = viewModel.selectedNavItem {
  30. toolContent(for: item)
  31. }
  32. }
  33. .background(AppTheme.background)
  34. }
  35. @ViewBuilder
  36. private func toolContent(for item: SidebarNavItem) -> some View {
  37. switch item.iconKind {
  38. case .postGenerator:
  39. PostGeneratorView(viewModel: postGeneratorViewModel) { url in
  40. viewModel.openReddit(at: url)
  41. }
  42. case .titleOptimizer:
  43. TitleOptimizerView(viewModel: titleOptimizerViewModel)
  44. case .commentWriter:
  45. CommentWriterView(viewModel: commentWriterViewModel) { url in
  46. viewModel.openReddit(at: url)
  47. }
  48. default:
  49. ToolPlaceholderView(item: item)
  50. }
  51. }
  52. }
  53. private struct ToolPlaceholderView: View {
  54. let item: SidebarNavItem
  55. var body: some View {
  56. VStack(spacing: 12) {
  57. ModernSidebarIconView(kind: item.iconKind, size: 56)
  58. Text(item.title)
  59. .font(.system(size: 20, weight: .semibold))
  60. .foregroundStyle(AppTheme.textPrimary)
  61. Text(item.subtitle)
  62. .font(.system(size: 13))
  63. .foregroundStyle(AppTheme.textSecondary)
  64. }
  65. .frame(maxWidth: .infinity, maxHeight: .infinity)
  66. .background(AppTheme.background)
  67. }
  68. }
  69. #Preview {
  70. FrontPageView()
  71. .frame(width: AppWindow.width, height: AppWindow.height)
  72. }