use leptos::html::ElementDescriptor; use leptos::*; use std::ops::Deref; pub enum EventTargetMaybeSignal where T: Into + Clone + 'static, { Static(Option), Dynamic(Signal>), } impl From<(Scope, T)> for EventTargetMaybeSignal where T: Into + Clone + 'static, { fn from(value: (Scope, T)) -> Self { EventTargetMaybeSignal::Static(Some(value.1)) } } impl From<(Scope, Option)> for EventTargetMaybeSignal where T: Into + Clone + 'static, { fn from(target: (Scope, Option)) -> Self { EventTargetMaybeSignal::Static(target.1) } } macro_rules! impl_from_signal_option { ($ty:ty) => { impl From<(Scope, $ty)> for EventTargetMaybeSignal where T: Into + Clone + 'static, { fn from(target: (Scope, $ty)) -> Self { EventTargetMaybeSignal::Dynamic(target.1.into()) } } }; } impl_from_signal_option!(Signal>); impl_from_signal_option!(ReadSignal>); impl_from_signal_option!(RwSignal>); impl_from_signal_option!(Memo>); macro_rules! impl_from_signal { ($ty:ty) => { impl From<(Scope, $ty)> for EventTargetMaybeSignal where T: Into + Clone + 'static, { fn from(target: (Scope, $ty)) -> Self { let (cx, signal) = target; EventTargetMaybeSignal::Dynamic(Signal::derive(cx, move || Some(signal.get()))) } } }; } impl_from_signal!(Signal); impl_from_signal!(ReadSignal); impl_from_signal!(RwSignal); impl_from_signal!(Memo); impl From<(Scope, NodeRef)> for EventTargetMaybeSignal where R: ElementDescriptor + Clone + 'static, { fn from(target: (Scope, NodeRef)) -> Self { let (cx, node_ref) = target; EventTargetMaybeSignal::Dynamic(Signal::derive(cx, move || { node_ref.get().map(move |el| { let el = el.into_any(); let el: web_sys::EventTarget = el.deref().clone().into(); el }) })) } }