fix: make tests pass
This commit is contained in:
1 parent
15b72cd7eb
commit
75fa7b4aa6
9 files changed
+116
-25
No files matched your search
@@ -0,0 +1,92 @@
|
|||||||
|
//! Render a bunch of doggos!
|
||||||
|
//!
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
dioxus::desktop::launch(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, serde::Deserialize)]
|
||||||
|
struct ListBreeds {
|
||||||
|
message: HashMap<String, Vec<String>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn app(cx: Scope) -> Element {
|
||||||
|
let fut = use_future(&cx, || async move {
|
||||||
|
reqwest::get("https://dog.ceo/api/breeds/list/all")
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.json::<ListBreeds>()
|
||||||
|
.await
|
||||||
|
});
|
||||||
|
|
||||||
|
let selected_breed = use_state(&cx, || None);
|
||||||
|
|
||||||
|
match fut.value() {
|
||||||
|
Some(Ok(breeds)) => cx.render(rsx! {
|
||||||
|
div {
|
||||||
|
h1 {"Select a dog breed!"}
|
||||||
|
|
||||||
|
div { display: "flex",
|
||||||
|
ul { flex: "50%",
|
||||||
|
breeds.message.keys().map(|breed| rsx!(
|
||||||
|
li {
|
||||||
|
button {
|
||||||
|
onclick: move |_| selected_breed.set(Some(breed.clone())),
|
||||||
|
"{breed}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
))
|
||||||
|
}
|
||||||
|
div { flex: "50%",
|
||||||
|
match &*selected_breed {
|
||||||
|
Some(breed) => rsx!( Breed { breed: breed.clone() } ),
|
||||||
|
None => rsx!("No Breed selected"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Some(Err(e)) => cx.render(rsx! {
|
||||||
|
div { "Error fetching breeds" }
|
||||||
|
}),
|
||||||
|
None => cx.render(rsx! {
|
||||||
|
div { "Loading dogs..." }
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline_props]
|
||||||
|
fn Breed(cx: Scope, breed: String) -> Element {
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
struct DogApi {
|
||||||
|
message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
let endpoint = format!("https://dog.ceo/api/breed/{}/images/random", breed);
|
||||||
|
|
||||||
|
let fut = use_future(&cx, || async move {
|
||||||
|
reqwest::get(endpoint).await.unwrap().json::<DogApi>().await
|
||||||
|
});
|
||||||
|
|
||||||
|
cx.render(match fut.value() {
|
||||||
|
Some(Ok(resp)) => rsx! {
|
||||||
|
button {
|
||||||
|
onclick: move |_| fut.restart(),
|
||||||
|
"Click to fetch another doggo"
|
||||||
|
}
|
||||||
|
div {
|
||||||
|
img {
|
||||||
|
max_width: "500px",
|
||||||
|
max_height: "500px",
|
||||||
|
src: "{resp.message}",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Some(Err(_)) => rsx! { div { "loading dogs failed" } },
|
||||||
|
None => rsx! { div { "loading dogs..." } },
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ This is the core crate for the Dioxus Virtual DOM. This README will focus on the
|
|||||||
To build new apps with Dioxus or to extend the ecosystem with new hooks or components, use the higher-level `dioxus` crate with the appropriate feature flags.
|
To build new apps with Dioxus or to extend the ecosystem with new hooks or components, use the higher-level `dioxus` crate with the appropriate feature flags.
|
||||||
|
|
||||||
|
|
||||||
```rust
|
```rust, ignore
|
||||||
fn app(cx: Scope) -> Element {
|
fn app(cx: Scope) -> Element {
|
||||||
rsx!(cx, div { "hello world" })
|
rsx!(cx, div { "hello world" })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ pub(crate) mod innerlude {
|
|||||||
///
|
///
|
||||||
/// ## Rust-Style
|
/// ## Rust-Style
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn example(cx: Scope<Props>) -> Element {
|
/// fn example(cx: Scope<Props>) -> Element {
|
||||||
/// // ...
|
/// // ...
|
||||||
/// }
|
/// }
|
||||||
@@ -39,7 +39,7 @@ pub(crate) mod innerlude {
|
|||||||
/// )
|
/// )
|
||||||
/// ```
|
/// ```
|
||||||
/// ## React-Style
|
/// ## React-Style
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn Example(cx: Scope<Props>) -> Element {
|
/// fn Example(cx: Scope<Props>) -> Element {
|
||||||
/// // ...
|
/// // ...
|
||||||
/// }
|
/// }
|
||||||
@@ -52,7 +52,7 @@ pub(crate) mod innerlude {
|
|||||||
/// ## As a closure
|
/// ## As a closure
|
||||||
/// This particular type alias lets you even use static closures for pure/static components:
|
/// This particular type alias lets you even use static closures for pure/static components:
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// static Example: Component<Props> = |cx| {
|
/// static Example: Component<Props> = |cx| {
|
||||||
/// // ...
|
/// // ...
|
||||||
/// };
|
/// };
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ impl VirtualDom {
|
|||||||
/// This is useful when the VirtualDom must be driven from outside a thread and it doesn't make sense to wait for the
|
/// This is useful when the VirtualDom must be driven from outside a thread and it doesn't make sense to wait for the
|
||||||
/// VirtualDom to be created just to retrieve its channel receiver.
|
/// VirtualDom to be created just to retrieve its channel receiver.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// let channel = futures_channel::mpsc::unbounded();
|
/// let channel = futures_channel::mpsc::unbounded();
|
||||||
/// let dom = VirtualDom::new_with_scheduler(Example, (), channel);
|
/// let dom = VirtualDom::new_with_scheduler(Example, (), channel);
|
||||||
/// ```
|
/// ```
|
||||||
@@ -228,7 +228,7 @@ impl VirtualDom {
|
|||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// let mut dom = VirtualDom::new(example);
|
/// let mut dom = VirtualDom::new(example);
|
||||||
/// dom.rebuild();
|
/// dom.rebuild();
|
||||||
///
|
///
|
||||||
@@ -547,7 +547,7 @@ impl VirtualDom {
|
|||||||
///
|
///
|
||||||
/// Useful when needing to render nodes from outside the VirtualDom, such as in a test.
|
/// Useful when needing to render nodes from outside the VirtualDom, such as in a test.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn Base(cx: Scope) -> Element {
|
/// fn Base(cx: Scope) -> Element {
|
||||||
/// rsx!(cx, div {})
|
/// rsx!(cx, div {})
|
||||||
/// }
|
/// }
|
||||||
@@ -567,7 +567,7 @@ impl VirtualDom {
|
|||||||
///
|
///
|
||||||
/// Useful when needing to render nodes from outside the VirtualDom, such as in a test.
|
/// Useful when needing to render nodes from outside the VirtualDom, such as in a test.
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn Base(cx: Scope) -> Element {
|
/// fn Base(cx: Scope) -> Element {
|
||||||
/// rsx!(cx, div {})
|
/// rsx!(cx, div {})
|
||||||
/// }
|
/// }
|
||||||
@@ -589,7 +589,7 @@ impl VirtualDom {
|
|||||||
/// Useful when needing to render nodes from outside the VirtualDom, such as in a test.
|
/// Useful when needing to render nodes from outside the VirtualDom, such as in a test.
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn Base(cx: Scope) -> Element {
|
/// fn Base(cx: Scope) -> Element {
|
||||||
/// rsx!(cx, div {})
|
/// rsx!(cx, div {})
|
||||||
/// }
|
/// }
|
||||||
@@ -612,7 +612,7 @@ impl VirtualDom {
|
|||||||
/// Useful when needing to diff two rsx! calls from outside the VirtualDom, such as in a test.
|
/// Useful when needing to diff two rsx! calls from outside the VirtualDom, such as in a test.
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn Base(cx: Scope) -> Element {
|
/// fn Base(cx: Scope) -> Element {
|
||||||
/// rsx!(cx, div {})
|
/// rsx!(cx, div {})
|
||||||
/// }
|
/// }
|
||||||
@@ -756,7 +756,7 @@ pub enum SchedulerMsg {
|
|||||||
/// `Send` will not be lifted. The entire `UserEvent` must also be `Send + Sync` due to its use in the scheduler channel.
|
/// `Send` will not be lifted. The entire `UserEvent` must also be `Send + Sync` due to its use in the scheduler channel.
|
||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn App(cx: Scope) -> Element {
|
/// fn App(cx: Scope) -> Element {
|
||||||
/// rsx!(cx, div {
|
/// rsx!(cx, div {
|
||||||
/// onclick: move |_| println!("Clicked!")
|
/// onclick: move |_| println!("Clicked!")
|
||||||
@@ -957,7 +957,7 @@ pub fn Fragment<'a>(cx: Scope<'a, FragmentProps<'a>>) -> Element {
|
|||||||
/// ## Example
|
/// ## Example
|
||||||
///
|
///
|
||||||
/// For props that are 'static:
|
/// For props that are 'static:
|
||||||
/// ```rust, ignore ignore
|
/// ```rust, ignore
|
||||||
/// #[derive(Props, PartialEq)]
|
/// #[derive(Props, PartialEq)]
|
||||||
/// struct MyProps {
|
/// struct MyProps {
|
||||||
/// data: String
|
/// data: String
|
||||||
@@ -966,7 +966,7 @@ pub fn Fragment<'a>(cx: Scope<'a, FragmentProps<'a>>) -> Element {
|
|||||||
///
|
///
|
||||||
/// For props that borrow:
|
/// For props that borrow:
|
||||||
///
|
///
|
||||||
/// ```rust, ignore ignore
|
/// ```rust, ignore
|
||||||
/// #[derive(Props)]
|
/// #[derive(Props)]
|
||||||
/// struct MyProps<'a >{
|
/// struct MyProps<'a >{
|
||||||
/// data: &'a str
|
/// data: &'a str
|
||||||
|
|||||||
@@ -9,13 +9,12 @@ Specifically:
|
|||||||
- [ ] Async isn't busted
|
- [ ] Async isn't busted
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use dioxus::{prelude::*, DomEdit, SchedulerMsg, ScopeId};
|
use dioxus::{prelude::*, SchedulerMsg, ScopeId};
|
||||||
use dioxus_core as dioxus;
|
use dioxus_core as dioxus;
|
||||||
use dioxus_core_macro::*;
|
use dioxus_core_macro::*;
|
||||||
use dioxus_html as dioxus_elements;
|
use dioxus_html as dioxus_elements;
|
||||||
|
|
||||||
mod test_logging;
|
mod test_logging;
|
||||||
use DomEdit::*;
|
|
||||||
|
|
||||||
const IS_LOGGING_ENABLED: bool = false;
|
const IS_LOGGING_ENABLED: bool = false;
|
||||||
|
|
||||||
@@ -97,7 +96,7 @@ fn memo_works_properly() {
|
|||||||
let name = cx.use_hook(|_| String::from("asd"));
|
let name = cx.use_hook(|_| String::from("asd"));
|
||||||
|
|
||||||
cx.render(rsx!(
|
cx.render(rsx!(
|
||||||
div { "Hello, world!" }
|
div { "Hello, world! {name}" }
|
||||||
child(na: "asdfg".to_string())
|
child(na: "asdfg".to_string())
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@@ -149,7 +148,7 @@ fn free_works_on_root_props() {
|
|||||||
|
|
||||||
impl Drop for Custom {
|
impl Drop for Custom {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
dbg!("dropped!");
|
dbg!("dropped! {}", &self.val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,14 +39,14 @@ impl<T> ProvidedStateInner<T> {
|
|||||||
///
|
///
|
||||||
/// ## Provider
|
/// ## Provider
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// ## Consumer
|
/// ## Consumer
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ pub mod on {
|
|||||||
/// The MouseEvent interface represents events that occur due to the user interacting with a pointing device (such as a mouse).
|
/// The MouseEvent interface represents events that occur due to the user interacting with a pointing device (such as a mouse).
|
||||||
///
|
///
|
||||||
/// ## Trait implementation:
|
/// ## Trait implementation:
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn alt_key(&self) -> bool;
|
/// fn alt_key(&self) -> bool;
|
||||||
/// fn button(&self) -> i16;
|
/// fn button(&self) -> i16;
|
||||||
/// fn buttons(&self) -> u16;
|
/// fn buttons(&self) -> u16;
|
||||||
@@ -416,7 +416,7 @@ pub mod on {
|
|||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// match event.key().as_str() {
|
/// match event.key().as_str() {
|
||||||
/// "Esc" | "Escape" => {}
|
/// "Esc" | "Escape" => {}
|
||||||
/// "ArrowDown" => {}
|
/// "ArrowDown" => {}
|
||||||
@@ -435,7 +435,7 @@ pub mod on {
|
|||||||
///
|
///
|
||||||
/// ## Example
|
/// ## Example
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// use dioxus::KeyCode;
|
/// use dioxus::KeyCode;
|
||||||
/// match event.key_code() {
|
/// match event.key_code() {
|
||||||
/// KeyCode::Escape => {}
|
/// KeyCode::Escape => {}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ pub struct LinkProps<'a, R: Routable> {
|
|||||||
///
|
///
|
||||||
/// You can either put it your own inline method or just autoderive the route using `derive(Routable)`
|
/// You can either put it your own inline method or just autoderive the route using `derive(Routable)`
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
///
|
///
|
||||||
/// Link { to: Route::Home, href: |_| "home".to_string() }
|
/// Link { to: Route::Home, href: |_| "home".to_string() }
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ mod ric_raf;
|
|||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn main() {
|
/// fn main() {
|
||||||
/// dioxus_web::launch(App);
|
/// dioxus_web::launch(App);
|
||||||
/// }
|
/// }
|
||||||
@@ -98,7 +98,7 @@ pub fn launch(root_component: Component) {
|
|||||||
///
|
///
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust, ignore
|
||||||
/// fn main() {
|
/// fn main() {
|
||||||
/// dioxus_web::launch_with_props(App, RootProps { name: String::from("joe") });
|
/// dioxus_web::launch_with_props(App, RootProps { name: String::from("joe") });
|
||||||
/// }
|
/// }
|
||||||
|
|||||||
Reference in new issue
Block a user