Luminate/Sources/LuminateHome/HomeView.swift

88 lines
2.9 KiB
Swift

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 }
}
}
}
}