@@ -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