Luminate/Sources/LuminateHome/HomeView.swift

100 lines
3.2 KiB
Swift

import Adwaita
import LuminateCore
public struct HomeView: View {
public var app: AdwaitaApp
public var window: AdwaitaWindow
public var client: JellyfinClient
public 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
public init(
app: AdwaitaApp,
window: AdwaitaWindow,
client: JellyfinClient,
userId: String
) {
self.app = app
self.window = window
self.client = client
self.userId = userId
}
public 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 }
}
}
}
}