material_dioxus/list/
request_selected.rs1use crate::{event_details_into, StaticCallback};
2use gloo::events::EventListener;
3use js_sys::Object;
4use wasm_bindgen::prelude::*;
5
6#[derive(Debug, Clone)]
8pub enum RequestSelectedSource {
9 Interaction,
10 Property,
11}
12
13#[derive(Debug, Clone)]
17pub struct RequestSelectedDetail {
18 pub selected: bool,
19 pub source: RequestSelectedSource,
20}
21
22#[wasm_bindgen]
23extern "C" {
24 #[derive(Debug)]
25 #[wasm_bindgen(extends = Object)]
26 type RequestSelectedDetailJS;
27
28 #[wasm_bindgen(method, getter)]
29 fn selected(this: &RequestSelectedDetailJS) -> bool;
30
31 #[wasm_bindgen(method, getter)]
32 fn source(this: &RequestSelectedDetailJS) -> String;
33}
34
35pub fn make_request_selected_listener(
36 target: &web_sys::Element,
37 callback: StaticCallback<RequestSelectedDetail>,
38) -> EventListener {
39 EventListener::new(target, "request-selected", move |event| {
40 let selected_detail = event_details_into::<RequestSelectedDetailJS>(event);
41 let selected_detail = RequestSelectedDetail {
42 selected: selected_detail.selected(),
43 source: match selected_detail.source().as_str() {
44 "interaction" => RequestSelectedSource::Interaction,
45 "property" => RequestSelectedSource::Property,
46 val => {
47 panic!(
48 "invalid `source` value {} received. This should never happen",
49 val
50 )
51 }
52 },
53 };
54 callback.call(selected_detail);
55 })
56}