summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-07-24 18:15:50 +0200
committerFuwn <[email protected]>2025-07-24 18:15:50 +0200
commita112a485e891a98ca3c3f5d9e08bdd3ea2e6f664 (patch)
treeca3f94ceefc3c7ca78c9ed6dd48bcd4c964a0395
parentfeat: Development commit (diff)
downloadsora-testing-a112a485e891a98ca3c3f5d9e08bdd3ea2e6f664.tar.xz
sora-testing-a112a485e891a98ca3c3f5d9e08bdd3ea2e6f664.zip
feat: Development commit
-rw-r--r--Sora/Data/ColumnsDataCache.swift5
-rw-r--r--Sora/Views/Post/Grid/PostGridView.swift45
2 files changed, 43 insertions, 7 deletions
diff --git a/Sora/Data/ColumnsDataCache.swift b/Sora/Data/ColumnsDataCache.swift
new file mode 100644
index 0000000..4858e80
--- /dev/null
+++ b/Sora/Data/ColumnsDataCache.swift
@@ -0,0 +1,5 @@
+struct ColumnsDataCache {
+ let data: [[BooruPost]]
+ let columnCount: Int
+ let posts: [BooruPost]
+}
diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift
index 99c7966..a63bf97 100644
--- a/Sora/Views/Post/Grid/PostGridView.swift
+++ b/Sora/Views/Post/Grid/PostGridView.swift
@@ -17,6 +17,8 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length
@State private var suggestions: [BooruTag] = []
private static let topID = "PostGridScrollTop"
@State private var scrollID: String?
+ @State private var cachedColumnsData: ColumnsDataCache?
+ @State private var scrollDebounceTask: Task<Void, Never>?
@Environment(\.isSearching)
private var isSearching
@@ -72,7 +74,7 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length
@ViewBuilder
private func gridView(columnCount: Int) -> some View {
if settings.alternativeThumbnailGrid {
- let columnsData = computeColumnsData(columnCount: columnCount)
+ let columnsData = getColumnsData(columnCount: columnCount)
HStack(alignment: .top) {
ForEach(0..<columnCount, id: \.self) { columnIndex in
@@ -109,12 +111,27 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length
}
}
- private func computeColumnsData(columnCount: Int) -> [[BooruPost]] {
- (0..<columnCount).map { columnIndex in
+ private func getColumnsData(columnCount: Int) -> [[BooruPost]] {
+ if let cached = cachedColumnsData,
+ cached.columnCount == columnCount,
+ cached.posts == activePosts
+ {
+ return cached.data
+ }
+
+ let computedData = (0..<columnCount).map { columnIndex in
activePosts.enumerated().compactMap { index, post in
index % columnCount == columnIndex ? post : nil
}
}
+
+ cachedColumnsData = ColumnsDataCache(
+ data: computedData,
+ columnCount: columnCount,
+ posts: activePosts
+ )
+
+ return computedData
}
var body: some View {
@@ -213,9 +230,17 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length
return
}
- let queryID = manager.searchHistory[manager.historyIndex].id
+ scrollDebounceTask?.cancel()
+
+ scrollDebounceTask = Task {
+ try? await Task.sleep(nanoseconds: 200_000_000)
- updateViewState(for: queryID, scrollPostID: newValue)
+ guard !Task.isCancelled else { return }
+
+ let queryID = manager.searchHistory[manager.historyIndex].id
+
+ updateViewState(for: queryID, scrollPostID: newValue)
+ }
}
.onChange(of: manager.historyIndex) { _, newIndex in
guard newIndex >= 0 && newIndex < manager.searchHistory.count else { return }
@@ -359,7 +384,11 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length
)
}
.onAppear {
- scrollID = viewStates[queryID]?.scrollPostID ?? Self.topID
+ let targetScrollID = viewStates[queryID]?.scrollPostID ?? Self.topID
+
+ if scrollID == nil || scrollID != targetScrollID {
+ scrollID = targetScrollID
+ }
}
.onDisappear {
guard manager.historyIndex >= 0 && manager.historyIndex < manager.searchHistory.count else {
@@ -368,7 +397,9 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length
let queryID = manager.searchHistory[manager.historyIndex].id
- updateViewState(for: queryID, scrollPostID: scrollID)
+ if viewStates[queryID]?.scrollPostID != scrollID {
+ updateViewState(for: queryID, scrollPostID: scrollID)
+ }
}
#if os(iOS)
.gesture(