diff options
| author | Fuwn <[email protected]> | 2025-06-14 09:11:49 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-06-14 09:11:49 -0700 |
| commit | d898ce6447f8dbddc755b97b520207859a07b181 (patch) | |
| tree | 01fdb9bb9bbe0350287b5577a3ad698dabaff924 | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-d898ce6447f8dbddc755b97b520207859a07b181.tar.xz sora-testing-d898ce6447f8dbddc755b97b520207859a07b181.zip | |
feat: Development commit
| -rw-r--r-- | Localizable.xcstrings | 3 | ||||
| -rw-r--r-- | Sora/Data/GenericItem.swift | 4 | ||||
| -rw-r--r-- | Sora/Data/Settings/SettingsBookmark.swift | 3 | ||||
| -rw-r--r-- | Sora/Data/Settings/SettingsBookmarkSort.swift | 5 | ||||
| -rw-r--r-- | Sora/Data/Settings/SettingsManager.swift | 20 | ||||
| -rw-r--r-- | Sora/Views/Generic/GenericListView.swift | 42 |
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( |