Merge branch 'main' into jk/mobile-fixes

This commit is contained in:
Jonathan Kelley committed 2024-03-15 12:20:57 -07:00
commit ef288d02d7
5 files changed
+35 -9

No files matched your search

+13
View File
@@ -20,6 +20,14 @@ fn app() -> Element {
}, },
DemoC { x: 1 } DemoC { x: 1 }
} }
ErrorBoundary {
handle_error: |error: CapturedError| rsx! {
h1 { "Another error occurred" }
pre { "{error:#?}" }
},
ComponentPanic {}
}
} }
} }
@@ -40,3 +48,8 @@ fn DemoC(x: i32) -> Element {
} }
} }
} }
#[component]
fn ComponentPanic() -> Element {
panic!("This component panics")
}
-6
View File
@@ -335,12 +335,6 @@ pub fn build_desktop(
let _manganis_support = ManganisSupportGuard::default(); let _manganis_support = ManganisSupportGuard::default();
let _guard = AssetConfigDropGuard::new(); let _guard = AssetConfigDropGuard::new();
// set the asset dir via cli args
env::set_var(
"DIOXUS_ASSET_DIR",
config.asset_dir().canonicalize().unwrap(),
);
let mut cmd = subprocess::Exec::cmd("cargo") let mut cmd = subprocess::Exec::cmd("cargo")
.set_rust_flags(rust_flags) .set_rust_flags(rust_flags)
.env("CARGO_TARGET_DIR", &config.target_dir) .env("CARGO_TARGET_DIR", &config.target_dir)
+6 -1
View File
@@ -1,4 +1,8 @@
use crate::{nodes::RenderReturn, ComponentFunction}; use crate::{
innerlude::{throw_error, CapturedPanic},
nodes::RenderReturn,
ComponentFunction,
};
use std::{any::Any, panic::AssertUnwindSafe}; use std::{any::Any, panic::AssertUnwindSafe};
pub(crate) type BoxedAnyProps = Box<dyn AnyProps>; pub(crate) type BoxedAnyProps = Box<dyn AnyProps>;
@@ -79,6 +83,7 @@ impl<F: ComponentFunction<P, M> + Clone, P: Clone + 'static, M: 'static> AnyProp
Err(err) => { Err(err) => {
let component_name = self.name; let component_name = self.name;
tracing::error!("Error while rendering component `{component_name}`: {err:?}"); tracing::error!("Error while rendering component `{component_name}`: {err:?}");
throw_error::<()>(CapturedPanic { error: err });
RenderReturn::default() RenderReturn::default()
} }
} }
+15 -1
View File
@@ -13,6 +13,20 @@ use std::{
rc::Rc, rc::Rc,
}; };
/// A panic in a component that was caught by an error boundary.
///
/// NOTE: WASM currently does not support caching unwinds, so this struct will not be created in WASM.
pub struct CapturedPanic {
/// The error that was caught
pub error: Box<dyn Any + 'static>,
}
impl Debug for CapturedPanic {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CapturedPanic").finish()
}
}
/// Provide an error boundary to catch errors from child components /// Provide an error boundary to catch errors from child components
pub fn use_error_boundary() -> ErrorBoundary { pub fn use_error_boundary() -> ErrorBoundary {
use_hook(|| provide_context(ErrorBoundary::new())) use_hook(|| provide_context(ErrorBoundary::new()))
@@ -201,7 +215,7 @@ pub trait Throw<S = ()>: Sized {
} }
} }
fn throw_error<T>(e: impl Debug + 'static) -> Option<T> { pub(crate) fn throw_error<T>(e: impl Debug + 'static) -> Option<T> {
if let Some(cx) = try_consume_context::<ErrorBoundary>() { if let Some(cx) = try_consume_context::<ErrorBoundary>() {
match current_scope_id() { match current_scope_id() {
Some(id) => cx.insert_error(id, Box::new(e), Backtrace::capture()), Some(id) => cx.insert_error(id, Box::new(e), Backtrace::capture()),
+1 -1
View File
@@ -243,7 +243,7 @@ pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
// FIXME: use a more robust system here for embedded discovery // FIXME: use a more robust system here for embedded discovery
// //
// https://github.com/DioxusLabs/dioxus/issues/1914 // https://github.com/DioxusLabs/dioxus/issues/1914
if listening_paths == &[""] { if listening_paths == [""] {
for entry in std::fs::read_dir(&crate_dir) for entry in std::fs::read_dir(&crate_dir)
.expect("failed to read rust crate directory. Are you running with cargo?") .expect("failed to read rust crate directory. Are you running with cargo?")
{ {