|
@@ -0,0 +1,90 @@
|
|
|
|
+import React, { FC, useEffect, useState } from 'react';
|
|
|
|
+import { FlatList as List, SafeAreaView } from 'react-native';
|
|
|
|
+import { Input } from '../Input';
|
|
|
|
+import { styles } from './styles';
|
|
|
|
+import { Item, ItemData } from './item';
|
|
|
|
+
|
|
|
|
+const DATA: ItemData[] = [
|
|
|
|
+ {
|
|
|
|
+ id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
|
|
|
|
+ title: 'First Item'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
|
|
|
|
+ title: 'Second Item'
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ id: '58694a0f-3da1-471f-bd96-145571e29d72',
|
|
|
|
+ title: 'Third Item'
|
|
|
|
+ }
|
|
|
|
+];
|
|
|
|
+
|
|
|
|
+type Props = {
|
|
|
|
+ itemObject: (object: any) => void;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+//TODO: rework to generic types + custom props + fetch data
|
|
|
|
+
|
|
|
|
+export const FlatList: FC<Props> = ({ itemObject }) => {
|
|
|
|
+ const [selectedObject, setSelectedObject] = useState<{ id: string; title: string }>();
|
|
|
|
+ const [search, setSearch] = useState('');
|
|
|
|
+ const [filteredData, setFilteredData] = useState<ItemData[]>([]);
|
|
|
|
+ const [masterData, setMasterData] = useState<ItemData[]>([]);
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ setFilteredData(DATA);
|
|
|
|
+ setMasterData(DATA);
|
|
|
|
+ }, []);
|
|
|
|
+
|
|
|
|
+ const selectItem = (object: { title: string; id: string }) => {
|
|
|
|
+ itemObject(object);
|
|
|
|
+ setSelectedObject(object);
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const searchFilter = (text: string) => {
|
|
|
|
+ if (text) {
|
|
|
|
+ const newData = masterData.filter((item) => {
|
|
|
|
+ const itemData = item.title ? item.title.toLowerCase() : ''.toLowerCase();
|
|
|
|
+ const textData = text.toLowerCase();
|
|
|
|
+ return itemData.indexOf(textData) > -1;
|
|
|
|
+ });
|
|
|
|
+ setFilteredData(newData);
|
|
|
|
+ setSearch(text);
|
|
|
|
+ } else {
|
|
|
|
+ setFilteredData(masterData);
|
|
|
|
+ setSearch(text);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const renderItem = ({ item }: { item: ItemData }) => {
|
|
|
|
+ const selected = item.id === selectedObject?.id;
|
|
|
|
+
|
|
|
|
+ const backgroundColor = selected ? '#FAFAFA' : 'white';
|
|
|
|
+
|
|
|
|
+ return (
|
|
|
|
+ <Item
|
|
|
|
+ selected={selected}
|
|
|
|
+ item={item}
|
|
|
|
+ onPress={() => selectItem(item)}
|
|
|
|
+ backgroundColor={backgroundColor}
|
|
|
|
+ />
|
|
|
|
+ );
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ return (
|
|
|
|
+ <SafeAreaView style={styles.container}>
|
|
|
|
+ <Input
|
|
|
|
+ inputMode={'search'}
|
|
|
|
+ placeholder={'test'}
|
|
|
|
+ onChange={(text) => searchFilter(text)}
|
|
|
|
+ value={search}
|
|
|
|
+ />
|
|
|
|
+ <List
|
|
|
|
+ data={filteredData}
|
|
|
|
+ renderItem={renderItem}
|
|
|
|
+ keyExtractor={(item) => item.id}
|
|
|
|
+ extraData={selectedObject}
|
|
|
|
+ />
|
|
|
|
+ </SafeAreaView>
|
|
|
|
+ );
|
|
|
|
+};
|