summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-06-14 09:11:49 -0700
committerFuwn <[email protected]>2025-06-14 09:11:49 -0700
commitd898ce6447f8dbddc755b97b520207859a07b181 (patch)
tree01fdb9bb9bbe0350287b5577a3ad698dabaff924
parentfeat: Development commit (diff)
downloadsora-testing-d898ce6447f8dbddc755b97b520207859a07b181.tar.xz
sora-testing-d898ce6447f8dbddc755b97b520207859a07b181.zip
feat: Development commit
-rw-r--r--Localizable.xcstrings3
-rw-r--r--Sora/Data/GenericItem.swift4
-rw-r--r--Sora/Data/Settings/SettingsBookmark.swift3
-rw-r--r--Sora/Data/Settings/SettingsBookmarkSort.swift5
-rw-r--r--Sora/Data/Settings/SettingsManager.swift20
-rw-r--r--Sora/Views/Generic/GenericListView.swift42
6 files changed, 73 insertions, 4 deletions
diff --git a/Localizable.xcstrings b/Localizable.xcstrings
index ceab289..08a71a1 100644
--- a/Localizable.xcstrings
+++ b/Localizable.xcstrings
@@ -343,6 +343,9 @@
"Share Image" : {
},
+ "Sort" : {
+
+ },
"Suggestion Mode" : {
},
diff --git a/Sora/Data/GenericItem.swift b/Sora/Data/GenericItem.swift
index 6b06d02..7881a00 100644
--- a/Sora/Data/GenericItem.swift
+++ b/Sora/Data/GenericItem.swift
@@ -6,11 +6,15 @@ protocol GenericItem {
var provider: BooruProvider { get }
var date: Date { get }
var folder: UUID? { get }
+ var lastVisit: Date { get }
+ var visitedCount: Int { get }
}
extension BooruSearchQuery: GenericItem {
var date: Date { searchedAt }
var folder: UUID? { nil }
+ var visitedCount: Int { 0 }
+ var lastVisit: Date { searchedAt }
}
extension SettingsBookmark: GenericItem {
diff --git a/Sora/Data/Settings/SettingsBookmark.swift b/Sora/Data/Settings/SettingsBookmark.swift
index 34b87f4..41c63af 100644
--- a/Sora/Data/Settings/SettingsBookmark.swift
+++ b/Sora/Data/Settings/SettingsBookmark.swift
@@ -6,9 +6,12 @@ struct SettingsBookmark: Codable, Identifiable, Hashable {
let createdAt: Date
let provider: BooruProvider
var folder: UUID?
+ var lastVisit: Date
+ var visitedCount = 0
init(provider: BooruProvider, tags: [String], folder: UUID? = nil, id: UUID = UUID()) {
createdAt = Date()
+ lastVisit = Date()
self.id = id
self.tags = tags
self.provider = provider
diff --git a/Sora/Data/Settings/SettingsBookmarkSort.swift b/Sora/Data/Settings/SettingsBookmarkSort.swift
new file mode 100644
index 0000000..290aa8d
--- /dev/null
+++ b/Sora/Data/Settings/SettingsBookmarkSort.swift
@@ -0,0 +1,5 @@
+enum SettingsBookmarkSort: String, CaseIterable {
+ case dateBookmarked = "Date Bookmarked"
+ case lastVisited = "Last Visited"
+ case visitedCount = "Visited Count"
+}
diff --git a/Sora/Data/Settings/SettingsManager.swift b/Sora/Data/Settings/SettingsManager.swift
index 1d6e2b8..0b5af21 100644
--- a/Sora/Data/Settings/SettingsManager.swift
+++ b/Sora/Data/Settings/SettingsManager.swift
@@ -393,6 +393,26 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l
self.syncToCloud()
}
+ func updateBookmarkLastVisit(withID id: UUID, date: Date = Date()) {
+ guard let index = bookmarks.firstIndex(of: bookmarks.first(where: { $0.id == id })!) else {
+ return
+ }
+
+ bookmarks[index].lastVisit = date
+
+ self.syncToCloud()
+ }
+
+ func incrementBookmarkVisitCount(withID id: UUID) {
+ guard let index = bookmarks.firstIndex(of: bookmarks.first(where: { $0.id == id })!) else {
+ return
+ }
+
+ bookmarks[index].visitedCount += 1
+
+ self.syncToCloud()
+ }
+
func folderName(forID id: UUID) -> String? {
folders.first { $0.id == id }?.name
}
diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift
index b324e5d..ec02ce3 100644
--- a/Sora/Views/Generic/GenericListView.swift
+++ b/Sora/Views/Generic/GenericListView.swift
@@ -12,6 +12,7 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
@State private var itemPendingCollectionAssignment: UUID?
@State private var isCollectionErrorAlertPresented = false
@State private var selectedFolder: UUID?
+ @State private var sort: SettingsBookmarkSort = .dateBookmarked
let allowBookmarking: Bool
let title: String
let emptyMessage: String
@@ -23,6 +24,7 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
let removeAction: (IndexSet) -> Void
let removeActionUUID: (UUID) -> Void
let removeAllAction: () -> Void
+
var filteredItems: [T] {
items.filter { item in
let matchesFolder: Bool = {
@@ -46,6 +48,26 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
return matchesFolder && matchesSearch
}
}
+
+ var sortedFilteredItems: [T] {
+ if allowBookmarking {
+ return filteredItems.sorted { $0.date > $1.date }
+ }
+
+ return filteredItems.sorted { (lhs: T, rhs: T) in
+ switch sort {
+ case .dateBookmarked:
+ return lhs.date > rhs.date
+
+ case .lastVisited:
+ return lhs.lastVisit > rhs.lastVisit
+
+ case .visitedCount:
+ return lhs.visitedCount > rhs.visitedCount
+ }
+ }
+ }
+
private let uncategorisedUUID = UUID(uuidString: "00000000-0000-0000-0000-000000000000")!
var body: some View {
@@ -76,6 +98,18 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
#else
.padding(.horizontal)
#endif
+
+ Picker("Sort", selection: $sort) {
+ ForEach(SettingsBookmarkSort.allCases, id: \.rawValue) { sortMode in
+ Text(sortMode.rawValue).tag(sortMode)
+ }
+ }
+ .pickerStyle(.menu)
+ #if os(macOS)
+ .padding()
+ #else
+ .padding(.horizontal)
+ #endif
}
List {
@@ -83,10 +117,7 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
Text("No matching items found")
}
- ForEach(
- filteredItems.sorted { $0.date > $1.date },
- id: \.id
- ) { item in
+ ForEach(sortedFilteredItems, id: \.id) { item in
itemButtonContent(item: item)
}
.onDelete(perform: removeAction)
@@ -175,6 +206,9 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
manager.performSearch(settings: settings)
}
+ settings.incrementBookmarkVisitCount(withID: item.id)
+ settings.updateBookmarkLastVisit(withID: item.id)
+
isPresented.toggle()
}) {
GenericItemView(