dog_app.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. use dioxus::prelude::*;
  2. use std::collections::HashMap;
  3. fn main() {
  4. dioxus_desktop::launch(app);
  5. }
  6. fn app() -> Element {
  7. let breed = use_signal(|| "deerhound".to_string());
  8. let breed_list = use_future(|| async move {
  9. reqwest::get("https://dog.ceo/api/breeds/list/all")
  10. .await
  11. .unwrap()
  12. .json::<ListBreeds>()
  13. .await
  14. });
  15. match breed_list.value().read().as_ref() {
  16. Some(Ok(breeds)) => rsx! {
  17. div { height: "500px",
  18. h1 { "Select a dog breed!" }
  19. div { display: "flex",
  20. ul { flex: "50%",
  21. for cur_breed in breeds.message.keys().take(10).cloned() {
  22. li { key: "{cur_breed}",
  23. button { onclick: move |_| breed.set(cur_breed.clone()), "{cur_breed}" }
  24. }
  25. }
  26. }
  27. div { flex: "50%", BreedPic { breed } }
  28. }
  29. }
  30. },
  31. _ => rsx! { div { "loading breeds" } },
  32. }
  33. }
  34. #[component]
  35. fn BreedPic(breed: Signal<String>) -> Element {
  36. let fut = use_future(|| async move {
  37. reqwest::get(format!("https://dog.ceo/api/breed/{breed}/images/random"))
  38. .await
  39. .unwrap()
  40. .json::<DogApi>()
  41. .await
  42. });
  43. match fut.value().read().as_ref() {
  44. Some(Ok(resp)) => rsx! {
  45. div {
  46. button { onclick: move |_| fut.restart(), "Click to fetch another doggo" }
  47. img { max_width: "500px", max_height: "500px", src: "{resp.message}" }
  48. }
  49. },
  50. _ => rsx! { div { "loading dog picture" } },
  51. }
  52. }
  53. #[derive(Debug, Clone, PartialEq, serde::Deserialize)]
  54. struct ListBreeds {
  55. message: HashMap<String, Vec<String>>,
  56. }
  57. #[derive(serde::Deserialize, Debug)]
  58. struct DogApi {
  59. message: String,
  60. }