Skip to content

Instantly share code, notes, and snippets.

@Ayyagaries
Created April 6, 2018 19:33
Show Gist options
  • Save Ayyagaries/3dd13989f5e22cad93d0c54f579e736b to your computer and use it in GitHub Desktop.
Save Ayyagaries/3dd13989f5e22cad93d0c54f579e736b to your computer and use it in GitHub Desktop.
ListComponent
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { StyleSheet, View, FlatList, TextInput, TouchableHighlight } from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome';
import { Container, Content, Text, Button, Label, Item, Input } from 'native-base';
import Spinner from 'react-native-loading-spinner-overlay';
import { requestAttachedFacilities, seletedFacility } from '../actions/pickFacility';
class PickFacility extends React.PureComponent {
static navigationOptions = {
drawerLabel: 'Pick a Facility',
title: 'Pick a Facility',
drawerIcon: () => <Icon name="ios-home" />,
};
static propTypes = {
navigation: PropTypes.object,
dispatch: PropTypes.func,
PickFacility: PropTypes.object,
};
constructor(props) {
super(props);
this.state = {
data: [],
noData: false,
};
}
componentDidMount() {
this.props.dispatch(requestAttachedFacilities());
}
getItemLayout = (data, index) => ({ length: 50, offset: 50 * index, index });
listItemClick = (data) => {
this.props.dispatch(seletedFacility(data.id, data.name));
console.log(data);
};
handleRetry = () => {
this.props.dispatch(requestAttachedFacilities());
};
fliterList = (e) => {
const text = e.toLowerCase();
const facilties = this.props.PickFacility.attachedFacilities;
const filteredName = facilties.filter(item => item.name.toLowerCase().match(text));
if (!text || text === '') {
this.setState({
data: this.props.PickFacility.attachedFacilities,
});
} else if (!Array.isArray(filteredName) && !filteredName.length) {
this.setState({
noData: true,
});
} else if (Array.isArray(filteredName)) {
this.setState({
noData: true,
data: filteredName,
});
}
};
headerWithSearchText = () => (
<TextInput
style={styles.TextInputStyleClass}
onChangeText={text => this.fliterList(text)}
value={this.state.text}
underlineColorAndroid="transparent"
placeholder="Search Facility"
/>
);
spinnerView = () => <Spinner visible textContent="Loading" textStyle={{ color: '#FFF' }} />;
listView = () => (
<FlatList
style={{ flex: 1 }}
data={this.state.noData ? this.state.data : this.props.PickFacility.attachedFacilities}
keyExtractor={item => item.id}
getItemLayout={this.getItemLayout}
ItemSeparatorComponent={this.renderSeparator}
renderItem={({ item }) => (
<TouchableHighlight onPress={() => this.listItemClick(item)}>
<View style={styles.faltListView}>
<Text style={styles.listtext}>{item.name}</Text>
</View>
</TouchableHighlight>
)}
/>
);
networkErrorView = () => (
<View
style={{
flex: 1,
alignSelf: 'center',
marginTop: '50%',
}}
>
<Icon name="exclamation-triangle" color="#C0C0C0" size={30} style={styles.iconStyle} />
<Label style={styles.securetext}>Network Connectivity Error</Label>
<Button style={styles.button} onPress={this.handleRetry}>
<Label style={styles.buttonLabel}>RETRY</Label>
</Button>
</View>
);
renderHeader = () => (
<View searchBar rounded style={styles.headerStyle}>
<Item style={{ flex: 1 }}>
<Icon name="search" />
<Input placeholder="Search" onChangeText={this.fliterList} />
</Item>
</View>
);
renderSeparator = () => (
<View
style={{
height: 1,
width: '100%',
backgroundColor: '#CED0CE',
}}
/>
);
render() {
if (this.props.PickFacility.attachedFacilities.length > 0) {
return (
<Container style={styles.container}>
{this.headerWithSearchText()}
<Content>{this.listView()}</Content>
</Container>
);
} else if (this.props.PickFacility.msg) {
return (
<Container style={styles.container}>
<Content>
{this.spinnerView()}
{this.networkErrorView()}
</Content>
</Container>
);
}
return null;
}
}
const mapStateToProps = state => ({ PickFacility: state.pickFacility });
export default connect(mapStateToProps)(PickFacility);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment