fix: enrich player track info from API + share button feedback
PlayerTrackInfoView auto-fetches full release data when current track is missing audio/lastfm fields (e.g. after device transfer). Share button turns green with checkmark for 1.5s after copying URL. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,7 @@ struct ContentView: View {
|
|||||||
@State private var showingQueue = false
|
@State private var showingQueue = false
|
||||||
@State private var showingDevices = false
|
@State private var showingDevices = false
|
||||||
@State private var remoteSeekOverride: Double? = nil // optimistic seek for client mode
|
@State private var remoteSeekOverride: Double? = nil // optimistic seek for client mode
|
||||||
|
@State private var shareCopied = false
|
||||||
|
|
||||||
// ViewModels bound to session (optional)
|
// ViewModels bound to session (optional)
|
||||||
@State private var globalVM: GlobalArtistsViewModel?
|
@State private var globalVM: GlobalArtistsViewModel?
|
||||||
@@ -560,9 +561,11 @@ struct ContentView: View {
|
|||||||
.disabled(player.currentTrack == nil)
|
.disabled(player.currentTrack == nil)
|
||||||
|
|
||||||
Button(action: shareCurrentTrack) {
|
Button(action: shareCurrentTrack) {
|
||||||
Image(systemName: "square.and.arrow.up").font(.system(size: 14))
|
Image(systemName: shareCopied ? "checkmark" : "square.and.arrow.up")
|
||||||
|
.font(.system(size: 14))
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain).foregroundColor(.secondary)
|
.buttonStyle(.plain)
|
||||||
|
.foregroundColor(shareCopied ? .green : .secondary)
|
||||||
.disabled(player.currentTrack == nil)
|
.disabled(player.currentTrack == nil)
|
||||||
|
|
||||||
Button(action: { showingTrackInfo.toggle() }) {
|
Button(action: { showingTrackInfo.toggle() }) {
|
||||||
@@ -572,7 +575,7 @@ struct ContentView: View {
|
|||||||
.disabled(player.currentTrack == nil)
|
.disabled(player.currentTrack == nil)
|
||||||
.popover(isPresented: $showingTrackInfo, arrowEdge: .bottom) {
|
.popover(isPresented: $showingTrackInfo, arrowEdge: .bottom) {
|
||||||
if let track = player.currentTrack {
|
if let track = player.currentTrack {
|
||||||
TrackInfoView(track: track)
|
PlayerTrackInfoView(track: track, service: authManager.catalogService)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -706,6 +709,11 @@ struct ContentView: View {
|
|||||||
let url = "\(baseUrl.trimmingCharacters(in: CharacterSet(charactersIn: "/")))/share/track/\(track.id)"
|
let url = "\(baseUrl.trimmingCharacters(in: CharacterSet(charactersIn: "/")))/share/track/\(track.id)"
|
||||||
NSPasteboard.general.clearContents()
|
NSPasteboard.general.clearContents()
|
||||||
NSPasteboard.general.setString(url, forType: .string)
|
NSPasteboard.general.setString(url, forType: .string)
|
||||||
|
withAnimation(.easeIn(duration: 0.1)) { shareCopied = true }
|
||||||
|
Task {
|
||||||
|
try? await Task.sleep(nanoseconds: 1_500_000_000)
|
||||||
|
withAnimation(.easeOut(duration: 0.4)) { shareCopied = false }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,24 @@
|
|||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
/// Wrapper used by the player bar — enriches track data from the API if fields are missing
|
||||||
|
struct PlayerTrackInfoView: View {
|
||||||
|
let track: TrackCard
|
||||||
|
let service: CatalogService?
|
||||||
|
|
||||||
|
@State private var enriched: TrackCard?
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
TrackInfoView(track: enriched ?? track)
|
||||||
|
.task(id: track.id) {
|
||||||
|
guard track.audioFormat == nil, track.releaseId > 0, let service else { return }
|
||||||
|
guard let detail = try? await service.releaseDetail(id: track.releaseId),
|
||||||
|
let full = detail.tracks.first(where: { $0.id == track.id }) else { return }
|
||||||
|
enriched = full
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct TrackInfoView: View {
|
struct TrackInfoView: View {
|
||||||
let track: TrackCard
|
let track: TrackCard
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user