FrontPageView.swift 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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.redditLoadURL,
  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) { url in
  37. viewModel.openReddit(at: url)
  38. }
  39. case .titleOptimizer:
  40. TitleOptimizerView(viewModel: titleOptimizerViewModel)
  41. default:
  42. ToolPlaceholderView(item: item)
  43. }
  44. }
  45. }
  46. private struct ToolPlaceholderView: View {
  47. let item: SidebarNavItem
  48. var body: some View {
  49. VStack(spacing: 12) {
  50. ModernSidebarIconView(kind: item.iconKind, size: 56)
  51. Text(item.title)
  52. .font(.system(size: 20, weight: .semibold))
  53. .foregroundStyle(AppTheme.textPrimary)
  54. Text(item.subtitle)
  55. .font(.system(size: 13))
  56. .foregroundStyle(AppTheme.textSecondary)
  57. }
  58. .frame(maxWidth: .infinity, maxHeight: .infinity)
  59. .background(AppTheme.background)
  60. }
  61. }
  62. #Preview {
  63. FrontPageView()
  64. .frame(width: AppWindow.width, height: AppWindow.height)
  65. }