-
Notifications
You must be signed in to change notification settings - Fork 326
/
Copy pathsuggest-list.tsx
105 lines (98 loc) · 3.14 KB
/
suggest-list.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import * as React from 'react';
import classnames from 'classnames';
import SuggestItem from './suggest-item';
import {Suggest} from './types/suggest';
interface Props {
readonly isHidden: boolean;
readonly suggests: Suggest[];
readonly suggestsClassName?: string;
readonly hiddenClassName?: string;
readonly suggestItemClassName?: string;
readonly suggestItemActiveClassName?: string;
readonly activeSuggest: Suggest | null;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
readonly style: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
readonly suggestItemStyle: any;
readonly userInput: string;
readonly isHighlightMatch: boolean;
readonly listId: string;
readonly listLabel: string;
readonly onSuggestNoResults: () => void;
readonly renderSuggestItem?: (
suggest: Suggest,
userInput: string
) => React.JSX.Element | string;
readonly onSuggestSelect: (suggest: Suggest) => void;
readonly onSuggestMouseDown: (event: React.MouseEvent) => void;
readonly onSuggestMouseOut: (event: React.MouseEvent) => void;
}
/**
* The list with suggestions.
*/
export default class SuggestList extends React.PureComponent<Props, unknown> {
/**
* Whether or not it is hidden
*/
isHidden(): boolean {
return this.props.isHidden || this.props.suggests.length === 0;
}
/**
* There are new properties available for the list
*/
componentDidUpdate(prevProps: Props): void {
if (prevProps.suggests !== this.props.suggests) {
if (this.props.suggests.length === 0) {
this.props.onSuggestNoResults();
}
}
}
/**
* Render the view
* @return {Function} The React element to render
*/
render(): React.JSX.Element {
const classes = classnames(
'geosuggest__suggests',
this.props.suggestsClassName,
{'geosuggest__suggests--hidden': this.isHidden()},
{
[this.props.hiddenClassName || '']: this.props.hiddenClassName
? this.isHidden()
: null
}
);
return (
<ul
className={classes}
style={this.props.style}
role="listbox"
aria-label={this.props.listLabel}
id={this.props.listId}>
{this.props.suggests.map((suggest) => {
const isActive =
(this.props.activeSuggest &&
suggest.placeId === this.props.activeSuggest.placeId) ||
false;
return (
<SuggestItem
key={suggest.placeId}
className={suggest.className || ''}
userInput={this.props.userInput}
isHighlightMatch={this.props.isHighlightMatch}
suggest={suggest}
style={this.props.suggestItemStyle}
suggestItemClassName={this.props.suggestItemClassName}
isActive={isActive}
activeClassName={this.props.suggestItemActiveClassName}
onMouseDown={this.props.onSuggestMouseDown}
onMouseOut={this.props.onSuggestMouseOut}
onSelect={this.props.onSuggestSelect}
renderSuggestItem={this.props.renderSuggestItem}
/>
);
})}
</ul>
);
}
}