summaryrefslogtreecommitdiff
path: root/Sora/Views/Post/PostGridView.swift
blob: 4c43eebf880ef6e7970f20c8bf32c8bc69c70201 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import SwiftUI
import WaterfallGrid

struct PostGridView: View {
    @EnvironmentObject var settings: Settings
    @ObservedObject var manager: MoebooruManager

    var body: some View {
        ScrollViewReader { _ in
            ScrollView {
                if manager.posts.isEmpty {
                    ProgressView()
                        .frame(
                            width: settings.softLimitAsCGFloat(),
                            height: settings.softLimitAsCGFloat()
                        )
                }

                WaterfallGrid(manager.posts, id: \.id) { post in
                    Group {
                        #if os(macOS)
                            Button {
                                manager.selectedPost = post
                            } label: {
                                PostView(post: post, manager: manager)
                            }
                            .buttonStyle(PlainButtonStyle())
                        #else
                            NavigationLink(value: post) {
                                PostView(post: post, manager: manager)
                            }
                        #endif
                    }
                }
                .gridStyle(columns: settings.columns, spacing: 0)
            }
            .searchable(text: $manager.searchText, prompt: "Tags")
            .searchSuggestions {
                if settings.searchSuggestions {
                    SearchSuggestionsView(
                        tags: manager.allTags,
                        searchText: $manager.searchText
                    )
                }
            }
            .onSubmit(of: .search, manager.performSearch)
            .task {
                if manager.posts.isEmpty {
                    await manager.fetchPosts(page: manager.currentPage)
                }
            }
            .navigationDestination(for: MoebooruPost.self) { post in
                PostDetailsView(post: post)
            }
            #if os(macOS)
            .toolbar {
                ToolbarItem {
                    Button(action: {
                        Task {
                            await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
                        }
                    }) {
                        Label("Refresh", systemImage: "arrow.clockwise")
                    }
                }
            }
            #endif
            .navigationTitle("Posts")
            .refreshable {
                await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
            }
            #if os(iOS)
            .navigationBarTitleDisplayMode(.inline)
            #endif
        }
    }
}