This repository has been archived by the owner on Dec 21, 2021. It is now read-only.
/
search_bar.tsx
76 lines (65 loc) · 1.78 KB
/
search_bar.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import React from 'react';
import debounce from 'lodash.debounce';
import * as Input from '../input';
import * as Icon from '../icons';
interface SearchBarProps {
query?: string;
emitDelay?: number;
onChange: (value: string) => void;
placeholder?: string;
}
interface SearchBarState {
query: string;
}
class SearchBar extends React.Component<SearchBarProps, SearchBarState> {
static defaultProps = {
emitDelay: 0,
}
debouncedEmit = (({ onChange, emitDelay }) => debounce(
onChange, emitDelay,
))(this.props);
constructor(props: Readonly<SearchBarProps>) {
super(props);
const { query = '' } = props;
this.state = {
query,
};
this.onChange = this.onChange.bind(this);
}
componentDidMount() {
const { query } = this.state;
if (query !== '') {
this.debouncedEmit(query);
}
}
componentWillUnmount() {
this.debouncedEmit.cancel();
}
onChange(event: React.ChangeEvent<HTMLInputElement>) {
const { value: query } = event.target;
this.setState({
query,
});
event.persist();
this.debouncedEmit(query);
}
render() {
const { query } = this.state;
const { onChange } = this;
const { placeholder } = this.props;
return (
<div className="search-bar">
<span className="search-bar__icon">
<Icon.MagnifierSmall />
</span>
<Input.Text
className="search-bar__input"
value={query}
onChange={onChange}
placeholder={placeholder}
/>
</div>
);
}
}
export { SearchBar };