material_yew/list/
request_selected.rs1use crate::event_details_into;
2use gloo::events::EventListener;
3use js_sys::Object;
4use wasm_bindgen::prelude::*;
5use web_sys::Element;
6use yew::prelude::*;
7
8pub enum RequestSelectedSource {
10 Interaction,
11 Property,
12}
13
14pub 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 request_selected_listener(
36 node_ref: &NodeRef,
37 callback: Callback<RequestSelectedDetail>,
38) -> EventListener {
39 let element = node_ref.cast::<Element>().unwrap();
40 EventListener::new(&element, "request-selected", move |event| {
41 let selected_detail = event_details_into::<RequestSelectedDetailJS>(event);
42 let selected_detail = RequestSelectedDetail {
43 selected: selected_detail.selected(),
44 source: match selected_detail.source().as_str() {
45 "interaction" => RequestSelectedSource::Interaction,
46 "property" => RequestSelectedSource::Property,
47 val => {
48 panic!(
49 "invalid `source` value {} received. This should never happen",
50 val
51 )
52 }
53 },
54 };
55 callback.emit(selected_detail);
56 })
57}