import Adwaita import LuminateCore struct HomeView: View { var app: AdwaitaApp var window: AdwaitaWindow var client: JellyfinClient var userId: String @State private var resumeItems: [Components.Schemas.BaseItemDto] = [] @State private var nextUpItems: [Components.Schemas.BaseItemDto] = [] @State private var latestItems: [Components.Schemas.BaseItemDto] = [] @State private var libraries: [Components.Schemas.BaseItemDto] = [] @State private var isLoading = true var view: Body { ScrollView { VStack { if isLoading { Spinner() .padding(50) } else { if !resumeItems.isEmpty { MediaRow( title: "Continue Watching", items: resumeItems, client: client ) .padding(10, .bottom) } if !nextUpItems.isEmpty { MediaRow( title: "Next Up", items: nextUpItems, client: client ) .padding(10, .bottom) } if !latestItems.isEmpty { MediaRow( title: "Recently Added", items: latestItems, client: client, onSeeAll: {} ) .padding(10, .bottom) } LibraryGrid( libraries: libraries, client: client ) } } } .onAppear { loadHomeData() } } private func loadHomeData() { isLoading = true Task { async let resume = client.getItems( userId: userId, filters: [.IsResumable], sortBy: [.DatePlayed], sortOrder: [.Descending], limit: 20, recursive: true ) async let nextUp = client.getNextUp(userId: userId, limit: 20) async let latest = client.getLatestMedia(userId: userId, limit: 20) async let views = client.getUserViews(userId: userId) do { let (r, n, l, v) = try await (resume, nextUp, latest, views) await MainActor.run { resumeItems = r.Items ?? [] nextUpItems = n.Items ?? [] latestItems = l libraries = v.Items ?? [] isLoading = false } } catch { await MainActor.run { isLoading = false } } } } }