dog_app.rs 2.3 KB

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