✨ Add ui use_long_press hook
This commit is contained in:
3
src/ui/hooks/mod.rs
Normal file
3
src/ui/hooks/mod.rs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pub use use_long_press::use_long_press;
|
||||||
|
|
||||||
|
mod use_long_press;
|
60
src/ui/hooks/use_long_press.rs
Normal file
60
src/ui/hooks/use_long_press.rs
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
use std::{cell::RefCell, time::Duration};
|
||||||
|
|
||||||
|
use async_std::task;
|
||||||
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
|
pub struct UseLongPress {
|
||||||
|
_timer: UseFuture,
|
||||||
|
pub handlers: Vec<Attribute>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn use_long_press(
|
||||||
|
duration: Duration,
|
||||||
|
on_press: impl FnMut() + 'static,
|
||||||
|
on_long_press: impl FnMut() + 'static,
|
||||||
|
) -> UseLongPress {
|
||||||
|
let on_press = std::rc::Rc::new(RefCell::new(on_press));
|
||||||
|
let on_press_cb = use_callback(move || {
|
||||||
|
let mut on_press = on_press.as_ref().borrow_mut();
|
||||||
|
on_press();
|
||||||
|
});
|
||||||
|
|
||||||
|
let on_long_press = std::rc::Rc::new(RefCell::new(on_long_press));
|
||||||
|
let on_long_press_cb = use_callback(move || {
|
||||||
|
let mut on_long_press = on_long_press.as_ref().borrow_mut();
|
||||||
|
on_long_press();
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut timer = use_future(move || async move {
|
||||||
|
task::sleep(duration).await;
|
||||||
|
on_long_press_cb.call();
|
||||||
|
});
|
||||||
|
|
||||||
|
timer.cancel();
|
||||||
|
|
||||||
|
let selection_begin_cb = move |_: Event<PlatformEventData>| {
|
||||||
|
timer.restart();
|
||||||
|
};
|
||||||
|
|
||||||
|
let selection_end_cb = move |_: Event<PlatformEventData>| {
|
||||||
|
if !timer.finished() {
|
||||||
|
timer.cancel();
|
||||||
|
on_press_cb.call();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut handlers = Vec::new();
|
||||||
|
for event_name in ["onmousedown", "ontouchstart"] {
|
||||||
|
let value = dioxus_core::AttributeValue::listener(selection_begin_cb);
|
||||||
|
handlers.push(Attribute::new(event_name, value, None, false));
|
||||||
|
}
|
||||||
|
for event_name in ["onmouseup", "ontouchend"] {
|
||||||
|
let value = dioxus_core::AttributeValue::listener(selection_end_cb);
|
||||||
|
handlers.push(Attribute::new(event_name, value, None, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
UseLongPress {
|
||||||
|
_timer: timer,
|
||||||
|
handlers,
|
||||||
|
}
|
||||||
|
}
|
@@ -1,4 +1,5 @@
|
|||||||
pub(crate) mod components;
|
pub(crate) mod components;
|
||||||
|
pub(crate) mod hooks;
|
||||||
pub(crate) mod layouts;
|
pub(crate) mod layouts;
|
||||||
pub(crate) mod store;
|
pub(crate) mod store;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user