import React from 'react'; import { View, Text, StyleSheet, Image, TouchableOpacity, ScrollView, Animated, TextInput, Pressable, Keyboard } from 'react-native'; import { ListaSelecaoMultiplaProps } from '../..'; type Modelo = { chave?: any; valor?: any; desabilitado?: boolean | undefined } const ListaSelecaoMultipla: React.FC = ({ setSelecionada, textoCaixaSelecao, estiloCaixaSelecao, estiloTextoCaixaSelecao, estiloLista, estiloItemLista, estiloTextoItemLista, maxAltura, dados, iconePesquisar = false, iconeSeta = false, pesquisar = true, textoCampoPesquisar = "pesquisar", aoSelecionar = () => {}, subtituloListaItens, subtituloListaVisivel, fontFamily, textoItemNaoEncontrado = "Nenhum dado encontrado", estiloItemDesabilitado, estiloTextoItemDesabilitado, estiloCheckBoxDesabilitado, estiloCheckBox, salvar = 'chave', selecionada, listaVisivel = false, iconeFechar = false, estiloTag, estiloTextoTag, estiloTituloTag, }) => { const [_primeiraRenderizacao, _setPrimeiraRenderizacao] = React.useState(true); const [visivel, setVisivel] = React.useState(listaVisivel); const [altura, setAltura] = React.useState(350) 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 } : (selecionada?.length > 0) ? { if (!visivel) { Keyboard.dismiss(); deslizeParaBaixo() } else { deslizarParaCima() } }} > {subtituloListaItens} { selecionada?.map((item, index) => { return ( {item} ) }) } : { if (!visivel) { Keyboard.dismiss(); deslizeParaBaixo() } else { deslizarParaCima() } }}> {(textoCaixaSelecao) ? textoCaixaSelecao : 'selecione a opção'} { (!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 desabilitado = item.desabilitado ?? false; if (desabilitado) { return ( { (selecionada?.includes(valor)) ? : null } {valor} ) } else { return ( { let existing = selecionada?.indexOf(valor) if (existing != -1 && existing != undefined) { // let sv = [...listaItens]; // sv.splice(existing, 1) // setListaItens(sv); setSelecionada((val: any) => { let temp = [...selecionada]; temp.splice(existing, 1) return temp; }); } else { if (salvar === 'valor') { setSelecionada((val: any) => { let temp = [...new Set([...val, valor])]; return temp; }) } else { setSelecionada((val: any) => { let temp = [...new Set([...val, chave])]; return temp; }) } // setListaItens((val: any) => { // let temp = [...new Set([...val, value])]; // return temp; // }) } }}> { (selecionada?.includes(valor)) ? : null } {valor} ) } }) : {textoItemNaoEncontrado} } { (selecionada?.length > 0) ? {subtituloListaVisivel ? subtituloListaItens : 'Selecionado'} { selecionada?.map((item, index) => { return ( {item} ) }) } : null } : null } ) } export default ListaSelecaoMultipla; const styles = StyleSheet.create({ areaTag: { borderWidth: 1, borderRadius: 10, borderColor: 'gray', paddingHorizontal: 20, paddingVertical: 12, flexDirection: 'row', justifyContent: 'space-between', marginBottom: 10 }, lista: { borderWidth: 1, borderRadius: 10, borderColor: 'gray', overflow: 'hidden' }, option: { paddingHorizontal: 20, paddingVertical: 8, flexDirection: 'row', alignItems: 'center' }, opcaoDesabilitada: { paddingHorizontal: 20, paddingVertical: 8, flexDirection: 'row', alignItems: 'center', backgroundColor: 'whitesmoke' } })