Skip to content

Commit f1cd946

Browse files
committed
fix selecting autocomplete
1 parent c67cad3 commit f1cd946

1 file changed

Lines changed: 40 additions & 27 deletions

File tree

src/components/search_bar.rs

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub fn SearchBar(
2121
let input_ref = NodeRef::<leptos::html::Input>::new();
2222
let navigate = use_navigate();
2323
let on_complete_cb = on_complete.clone();
24+
let has_interacted = RwSignal::new(false);
2425

2526
let on_search = move || {
2627
let q = query.get().trim().to_string();
@@ -62,6 +63,9 @@ pub fn SearchBar(
6263

6364
// Create a reactive validation of the query
6465
let validation = Memo::new(move |_| {
66+
if !has_interacted.get() {
67+
return None;
68+
}
6569
let q = query.get();
6670
if q.is_empty() {
6771
return None;
@@ -467,6 +471,15 @@ pub fn SearchBar(
467471
active_index.set(None);
468472
};
469473

474+
let apply_selection = {
475+
let set_query = set_query.clone();
476+
move |replacement: &str, active_start: usize| {
477+
let updated = apply_autocomplete_replacement(&query.get(), active_start, replacement);
478+
set_query.set(updated);
479+
active_index.set(None);
480+
}
481+
};
482+
470483
view! {
471484
<div class="w-full max-w-2xl">
472485
<div class="group relative">
@@ -493,17 +506,18 @@ pub fn SearchBar(
493506
on:keydown={
494507
let func = on_search.clone();
495508
move |ev| {
509+
if !has_interacted.get() {
510+
has_interacted.set(true);
511+
}
496512
if ev.key() == "Enter" {
497513
ev.prevent_default();
498514
let suggestions = flat_suggestions.get();
499515
if let Some(idx) = active_index.get() {
500516
if let Some(suggestion) = suggestions.get(idx) {
501-
let updated = apply_autocomplete_replacement(
502-
&query.get(),
503-
autocomplete_state.get().active_start,
517+
apply_selection(
504518
&suggestion.replacement,
519+
autocomplete_state.get().active_start,
505520
);
506-
set_query.set(updated);
507521
return;
508522
}
509523
}
@@ -535,12 +549,10 @@ pub fn SearchBar(
535549
if let Some(idx) = active_index.get() {
536550
if let Some(suggestion) = suggestions.get(idx) {
537551
ev.prevent_default();
538-
let updated = apply_autocomplete_replacement(
539-
&query.get(),
540-
autocomplete_state.get().active_start,
552+
apply_selection(
541553
&suggestion.replacement,
554+
autocomplete_state.get().active_start,
542555
);
543-
set_query.set(updated);
544556
}
545557
}
546558
}
@@ -622,12 +634,7 @@ pub fn SearchBar(
622634
class="flex cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 p-1 rounded"
623635
on:mousedown=move |ev| {
624636
ev.prevent_default();
625-
let updated = apply_autocomplete_replacement(
626-
&query.get(),
627-
query.get().len(),
628-
&syntax,
629-
);
630-
set_query.set(updated);
637+
apply_selection(&syntax, query.get().len());
631638
}
632639
>
633640
<span class="font-mono text-blue-600 dark:text-blue-400 font-semibold mr-2">
@@ -653,11 +660,12 @@ pub fn SearchBar(
653660
class="font-mono text-sm bg-gray-100 dark:bg-gray-700 p-2 rounded cursor-pointer hover:bg-gray-200 dark:hover:bg-gray-600"
654661
on:mousedown=move |ev| {
655662
ev.prevent_default();
656-
set_query.set(ex.to_string());
657-
}
658-
>
659-
{ex}
660-
</div>
663+
set_query.set(ex.to_string());
664+
active_index.set(None);
665+
}
666+
>
667+
{ex}
668+
</div>
661669
}
662670
})
663671
.collect_view()}
@@ -685,14 +693,15 @@ pub fn SearchBar(
685693
}
686694
let symbol_column = symbol_group
687695
.map(|group| {
688-
render_group_view(
689-
group,
690-
active_idx,
691-
active_start,
692-
current_query.clone(),
693-
set_query,
694-
)
695-
});
696+
render_group_view(
697+
group,
698+
active_idx,
699+
active_start,
700+
current_query.clone(),
701+
set_query,
702+
active_index,
703+
)
704+
});
696705
let dsl_column = dsl_group
697706
.map(|group| {
698707
render_group_view(
@@ -701,6 +710,7 @@ pub fn SearchBar(
701710
active_start,
702711
current_query.clone(),
703712
set_query,
713+
active_index,
704714
)
705715
});
706716
let two_column = if symbol_column.is_some() || dsl_column.is_some() {
@@ -728,6 +738,7 @@ pub fn SearchBar(
728738
active_start,
729739
current_query.clone(),
730740
set_query,
741+
active_index,
731742
)
732743
}
733744
/>
@@ -813,6 +824,7 @@ fn render_group_view(
813824
active_start: usize,
814825
current_query: String,
815826
set_query: WriteSignal<String>,
827+
active_index: RwSignal<Option<usize>>,
816828
) -> impl IntoView {
817829
let group_title = group.title;
818830
let items = group.items;
@@ -848,6 +860,7 @@ fn render_group_view(
848860
&replacement,
849861
);
850862
set_query.set(updated);
863+
active_index.set(None);
851864
}
852865
>
853866
<div>

0 commit comments

Comments
 (0)