mirror of
https://github.com/yattee/yattee.git
synced 2025-08-06 10:44:06 +00:00
Unify forms, add to/remove from playlist on all platforms, UI improvements
This commit is contained in:
@@ -13,6 +13,9 @@ final class NavigationModel: ObservableObject {
|
||||
|
||||
@Published var returnToDetails = false
|
||||
|
||||
@Published var presentingAddToPlaylist = false
|
||||
@Published var videoToAddToPlaylist: Video!
|
||||
|
||||
@Published var presentingPlaylistForm = false
|
||||
@Published var editedPlaylist: Playlist!
|
||||
|
||||
@@ -42,6 +45,11 @@ final class NavigationModel: ObservableObject {
|
||||
)
|
||||
}
|
||||
|
||||
func presentAddToPlaylist(_ video: Video) {
|
||||
videoToAddToPlaylist = video
|
||||
presentingAddToPlaylist = true
|
||||
}
|
||||
|
||||
func presentEditPlaylistForm(_ playlist: Playlist?) {
|
||||
editedPlaylist = playlist
|
||||
presentingPlaylistForm = editedPlaylist != nil
|
||||
|
@@ -4,11 +4,12 @@ import SwiftUI
|
||||
|
||||
final class PlaylistsModel: ObservableObject {
|
||||
@Published var playlists = [Playlist]()
|
||||
@Published var api = InvidiousAPI()
|
||||
|
||||
@Published var api: InvidiousAPI!
|
||||
@Published var selectedPlaylistID: Playlist.ID = ""
|
||||
|
||||
var resource: Resource {
|
||||
api.playlists
|
||||
init(_ playlists: [Playlist] = [Playlist]()) {
|
||||
self.playlists = playlists
|
||||
}
|
||||
|
||||
var all: [Playlist] {
|
||||
@@ -16,20 +17,67 @@ final class PlaylistsModel: ObservableObject {
|
||||
}
|
||||
|
||||
func find(id: Playlist.ID) -> Playlist? {
|
||||
all.first { $0.id == id }
|
||||
playlists.first { $0.id == id }
|
||||
}
|
||||
|
||||
func load(force: Bool = false) {
|
||||
var isEmpty: Bool {
|
||||
playlists.isEmpty
|
||||
}
|
||||
|
||||
func load(force: Bool = false, onSuccess: @escaping () -> Void = {}) {
|
||||
let request = force ? resource.load() : resource.loadIfNeeded()
|
||||
|
||||
request?
|
||||
.onSuccess { resource in
|
||||
if let playlists: [Playlist] = resource.typedContent() {
|
||||
self.playlists = playlists
|
||||
if self.selectedPlaylistID.isEmpty {
|
||||
self.selectPlaylist(self.all.first?.id)
|
||||
}
|
||||
onSuccess()
|
||||
}
|
||||
}
|
||||
.onFailure { _ in
|
||||
self.playlists = []
|
||||
}
|
||||
}
|
||||
|
||||
func addVideoToCurrentPlaylist(videoID: Video.ID, onSuccess: @escaping () -> Void = {}) {
|
||||
let resource = api.playlistVideos(currentPlaylist!.id)
|
||||
let body = ["videoId": videoID]
|
||||
|
||||
resource.request(.post, json: body).onSuccess { _ in
|
||||
self.load(force: true)
|
||||
onSuccess()
|
||||
}
|
||||
}
|
||||
|
||||
func removeVideoFromPlaylist(videoIndexID: String, playlistID: Playlist.ID, onSuccess: @escaping () -> Void = {}) {
|
||||
let resource = api.playlistVideo(playlistID, videoIndexID)
|
||||
|
||||
resource.request(.delete).onSuccess { _ in
|
||||
self.load(force: true)
|
||||
onSuccess()
|
||||
}
|
||||
}
|
||||
|
||||
func selectPlaylist(_ id: String?) {
|
||||
selectedPlaylistID = id ?? ""
|
||||
}
|
||||
|
||||
private var resource: Resource {
|
||||
api.playlists
|
||||
}
|
||||
|
||||
private var selectedPlaylist: Playlist? {
|
||||
guard !selectedPlaylistID.isEmpty else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return find(id: selectedPlaylistID)
|
||||
}
|
||||
|
||||
var currentPlaylist: Playlist? {
|
||||
selectedPlaylist ?? all.first
|
||||
}
|
||||
}
|
||||
|
@@ -16,7 +16,7 @@ final class RecentsModel: ObservableObject {
|
||||
items.removeAll { $0.type == .query }
|
||||
}
|
||||
|
||||
func open(_ item: RecentItem) {
|
||||
func add(_ item: RecentItem) {
|
||||
if !items.contains(where: { $0.id == item.id }) {
|
||||
items.append(item)
|
||||
}
|
||||
@@ -30,7 +30,7 @@ final class RecentsModel: ObservableObject {
|
||||
|
||||
func addQuery(_ query: String) {
|
||||
if !query.isEmpty {
|
||||
open(.init(from: query))
|
||||
add(.init(from: query))
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -4,7 +4,7 @@ import SwiftUI
|
||||
|
||||
final class SubscriptionsModel: ObservableObject {
|
||||
@Published var channels = [Channel]()
|
||||
@Published var api: InvidiousAPI!
|
||||
@Published var api: InvidiousAPI! = InvidiousAPI()
|
||||
|
||||
var resource: Resource {
|
||||
api.subscriptions
|
||||
|
Reference in New Issue
Block a user