Simplify search results and make more efficient using tokio join through general search server function
Some checks failed
Push Workflows / docs (push) Successful in 2m44s
Push Workflows / build (push) Failing after 3m20s
Push Workflows / test (push) Successful in 4m46s
Push Workflows / leptos-test (push) Successful in 6m16s
Push Workflows / docker-build (push) Failing after 12m45s

This commit is contained in:
Connor Wittman 2024-12-06 19:37:48 -05:00
parent f8a28ca75c
commit d73a114d35
2 changed files with 13 additions and 40 deletions

View File

@ -1,8 +1,6 @@
use html::Li; use html::Li;
use leptos::*; use leptos::*;
use crate::search::search_albums; use crate::search::search;
use crate::search::search_artists;
use crate::search::search_songs;
use crate::song::Song; use crate::song::Song;
use crate::models::Album; use crate::models::Album;
use crate::models::Artist; use crate::models::Artist;
@ -20,9 +18,7 @@ pub fn Search() -> impl IntoView {
let status = GlobalState::play_status(); let status = GlobalState::play_status();
let search_query = create_rw_signal(String::new()); let search_query = create_rw_signal(String::new());
let album_search_results = create_rw_signal(Vec::<(Album, f32)>::new()); let search_results = create_rw_signal((Vec::<(Album, f32)>::new(), Vec::<(Artist, f32)>::new(), Vec::<(Song, f32)>::new()));
let artist_search_results = create_rw_signal(Vec::<(Artist, f32)>::new());
let song_search_results = create_rw_signal(Vec::<(Song, f32)>::new());
let search_limit = 10; let search_limit = 10;
let on_input = move |e: Event| { let on_input = move |e: Event| {
@ -32,36 +28,16 @@ pub fn Search() -> impl IntoView {
spawn_local(async move { spawn_local(async move {
log!("Searching for: {:?}", search_query.get_untracked()); log!("Searching for: {:?}", search_query.get_untracked());
let albums = search_albums(search_query.get_untracked(), search_limit).await; let results = search(search_query.get_untracked(), search_limit).await;
let artists = search_artists(search_query.get_untracked(), search_limit).await;
let songs = search_songs(search_query.get_untracked(), search_limit).await;
match albums { match results {
Ok(albums) => { Ok((albums, artists, songs)) => {
album_search_results.set(albums); search_results.set((albums, artists, songs));
} }
Err(err) => { Err(err) => {
log!("Error searching albums: {:?}", err); log!("Error searching albums: {:?}", err);
} }
} }
match artists {
Ok(artists) => {
artist_search_results.set(artists);
}
Err(err) => {
log!("Error searching artists: {:?}", err);
}
}
match songs {
Ok(songs) => {
song_search_results.set(songs);
}
Err(err) => {
log!("Error searching songs: {:?}", err);
}
}
}); });
}; };
@ -91,10 +67,9 @@ pub fn Search() -> impl IntoView {
<div class="search-results"> <div class="search-results">
// Display 3 columns of search results: songs, albums, and artists // Display 3 columns of search results: songs, albums, and artists
<ul class="search-result-list"> <ul class="search-result-list">
{move || song_search_results.with(|songs| -> Vec<leptos::HtmlElement<Li>> { {move || search_results.with(|results| -> Vec<leptos::HtmlElement<Li>> {
let mut song_list = Vec::new(); let mut song_list = Vec::new();
log!("Songs: {:?}", songs); for (song, _) in results.2.clone() {
for (song, _) in songs {
song_list.push(view! { song_list.push(view! {
<li class="search-result"> <li class="search-result">
<div class="result-container"> <div class="result-container">
@ -118,10 +93,9 @@ pub fn Search() -> impl IntoView {
})} })}
</ul> </ul>
<ul class="search-result-list"> <ul class="search-result-list">
{move || album_search_results.with(|albums| -> Vec<leptos::HtmlElement<Li>> { {move || search_results.with(|results| -> Vec<leptos::HtmlElement<Li>> {
let mut album_list = Vec::new(); let mut album_list = Vec::new();
log!("Albums: {:?}", albums); for (album, _) in results.0.clone() {
for (album, _) in albums {
album_list.push(view! { album_list.push(view! {
<li class="search-result"> <li class="search-result">
<div class="result-container"> <div class="result-container">
@ -148,10 +122,9 @@ pub fn Search() -> impl IntoView {
})} })}
</ul> </ul>
<ul class="search-result-list"> <ul class="search-result-list">
{move || artist_search_results.with(|artists| -> Vec<leptos::HtmlElement<Li>> { {move || search_results.with(|results| -> Vec<leptos::HtmlElement<Li>> {
let mut artist_list = Vec::new(); let mut artist_list = Vec::new();
log!("Artists: {:?}", artists); for (artist, _) in results.1.clone() {
for (artist, _) in artists {
artist_list.push(view! { artist_list.push(view! {
<li class="search-result"> <li class="search-result">
<div class="result-container"> <div class="result-container">

View File

@ -531,7 +531,7 @@ impl Album {
#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Insertable))] #[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Insertable))]
#[cfg_attr(feature = "ssr", diesel(table_name = crate::schema::songs))] #[cfg_attr(feature = "ssr", diesel(table_name = crate::schema::songs))]
#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] #[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))]
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Song { pub struct Song {
/// A unique id for the song /// A unique id for the song
#[cfg_attr(feature = "ssr", diesel(deserialize_as = i32))] #[cfg_attr(feature = "ssr", diesel(deserialize_as = i32))]