dog_app.rs 2.4 KB

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