use dioxus::prelude::*;
use reader::Track;
use server::source::ActiveSource;
use crate::db_reactivity::{Generations, Table};
pub fn toggle_favorite(track: Option<Track>) {
let Some(track) = track else { return };
if track.id.key().trim().is_empty() {
return;
}
let source = consume_context::<Signal<ActiveSource>>().peek().clone();
let gens = consume_context::<Generations>();
spawn(async move {
let key = track.id.key().to_string();
let new_fav = !source.is_favorite(&key).await;
if let Err(e) = source.record_favorite(&track, new_fav).await {
tracing::warn!(error = %e, track = %track.id.uid(), "favorite: local write failed");
return;
}
gens.bump(Table::Favorites);
gens.bump(Table::Tracks);
if let Err(e) = source.push_favorite(&key, new_fav).await {
tracing::warn!(error = %e, track = %track.id.uid(), "favorite push rejected; reverting");
let _ = source.record_favorite(&track, !new_fav).await;
gens.bump(Table::Favorites);
gens.bump(Table::Tracks);
let msg = match track.id.service() {
Some(service) => format!("Couldn't update favorite on {}", service.display_name()),
None => "Couldn't update favorite".to_string(),
};
crate::toast::toast_error(&msg);
}
});
}
pub fn set_favorite_many(tracks: Vec<Track>, on: bool) {
if tracks.is_empty() {
return;
}
let source = consume_context::<Signal<ActiveSource>>().peek().clone();
let gens = consume_context::<Generations>();
spawn(async move {
let mut recorded = Vec::new();
for track in tracks {
let key = track.id.key().to_string();
if key.trim().is_empty() {
continue;
}
if source.is_favorite(&key).await == on {
continue;
}
if source.record_favorite(&track, on).await.is_ok() {
recorded.push(track);
}
}
if recorded.is_empty() {
return;
}
gens.bump(Table::Favorites);
gens.bump(Table::Tracks);
let mut reverted = false;
for track in recorded {
let key = track.id.key().to_string();
if let Err(e) = source.push_favorite(&key, on).await {
tracing::warn!(error = %e, track = %track.id.uid(), "favorite push rejected; reverting");
let _ = source.record_favorite(&track, !on).await;
reverted = true;
}
}
if reverted {
gens.bump(Table::Favorites);
gens.bump(Table::Tracks);
crate::toast::toast_error("Couldn't update some favorites");
}
});
}