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- }
17-
18- const suggestionClickHandler = ( s ) => {
19- document . getElementById ( "search-box" ) . value = s ;
20- setShowSuggestions ( false ) ;
21- props . postSearchHandler ( s ) ;
22- }
2326
24- const onEnterButton = ( event ) => {
25- if ( event . keyCode === 13 ) {
26- onSearchHandler ( ) ;
27- }
28- }
29-
30- const onChangeHandler = ( ) => {
31- var searchTerm = document . getElementById ( "search-box" ) . value ;
32- setShowSuggestions ( true ) ;
33- setQ ( searchTerm ) ;
34-
35- // use this prop if you want to make the search more reactive
36- if ( props . searchChangeHandler ) {
37- props . searchChangeHandler ( searchTerm ) ;
38- }
39- }
27+ const onInputChangeHandler = ( event , value ) => {
28+ console . log ( `onInputChangeHandler: ${ value } ` ) ;
29+ setQ ( value ) ;
30+ } ;
4031
41- useEffect ( _ => {
42- const timer = setTimeout ( ( ) => {
43- const body = {
44- q : q ,
45- top : 5 ,
46- suggester : 'sg'
47- } ;
4832
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 ] ) ;
33+ const onChangeHandler = ( event , value ) => {
34+ console . log ( `onChangeHandler: ${ value } ` ) ;
35+ setQ ( value ) ;
36+ search ( value ) ;
37+ } ;
6538
66- var suggestionDiv ;
67- if ( showSuggestions ) {
68- suggestionDiv = ( < Suggestions suggestions = { suggestions } suggestionClickHandler = { ( s ) => suggestionClickHandler ( s ) } > </ Suggestions > ) ;
69- } else {
70- suggestionDiv = ( < div > </ div > ) ;
39+ const onEnterButton = ( event ) => {
40+ console . log ( `onEnterButton: ${ q } ` ) ;
41+ // if enter key is pressed
42+ if ( event . key === 'Enter' ) {
43+ search ( q ) ;
7144 }
45+ } ;
7246
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+ style = { { width : '95%' , display : 'flex' , justifyContent : 'center' , alignItems : 'center' , margin : '0 auto' } }
51+ >
52+ < Box sx = { { display : 'flex' , alignItems : 'center' , width : '75%' , minWidth : '390px' } } >
53+ < Autocomplete
54+ freeSolo
55+ value = { q }
56+ options = { suggestions }
57+ onInputChange = { onInputChangeHandler }
58+ onChange = { onChangeHandler }
59+ disableClearable
60+ sx = { {
61+ width : '75%' ,
62+ '& .MuiAutocomplete-endAdornment' : {
63+ display : 'none'
64+ }
65+ } }
66+ renderInput = { ( params ) => (
67+ < TextField
68+ { ...params }
69+ id = "search-box"
70+ className = "form-control rounded-0"
71+ placeholder = "What are you looking for?"
72+ onBlur = { ( ) => setSuggestions ( [ ] ) }
73+ onClick = { ( ) => setSuggestions ( [ ] ) }
74+ />
75+ ) }
76+ />
77+ < div className = "input-group-btn" style = { { marginLeft : '10px' } } >
78+ < Button variant = "contained" color = "primary" onClick = { ( ) => {
79+ console . log ( `search button: ${ q } ` ) ;
80+ search ( q ) }
81+ } >
82+ Search
83+ </ Button >
84+ </ div >
85+ </ Box >
86+ </ div >
87+ ) ;
88+ }
0 commit comments