use super::filter::filtered_recent_indices;
use crate::state::AppState;
pub async fn fetch_first_match_for_query(q: String) -> Option<crate::state::PackageItem> {
let official_results = crate::index::search_official(&q, false);
let official: Vec<crate::state::PackageItem> =
official_results.into_iter().map(|(item, _)| item).collect();
if let Some(off) = official
.iter()
.find(|it| it.name.eq_ignore_ascii_case(&q))
.cloned()
{
return Some(off);
}
let (aur, _errors) = crate::sources::fetch_all_with_errors(q.clone()).await;
if let Some(a) = aur
.iter()
.find(|it| it.name.eq_ignore_ascii_case(&q))
.cloned()
{
return Some(a);
}
if let Some(off) = official.first().cloned() {
return Some(off);
}
aur.into_iter().next()
}
pub fn trigger_recent_preview(
app: &AppState,
preview_tx: &tokio::sync::mpsc::UnboundedSender<crate::state::PackageItem>,
) {
if !matches!(app.focus, crate::state::Focus::Recent)
|| matches!(app.app_mode, crate::state::types::AppMode::News)
{
return;
}
let Some(idx) = app.history_state.selected() else {
return;
};
let inds = filtered_recent_indices(app);
if idx >= inds.len() {
return;
}
let Some(q) = app.recent_value_at(inds[idx]) else {
return;
};
let tx = preview_tx.clone();
tokio::spawn(async move {
if let Some(item) = fetch_first_match_for_query(q).await {
let _ = tx.send(item);
}
});
}