diff --git a/packages/hooks/src/lib.rs b/packages/hooks/src/lib.rs index cb4afd297..598442e19 100644 --- a/packages/hooks/src/lib.rs +++ b/packages/hooks/src/lib.rs @@ -13,8 +13,8 @@ pub use usecoroutine::*; mod usefuture; pub use usefuture::*; -mod usesuspense; -pub use usesuspense::*; +mod usecallback; +pub use usecallback::*; #[macro_export] /// A helper macro for using hooks in async environements. diff --git a/packages/hooks/src/usecallback.rs b/packages/hooks/src/usecallback.rs new file mode 100644 index 000000000..1affd323f --- /dev/null +++ b/packages/hooks/src/usecallback.rs @@ -0,0 +1,68 @@ +use std::{cell::RefCell, rc::Rc}; + +use crate::use_state; +use crate::UseFutureDep; +use dioxus_core::{ScopeState, UiEvent}; +use std::future::Future; + +pub fn use_callback + 'static>( + cx: &ScopeState, + // + g: G, + f: impl FnMut(I, G::Out) -> F, +) -> &UseCallback +where + G::Out: 'static, + I: 'static, +{ + cx.use_hook(|_| { + // + UseCallback { + f: todo!(), + f2: Box::new(|f| {}), + } + }) +} + +pub struct UseCallback { + f: Rc>>>, + f2: Box, // f: Rc>>>, +} + +impl std::ops::Deref for UseCallback { + type Target = dyn Fn(I); + + fn deref(&self) -> &Self::Target { + &self.f2 + } +} + +trait MyThing {} +impl MyThing for Box {} +impl MyThing for Box {} + +#[test] +fn demo() { + use dioxus_core::prelude::*; + fn example(cx: Scope) -> Element { + let (name, _) = use_state(&cx, || 0); + let (age, _) = use_state(&cx, || 0); + + let onsubmit = use_callback(&cx, (name,), |event: (), (name,)| async move { + // + }); + + let onsubmit = use_callback(&cx, (name,), my_callback); + async fn my_callback(event: UiEvent<()>, name: (i32,)) { + // + } + + let onsubmit = use_callback(&cx, name, my_callback2); + + async fn my_callback2(event: UiEvent<()>, name: i32) { + // + } + + None + } +} diff --git a/packages/hooks/src/usefuture.rs b/packages/hooks/src/usefuture.rs index 9db67aef2..0c066363e 100644 --- a/packages/hooks/src/usefuture.rs +++ b/packages/hooks/src/usefuture.rs @@ -146,6 +146,28 @@ impl UseFutureDep for () { pub trait Dep: 'static + PartialEq + Clone {} impl Dep for T where T: 'static + PartialEq + Clone {} +impl UseFutureDep for &A { + type Out = A; + fn out(&self) -> Self::Out { + (*self).clone() + } + fn apply(self, state: &mut Vec>) -> bool { + match state.get_mut(0).map(|f| f.downcast_mut::()).flatten() { + Some(val) => { + if *val != *self { + *val = self.clone(); + return true; + } + } + None => { + state.push(Box::new(self.clone())); + return true; + } + } + false + } +} + macro_rules! impl_dep { ( $($el:ident=$name:ident,)*