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
})
}))
}
}