This repository has been archived by the owner on Dec 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 33
/
suggestions.tsx
97 lines (89 loc) · 2.57 KB
/
suggestions.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
import { styled } from '@edtr-io/ui'
import * as React from 'react'
import { TextConfig } from '..'
const Suggestion = styled.div<{ active: boolean; config: TextConfig }>(
({ active, config }) => {
const { theme } = config
return {
height: '32px',
padding: '4px 8px',
cursor: 'pointer',
backgroundColor: active
? theme.suggestions.background.highlight
: theme.suggestions.background.default,
borderRadius: '4px',
'&:hover': {
background: theme.suggestions.background.highlight
}
}
}
)
const Container = styled.div({
padding: '10px'
})
const StyledText = styled.span<{ highlight: boolean; config: TextConfig }>(
({ highlight, config }) => {
const { theme } = config
return {
color: highlight
? theme.suggestions.text.highlight
: theme.suggestions.text.default
}
}
)
export class Suggestions extends React.Component<SuggestionProps> {
public render() {
return (
<Container>
{this.props.options.length === 0
? 'keine Einträge vorhanden'
: this.props.options.map((option, index) => {
const displayText = option[0]
const fragments = displayText
.split(
new RegExp(`(${escapeRegExp(this.props.currentValue)})`, 'i')
)
.map(text => {
return {
text,
highlight:
text.toLowerCase() ===
this.props.currentValue.toLowerCase()
}
})
return (
<Suggestion
key={index}
active={index === this.props.selected}
onMouseDown={() => this.props.onSelect(option[1])}
config={this.props.config}
>
{fragments.map((f, index) => {
return (
<StyledText
key={index}
highlight={f.highlight}
config={this.props.config}
>
{f.text}
</StyledText>
)
})}
</Suggestion>
)
})}
</Container>
)
function escapeRegExp(string: string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
}
}
}
export interface SuggestionProps {
config: TextConfig
onSelect: Function
options: string[][]
selected?: number
currentValue: string
name: string
}