1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//! This crate provides a highly configurable auto-completion component
//!
//! A minimal example that showcases the main building blocks:
//!
//! ```rust
//! use yew::prelude::*;
//! use yew_autocomplete::{view::Bulma, Autocomplete, ItemResolver, ItemResolverResult};
//! use yew_commons::FnProp;
//!
//! let onchange = |_: Vec<String>| ();
//! let resolve_items: ItemResolver<String> =
//!     FnProp::from(|_: String| -> ItemResolverResult<String>  {
//!         Box::pin(async { Ok(Vec::<String>::new()) })
//!     });
//!
//! html! {
//!     <Autocomplete<String>
//!         {resolve_items}
//!         {onchange}
//!         auto = false
//!     >
//!         <Bulma<String> />
//!     </Autocomplete<String>>
//! };
//! ```

mod autocomplete;
mod autocomplete_state;
pub mod view;

pub use autocomplete::*;
use web_sys::{Event, HtmlInputElement};
use yew::{html::Scope, Callback, Component, TargetCast};

pub(crate) fn make_callback<M, C, E: AsRef<Event>, F: Fn(String) -> M + 'static>(
    link: &Scope<C>,
    f: F,
) -> Callback<E>
where
    C: Component<Message = M>,
{
    link.callback(move |e: E| {
        let input = e.target_dyn_into::<HtmlInputElement>().unwrap();
        f(input.value())
    })
}