yattee/Shared/Home/HistoryView.swift

54 lines
1.6 KiB
Swift
Raw Normal View History

2022-11-09 13:34:04 +00:00
import SwiftUI
struct HistoryView: View {
2022-11-15 11:22:27 +00:00
var limit = 10
2022-11-09 13:34:04 +00:00
@FetchRequest(sortDescriptors: [.init(key: "watchedAt", ascending: false)])
var watches: FetchedResults<Watch>
@ObservedObject private var player = PlayerModel.shared
2022-11-09 13:34:04 +00:00
2023-05-23 16:49:14 +00:00
@State private var visibleWatches = [Watch]()
init(limit: Int = 10) {
self.limit = limit
}
2022-11-09 13:34:04 +00:00
var body: some View {
LazyVStack {
2022-11-11 17:50:13 +00:00
if visibleWatches.isEmpty {
VStack(spacing: 20) {
2022-11-11 17:50:13 +00:00
HStack {
Image(systemName: "clock")
Text("Playback history is empty")
}.foregroundColor(.secondary)
2022-11-09 13:34:04 +00:00
}
2022-11-11 17:50:13 +00:00
} else {
ForEach(visibleWatches, id: \.videoID) { watch in
2022-12-15 11:09:36 +00:00
let video = player.historyVideo(watch.videoID) ?? watch.video
ContentItemView(item: .init(video: video))
.environment(\.listingStyle, .list)
.contextMenu {
VideoContextMenuView(video: video)
}
2022-11-09 13:34:04 +00:00
}
}
}
2022-12-22 18:36:35 +00:00
.animation(nil, value: visibleWatches)
2023-05-23 16:49:14 +00:00
.onAppear(perform: reloadVisibleWatches)
.onChange(of: player.currentVideo) { _ in reloadVisibleWatches() }
2022-11-09 13:34:04 +00:00
}
2023-05-23 16:49:14 +00:00
func reloadVisibleWatches() {
visibleWatches = Array(watches.filter { $0.videoID != player.currentVideo?.videoID }.prefix(limit))
visibleWatches.forEach(player.loadHistoryVideoDetails)
2022-11-09 13:34:04 +00:00
}
}
struct HistoryView_Previews: PreviewProvider {
static var previews: some View {
HistoryView()
}
}