mirror of
https://github.com/yattee/yattee.git
synced 2024-12-22 13:33:42 +00:00
Merge pull request #695 from stonerl/more-async-work
more responsive UI when Favorites are used.
This commit is contained in:
commit
ced9eb28d7
@ -88,28 +88,40 @@ struct FavoriteItemView: View {
|
||||
reloadVisibleWatches()
|
||||
} else {
|
||||
resource?.addObserver(store)
|
||||
loadCacheAndResource()
|
||||
DispatchQueue.main.async {
|
||||
self.loadCacheAndResource()
|
||||
}
|
||||
}
|
||||
}
|
||||
.onDisappear {
|
||||
resource?.removeObservers(ownedBy: store)
|
||||
}
|
||||
.onChange(of: player.currentVideo) { _ in reloadVisibleWatches() }
|
||||
.onChange(of: hideShorts) { _ in reloadVisibleWatches() }
|
||||
.onChange(of: hideWatched) { _ in reloadVisibleWatches() }
|
||||
.onChange(of: favoritesChanged) { _ in reloadVisibleWatches() }
|
||||
.onChange(of: player.currentVideo) { _ in if !player.presentingPlayer { reloadVisibleWatches() } }
|
||||
.onChange(of: hideShorts) { _ in if !player.presentingPlayer { reloadVisibleWatches() } }
|
||||
.onChange(of: hideWatched) { _ in if !player.presentingPlayer { reloadVisibleWatches() } }
|
||||
// Delay is necessary to update the list with the new items.
|
||||
.onChange(of: favoritesChanged) { _ in if !player.presentingPlayer { Delay.by(1.0) { reloadVisibleWatches() } } }
|
||||
.onChange(of: player.presentingPlayer) { _ in
|
||||
if player.presentingPlayer {
|
||||
resource?.removeObservers(ownedBy: store)
|
||||
} else {
|
||||
resource?.addObserver(store)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.id(watchModel.historyToken)
|
||||
.onChange(of: accounts.current) { _ in
|
||||
resource?.removeObservers(ownedBy: store)
|
||||
resource?.addObserver(store)
|
||||
DispatchQueue.main.async {
|
||||
loadCacheAndResource(force: true)
|
||||
}
|
||||
}
|
||||
.onChange(of: watchModel.historyToken) { _ in
|
||||
if !player.presentingPlayer {
|
||||
reloadVisibleWatches()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var emptyItemsText: String {
|
||||
var filterText = ""
|
||||
@ -159,6 +171,7 @@ struct FavoriteItemView: View {
|
||||
}
|
||||
|
||||
func reloadVisibleWatches() {
|
||||
DispatchQueue.main.async {
|
||||
guard item.section == .history else { return }
|
||||
|
||||
visibleWatches = []
|
||||
@ -181,6 +194,7 @@ struct FavoriteItemView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var limitedItems: [ContentItem] {
|
||||
var items: [ContentItem]
|
||||
@ -227,6 +241,9 @@ struct FavoriteItemView: View {
|
||||
onSuccess = { response in
|
||||
if let videos: [Video] = response.typedContent() {
|
||||
FeedCacheModel.shared.storeFeed(account: accounts.current, videos: videos)
|
||||
DispatchQueue.main.async {
|
||||
store.contentItems = contentItems
|
||||
}
|
||||
}
|
||||
}
|
||||
case let .channel(_, id, name):
|
||||
@ -239,6 +256,7 @@ struct FavoriteItemView: View {
|
||||
}
|
||||
|
||||
onSuccess = { response in
|
||||
DispatchQueue.main.async {
|
||||
if let channel: Channel = response.typedContent() {
|
||||
ChannelsCacheModel.shared.store(channel)
|
||||
store.contentItems = ContentItem.array(of: channel.videos)
|
||||
@ -254,6 +272,7 @@ struct FavoriteItemView: View {
|
||||
store.contentItems = channelPage.results
|
||||
}
|
||||
}
|
||||
}
|
||||
case let .channelPlaylist(_, id, title):
|
||||
if let cache = ChannelPlaylistsCacheModel.shared.retrievePlaylist(.init(id: id, title: title)),
|
||||
!cache.videos.isEmpty
|
||||
@ -264,6 +283,9 @@ struct FavoriteItemView: View {
|
||||
onSuccess = { response in
|
||||
if let playlist: ChannelPlaylist = response.typedContent() {
|
||||
ChannelPlaylistsCacheModel.shared.storePlaylist(playlist: playlist)
|
||||
DispatchQueue.main.async {
|
||||
store.contentItems = contentItems
|
||||
}
|
||||
}
|
||||
}
|
||||
case let .playlist(_, id):
|
||||
@ -272,13 +294,17 @@ struct FavoriteItemView: View {
|
||||
if let playlist = playlists.first(where: { $0.id == id }) {
|
||||
contentItems = ContentItem.array(of: playlist.videos)
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
store.contentItems = contentItems
|
||||
}
|
||||
default:
|
||||
contentItems = []
|
||||
}
|
||||
|
||||
if !contentItems.isEmpty {
|
||||
DispatchQueue.main.async {
|
||||
store.contentItems = contentItems
|
||||
}
|
||||
}
|
||||
|
||||
if force {
|
||||
resource.load().onSuccess(onSuccess)
|
||||
|
@ -5,9 +5,11 @@ import UniformTypeIdentifiers
|
||||
|
||||
struct HomeView: View {
|
||||
@ObservedObject private var accounts = AccountsModel.shared
|
||||
@ObservedObject private var player = PlayerModel.shared
|
||||
|
||||
@State private var presentingHomeSettings = false
|
||||
@State private var favoritesChanged = false
|
||||
@State private var updateTask: Task<Void, Never>?
|
||||
|
||||
@FetchRequest(sortDescriptors: [.init(key: "watchedAt", ascending: false)])
|
||||
var watches: FetchedResults<Watch>
|
||||
@ -16,8 +18,6 @@ struct HomeView: View {
|
||||
@State private var recentDocumentsID = UUID()
|
||||
#endif
|
||||
|
||||
var favoritesObserver: Any?
|
||||
|
||||
#if !os(tvOS)
|
||||
@Default(.favorites) private var favorites
|
||||
@Default(.widgetsSettings) private var widgetsSettings
|
||||
@ -124,6 +124,24 @@ struct HomeView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.onDisappear {
|
||||
updateTask?.cancel()
|
||||
}
|
||||
|
||||
.onChange(of: player.presentingPlayer) { _ in
|
||||
if player.presentingPlayer {
|
||||
updateTask?.cancel()
|
||||
} else {
|
||||
Task {
|
||||
for await _ in Defaults.updates(.favorites) {
|
||||
favoritesChanged.toggle()
|
||||
}
|
||||
for await _ in Defaults.updates(.widgetsSettings) {
|
||||
favoritesChanged.toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.redrawOn(change: favoritesChanged)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user