Version 1.4 - Translations, Like toasts Queue redesign.

This commit is contained in:
2026-04-09 16:54:41 +02:00
parent ec1ffcb0b1
commit 5f3902cb54
30 changed files with 3472 additions and 654 deletions
@@ -8,11 +8,17 @@
import SwiftUI
import UIKit
enum FavoritesTab: String, CaseIterable {
case artists = "Artists"
case albums = "Albums"
case radios = "Radios"
case podcasts = "Podcasts"
enum FavoritesTab: CaseIterable {
case artists, albums, radios, podcasts
var title: LocalizedStringKey {
switch self {
case .artists: return "Artists"
case .albums: return "Albums"
case .radios: return "Radios"
case .podcasts: return "Podcasts"
}
}
}
struct FavoritesView: View {
@@ -41,7 +47,7 @@ struct FavoritesView: View {
ToolbarItem(placement: .principal) {
Picker("Favorites", selection: $selectedTab) {
ForEach(FavoritesTab.allCases, id: \.self) { tab in
Text(tab.rawValue).tag(tab)
Text(tab.title).tag(tab)
}
}
.pickerStyle(.segmented)
@@ -58,6 +64,8 @@ struct FavoritesView: View {
private struct FavoriteArtistsSection: View {
@Environment(MAService.self) private var service
@State private var scrollPosition: String?
@State private var errorMessage: String?
@State private var showError = false
private var favoriteArtists: [MAArtist] {
// Merge artists + albumArtists, deduplicate by URI, filter favorites
@@ -147,6 +155,24 @@ private struct FavoriteArtistsSection: View {
}
}
}
.refreshable {
await reloadArtists()
}
.alert("Error", isPresented: $showError) {
Button("OK", role: .cancel) { }
} message: {
if let errorMessage { Text(errorMessage) }
}
}
private func reloadArtists() async {
do {
try await service.libraryManager.loadArtists(refresh: true)
try await service.libraryManager.loadAlbumArtists(refresh: true)
} catch {
errorMessage = error.localizedDescription
showError = true
}
}
}
@@ -154,6 +180,8 @@ private struct FavoriteArtistsSection: View {
private struct FavoriteAlbumsSection: View {
@Environment(MAService.self) private var service
@State private var errorMessage: String?
@State private var showError = false
private var favoriteAlbums: [MAAlbum] {
service.libraryManager.albums
@@ -189,6 +217,23 @@ private struct FavoriteAlbumsSection: View {
}
}
}
.refreshable {
await reloadAlbums()
}
.alert("Error", isPresented: $showError) {
Button("OK", role: .cancel) { }
} message: {
if let errorMessage { Text(errorMessage) }
}
}
private func reloadAlbums() async {
do {
try await service.libraryManager.loadAlbums(refresh: true)
} catch {
errorMessage = error.localizedDescription
showError = true
}
}
}
@@ -250,6 +295,7 @@ private struct FavoriteRadiosSection: View {
.sheet(item: $selectedRadio) { radio in
EnhancedPlayerPickerView(
players: players,
showNowPlayingOnSelect: true,
onSelect: { player in
Task { await playRadio(radio, on: player) }
}
@@ -291,6 +337,8 @@ private struct FavoriteRadiosSection: View {
private struct FavoritePodcastsSection: View {
@Environment(MAService.self) private var service
@State private var errorMessage: String?
@State private var showError = false
private var favoritePodcasts: [MAPodcast] {
service.libraryManager.podcasts
@@ -315,6 +363,23 @@ private struct FavoritePodcastsSection: View {
.listStyle(.plain)
}
}
.refreshable {
await reloadPodcasts()
}
.alert("Error", isPresented: $showError) {
Button("OK", role: .cancel) { }
} message: {
if let errorMessage { Text(errorMessage) }
}
}
private func reloadPodcasts() async {
do {
try await service.libraryManager.loadPodcasts(refresh: true)
} catch {
errorMessage = error.localizedDescription
showError = true
}
}
}