summaryrefslogtreecommitdiff
path: root/Sora/Views/Generic/GenericListView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-07-08 04:19:46 -0700
committerFuwn <[email protected]>2025-07-08 04:19:46 -0700
commitb647d1a7a13e38a529efea3d5d849e5b1a769904 (patch)
treed921595d450414348dd512802e4492f18e9b5738 /Sora/Views/Generic/GenericListView.swift
parentfeat: Development commit (diff)
downloadsora-testing-b647d1a7a13e38a529efea3d5d849e5b1a769904.tar.xz
sora-testing-b647d1a7a13e38a529efea3d5d849e5b1a769904.zip
feat: Development commit
Diffstat (limited to 'Sora/Views/Generic/GenericListView.swift')
-rw-r--r--Sora/Views/Generic/GenericListView.swift112
1 files changed, 63 insertions, 49 deletions
diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift
index 0c8da79..0945b82 100644
--- a/Sora/Views/Generic/GenericListView.swift
+++ b/Sora/Views/Generic/GenericListView.swift
@@ -41,15 +41,6 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
case .uncategorized:
return item.folder == nil
- case .topLevel(let topLevelName):
- if let folderId = item.folder,
- let folder = settings.folders.first(where: { $0.id == folderId }),
- let itemTopLevelName = folder.topLevelName
- {
- return itemTopLevelName == topLevelName
- }
- return false
-
case .folder(let folderId):
return item.folder == folderId
}
@@ -138,28 +129,28 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
)
}
- ForEach(
- settings.folders
- .filter { $0.topLevelName != nil }
- .map { $0.topLevelName! }
- .removingDuplicates(), id: \.self
- ) { topLevelName in
- Text(CollectionPickerOption.topLevel(topLevelName).name(settings)).tag(
- CollectionPickerOption.topLevel(topLevelName)
- )
+ ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in
+ Text(folder.name).tag(CollectionPickerOption.folder(folder.id))
}
- ForEach(
- settings.folders.filter { folder in
- folder.topLevelName == nil
- || (selectedCollectionOption == .topLevel(folder.topLevelName!)
- && folder.topLevelName != nil)
- }, id: \.id
- ) { folder in
- if isCollectionPopulated(folder.id) {
- Text(CollectionPickerOption.folder(folder.id).name(settings)).tag(
- CollectionPickerOption.folder(folder.id)
- )
+ let topLevelFolders = settings.folders
+ .reduce(into: [String: [SettingsFolder]]()) { result, folder in
+ guard let topLevelName = folder.topLevelName else { return }
+
+ result[topLevelName, default: []].append(folder)
+ }
+
+ ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in
+ Menu {
+ ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in
+ Button(action: {
+ selectedCollectionOption = .folder(folder.id)
+ }) {
+ Text(folder.shortName)
+ }
+ }
+ } label: {
+ Text(topLevelName)
}
}
}
@@ -242,27 +233,29 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
)
}
- ForEach(
- settings.folders
- .filter { $0.topLevelName != nil }
- .map { $0.topLevelName! }
- .removingDuplicates(), id: \.self
- ) { topLevelName in
- Text(CollectionPickerOption.topLevel(topLevelName).name(settings)).tag(
- CollectionPickerOption.topLevel(topLevelName)
- )
+ ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in
+ Text(folder.name).tag(CollectionPickerOption.folder(folder.id))
}
- ForEach(
- settings.folders.filter { folder in
- folder.topLevelName == nil
- || (selectedCollectionOption == .topLevel(folder.topLevelName!)
- && folder.topLevelName != nil)
- }, id: \.id
- ) { folder in
- Text(CollectionPickerOption.folder(folder.id).name(settings))
- .tag(CollectionPickerOption.folder(folder.id))
- .selectionDisabled(!isCollectionPopulated(folder.id))
+ let topLevelFolders = settings.folders
+ .reduce(into: [String: [SettingsFolder]]()) { result, folder in
+ guard let topLevelName = folder.topLevelName else { return }
+
+ result[topLevelName, default: []].append(folder)
+ }
+
+ ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in
+ Menu {
+ ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in
+ Button(action: {
+ selectedCollectionOption = .folder(folder.id)
+ }) {
+ Text(folder.shortName)
+ }
+ }
+ } label: {
+ Text(topLevelName)
+ }
}
}
} label: {
@@ -391,7 +384,7 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
}
Menu {
- ForEach(settings.folders, id: \.id) { folder in
+ ForEach(settings.folders.filter { $0.topLevelName == nil }, id: \.id) { folder in
if item.folder != folder.id {
Button(action: {
settings.updateBookmarkFolder(withID: item.id, folder: folder.id)
@@ -401,6 +394,27 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
}
}
+ let topLevelFolders = settings.folders
+ .reduce(into: [String: [SettingsFolder]]()) { result, folder in
+ guard let topLevelName = folder.topLevelName else { return }
+
+ result[topLevelName, default: []].append(folder)
+ }
+
+ ForEach(topLevelFolders.keys.sorted(), id: \.self) { topLevelName in
+ Menu {
+ ForEach(topLevelFolders[topLevelName] ?? [], id: \.id) { folder in
+ Button(action: {
+ settings.updateBookmarkFolder(withID: item.id, folder: folder.id)
+ }) {
+ Text(folder.shortName)
+ }
+ }
+ } label: {
+ Text(topLevelName)
+ }
+ }
+
Button(action: {
itemPendingCollectionAssignment = item.id
isNewCollectionAlertPresented = true