use web_sys::HtmlInputElement; use web_sys::HtmlSelectElement; use yew::prelude::*; use crate::api; use crate::types::*; enum SearchResults { None, Artists(Vec), Albums(Vec), Tracks(Vec), } #[function_component(SearchPage)] pub fn search_page() -> Html { let query = use_state(|| String::new()); let search_type = use_state(|| "artist".to_string()); let results = use_state(|| SearchResults::None); let error = use_state(|| None::); let message = use_state(|| None::); let on_search = { let query = query.clone(); let search_type = search_type.clone(); let results = results.clone(); let error = error.clone(); Callback::from(move |e: SubmitEvent| { e.prevent_default(); let q = (*query).clone(); let st = (*search_type).clone(); let results = results.clone(); let error = error.clone(); wasm_bindgen_futures::spawn_local(async move { error.set(None); match st.as_str() { "artist" => match api::search_artist(&q, 10).await { Ok(r) => results.set(SearchResults::Artists(r)), Err(e) => error.set(Some(e.0)), }, "album" => match api::search_album(&q, None, 10).await { Ok(r) => results.set(SearchResults::Albums(r)), Err(e) => error.set(Some(e.0)), }, "track" => match api::search_track(&q, None, 10).await { Ok(r) => results.set(SearchResults::Tracks(r)), Err(e) => error.set(Some(e.0)), }, _ => {} } }); }) }; let on_add_artist = { let message = message.clone(); let error = error.clone(); move |name: String, mbid: String| { let message = message.clone(); let error = error.clone(); wasm_bindgen_futures::spawn_local(async move { match api::add_artist(&name, Some(&mbid)).await { Ok(s) => message.set(Some(format!( "Added {} tracks ({} already owned)", s.tracks_added, s.tracks_already_owned ))), Err(e) => error.set(Some(e.0)), } }); } }; let on_add_album = { let message = message.clone(); let error = error.clone(); move |artist: String, title: String, mbid: String| { let message = message.clone(); let error = error.clone(); wasm_bindgen_futures::spawn_local(async move { match api::add_album(&artist, &title, Some(&mbid)).await { Ok(s) => message.set(Some(format!( "Added {} tracks ({} already owned)", s.tracks_added, s.tracks_already_owned ))), Err(e) => error.set(Some(e.0)), } }); } }; html! {
if let Some(ref msg) = *message {

{ msg }

} if let Some(ref err) = *error {
{ err }
} { match &*results { SearchResults::None => html! {}, SearchResults::Artists(items) => html! { { for items.iter().map(|a| { let name = a.name.clone(); let mbid = a.id.clone(); let on_add = on_add_artist.clone(); html! { } })}
{ "Name" }{ "Country" }{ "Type" }{ "Score" }
{ &a.name } if let Some(ref d) = a.disambiguation { { format!(" ({d})") } } { a.country.as_deref().unwrap_or("") } { a.artist_type.as_deref().unwrap_or("") } { a.score }
}, SearchResults::Albums(items) => html! { { for items.iter().map(|a| { let artist = a.artist.clone(); let title = a.title.clone(); let mbid = a.id.clone(); let on_add = on_add_album.clone(); html! { } })}
{ "Title" }{ "Artist" }{ "Year" }{ "Score" }
{ &a.title } { &a.artist } { a.year.as_deref().unwrap_or("") } { a.score }
}, SearchResults::Tracks(items) => html! { { for items.iter().map(|t| html! { })}
{ "Title" }{ "Artist" }{ "Album" }{ "Score" }
{ &t.title } { &t.artist } { t.album.as_deref().unwrap_or("") } { t.score }
}, }}
} }