This repository has been archived by the owner on May 6, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MultiSelect.js
114 lines (103 loc) · 3.1 KB
/
MultiSelect.js
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
106
107
108
109
110
111
112
113
114
'use strict'
const { useState } = require('react')
const h = require('react-hyperscript')
const { TextGroup } = require(
'@zendeskgarden/react-textfields')
const { FieldContainer } = require(
'@zendeskgarden/react-selection')
const { AutocompleteContainer } = require(
'@zendeskgarden/react-autocomplete')
const suggestionListCreator = require('./suggestion-list-creator')
const suggestionTriggerCreator = require('./suggestion-trigger-creator')
module.exports = function({
placeholder,
suggestions,
selectedKeys,
renderSelectedKey,
renderSectionTitle,
getSectionSuggestions,
onFocusChange,
onSelectionChange,
onSuggestionsRequested
}) {
const [inputValue, setInputValue] = useState('')
const [focusedKey, setFocusedKey] = useState(undefined)
const [tagFocusedKey, setTagFocusedKey] = useState(undefined)
const [isFocused, setFocused] = useState(false)
const [isOpen, setOpen] = useState(false)
const [wrapperRef, setWrapperRef] = useState(undefined)
const setQuery = query => {
setInputValue(query)
onSuggestionsRequested(query)
}
const onSelect = key => {
const newSelectedKeys = new Set(selectedKeys)
if (newSelectedKeys.has(key)) {
newSelectedKeys.delete(key)
} else {
newSelectedKeys.add(key)
}
setInputValue('')
onSelectionChange(newSelectedKeys)
return true // returning true keeps the menu open
}
const onStateChange = newState => {
const oldFocus = focusedKey || tagFocusedKey
const newFocus = newState.focusedKey || newState.tagFocusedKey
if (newFocus !== oldFocus) {
onFocusChange(newFocus)
}
Object.keys(newState).forEach(key => {
if (key === 'focusedKey') {
setFocusedKey(newState.focusedKey)
} else if (key === 'tagFocusedKey') {
setTagFocusedKey(newState.tagFocusedKey)
} else if (key === 'isOpen') {
if ((newState.isOpen !== isOpen) && (! newState.isOpen)) {
setQuery('')
}
setOpen(newState.isOpen)
}
})
}
return (
h(FieldContainer, [
({ getInputProps: getFieldInputProps }) => (
h(TextGroup, {style: {maxWidth: 400, minHeight: 300}}, [
h(AutocompleteContainer,
{
isOpen,
tagFocusedKey,
focusedKey,
onSelect,
onStateChange,
trigger: suggestionTriggerCreator({
getFieldInputProps,
inputValue,
isFocused,
onFocusChange,
onSelectionChange,
placeholder,
renderSelectedKey,
selectedKeys,
setFocused,
setQuery,
setTagFocusedKey,
setWrapperRef
})
},
[
suggestionListCreator({
suggestions,
selectedKeys,
getSectionSuggestions,
renderSectionTitle,
wrapperRef
})
]
) // end AutocompleteContainer
]) // end TextGroup
)
]) // end FieldContainer
)
}