dog_app.rs 2.1 KB

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