material_yew/text_inputs/
mod.rs

1#[cfg(feature = "textfield")]
2mod textfield;
3#[cfg(feature = "textfield")]
4pub use textfield::*;
5
6#[cfg(any(feature = "textfield", feature = "textarea"))]
7pub(crate) mod validity_state;
8#[cfg(any(feature = "textfield", feature = "textarea"))]
9pub use validity_state::ValidityState;
10
11#[cfg(any(feature = "textfield", feature = "textarea"))]
12pub(crate) mod text_field_type;
13#[cfg(any(feature = "textfield", feature = "textarea"))]
14pub use text_field_type::*;
15
16#[cfg(feature = "textarea")]
17mod textarea;
18#[cfg(feature = "textarea")]
19pub use textarea::*;
20
21#[cfg(any(feature = "textfield", feature = "textarea"))]
22pub use web_sys::ValidityState as NativeValidityState;
23
24use std::rc::Rc;
25
26use gloo::events::EventListener;
27use wasm_bindgen::JsValue;
28use web_sys::{Element, Event};
29use yew::{Callback, NodeRef};
30
31#[cfg(any(feature = "textfield", feature = "textarea"))]
32pub(crate) type ValidityTransformFn = dyn Fn(String, NativeValidityState) -> ValidityState;
33
34#[cfg(any(feature = "textfield", feature = "textarea"))]
35#[derive(Clone)]
36/// Owned function for validity props
37pub struct ValidityTransform(pub(crate) Rc<ValidityTransformFn>);
38
39#[cfg(any(feature = "textfield", feature = "textarea"))]
40impl ValidityTransform {
41    pub(crate) fn new<F: Fn(String, NativeValidityState) -> ValidityState + 'static>(
42        func: F,
43    ) -> ValidityTransform {
44        ValidityTransform(Rc::new(func))
45    }
46}
47
48impl PartialEq for ValidityTransform {
49    #[allow(clippy::vtable_address_comparisons)]
50    fn eq(&self, other: &Self) -> bool {
51        Rc::ptr_eq(&self.0, &other.0)
52    }
53}
54
55fn set_on_input_handler(
56    node_ref: &NodeRef,
57    callback: Callback<String>,
58    convert: impl Fn((Event, JsValue)) -> String + 'static,
59) -> EventListener {
60    let element = node_ref.cast::<Element>().unwrap();
61    EventListener::new(&element, "input", move |event: &Event| {
62        let js_value = JsValue::from(event);
63
64        callback.emit(convert((event.clone(), js_value)))
65    })
66}