dog_app.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. let list = reqwest::get("https://dog.ceo/api/breeds/list/all")
  10. .await
  11. .unwrap()
  12. .json::<ListBreeds>()
  13. .await;
  14. let Ok(breeds) = list else {
  15. return rsx! { "error fetching breeds" };
  16. };
  17. rsx! {
  18. for cur_breed in breeds.message.keys().take(10).cloned() {
  19. li { key: "{cur_breed}",
  20. button { onclick: move |_| breed.set(cur_breed.clone()),
  21. "{cur_breed}"
  22. }
  23. }
  24. }
  25. }
  26. });
  27. match breed_list.value().read().as_ref() {
  28. Some(resp) => rsx! {
  29. h1 { "Select a dog breed!" }
  30. div { height: "500px", display: "flex",
  31. ul { flex: "50%", {breed_list.value().cloned().unwrap_or_else(|| rsx! {
  32. "loading breeds..."
  33. })} }
  34. div { flex: "50%", BreedPic { breed } }
  35. }
  36. },
  37. _ => rsx! { "loading breeds..." },
  38. }
  39. }
  40. #[component]
  41. fn BreedPic(breed: Signal<String>) -> Element {
  42. let fut = use_future(|| async move {
  43. reqwest::get(format!("https://dog.ceo/api/breed/{breed}/images/random"))
  44. .await
  45. .unwrap()
  46. .json::<DogApi>()
  47. .await
  48. });
  49. match fut.value().read().as_ref() {
  50. Some(Ok(resp)) => rsx! {
  51. div {
  52. button { onclick: move |_| fut.restart(), "Click to fetch another doggo" }
  53. img { max_width: "500px", max_height: "500px", src: "{resp.message}" }
  54. }
  55. },
  56. _ => rsx! { "loading image..." },
  57. }
  58. }
  59. #[derive(Debug, Clone, PartialEq, serde::Deserialize)]
  60. struct ListBreeds {
  61. message: HashMap<String, Vec<String>>,
  62. }
  63. #[derive(serde::Deserialize, Debug)]
  64. struct DogApi {
  65. message: String,
  66. }