import SwiftUI import FlixyDesign import PlexKit /// Reihen der Startseite ein- und ausblenden und umsortieren. struct HomeLayoutView: View { @Environment(FlixySession.self) private var session @Environment(HomeLayoutSettings.self) private var layout @State private var rows: [HomeRow] = [] @State private var isLoading = true var body: some View { Group { if isLoading { ProgressView().frame(maxWidth: .infinity, maxHeight: .infinity) } else if rows.isEmpty { ContentUnavailableView { Label("home.empty.title", systemImage: "rectangle.stack") } description: { Text("homeLayout.empty") } } else { list } } .background(Color.flixyCanvas) .navigationTitle(Text("homeLayout.title")) .navigationBarTitleDisplayMode(.inline) .toolbar { EditButton() } .task { await load() } } private var list: some View { List { Section { ForEach($rows) { $row in Toggle(isOn: Binding( get: { !row.isHidden }, set: { row.isHidden = !$0 layout.setHidden(!$0, for: row.id) } )) { Text(row.title) .foregroundStyle(Color.flixyTextPrimary) } .listRowBackground(Color.flixySurface) } .onMove { indices, destination in rows.move(fromOffsets: indices, toOffset: destination) layout.setOrder(rows.map(\.id)) } } footer: { Text("homeLayout.explanation") } } .scrollContentBackground(.hidden) } private func load() async { defer { isLoading = false } guard let server = session.server else { return } // Die Reihen kommen vom Server — es gibt keine feste Liste, die sich // vorweg anzeigen ließe. Was hier steht, hängt davon ab, welche // Mediatheken und Sammlungen angelegt sind. let hubs = (try? await server.homeHubs()) ?? [] rows = layout.rows(from: hubs) } }