1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-15 06:40:32 +05:30
yattee/Shared/Navigation/AppSidebarRecents.swift

105 lines
3.5 KiB
Swift
Raw Normal View History

2021-09-19 16:36:54 +05:30
import Defaults
import SwiftUI
struct AppSidebarRecents: View {
@ObservedObject private var navigation = NavigationModel.shared
var recents = RecentsModel.shared
2021-09-19 16:36:54 +05:30
@Default(.recentlyOpened) private var recentItems
var body: some View {
Group {
if !recentItems.isEmpty {
Section(header: Text("Recents")) {
2021-09-19 18:12:47 +05:30
ForEach(recentItems.reversed()) { recent in
2021-09-19 16:36:54 +05:30
Group {
switch recent.type {
case .channel:
2021-09-29 04:31:49 +05:30
RecentNavigationLink(recent: recent) {
LazyView(ChannelVideosView(channel: recent.channel!))
2021-09-19 16:36:54 +05:30
}
2021-10-23 04:34:03 +05:30
case .playlist:
RecentNavigationLink(recent: recent, systemImage: "list.and.film") {
LazyView(ChannelPlaylistView(playlist: recent.playlist!))
2021-10-23 04:34:03 +05:30
}
2021-09-19 16:36:54 +05:30
case .query:
2021-09-29 04:31:49 +05:30
RecentNavigationLink(recent: recent, systemImage: "magnifyingglass") {
LazyView(SearchView(recent.query!))
2021-09-19 16:36:54 +05:30
}
}
}
.contextMenu {
Button("Clear All Recents") {
recents.clear()
}
Button("Clear Search History") {
recents.clearQueries()
}
.disabled(!recentItems.contains { $0.type == .query })
}
}
}
}
}
}
}
struct RecentNavigationLink<DestinationContent: View>: View {
var recents = RecentsModel.shared
@ObservedObject private var navigation = NavigationModel.shared
2021-09-19 16:36:54 +05:30
var recent: RecentItem
var systemImage: String?
let destination: DestinationContent
init(
recent: RecentItem,
systemImage: String? = nil,
@ViewBuilder destination: () -> DestinationContent
) {
self.recent = recent
self.systemImage = systemImage
self.destination = destination()
}
var body: some View {
2021-09-29 04:31:49 +05:30
NavigationLink(tag: TabSelection.recentlyOpened(recent.tag), selection: $navigation.tabSelection) {
2021-09-19 16:36:54 +05:30
destination
} label: {
HStack {
2022-12-14 22:40:50 +05:30
if recent.type == .channel,
let channel = recent.channel,
channel.thumbnailURLOrCached != nil
{
ChannelAvatarView(channel: channel, subscribedBadge: false)
2022-12-16 03:11:42 +05:30
.frame(width: Constants.sidebarChannelThumbnailSize, height: Constants.sidebarChannelThumbnailSize)
2022-12-14 22:40:50 +05:30
Text(channel.name)
} else {
Label(recent.title, systemImage: labelSystemImage)
.lineLimit(1)
}
2021-09-19 16:36:54 +05:30
Spacer()
Button(action: {
recents.close(recent)
}) {
Image(systemName: "xmark.circle.fill")
}
.foregroundColor(.secondary)
.opacity(0.5)
2021-09-19 16:36:54 +05:30
.buttonStyle(.plain)
}
}
.id(recent.tag)
}
var labelSystemImage: String {
systemImage != nil ? systemImage! : RecentsModel.symbolSystemImage(recent.title)
2021-09-19 16:36:54 +05:30
}
}