summaryrefslogtreecommitdiff
path: root/Sora/Views/FavoritesView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-18 12:45:11 -0800
committerFuwn <[email protected]>2026-02-18 12:45:19 -0800
commit2aaf7665047f61e72495b99b6caaef54d19332fe (patch)
treec82cbc7a8b99bdc2eb59e75748c2c18bb9d39713 /Sora/Views/FavoritesView.swift
parentperf: memoize post grid derived collections and remove columns cache (diff)
downloadsora-testing-2aaf7665047f61e72495b99b6caaef54d19332fe.tar.xz
sora-testing-2aaf7665047f61e72495b99b6caaef54d19332fe.zip
chore: finalise performance optimisation batch and metrics
Diffstat (limited to 'Sora/Views/FavoritesView.swift')
-rw-r--r--Sora/Views/FavoritesView.swift54
1 files changed, 50 insertions, 4 deletions
diff --git a/Sora/Views/FavoritesView.swift b/Sora/Views/FavoritesView.swift
index 12f1bc0..04ecd24 100644
--- a/Sora/Views/FavoritesView.swift
+++ b/Sora/Views/FavoritesView.swift
@@ -25,6 +25,9 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
@State private var displayedFavorites: [SettingsFavoritePost] = []
@State private var displayedPosts: [BooruPost] = []
@State private var displayedColumnsData: [[SettingsFavoritePost]] = []
+ @State private var shuffleOrderByIdentifier: [UUID: Int] = [:]
+ @State private var shuffleSourceIdentifiers: [UUID] = []
+ @State private var shouldRefreshShuffleOrder = true
private func refreshFolderHierarchy() {
folderHierarchy = FolderHierarchy(folders: settings.folders)
@@ -61,7 +64,7 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
}
}
- private func sortedFavorites(from unsortedFavorites: [SettingsFavoritePost])
+ private func orderedFavorites(from unsortedFavorites: [SettingsFavoritePost])
-> [SettingsFavoritePost]
{
unsortedFavorites.sorted { leftFavorite, rightFavorite in
@@ -76,8 +79,40 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
return leftFavorite.visitedCount > rightFavorite.visitedCount
case .shuffle:
- return Bool.random()
+ return leftFavorite.date > rightFavorite.date
+ }
+ }
+ }
+
+ private func refreshShuffleOrder(for favoritesToShuffle: [SettingsFavoritePost]) {
+ let currentIdentifiers = favoritesToShuffle.map(\.id)
+
+ if shouldRefreshShuffleOrder || shuffleSourceIdentifiers != currentIdentifiers {
+ var refreshedShuffleOrderByIdentifier: [UUID: Int] = [:]
+ let shuffledIdentifiers = currentIdentifiers.shuffled()
+
+ for (identifierIndex, identifier) in shuffledIdentifiers.enumerated() {
+ refreshedShuffleOrderByIdentifier[identifier] = identifierIndex
+ }
+
+ shuffleOrderByIdentifier = refreshedShuffleOrderByIdentifier
+ shuffleSourceIdentifiers = currentIdentifiers
+ shouldRefreshShuffleOrder = false
+ }
+ }
+
+ private func shuffledFavorites(from favoritesToShuffle: [SettingsFavoritePost])
+ -> [SettingsFavoritePost]
+ {
+ favoritesToShuffle.sorted { leftFavorite, rightFavorite in
+ let leftIndex = shuffleOrderByIdentifier[leftFavorite.id] ?? Int.max
+ let rightIndex = shuffleOrderByIdentifier[rightFavorite.id] ?? Int.max
+
+ if leftIndex != rightIndex {
+ return leftIndex < rightIndex
}
+
+ return leftFavorite.id.uuidString < rightFavorite.id.uuidString
}
}
@@ -93,7 +128,7 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
private func refreshDisplayedFavorites() {
let normalizedSearchText = searchText.lowercased()
- let filteredFavorites = settings.favorites.filter { favorite in
+ let matchingFavorites = settings.favorites.filter { favorite in
let matchesSearch =
normalizedSearchText.isEmpty
|| favorite.tags
@@ -106,7 +141,14 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
return matchesSelectedCollection(for: favorite) && matchesSearch && matchesProvider
}
- let sortedFavorites = sortedFavorites(from: filteredFavorites)
+ let sortedFavorites: [SettingsFavoritePost]
+
+ if sort == .shuffle {
+ refreshShuffleOrder(for: matchingFavorites)
+ sortedFavorites = shuffledFavorites(from: matchingFavorites)
+ } else {
+ sortedFavorites = orderedFavorites(from: matchingFavorites)
+ }
displayedFavorites = sortedFavorites
displayedPosts = sortedFavorites.map { $0.toBooruPost() }
@@ -365,6 +407,10 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length
refreshDisplayedFavorites()
}
.onChange(of: sort) {
+ if sort == .shuffle {
+ shouldRefreshShuffleOrder = true
+ }
+
refreshDisplayedFavorites()
}
.onChange(of: settings.folders) {