material_yew/list/
request_selected.rs

1use crate::event_details_into;
2use gloo::events::EventListener;
3use js_sys::Object;
4use wasm_bindgen::prelude::*;
5use web_sys::Element;
6use yew::prelude::*;
7
8/// Type for [`RequestSelectedDetail::source`]
9pub enum RequestSelectedSource {
10    Interaction,
11    Property,
12}
13
14/// The `RequestSelectedDetail` type
15///
16/// [MWC Documentation](https://github.com/material-components/material-components-web-components/tree/v0.27.0/packages/list#mwc-list-item-2)
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 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}