Skip to main content

impulse_thaw/auto_complete/
auto_complete_option.rs

1use super::AutoCompleteInjection;
2use crate::combobox::listbox::ListboxInjection;
3use leptos::prelude::*;
4use thaw_utils::class_list;
5
6#[component]
7pub fn AutoCompleteOption(
8    #[prop(optional, into)] class: MaybeProp<String>,
9    /// Option ID.
10    value: String,
11    children: Children,
12) -> impl IntoView {
13    let auto_complete = AutoCompleteInjection::expect_context();
14    let listbox = ListboxInjection::expect_context();
15    let is_selected = Memo::new({
16        let value = value.clone();
17        let auto_complete = auto_complete.clone();
18        move |_| auto_complete.is_selected(&value)
19    });
20    let id = uuid::Uuid::new_v4().to_string();
21    {
22        auto_complete.insert_option(id.clone(), value.clone());
23        let id = id.clone();
24        listbox.trigger();
25        let auto_complete = auto_complete.clone();
26        on_cleanup(move || {
27            auto_complete.remove_option(&id);
28            listbox.trigger();
29        });
30    }
31
32    view! {
33        <div
34            class=class_list!["thaw-auto-complete-option", class]
35            role="option"
36            id=id
37            aria-selected=move || if is_selected.get() { "true" } else { "false" }
38            on:click=move |_| auto_complete.select_option(value.clone())
39        >
40            {children()}
41        </div>
42    }
43}