1- import React , { useState , useEffect } from 'react' ;
1+ import React , { useState , useEffect } from 'react' ;
2+ import { TextField , Autocomplete , Button , Box } from '@mui/material' ;
23import axios from '../../axios.js' ;
3- import Suggestions from './Suggestions/Suggestions' ;
44
5- import "./SearchBar.css" ;
5+ export default function SearchBar2 ( { postSearchHandler, query } ) {
6+ const [ q , setQ ] = useState ( ( ) => query || '' ) ;
7+ const [ suggestions , setSuggestions ] = useState ( [ ] ) ;
68
7- export default function SearchBar ( props ) {
9+ const search = ( value ) => {
10+ console . log ( `search: ${ value } ` ) ;
11+ postSearchHandler ( value ) ;
12+ } ;
813
9- let [ q , setQ ] = useState ( "" ) ;
10- let [ suggestions , setSuggestions ] = useState ( [ ] ) ;
11- let [ showSuggestions , setShowSuggestions ] = useState ( false ) ;
14+ useEffect ( ( ) => {
15+ console . log ( `useEffect getSuggestions: ${ q } ` ) ;
16+ if ( q ) {
17+ axios . post ( '/api/suggest' , { q, top : 5 , suggester : 'sg' } )
18+ . then ( response => {
19+ setSuggestions ( response . data . suggestions . map ( s => s . text ) ) ;
20+ } ) . catch ( error => {
21+ console . log ( error ) ;
22+ setSuggestions ( [ ] ) ;
23+ } ) ;
24+ } } , [ q ] ) ;
1225
13- const onSearchHandler = ( ) => {
14- props . postSearchHandler ( q ) ;
15- setShowSuggestions ( false ) ;
16- }
1726
18- const suggestionClickHandler = ( s ) => {
19- document . getElementById ( "search-box" ) . value = s ;
20- setShowSuggestions ( false ) ;
21- props . postSearchHandler ( s ) ;
22- }
27+ const onInputChangeHandler = ( event , value ) => {
28+ console . log ( `onInputChangeHandler: ${ value } ` ) ;
29+ setQ ( value ) ;
30+ } ;
2331
24- const onEnterButton = ( event ) => {
25- if ( event . keyCode === 13 ) {
26- onSearchHandler ( ) ;
27- }
28- }
2932
30- const onChangeHandler = ( ) => {
31- var searchTerm = document . getElementById ( "search-box" ) . value ;
32- setShowSuggestions ( true ) ;
33- setQ ( searchTerm ) ;
33+ const onChangeHandler = ( event , value ) => {
34+ console . log ( `onChangeHandler: ${ value } ` ) ;
35+ setQ ( value ) ;
36+ search ( value ) ;
37+ } ;
3438
35- // use this prop if you want to make the search more reactive
36- if ( props . searchChangeHandler ) {
37- props . searchChangeHandler ( searchTerm ) ;
38- }
39- }
39+ const onEnterButton = ( event ) => {
40+ // console.log(`onEnterButton: ${q}`);
41+ // if (event.keyCode === 13) {
42+ // console.log(`Enter key pressed ${q}`);
43+ // search(q);
44+ // }
45+ } ;
4046
41- useEffect ( _ => {
42- const timer = setTimeout ( ( ) => {
43- const body = {
44- q : q ,
45- top : 5 ,
46- suggester : 'sg'
47- } ;
48-
49- if ( q === '' ) {
50- setSuggestions ( [ ] ) ;
51- } else {
52- axios . post ( '/api/suggest' , body )
53- . then ( response => {
54- console . log ( JSON . stringify ( response . data ) )
55- setSuggestions ( response . data . suggestions ) ;
56- } )
57- . catch ( error => {
58- console . log ( error ) ;
59- setSuggestions ( [ ] ) ;
60- } ) ;
61- }
62- } , 300 ) ;
63- return ( ) => clearTimeout ( timer ) ;
64- } , [ q , props ] ) ;
65-
66- var suggestionDiv ;
67- if ( showSuggestions ) {
68- suggestionDiv = ( < Suggestions suggestions = { suggestions } suggestionClickHandler = { ( s ) => suggestionClickHandler ( s ) } > </ Suggestions > ) ;
69- } else {
70- suggestionDiv = ( < div > </ div > ) ;
71- }
72-
73- return (
74- < div >
75- < div className = "input-group" onKeyDown = { e => onEnterButton ( e ) } >
76- < div className = "suggestions" >
77- < input
78- autoComplete = "off" // setting for browsers; not the app
79- type = "text"
80- id = "search-box"
81- className = "form-control rounded-0"
82- placeholder = "What are you looking for?"
83- onChange = { onChangeHandler }
84- defaultValue = { props . q }
85- onBlur = { ( ) => setShowSuggestions ( false ) }
86- onClick = { ( ) => setShowSuggestions ( true ) } >
87- </ input >
88- { suggestionDiv }
89- </ div >
90- < div className = "input-group-btn" >
91- < button className = "btn btn-primary rounded-0" type = "submit" onClick = { onSearchHandler } >
92- Search
93- </ button >
94- </ div >
95- </ div >
96- </ div >
97- ) ;
98- } ;
47+ return (
48+ < div
49+ className = "input-group"
50+ onKeyDown = { onEnterButton }
51+ style = { { width : '95%' , display : 'flex' , justifyContent : 'center' , alignItems : 'center' , margin : '0 auto' } }
52+ >
53+ < Box sx = { { display : 'flex' , alignItems : 'center' , width : '75%' , minWidth : '390px' } } >
54+ < Autocomplete
55+ freeSolo
56+ value = { q }
57+ options = { suggestions }
58+ onInputChange = { onInputChangeHandler }
59+ onChange = { onChangeHandler }
60+ disableClearable
61+ sx = { {
62+ width : '75%' ,
63+ '& .MuiAutocomplete-endAdornment' : {
64+ display : 'none'
65+ }
66+ } }
67+ renderInput = { ( params ) => (
68+ < TextField
69+ { ...params }
70+ id = "search-box"
71+ className = "form-control rounded-0"
72+ placeholder = "What are you looking for?"
73+ onBlur = { ( ) => setSuggestions ( [ ] ) }
74+ onClick = { ( ) => setSuggestions ( [ ] ) }
75+ />
76+ ) }
77+ />
78+ < div className = "input-group-btn" style = { { marginLeft : '10px' } } >
79+ < Button variant = "contained" color = "primary" >
80+ Search
81+ </ Button >
82+ </ div >
83+ </ Box >
84+ </ div >
85+ ) ;
86+ }
0 commit comments