dioxus_web/events/
resize.rs1use dioxus_html::{geometry::PixelsSize, HasResizeData, ResizeResult};
2use wasm_bindgen::JsCast;
3use web_sys::{CustomEvent, Event, ResizeObserverEntry};
4
5use super::{Synthetic, WebEventExt};
6
7impl From<Event> for Synthetic<ResizeObserverEntry> {
8 #[inline]
9 fn from(e: Event) -> Self {
10 <Synthetic<ResizeObserverEntry> as From<&Event>>::from(&e)
11 }
12}
13
14impl From<&Event> for Synthetic<ResizeObserverEntry> {
15 #[inline]
16 fn from(e: &Event) -> Self {
17 let e: &CustomEvent = e.unchecked_ref();
18 let value = e.detail();
19 Self::new(value.unchecked_into::<ResizeObserverEntry>())
20 }
21}
22
23impl HasResizeData for Synthetic<ResizeObserverEntry> {
24 fn as_any(&self) -> &dyn std::any::Any {
25 &self.event
26 }
27
28 fn get_border_box_size(&self) -> ResizeResult<PixelsSize> {
29 extract_first_size(self.event.border_box_size())
30 }
31
32 fn get_content_box_size(&self) -> ResizeResult<PixelsSize> {
33 extract_first_size(self.event.content_box_size())
34 }
35}
36
37impl WebEventExt for dioxus_html::ResizeData {
38 type WebEvent = web_sys::ResizeObserverEntry;
39
40 #[inline(always)]
41 fn try_as_web_event(&self) -> Option<web_sys::ResizeObserverEntry> {
42 self.downcast::<web_sys::ResizeObserverEntry>().cloned()
43 }
44}
45
46fn extract_first_size(resize_observer_output: js_sys::Array) -> ResizeResult<PixelsSize> {
47 let first = resize_observer_output.get(0);
48 let size = first.unchecked_into::<web_sys::ResizeObserverSize>();
49
50 let inline_size = size.inline_size();
52 let block_size = size.block_size();
54
55 Ok(PixelsSize::new(inline_size, block_size))
56}