FrontPageView.swift 2.1 KB

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