1
0

dog_app.rs 2.3 KB

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