summaryrefslogtreecommitdiff
path: root/Sora/Views
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-20 06:04:18 -0800
committerFuwn <[email protected]>2025-02-20 06:04:18 -0800
commit82d7c141c000a05aa569880ccd44781e43be9654 (patch)
tree34886928eccc3ba8dac76e9e54e169eb080eba43 /Sora/Views
parentfeat: Development commit (diff)
downloadsora-testing-82d7c141c000a05aa569880ccd44781e43be9654.tar.xz
sora-testing-82d7c141c000a05aa569880ccd44781e43be9654.zip
feat: Development commit
Diffstat (limited to 'Sora/Views')
-rw-r--r--Sora/Views/BookmarksView.swift63
-rw-r--r--Sora/Views/ContentView.swift2
-rw-r--r--Sora/Views/MainView.swift16
-rw-r--r--Sora/Views/Post/PostGridView.swift16
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)