| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // LoopFollow
- // HomeContentView.swift
- import SwiftUI
- import UIKit
- /// A SwiftUI wrapper around MainViewController that displays the full Home screen.
- /// This can be used both in the tab bar and as a modal from the Menu.
- struct HomeContentView: View {
- let isModal: Bool
- init(isModal: Bool = false) {
- self.isModal = isModal
- }
- var body: some View {
- MainViewControllerRepresentable()
- // Home has no text input, yet iOS sometimes replays a stale keyboard
- // frame when the app returns to the foreground, which squeezes the
- // whole screen up by a keyboard's height until a rotation forces the
- // safe area to recompute. Opting out of keyboard avoidance prevents it.
- .ignoresSafeArea(.keyboard)
- }
- }
- private struct MainViewControllerRepresentable: UIViewControllerRepresentable {
- func makeUIViewController(context _: Context) -> UIViewController {
- // Reuse the single long-lived instance rather than creating a new one,
- // so there is exactly one data pipeline and MainViewController.shared is
- // never displaced. bootstrap() is a no-op if it already exists.
- MainViewController.bootstrap()
- let mainVC = MainViewController.shared!
- // Detach from any previous SwiftUI host (e.g. after a Menu push was
- // popped and is now being re-pushed) before this representable embeds it.
- mainVC.willMove(toParent: nil)
- mainVC.removeFromParent()
- mainVC.view.removeFromSuperview()
- mainVC.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
- return mainVC
- }
- func updateUIViewController(_ uiViewController: UIViewController, context _: Context) {
- uiViewController.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
- }
- }
- // MARK: - Modal wrapper with navigation bar
- struct HomeModalView: View {
- @Environment(\.dismiss) private var dismiss
- var body: some View {
- NavigationStack {
- HomeContentView(isModal: true)
- .navigationTitle("Home")
- .navigationBarTitleDisplayMode(.inline)
- .toolbar {
- ToolbarItem(placement: .cancellationAction) {
- Button {
- dismiss()
- } label: {
- Image(systemName: "xmark")
- }
- }
- }
- }
- .preferredColorScheme(Storage.shared.appearanceMode.value.colorScheme)
- }
- }
- // MARK: - Preview
- #Preview {
- HomeModalView()
- }
|