Skip to content

Commit

Permalink
Merge branch 'leptos-rs:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
kryesh authored Apr 15, 2024
2 parents 324a6cf + 9a51fb1 commit 22dd5a7
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 3 deletions.
22 changes: 22 additions & 0 deletions leptos/src/error_boundary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,28 @@ use leptos_reactive::{provide_context, run_as_child, signal_prelude::*};
/// {move || {
/// /* etc. */
/// ```
///
/// ## Beginner's Tip: ErrorBoundary Requires Your Error To Implement std::error::Error.
/// `ErrorBoundary` requires your `Result<T,E>` to implement [IntoView](https://docs.rs/leptos/latest/leptos/trait.IntoView.html).
/// `Result<T,E>` only implements `IntoView` if `E` implements [std::error::Error](https://doc.rust-lang.org/std/error/trait.Error.html).
/// So, for instance, if you pass a `Result<T,String>` where `T` implements [IntoView](https://docs.rs/leptos/latest/leptos/trait.IntoView.html)
/// and attempt to render the error for the purposes of `ErrorBoundary` you'll get a compiler error like this.
///
/// ```rust,ignore
/// error[E0599]: the method `into_view` exists for enum `Result<ViewableLoginFlow, String>`, but its trait bounds were not satisfied
/// --> src/login.rs:229:32
/// |
/// 229 | err => err.into_view(),
/// | ^^^^^^^^^ method cannot be called on `Result<ViewableLoginFlow, String>` due to unsatisfied trait bounds
/// |
/// = note: the following trait bounds were not satisfied:
/// `<&Result<ViewableLoginFlow, std::string::String> as FnOnce<()>>::Output = _`
/// which is required by `&Result<ViewableLoginFlow, std::string::String>: leptos::IntoView`
/// ... more notes here ...
/// ```
///
/// For more information about how to easily implement `Error` see
/// [thiserror](https://docs.rs/thiserror/latest/thiserror/)
#[component]
pub fn ErrorBoundary<F, IV>(
/// The components inside the tag which will get rendered
Expand Down
2 changes: 1 addition & 1 deletion leptos_reactive/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ bytecheck = { version = "0.7", features = [
rustc-hash = "1"
serde-wasm-bindgen = "0.6"
serde_json = "1"
spin-sdk = { version = "2", optional = true }
spin-sdk = { version = "3", optional = true }
base64 = "0.22"
thiserror = "1"
tokio = { version = "1", features = [
Expand Down
26 changes: 25 additions & 1 deletion meta/src/body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ pub struct BodyContext {
#[cfg(feature = "ssr")]
class: Rc<RefCell<Option<TextProp>>>,
#[cfg(feature = "ssr")]
id: Rc<RefCell<Option<TextProp>>>,
#[cfg(feature = "ssr")]
attributes: Rc<RefCell<HashMap<&'static str, Attribute>>>,
}

Expand All @@ -24,6 +26,13 @@ impl BodyContext {
leptos::leptos_dom::ssr::escape_attr(&val.get())
)
});

let id = self.id.borrow().as_ref().map(|val| {
format!(
"id=\"{}\"",
leptos::leptos_dom::ssr::escape_attr(&val.get())
)
});
let attributes = self.attributes.borrow();
let attributes = (!attributes.is_empty()).then(|| {
attributes
Expand All @@ -41,7 +50,7 @@ impl BodyContext {
.join(" ")
});

let mut val = [class, attributes]
let mut val = [id, class, attributes]
.into_iter()
.flatten()
.collect::<Vec<_>>()
Expand Down Expand Up @@ -92,6 +101,9 @@ pub fn Body(
/// The `class` attribute on the `<body>`.
#[prop(optional, into)]
class: Option<TextProp>,
/// The `id` attribute on the `<body>`.
#[prop(optional, into)]
id: Option<TextProp>,
/// Arbitrary attributes to add to the `<body>`
#[prop(attrs)]
attributes: Vec<(&'static str, Attribute)>,
Expand All @@ -112,15 +124,27 @@ pub fn Body(
});
}


if let Some(id) = id {
create_render_effect({
let el = el.clone();
move |_| {
let value = id.get();
_ = el.set_attribute("id", &value);
}
});
}
for (name, value) in attributes {
leptos::leptos_dom::attribute_helper(el.unchecked_ref(), name.into(), value);
}
} else if #[cfg(feature = "ssr")] {
let meta = crate::use_head();
*meta.body.class.borrow_mut() = class;
*meta.body.id.borrow_mut() = id;
meta.body.attributes.borrow_mut().extend(attributes);
} else {
_ = class;
_ = id;
_ = attributes;

#[cfg(debug_assertions)]
Expand Down
2 changes: 1 addition & 1 deletion router/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ regex = { version = "1", optional = true }
url = { version = "2", optional = true }
percent-encoding = "2"
thiserror = "1"
serde_qs = "0.12"
serde_qs = "0.13"
serde = "1"
tracing = "0.1"
js-sys = { version = "0.3" }
Expand Down

0 comments on commit 22dd5a7

Please sign in to comment.