material_dioxus/list/
request_selected.rs

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