mirror of
https://github.com/adoyle0/leptos-use.git
synced 2025-01-22 16:49:22 -05:00
some more ElementMaybeSignal conversions and some minor code improvements
This commit is contained in:
parent
07f592b222
commit
58395be22b
5 changed files with 87 additions and 15 deletions
5
.idea/leptos-use.iml
generated
5
.idea/leptos-use.iml
generated
|
@ -61,6 +61,9 @@
|
||||||
<sourceFolder url="file://$MODULE_DIR$/examples/use_service_worker/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/examples/use_service_worker/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/examples/use_infinite_scroll/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/examples/use_infinite_scroll/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/examples/use_web_notification/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/examples/use_web_notification/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/examples/use_device_pixel_ratio/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/examples/use_element_bounding/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/examples/use_mouse_in_element/src" isTestSource="false" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/examples/use_event_listener/target" />
|
<excludeFolder url="file://$MODULE_DIR$/examples/use_event_listener/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/docs/book/book" />
|
<excludeFolder url="file://$MODULE_DIR$/docs/book/book" />
|
||||||
|
@ -93,4 +96,4 @@
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="library" name="Python 3.9 interpreter library" level="application" />
|
<orderEntry type="library" name="Python 3.9 interpreter library" level="application" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
2
examples/rust-toolchain.toml
Normal file
2
examples/rust-toolchain.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[toolchain]
|
||||||
|
channel = "nightly"
|
|
@ -307,3 +307,63 @@ macro_rules! impl_from_html_element {
|
||||||
|
|
||||||
impl_from_html_element!(web_sys::EventTarget);
|
impl_from_html_element!(web_sys::EventTarget);
|
||||||
impl_from_html_element!(web_sys::Element);
|
impl_from_html_element!(web_sys::Element);
|
||||||
|
|
||||||
|
// From Signal<leptos::html::HTMLElement> /////////////////////////////////////////
|
||||||
|
|
||||||
|
macro_rules! impl_from_signal_html_element {
|
||||||
|
($signal:ty, $ty:ty) => {
|
||||||
|
impl<HtmlEl> From<$signal> for ElementMaybeSignal<$ty, $ty>
|
||||||
|
where
|
||||||
|
HtmlEl: ElementDescriptor + std::ops::Deref<Target = $ty> + Clone,
|
||||||
|
{
|
||||||
|
fn from(value: $signal) -> Self {
|
||||||
|
Self::Dynamic(Signal::derive(move || {
|
||||||
|
let value = value.get();
|
||||||
|
let el: &$ty = value.deref();
|
||||||
|
Some(el.clone())
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_from_signal_html_element!(Signal<HtmlElement<HtmlEl>>, web_sys::EventTarget);
|
||||||
|
impl_from_signal_html_element!(ReadSignal<HtmlElement<HtmlEl>>, web_sys::EventTarget);
|
||||||
|
impl_from_signal_html_element!(RwSignal<HtmlElement<HtmlEl>>, web_sys::EventTarget);
|
||||||
|
impl_from_signal_html_element!(Memo<HtmlElement<HtmlEl>>, web_sys::EventTarget);
|
||||||
|
|
||||||
|
impl_from_signal_html_element!(Signal<HtmlElement<HtmlEl>>, web_sys::Element);
|
||||||
|
impl_from_signal_html_element!(ReadSignal<HtmlElement<HtmlEl>>, web_sys::Element);
|
||||||
|
impl_from_signal_html_element!(RwSignal<HtmlElement<HtmlEl>>, web_sys::Element);
|
||||||
|
impl_from_signal_html_element!(Memo<HtmlElement<HtmlEl>>, web_sys::Element);
|
||||||
|
|
||||||
|
// From Signal<Option<leptos::html::HTMLElement>> /////////////////////////////////////////
|
||||||
|
|
||||||
|
macro_rules! impl_from_signal_html_element {
|
||||||
|
($signal:ty, $ty:ty) => {
|
||||||
|
impl<HtmlEl> From<$signal> for ElementMaybeSignal<$ty, $ty>
|
||||||
|
where
|
||||||
|
HtmlEl: ElementDescriptor + std::ops::Deref<Target = $ty> + Clone,
|
||||||
|
{
|
||||||
|
fn from(value: $signal) -> Self {
|
||||||
|
Self::Dynamic(Signal::derive(move || {
|
||||||
|
let el: Option<$ty> = value.get().map(|el| el.deref().clone());
|
||||||
|
el
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_from_signal_html_element!(Signal<Option<HtmlElement<HtmlEl>>>, web_sys::EventTarget);
|
||||||
|
impl_from_signal_html_element!(
|
||||||
|
ReadSignal<Option<HtmlElement<HtmlEl>>>,
|
||||||
|
web_sys::EventTarget
|
||||||
|
);
|
||||||
|
impl_from_signal_html_element!(RwSignal<Option<HtmlElement<HtmlEl>>>, web_sys::EventTarget);
|
||||||
|
impl_from_signal_html_element!(Memo<Option<HtmlElement<HtmlEl>>>, web_sys::EventTarget);
|
||||||
|
|
||||||
|
impl_from_signal_html_element!(Signal<Option<HtmlElement<HtmlEl>>>, web_sys::Element);
|
||||||
|
impl_from_signal_html_element!(ReadSignal<Option<HtmlElement<HtmlEl>>>, web_sys::Element);
|
||||||
|
impl_from_signal_html_element!(RwSignal<Option<HtmlElement<HtmlEl>>>, web_sys::Element);
|
||||||
|
impl_from_signal_html_element!(Memo<Option<HtmlElement<HtmlEl>>>, web_sys::Element);
|
||||||
|
|
|
@ -70,8 +70,8 @@ where
|
||||||
let (width, set_width) = create_signal(initial_size.width);
|
let (width, set_width) = create_signal(initial_size.width);
|
||||||
let (height, set_height) = create_signal(initial_size.height);
|
let (height, set_height) = create_signal(initial_size.height);
|
||||||
|
|
||||||
cfg_if! { if #[cfg(not(feature = "ssr"))] {
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
{
|
||||||
let box_ = box_.unwrap_or(web_sys::ResizeObserverBoxOptions::ContentBox);
|
let box_ = box_.unwrap_or(web_sys::ResizeObserverBoxOptions::ContentBox);
|
||||||
|
|
||||||
let target = target.into();
|
let target = target.into();
|
||||||
|
@ -126,7 +126,10 @@ where
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if !box_size.is_null() && !box_size.is_undefined() && box_size.length() > 0 {
|
} else if !box_size.is_null()
|
||||||
|
&& !box_size.is_undefined()
|
||||||
|
&& box_size.length() > 0
|
||||||
|
{
|
||||||
let format_box_size = if box_size.is_array() {
|
let format_box_size = if box_size.is_array() {
|
||||||
box_size.to_vec()
|
box_size.to_vec()
|
||||||
} else {
|
} else {
|
||||||
|
@ -162,7 +165,7 @@ where
|
||||||
},
|
},
|
||||||
WatchOptions::default().immediate(false),
|
WatchOptions::default().immediate(false),
|
||||||
);
|
);
|
||||||
}}
|
}
|
||||||
|
|
||||||
UseElementSizeReturn {
|
UseElementSizeReturn {
|
||||||
width: width.into(),
|
width: width.into(),
|
||||||
|
|
|
@ -75,12 +75,16 @@ where
|
||||||
T: Into<web_sys::Element> + Clone + 'static,
|
T: Into<web_sys::Element> + Clone + 'static,
|
||||||
F: FnMut(Vec<web_sys::ResizeObserverEntry>, web_sys::ResizeObserver) + 'static,
|
F: FnMut(Vec<web_sys::ResizeObserverEntry>, web_sys::ResizeObserver) + 'static,
|
||||||
{
|
{
|
||||||
cfg_if! { if #[cfg(feature = "ssr")] {
|
#[cfg(feature = "ssr")]
|
||||||
|
{
|
||||||
UseResizeObserverReturn {
|
UseResizeObserverReturn {
|
||||||
is_supported: Signal::derive(|| true),
|
is_supported: Signal::derive(|| true),
|
||||||
stop: || {}
|
stop: || {},
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
{
|
||||||
let closure_js = Closure::<dyn FnMut(js_sys::Array, web_sys::ResizeObserver)>::new(
|
let closure_js = Closure::<dyn FnMut(js_sys::Array, web_sys::ResizeObserver)>::new(
|
||||||
move |entries: js_sys::Array, observer| {
|
move |entries: js_sys::Array, observer| {
|
||||||
callback(
|
callback(
|
||||||
|
@ -121,20 +125,20 @@ where
|
||||||
move |targets, _, _| {
|
move |targets, _, _| {
|
||||||
cleanup();
|
cleanup();
|
||||||
|
|
||||||
if is_supported.get() && !targets.is_empty() {
|
if is_supported.get_untracked() && !targets.is_empty() {
|
||||||
let obs =
|
let obs = web_sys::ResizeObserver::new(
|
||||||
web_sys::ResizeObserver::new(closure_js.clone().as_ref().unchecked_ref())
|
closure_js.clone().as_ref().unchecked_ref(),
|
||||||
.expect("failed to create ResizeObserver");
|
)
|
||||||
|
.expect("failed to create ResizeObserver");
|
||||||
|
|
||||||
for target in targets.iter().flatten() {
|
for target in targets.iter().flatten() {
|
||||||
let target: web_sys::Element = target.clone().into();
|
let target: web_sys::Element = target.clone().into();
|
||||||
obs.observe_with_options(&target, &options.clone().into());
|
obs.observe_with_options(&target, &options.clone().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
observer.replace(Some(obs));
|
observer.replace(Some(obs));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
false,
|
true,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -146,7 +150,7 @@ where
|
||||||
on_cleanup(stop.clone());
|
on_cleanup(stop.clone());
|
||||||
|
|
||||||
UseResizeObserverReturn { is_supported, stop }
|
UseResizeObserverReturn { is_supported, stop }
|
||||||
}}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Options for [`use_resize_observer_with_options`].
|
/// Options for [`use_resize_observer_with_options`].
|
||||||
|
|
Loading…
Add table
Reference in a new issue