HomeContentView.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // LoopFollow
  2. // HomeContentView.swift
  3. import SwiftUI
  4. import UIKit
  5. /// A SwiftUI wrapper around MainViewController that displays the full Home screen.
  6. /// This can be used both in the tab bar and as a modal from the Menu.
  7. struct HomeContentView: UIViewControllerRepresentable {
  8. let isModal: Bool
  9. init(isModal: Bool = false) {
  10. self.isModal = isModal
  11. }
  12. func makeUIViewController(context _: Context) -> UIViewController {
  13. let storyboard = UIStoryboard(name: "Main", bundle: nil)
  14. // Get the MainViewController from storyboard
  15. guard let mainVC = storyboard.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController else {
  16. let fallbackVC = UIViewController()
  17. fallbackVC.view.backgroundColor = .systemBackground
  18. let label = UILabel()
  19. label.text = "Unable to load Home screen"
  20. label.textAlignment = .center
  21. label.translatesAutoresizingMaskIntoConstraints = false
  22. fallbackVC.view.addSubview(label)
  23. NSLayoutConstraint.activate([
  24. label.centerXAnchor.constraint(equalTo: fallbackVC.view.centerXAnchor),
  25. label.centerYAnchor.constraint(equalTo: fallbackVC.view.centerYAnchor),
  26. ])
  27. return fallbackVC
  28. }
  29. mainVC.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
  30. mainVC.isPresentedAsModal = isModal
  31. return mainVC
  32. }
  33. func updateUIViewController(_ uiViewController: UIViewController, context _: Context) {
  34. uiViewController.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
  35. }
  36. }
  37. // MARK: - Modal wrapper with navigation bar
  38. struct HomeModalView: View {
  39. @Environment(\.dismiss) private var dismiss
  40. var body: some View {
  41. NavigationView {
  42. HomeContentView(isModal: true)
  43. .navigationTitle("Home")
  44. .navigationBarTitleDisplayMode(.inline)
  45. .toolbar {
  46. ToolbarItem(placement: .cancellationAction) {
  47. Button {
  48. dismiss()
  49. } label: {
  50. Image(systemName: "xmark")
  51. }
  52. }
  53. }
  54. }
  55. .preferredColorScheme(Storage.shared.appearanceMode.value.colorScheme)
  56. }
  57. }
  58. // MARK: - Preview
  59. #Preview {
  60. HomeModalView()
  61. }