mirror of
https://github.com/yattee/yattee.git
synced 2025-08-06 10:44:06 +00:00
Search improvements for iOS
This commit is contained in:
@@ -7,10 +7,6 @@ extension Defaults.Keys {
|
||||
|
||||
static let instances = Key<[Instance]>("instances", default: [])
|
||||
|
||||
static let searchSortOrder = Key<SearchQuery.SortOrder>("searchSortOrder", default: .relevance)
|
||||
static let searchDate = Key<SearchQuery.Date?>("searchDate")
|
||||
static let searchDuration = Key<SearchQuery.Duration?>("searchDuration")
|
||||
|
||||
static let selectedPlaylistID = Key<String?>("selectedPlaylistID")
|
||||
static let showingAddToPlaylist = Key<Bool>("showingAddToPlaylist", default: false)
|
||||
static let videoIDToAddToPlaylist = Key<String?>("videoIDToAddToPlaylist")
|
||||
|
@@ -16,8 +16,7 @@ struct AppSidebarNavigation: View {
|
||||
@EnvironmentObject<InstancesModel> private var instances
|
||||
@EnvironmentObject<NavigationModel> private var navigation
|
||||
@EnvironmentObject<PlaylistsModel> private var playlists
|
||||
@EnvironmentObject<Recents> private var recents
|
||||
@EnvironmentObject<SearchModel> private var search
|
||||
@EnvironmentObject<RecentsModel> private var recents
|
||||
@EnvironmentObject<SubscriptionsModel> private var subscriptions
|
||||
|
||||
@State private var didApplyPrimaryViewWorkAround = false
|
||||
@@ -56,23 +55,6 @@ struct AppSidebarNavigation: View {
|
||||
Text("Select section")
|
||||
}
|
||||
.environment(\.navigationStyle, .sidebar)
|
||||
.searchable(text: $search.queryText, placement: .sidebar) {
|
||||
ForEach(search.querySuggestions.collection, id: \.self) { suggestion in
|
||||
Text(suggestion)
|
||||
.searchCompletion(suggestion)
|
||||
}
|
||||
}
|
||||
.onChange(of: search.queryText) { query in
|
||||
search.loadSuggestions(query)
|
||||
}
|
||||
.onSubmit(of: .search) {
|
||||
search.changeQuery { query in
|
||||
query.query = search.queryText
|
||||
}
|
||||
recents.open(RecentItem(from: search.queryText))
|
||||
|
||||
navigation.tabSelection = .search
|
||||
}
|
||||
}
|
||||
|
||||
var sidebar: some View {
|
||||
@@ -87,12 +69,6 @@ struct AppSidebarNavigation: View {
|
||||
scrollScrollViewToItem(scrollView: scrollView, for: navigation.tabSelection)
|
||||
}
|
||||
}
|
||||
.background {
|
||||
NavigationLink(destination: SearchView(), tag: TabSelection.search, selection: selection) {
|
||||
Color.clear
|
||||
}
|
||||
.hidden()
|
||||
}
|
||||
.listStyle(.sidebar)
|
||||
}
|
||||
.toolbar {
|
||||
@@ -144,6 +120,12 @@ struct AppSidebarNavigation: View {
|
||||
Label("Trending", systemImage: "chart.line.uptrend.xyaxis")
|
||||
.accessibility(label: Text("Trending"))
|
||||
}
|
||||
|
||||
NavigationLink(destination: LazyView(SearchView()), tag: TabSelection.search, selection: selection) {
|
||||
Label("Search", systemImage: "magnifyingglass")
|
||||
.accessibility(label: Text("Search"))
|
||||
}
|
||||
.keyboardShortcut("f")
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -5,7 +5,7 @@ struct AppSidebarRecents: View {
|
||||
@Binding var selection: TabSelection?
|
||||
|
||||
@EnvironmentObject<NavigationModel> private var navigation
|
||||
@EnvironmentObject<Recents> private var recents
|
||||
@EnvironmentObject<RecentsModel> private var recents
|
||||
|
||||
@Default(.recentlyOpened) private var recentItems
|
||||
|
||||
@@ -44,7 +44,7 @@ struct AppSidebarRecents: View {
|
||||
}
|
||||
|
||||
struct RecentNavigationLink<DestinationContent: View>: View {
|
||||
@EnvironmentObject<Recents> private var recents
|
||||
@EnvironmentObject<RecentsModel> private var recents
|
||||
|
||||
var recent: RecentItem
|
||||
@Binding var selection: TabSelection?
|
||||
|
@@ -4,7 +4,7 @@ import SwiftUI
|
||||
struct AppTabNavigation: View {
|
||||
@EnvironmentObject<NavigationModel> private var navigation
|
||||
@EnvironmentObject<SearchModel> private var search
|
||||
@EnvironmentObject<Recents> private var recents
|
||||
@EnvironmentObject<RecentsModel> private var recents
|
||||
|
||||
var body: some View {
|
||||
TabView(selection: $navigation.tabSelection) {
|
||||
@@ -78,9 +78,7 @@ struct AppTabNavigation: View {
|
||||
query.query = search.queryText
|
||||
}
|
||||
|
||||
recents.open(RecentItem(from: search.queryText))
|
||||
|
||||
navigation.tabSelection = .search
|
||||
recents.addQuery(search.queryText)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ import SwiftUI
|
||||
struct ContentView: View {
|
||||
@StateObject private var navigation = NavigationModel()
|
||||
@StateObject private var playback = PlaybackModel()
|
||||
@StateObject private var recents = Recents()
|
||||
@StateObject private var recents = RecentsModel()
|
||||
|
||||
@EnvironmentObject<InvidiousAPI> private var api
|
||||
@EnvironmentObject<InstancesModel> private var instances
|
||||
@@ -34,6 +34,7 @@ struct ContentView: View {
|
||||
.sheet(isPresented: $navigation.showingVideo) {
|
||||
if let video = navigation.video {
|
||||
VideoPlayerView(video)
|
||||
.environmentObject(playback)
|
||||
|
||||
#if !os(iOS)
|
||||
.frame(minWidth: 550, minHeight: 720)
|
||||
|
@@ -31,15 +31,14 @@ struct PearvidiousApp: App {
|
||||
.onAppear(perform: configureAPI)
|
||||
.environmentObject(api)
|
||||
.environmentObject(instances)
|
||||
.environmentObject(playlists)
|
||||
.environmentObject(subscriptions)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
fileprivate func configureAPI() {
|
||||
subscriptions.api = api
|
||||
playlists.api = api
|
||||
search.api = api
|
||||
subscriptions.api = api
|
||||
|
||||
guard api.account == nil, instances.defaultAccount != nil else {
|
||||
return
|
||||
|
@@ -3,19 +3,19 @@ import Siesta
|
||||
import SwiftUI
|
||||
|
||||
struct SearchView: View {
|
||||
@Default(.searchSortOrder) private var searchSortOrder
|
||||
@Default(.searchDate) private var searchDate
|
||||
@Default(.searchDuration) private var searchDuration
|
||||
private var query: SearchQuery?
|
||||
|
||||
@EnvironmentObject<Recents> private var recents
|
||||
@EnvironmentObject<SearchModel> private var state
|
||||
|
||||
@Environment(\.navigationStyle) private var navigationStyle
|
||||
@State private var searchSortOrder: SearchQuery.SortOrder = .relevance
|
||||
@State private var searchDate: SearchQuery.Date?
|
||||
@State private var searchDuration: SearchQuery.Duration?
|
||||
|
||||
@State private var presentingClearConfirmation = false
|
||||
@State private var recentsChanged = false
|
||||
|
||||
private var query: SearchQuery?
|
||||
@Environment(\.navigationStyle) private var navigationStyle
|
||||
|
||||
@EnvironmentObject<RecentsModel> private var recents
|
||||
@EnvironmentObject<SearchModel> private var state
|
||||
|
||||
init(_ query: SearchQuery? = nil) {
|
||||
self.query = query
|
||||
@@ -37,7 +37,9 @@ struct SearchView: View {
|
||||
|
||||
if searchFiltersActive {
|
||||
Button("Reset search filters") {
|
||||
Defaults.reset(.searchDate, .searchDuration)
|
||||
self.searchSortOrder = .relevance
|
||||
self.searchDate = nil
|
||||
self.searchDuration = nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,16 +47,74 @@ struct SearchView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.toolbar {
|
||||
#if os(iOS)
|
||||
ToolbarItemGroup(placement: .bottomBar) {
|
||||
Section {
|
||||
if !state.queryText.isEmpty {
|
||||
Text("Sort:")
|
||||
.foregroundColor(.secondary)
|
||||
|
||||
Menu(searchSortOrder.name) {
|
||||
ForEach(SearchQuery.SortOrder.allCases) { sortOrder in
|
||||
Button(sortOrder.name) {
|
||||
searchSortOrder = sortOrder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
Text("Filter:")
|
||||
.foregroundColor(.secondary)
|
||||
|
||||
Menu(searchDuration?.name ?? "Duration") {
|
||||
Button("All") {
|
||||
searchDuration = nil
|
||||
}
|
||||
ForEach(SearchQuery.Duration.allCases) { duration in
|
||||
Button(duration.name) {
|
||||
searchDuration = duration
|
||||
}
|
||||
}
|
||||
}
|
||||
.foregroundColor(searchDuration.isNil ? .secondary : .accentColor)
|
||||
|
||||
Menu(searchDate?.name ?? "Date") {
|
||||
Button("All") {
|
||||
searchDate = nil
|
||||
}
|
||||
ForEach(SearchQuery.Date.allCases) { date in
|
||||
Button(date.name) {
|
||||
searchDate = date
|
||||
}
|
||||
}
|
||||
}
|
||||
.foregroundColor(searchDate.isNil ? .secondary : .accentColor)
|
||||
}
|
||||
}
|
||||
.transaction { t in t.animation = .none }
|
||||
}
|
||||
#endif
|
||||
}
|
||||
.onAppear {
|
||||
if query != nil {
|
||||
if navigationStyle == .tab {
|
||||
state.queryText = query!.query
|
||||
}
|
||||
state.queryText = query!.query
|
||||
state.resetQuery(query!)
|
||||
}
|
||||
}
|
||||
.onChange(of: state.query.query) { queryText in
|
||||
state.changeQuery { query in query.query = queryText }
|
||||
.searchable(text: $state.queryText, placement: searchFieldPlacement) {
|
||||
ForEach(state.querySuggestions.collection, id: \.self) { suggestion in
|
||||
Text(suggestion)
|
||||
.searchCompletion(suggestion)
|
||||
}
|
||||
}
|
||||
.onChange(of: state.queryText) { query in
|
||||
state.loadSuggestions(query)
|
||||
}
|
||||
.onSubmit(of: .search) {
|
||||
state.changeQuery { query in query.query = state.queryText }
|
||||
recents.addQuery(state.queryText)
|
||||
}
|
||||
.onChange(of: searchSortOrder) { order in
|
||||
state.changeQuery { query in query.sortBy = order }
|
||||
@@ -66,7 +126,15 @@ struct SearchView: View {
|
||||
state.changeQuery { query in query.duration = duration }
|
||||
}
|
||||
#if !os(tvOS)
|
||||
.navigationTitle(navigationTitle)
|
||||
.navigationTitle("Search")
|
||||
#endif
|
||||
}
|
||||
|
||||
var searchFieldPlacement: SearchFieldPlacement {
|
||||
#if os(iOS)
|
||||
.navigationBarDrawer(displayMode: .always)
|
||||
#else
|
||||
.automatic
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -114,14 +182,6 @@ struct SearchView: View {
|
||||
}
|
||||
}
|
||||
|
||||
var navigationTitle: String {
|
||||
if state.query.query.isEmpty || (navigationStyle == .tab && state.queryText.isEmpty) {
|
||||
return "Search"
|
||||
}
|
||||
|
||||
return "Search: \"\(state.query.query)\""
|
||||
}
|
||||
|
||||
var searchFiltersActive: Bool {
|
||||
searchDate != nil || searchDuration != nil
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ import SwiftUI
|
||||
struct VideoContextMenuView: View {
|
||||
@EnvironmentObject<InvidiousAPI> private var api
|
||||
@EnvironmentObject<NavigationModel> private var navigation
|
||||
@EnvironmentObject<Recents> private var recents
|
||||
@EnvironmentObject<RecentsModel> private var recents
|
||||
@EnvironmentObject<SubscriptionsModel> private var subscriptions
|
||||
|
||||
let video: Video
|
||||
|
Reference in New Issue
Block a user