import React from 'react'; import { View, Text, StyleSheet, Image, TouchableOpacity, ScrollView, Animated, TextInput, Keyboard } from 'react-native'; import { ListaSelecaoProps } from '../..'; type Modelo = { chave?: any; valor?: any; desactivado?: boolean | undefined } const ListaSelecao: React.FC = ({ setSelecionada, textoCaixaSelecao, estiloCaixaSelecao, estiloTextoCaixaSelecao, estiloLista, estiloItemLista, estiloTextoItemLista, maxAltura, dados, selecionada = "", iconePesquisar = false, iconeSeta = false, pesquisar = true, textoCampoPesquisar = "pesquisar", aoSelecionar = () => { }, fontFamily, textoItemNaoEncontrado = "Nenhum dado encontrado", estiloItemDesabilitado, estiloTextoItemDesabilitado, salvar = 'chave', ListaVisivel = false, iconeFechar = false, }) => { const [_primeiraRenderizacao, _setPrimeiraRenderizacao] = React.useState(true); const [visivel, setVisivel] = React.useState(ListaVisivel); const [altura, setAltura] = React.useState(200) const valorAnimado = React.useRef(new Animated.Value(0)).current; const [dadosFiltrados, setDadosFiltrados] = React.useState(dados) const deslizeParaBaixo = () => { setVisivel(true) Animated.timing(valorAnimado, { toValue: altura, duration: 500, useNativeDriver: false, }).start() } const deslizarParaCima = () => { Animated.timing(valorAnimado, { toValue: 0, duration: 500, useNativeDriver: false, }).start(() => setVisivel(false)) } React.useEffect(() => { if (maxAltura) setAltura(maxAltura) }, [maxAltura]) React.useEffect(() => { setDadosFiltrados(dados); }, [dados]) React.useEffect(() => { if (_primeiraRenderizacao) { _setPrimeiraRenderizacao(false); return; } aoSelecionar() }, [selecionada]) React.useEffect(() => { if (!_primeiraRenderizacao) { if (ListaVisivel) deslizeParaBaixo(); else deslizarParaCima(); } }, [ListaVisivel]) return ( { (visivel && pesquisar) ? { (!iconePesquisar) ? : iconePesquisar } { let result = dados.filter((item: Modelo) => { val.toLowerCase(); let row = item.valor.toLowerCase() return row.search(val.toLowerCase()) > -1; }); setDadosFiltrados(result) }} style={[{ padding: 0, height: 20, flex: 1, fontFamily }, estiloTextoCaixaSelecao]} /> deslizarParaCima()} > { (!iconeFechar) ? : iconeFechar } : { if (!visivel) { Keyboard.dismiss(); deslizeParaBaixo() } else { deslizarParaCima() } }}> {(selecionada == "") ? ((textoCaixaSelecao) ? textoCaixaSelecao : 'selecione a opção') : selecionada} { (!iconeSeta) ? : iconeSeta } } { (visivel) ? { (dadosFiltrados.length >= 1) ? dadosFiltrados.map((item: Modelo, index: number) => { let chave = item.chave ?? item.valor ?? item; let valor = item.valor ?? item; let desactivado = item.desactivado ?? false; if (desactivado) { return ( { }}> {valor} ) } else { return ( { if (salvar === 'valor') { setSelecionada(valor); } else { setSelecionada(chave) } deslizarParaCima() setTimeout(() => { setDadosFiltrados(dados) }, 800) }}> {valor} ) } }) : {textoItemNaoEncontrado} } : null } ) } export default ListaSelecao; const styles = StyleSheet.create({ embrulho: { borderWidth: 1, borderRadius: 10, borderColor: 'gray', paddingHorizontal: 20, paddingVertical: 12, flexDirection: 'row', justifyContent: 'space-between' }, visivel: { borderWidth: 1, borderRadius: 10, borderColor: 'gray', marginTop: 10, overflow: 'hidden' }, opcao: { paddingHorizontal: 20, paddingVertical: 8, overflow: 'hidden' }, opcaoDesabilitada: { paddingHorizontal: 20, paddingVertical: 8, flexDirection: 'row', alignItems: 'center', backgroundColor: 'whitesmoke', opacity: 0.9 } })