1 | import React, { useState } from 'react'
|
2 | import { ScrollView } from 'react-native'
|
3 | import TextInput from '../forms/TextInput'
|
4 | import Popover from '../popups/Popover'
|
5 | import Menu from '../Menu'
|
6 | import propTypes from 'prop-types'
|
7 |
|
8 | const AutoSuggest = ({
|
9 | data,
|
10 | placeholder,
|
11 | popoverHeight,
|
12 | renderItem,
|
13 | value,
|
14 | onChange
|
15 | }) => {
|
16 | const [isFind, setIsFind] = useState(false)
|
17 | const onFocus = () => setIsFind(true)
|
18 | const onBlur = () => setIsFind(false)
|
19 |
|
20 | let _data = data.filter((item, index) => {
|
21 | if (item === value) return
|
22 | return value ? !!item.match(new RegExp('^' + value, 'gi')) : true
|
23 | }).splice(0, 30)
|
24 |
|
25 | const renderItems = _data.map((item, index) => {
|
26 | if (renderItem) return renderItem(item, index, item === value)
|
27 | return pug`
|
28 | Menu.Item(
|
29 | key=index
|
30 | onPress=()=> onChange(item)
|
31 | active=item === value
|
32 | )= item
|
33 | `
|
34 | })
|
35 |
|
36 | return pug`
|
37 | Popover(
|
38 | height=popoverHeight
|
39 | visible=(!!_data.length && isFind)
|
40 | positionHorizontal="right"
|
41 | onDismiss=()=> {}
|
42 | )
|
43 | Popover.Caption
|
44 | TextInput(
|
45 | placeholder=placeholder
|
46 | onFocus=onFocus
|
47 | onBlur=onBlur
|
48 | onChangeText=t=> onChange(t)
|
49 | value=value
|
50 | )
|
51 | ScrollView
|
52 | Menu= renderItems
|
53 | `
|
54 | }
|
55 |
|
56 | AutoSuggest.defaultProps = {
|
57 | data: [],
|
58 | placeholder: 'Select value',
|
59 | popoverHeight: 300,
|
60 | value: ''
|
61 | }
|
62 |
|
63 | AutoSuggest.propTypes = {
|
64 | placeholder: propTypes.string,
|
65 | popoverHeight: propTypes.number,
|
66 | value: propTypes.oneOfType([propTypes.string, propTypes.number]),
|
67 | data: propTypes.array,
|
68 | renderItem: propTypes.func,
|
69 | onChange: propTypes.func
|
70 | }
|
71 |
|
72 | export default AutoSuggest
|