dog_app.rs 2.4 KB

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