import SwiftUI import MediaKit /// Ein Navigationsstapel mit allen Zielen — und einem Weg, von innen zu /// schieben. /// /// **Warum der Pfad hier liegt und nicht beim System.** Ein `NavigationLink` /// schiebt selbst; wer stattdessen aus einem Knopf heraus schieben will, /// braucht eine Bindung. Genau das verlangt die Kachel, seit Antippen /// abspielt: der Weg auf die Detailseite führt dann über das Kontextmenü, und /// ein Menüeintrag ist kein Link. /// /// **Die Ziele stehen hier und nur hier.** Sie je Bildschirm anzumelden hat /// schon einmal nicht funktioniert: liegen zwei Bildschirme übereinander, /// entscheidet sonst die Reihenfolge, und ein Tippen landete im Nichts. struct MediaStack: View { @ViewBuilder let content: () -> Content @Environment(FlixySession.self) private var session @State private var path = NavigationPath() var body: some View { NavigationStack(path: $path) { content() .navigationDestination(for: MediaRoute.self) { MediaDetailView(route: $0) } .navigationDestination(for: LibraryRoute.self) { route in if let library = session.libraries.first(where: { $0.id == route.id }) { LibraryView(library: library) } } .navigationDestination(for: LiveTVRoute.self) { _ in LiveTVView() } .navigationDestination(for: SearchRoute.self) { _ in SearchView() } } .environment(\.flixyPush) { ziel in path.append(ziel) } } } extension EnvironmentValues { /// Schiebt ein Ziel auf den Stapel, in dem man gerade steht. /// /// **Über die Umgebung, weil der Weg sonst lang ist.** Eine Kachel steckt /// in einer Reihe, die in der Startseite steckt, die im Stapel steckt. /// Eine Bindung durch jede Ebene zu reichen hiesse, drei Ansichten um ein /// Argument zu erweitern, das sie nur weitergeben. /// /// Die Voreinstellung tut nichts: ausserhalb eines Stapels gibt es nichts /// zu schieben, und ein Absturz wäre die schlechtere Antwort. @Entry var flixyPush: (any Hashable) -> Void = { _ in } }