dog_app.rs 2.3 KB

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