euv_ui/hook/use_resize_observer/
impl.rs1use super::*;
2
3impl UseResizeObserver {
5 pub(crate) fn new() -> Self {
11 Self {
12 target: NodeRef::new(),
13 width: Signal::create(0.0),
14 height: Signal::create(0.0),
15 teardown: Rc::new(RefCell::new(None)),
16 }
17 }
18
19 pub fn current_width(&self) -> f64 {
25 self.get_width().get()
26 }
27
28 pub fn current_height(&self) -> f64 {
34 self.get_height().get()
35 }
36
37 pub(crate) fn attach(&self) {
43 #[cfg(target_arch = "wasm32")]
44 {
45 let width: Signal<f64> = self.get_width();
46 let height: Signal<f64> = self.get_height();
47 let closure: Closure<dyn FnMut(Array)> =
48 Closure::wrap(Box::new(move |entries: Array| {
49 for entry in entries.iter() {
50 let Ok(entry) = entry.dyn_into::<ResizeObserverEntry>() else {
51 continue;
52 };
53 let rect: DomRectReadOnly = entry.content_rect();
54 width.set(rect.width());
55 height.set(rect.height());
56 }
57 }));
58 let Ok(observer) = ResizeObserver::new(closure.as_ref().unchecked_ref()) else {
59 return;
60 };
61 let target: NodeRef<Element> = self.get_target().clone();
62 let observed: ResizeObserver = observer.clone();
63 after_mount(move || {
64 if let Some(element) = target.get_cloned() {
65 observed.observe(&element);
66 }
67 });
68 let disconnect: Rc<RefCell<Option<ResizeObserver>>> =
69 Rc::new(RefCell::new(Some(observer)));
70 *self.get_teardown().borrow_mut() = Some(Box::new(move || {
71 if let Some(observer) = disconnect.borrow_mut().take() {
72 observer.disconnect();
73 }
74 }));
75 }
76 }
77
78 pub(crate) fn detach(&self) {
80 let taken: Option<Box<dyn Fn()>> = self.get_teardown().borrow_mut().take();
81 if let Some(teardown) = taken {
82 teardown();
83 }
84 }
85}