diff options
| author | Fuwn <[email protected]> | 2025-02-20 06:04:18 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-02-20 06:04:18 -0800 |
| commit | 82d7c141c000a05aa569880ccd44781e43be9654 (patch) | |
| tree | 34886928eccc3ba8dac76e9e54e169eb080eba43 /Sora/Views | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-82d7c141c000a05aa569880ccd44781e43be9654.tar.xz sora-testing-82d7c141c000a05aa569880ccd44781e43be9654.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Views')
| -rw-r--r-- | Sora/Views/BookmarksView.swift | 63 | ||||
| -rw-r--r-- | Sora/Views/ContentView.swift | 2 | ||||
| -rw-r--r-- | Sora/Views/MainView.swift | 16 | ||||
| -rw-r--r-- | Sora/Views/Post/PostGridView.swift | 16 |
4 files changed, 95 insertions, 2 deletions
diff --git a/Sora/Views/BookmarksView.swift b/Sora/Views/BookmarksView.swift new file mode 100644 index 0000000..f98f949 --- /dev/null +++ b/Sora/Views/BookmarksView.swift @@ -0,0 +1,63 @@ +import SwiftUI + +struct BookmarksView: View { + @EnvironmentObject var settings: Settings + @EnvironmentObject var manager: MoebooruManager + @Binding var selectedTab: Int + @State private var bookmarksSearchText: String = "" + + var filteredBookmarks: [Bookmark] { + guard !bookmarksSearchText.isEmpty else { + return settings.bookmarks + } + + return settings.bookmarks + .filter { $0.tags.joined(separator: " ").lowercased().contains(bookmarksSearchText.lowercased()) } + } + + var body: some View { + NavigationStack { + if settings.bookmarks.isEmpty { + VStack { + Spacer() + + Text("There are no bookmarks yet. Add a bookmark by tapping the bookmark button in the bottom left corner of a search page.") + .padding() + + Spacer() + } + } else { + List { + if filteredBookmarks.isEmpty { + Text("No bookmarks found.") + } + + ForEach(filteredBookmarks, id: \.self) { bookmark in + Button(action: { + manager.searchText = bookmark.tags.joined(separator: " ") + manager.performSearch() + selectedTab = 0 + }) { + HStack { + Text(bookmark.tags.joined(separator: ", ")) + + Text(bookmark.createdAt.formatted()) + .foregroundColor(.secondary) + .font(.caption) + } + } + } + .onDelete(perform: settings.removeBookmark) + } + } + } + .navigationTitle("Bookmarks") + .searchable(text: $bookmarksSearchText) + } +} + +#Preview { + BookmarksView(selectedTab: .constant(1)) + .environmentObject(Settings()) + .environmentObject(MoebooruManager()) +} diff --git a/Sora/Views/ContentView.swift b/Sora/Views/ContentView.swift index c8a361e..22c17f6 100644 --- a/Sora/Views/ContentView.swift +++ b/Sora/Views/ContentView.swift @@ -1,7 +1,7 @@ import SwiftUI struct ContentView: View { - @StateObject private var manager = MoebooruManager() + @EnvironmentObject private var manager: MoebooruManager var body: some View { #if os(macOS) diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift index c657540..7ad7c77 100644 --- a/Sora/Views/MainView.swift +++ b/Sora/Views/MainView.swift @@ -2,17 +2,30 @@ import SwiftUI struct MainView: View { @EnvironmentObject var settings: Settings + @State private var selectedTab: Int = 0 + @StateObject private var manager = MoebooruManager() var body: some View { #if os(macOS) ContentView() .environmentObject(settings) #else - TabView { + TabView(selection: $selectedTab) { ContentView() .tabItem { Label("Posts", systemImage: "rectangle.stack") } + .tag(0) + .environmentObject(manager) + + NavigationStack { + BookmarksView(selectedTab: $selectedTab) + .environmentObject(manager) + } + .tabItem { + Label("Bookmarks", systemImage: "bookmark") + } + .tag(1) NavigationStack { SettingsView() @@ -20,6 +33,7 @@ struct MainView: View { .tabItem { Label("Settings", systemImage: "gear") } + .tag(2) } .environmentObject(settings) #endif diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/PostGridView.swift index 2eda971..487bde8 100644 --- a/Sora/Views/Post/PostGridView.swift +++ b/Sora/Views/Post/PostGridView.swift @@ -82,6 +82,22 @@ struct PostGridView: View { } } #endif + .toolbar { + if !manager.tags.isEmpty { + ToolbarItem(placement: .bottomBar) { + let contained = settings.bookmarks.contains(where: { $0.tags == manager.tags }) + + Button(action: { + contained ? settings.removeBookmark(withTags: manager.tags) : settings.addBookmark(tags: manager.tags) + }) { + Label("Bookmark", systemImage: + contained ? + "bookmark.fill" : + "bookmark") + } + } + } + } .navigationTitle("Posts") .refreshable { await manager.fetchPosts(page: 1, tags: manager.tags, replace: true) |