ilink-world/app/screens/history-request/History.js

744 lines
26 KiB
JavaScript
Executable File

/* eslint-disable prettier/prettier */
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow
*/
import React, { Component } from 'react';
import { Platform, StyleSheet, AppState, FlatList, ProgressBarAndroid, TouchableOpacity, Text, View } from 'react-native';
import ActionButton from 'react-native-action-button';
import Icon from 'react-native-vector-icons/FontAwesome5';
import { responsiveFontSize, responsiveHeight, responsiveWidth } from 'react-native-responsive-dimensions';
import { HistoryListItem, HistoryItemSectionned } from './HistoryItem';
import { credrequester } from './../../route.json';
import { loadDemandeCredit, loadMyDemandeCredit } from './../../webservice/HistoryRequestApi';
import FontAwesome5 from 'react-native-vector-icons/FontAwesome5';
import BaseScreen from './../../screens/BaseScreen'
import Button from 'apsl-react-native-button'
import { readUser } from "../../webservice/AuthApi";
let route = require('./../../route.json')
let moment = require('moment-timezone')
let theme = require('./../../utils/theme.json')
import { primary, primaryDark, accent, purpleLight, primaryLight } from './../../utils/theme.json';
import { IndicatorViewPager, PagerTabIndicator } from 'react-native-best-viewpager';
type Props = {};
var sortIcons;
var sectionIcons;
import I18n from 'react-native-i18n'
import { IlinkEmitter } from "../../utils/events";
require('./../../utils/Translations')
import { SinglePickerMaterialDialog } from 'react-native-material-dialog';
import { Header } from "react-native-elements";
import { withNavigationFocus } from "react-navigation";
class History extends BaseScreen {
static navigatorStyle = {
navBarBackgroundColor: primary,
statusBarColor: primaryDark,
navBarTextColor: '#FFFFFF',
navBarButtonColor: '#FFFFFF',
contextualMenuStatusBarColor: theme.accent,
contextualMenuBackgroundColor: theme.accentLight,
contextualMenuButtonsColor: '#ffffff',
};
static navigationOptions = ({ navigation }) => {
return {
title: I18n.t('CREDIT_MANAGE'),
drawerLabel: navigation.getParam('name', I18n.t('CREDIT_MANAGE')),
drawerIcon: ({ tintColor }) => (
<Icon
name={'credit-card'}
size={24}
/>
),
}
};
static options(passProps) {
return {
topBar: {
visible: true,
drawBehind: false,
background: {
color: theme.primaryDark,
},
},
}
}
constructor(props) {
super(props, true);
this.state = this.initState();
readUser().then((user) => { this.setState({ user: user }) })
this._populateIcons().then(() => {
});
IlinkEmitter.on("langueChange", this.updateLangue.bind(this))
this.refreshData();
};
navigationButtonPressed({ buttonId }) {
if (buttonId === 'id') {
this.showFilter();
} else if (buttonId === 'sectionned') {
this.setState({ isSectionned: !this.state.isSectionned })
}
}
updateLangue() {
this.props.navigation.setParams({ name: I18n.t('CREDIT_MANAGE') })
this.forceUpdate()
}
onNavigatorEvent(event) {
if (event.type === 'NavBarButtonPress') {
if (event.id === 'id') {
this.showFilter();
} else if (event.id === 'sectionned') {
this.setState({ isSectionned: !this.state.isSectionned })
}
} else {
switch (event.id) {
case 'willAppear':
this.refreshData()
break;
case 'didAppear':
break;
case 'willDisappear':
break;
case 'didDisappear':
break;
case 'willCommitPreview':
break;
}
}
}
showFilter() {
/*if (this.state.filter) {
Navigation.mergeOptions(route.stackRoot,
{
topBar: {
rightButtons: [
{
title: 'Non Traité',
},
{
title: 'Traité',
},
{
title: 'Période',
},
{
title: 'Tout',
},
{
title: 'Trier par',
},
{
title: '',
},
],
onButtonPressed: (index) => {
let data = this.state.conserve
console.log(index)
console.log(data);
if (data !== null) {
let filtre = "";
if (index < 2) {
switch (index) {
case 0:
filtre = I18n.t('NO_TREAT')
break;
case 1:
filtre = I18n.t('TREAT');
break;
}
let fi = data.filter(item => item.statut === filtre)
this.setState({listdata: fi, filter: true})
} else if (index === 2) {
this.setState({panelVisible: true})
} else {
this.setState({listdata: data, filter: false})
}
}
}
}}
);
} else {
Navigation.mergeOptions(route.stackRoot,
{
topBar: {
rightButtons: [
{
title: I18n.t('NO_TREAT'),
},
{
title: I18n.t('TREAT'),
}
, {
title: I18n.t('PERIOD'),
},
{
title: '',
},
{
title: 'Trier par',
}, {
title: '',
},
],
onButtonPressed: (index) => {
let data = this.state.conserve
if (data != null && data.length > 0) {
var filtre = "";
if (index < 2) {
switch (index) {
case 0:
filtre = I18n.t('NO_TREATED');
break;
case 1:
filtre = I18n.t('TREATED');
break;
}
let fi = data.filter(item => item.statut === filtre)
this.setState({listdata: fi, filter: true})
} else if (index === 2) {
this.setState({panelVisible: true})
this.props.navigator.showContextualMenu(
{
rightButtons: [
{
title: I18n.t('CANCEL'),
},
{
title: I18n.t('FILTER'),
},
],
onButtonPressed: (index) => {
console.log(index)
switch (index) {
case 1:
let {dateend, datestart} = this.state;
this.onfilterPress();
}
this.setState({panelVisible: false});
}
}
);
} else {
this.setState({listdata: data, filter: false})
}
}
}
}
}
);
}*/
}
_populateIcons = function () {
return new Promise(function (resolve, reject) {
Promise.all(
[
Icon.getImageSource('sort', 30),
Icon.getImageSource('layer-group', 30),
]
).then((values) => {
sortIcons = values[0];
sectionIcons = values[1];
resolve(true);
}).catch((error) => {
console.log(error);
reject(error);
}).done();
});
};
initState() {
return {
user: {},
listdata: [],
listdataSend: [],
conserve: [],
appState: AppState.currentState,
filter: false,
sortIcons: null,
panelVisible: false,
filder_disable: true,
datestartformated: 'La date de debut',
dateendformated: 'La date de fin',
datestart: null,
dateend: null,
isLoaded: false,
isSectionned: false,
isDateTimePickerVisible: false,
isDateEndTimePickerVisible: false,
}
}
updateList(data: Array) {
if (!this.state.filter) {
let rev = data.reverse()
this.setState({ listdata: rev, conserve: rev, isLoaded: true });
}
}
updateMyList(data) {
if (!this.state.filter) {
let rev = data.reverse()
this.setState({ listdataSend: rev, conserve: rev, isLoaded: true });
}
}
componentDidMount() {
AppState.addEventListener('change', this._handleAppStateChange);
}
componentWillUnmount() {
AppState.removeEventListener('change', this._handleAppStateChange);
}
_handleAppStateChange = (nextAppState) => {
if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
}
this.setState({ appState: nextAppState });
}
renderList(list: Array) {
if (this.state.isLoaded) {
let data = list;
if (data !== null) {
if (data.length > 0) {
return (<HistoryListItem
list={list}
refreshing={() => { this.refreshData() }}
isRefreshing={this.state.isRefreshing}
navigator={this.props.navigation}
style={styles.listbackground} />)
} else if (this.state.filter) {
return (
<View style={styles.emptyListe}>
<Text>{I18n.t('NO_ITEM_REQUEST')}</Text>
</View>
)
} else if (data.length === 0) {
return (
<View style={styles.emptyListe}>
<Text>{I18n.t('NO_ITEM_REQUEST')}</Text>
</View>
)
} else {
return (
<View style={styles.emptyListe}>
<ProgressBarAndroid />
<Text>{I18n.t('LOADING_DOTS')}</Text>
</View>
)
}
} else {
return (
<View style={styles.emptyListe}>
<Text>{I18n.t('EMPTY_LIST_REQUEST')} </Text>
</View>
)
}
} else if (list.length === 0) {
return (
<View style={styles.emptyListe}>
<Text>Aucuns éléments ne corresponds</Text>
</View>
)
}
}
componentDidUpdate(prevProps) {
if (prevProps.isFocused !== this.props.isFocused && this.props.isFocused) {
this.refreshData()
}
}
render() {
return (
<View style={{ flex: 1, marginBottom: 20 }}
>
<IndicatorViewPager
style={{ flex: 1 }}
indicator={
this.state.user.category === "geolocated" ? this._renderTabGeolocated() :
this.state.user.category === 'hyper' ? this._renderTabHyper()
: this._renderTabs()}
>
{this.state.user.category !== "hyper" ? this._renderListDemandsSend() : null}
{this.state.user.category !== "geolocated" ? this._renderListDemandReceive() : null}
</IndicatorViewPager>
</View>
);
}
renderSectionnedList(list) {
if (this.state.isLoaded) {
let data = list;
if (data !== null) {
if (data.length > 0) {
return (<HistoryItemSectionned
list={list}
navigator={this.props.navigator}
style={styles.listbackground} />)
} else if (this.state.filter) {
return (
<View style={styles.emptyListe}>
<Text>{I18n.t('NO_ITEMS_REQUEST')}</Text>
</View>
)
} else {
return (
<View style={styles.emptyListe}>
<ProgressBarAndroid />
<Text>{I18n.t('LOADING_DOTS')}</Text>
</View>
)
}
} else {
return (
<View style={styles.emptyListe}>
<Text>{I18n.t('EMPTY_LIST_REQUEST')}</Text>
</View>
)
}
}
}
renderLoading() {
return (<View><ProgressBarAndroid /><Text>{I18n.t('LOADING_DOTS')}</Text></View>)
}
showSlidingUpPanel() {
/* return (<SlidingUpPanel
style={styles.slidingup}
height={responsiveHeight(100)}
visible={this.state.panelVisible}
ref={(c) => this.panel = c}
draggableRange={{top: responsiveHeight(100), bottom: 0}}
onRequestClose={() => this.setState({panelVisible: false})}>
<View style={styles.container}>
{this.showSlidingUpView()}
</View>
</SlidingUpPanel>)
}
showSlidingUpView() {
/* return (
<View style={datefilter.container}>
<View stlye={datefilter.content}>
<DatepickerRange
styles={{
borderColor: 'transparent',
borderRadius: 0,
margin: 10,
height:responsiveWidth(50)
}}
initialMonth='201801'
onSelect={(fromdate,untildate)=>this._handleDatePicked(fromdate,untildate)}
dayHeadings={['D', 'L', 'M', 'M', 'J', 'V', 'S']}
maxMonth={12}
startdate={moment('20180101').format('YYYYMMDD')}
untilDate='20181231'
minDate='20180101'
maxDate='20181231'
buttonColor='green'
showReset={false}
showClose={false}
placeHolderStart= 'Date de debut'
placeHolderUntil= 'Date fin'
selectedBackgroundColor= 'green'
selectedTextColor='white'
/>
</View>
</View>
)*/
}
onfilterPress() {
let { datestart, dateend } = this.state;
let data = this.state.conserve;
if (data !== null) {
data = data.filter(item => {
let mda = moment(item.dateAjout)
return moment(item.dateAjout).isAfter(moment(datestart).toDate()) && (mda.isBefore(moment(dateend).toDate()))
})
this.setState({ listdata: data, panelVisible: false, filter: true })
}
}
_showDateTimePicker = (type) => {
if (type === 1)
this.setState({
isDateTimePickerVisible: true,
});
else this.setState({
isDateEndTimePickerVisible: true,
});
}
_showDateEndPicker = () => this.setState({ isDateEndTimePickerVisible: true });
_hideDateTimePicker = () => this.setState({ isDateTimePickerVisible: false, isDateEndTimePickerVisible: false });
_handleDatePicked = (fromdate, enddate) => {
console.log([fromdate, enddate]);
this.setState({
datestart: fromdate,
datestartformated: moment(fromdate).format('dddd Do ,MMMM YYYY'),
dateend: enddate,
dateendformated: moment(enddate).format('dddd Do ,MMMM YYYY'),
});
let startdate = this.state.datestart;
let enddatemo = moment(enddate);
let dif = moment(enddatemo).diff(startdate);
if (dif < 0) {
this.setState({ filder_disable: true });
this.props.navigator.showSnackbar({
text: I18n.t('DATE_WRONG'),
duration: 'long',
backgroundColor: 'red',
textColor: 'white',
})
} else {
this.setState({ filder_disable: false });
}
this._hideDateTimePicker();
};
printOptions() {
if (this.state.user.category === "hyper") {
return (<ActionButton buttonColor={accent}>
<ActionButton.Item buttonColor={purpleLight} title={I18n.t('SAVE_HISTORY')} onPress={() => {
}}>
<Icon name="save" style={styles.actionButtonIcon} />
</ActionButton.Item>
</ActionButton>);
} else {
return (<ActionButton buttonColor={accent}>
<ActionButton.Item buttonColor={primary} title={I18n.t('MAKE_REQUEST')}
onPress={() => {
this.props.navigation.push(route.credrequester, {
onGoBack: () => this.refreshData(),
})
}}
>
<Icon name="edit" style={styles.actionButtonIcon} />
</ActionButton.Item>
<ActionButton.Item buttonColor={purpleLight} title={I18n.t('SAVE_HISTORY')} onPress={() => {
}}>
<Icon name="save" style={styles.actionButtonIcon} />
</ActionButton.Item>
</ActionButton>)
}
}
_renderListDemandsSend() {
return (<View style={styles.container}>
{
this.state.isLoaded ?
this.state.isSectionned ?
this.renderSectionnedList(this.state.listdataSend) :
this.renderList(this.state.listdataSend) : this.renderLoading()
}
{this.printOptions()}
{this.showSlidingUpPanel()}
</View>
)
}
_renderListDemandReceive() {
return (<View style={styles.container}>
{
this.state.isLoaded ?
this.state.isSectionned ?
this.renderSectionnedList(this.state.listdata) :
this.renderList(this.state.listdata) : this.renderLoading()
}
{this.printOptions()}
{this.showSlidingUpPanel()}
</View>
)
}
_renderTabGeolocated() {
let tabs = [{
text: I18n.t('DEMANDE_SEND'),
}]
return <PagerTabIndicator
style={{
height: responsiveHeight(8),
}}
tabs={tabs} />;
}
_renderTabHyper() {
let tabs = [{
text: I18n.t('DEMANDE_RECEIVE'),
}]
return <PagerTabIndicator
style={{
height: responsiveHeight(8),
}}
tabs={tabs} />;
}
_renderTabs() {
let tabs = [{
text: I18n.t('MY_DEMANDE'),
iconSource: this.state.usersicon,
}, {
text: I18n.t('DEMANDE_RECEIVE'),
iconSource: this.state.charticon,
}]
return <PagerTabIndicator
style={{
height: responsiveHeight(8),
}}
tabs={tabs} />;
}
refreshData() {
this.setState({ isRefreshing: true })
loadDemandeCredit().then((data) => {
if (data.success !== undefined) {
this.updateList(data.demands);
this.setState({ isRefreshing: false })
}
});
loadMyDemandeCredit().then((data) => {
if (data.success !== undefined) {
this.setState({ isRefreshing: false })
this.updateMyList(data.demands)
}
})
}
}
export default withNavigationFocus(History);
const datefilter = StyleSheet.create({
titleHeader: {
fontSize: 20,
fontWeight: 'bold',
color: 'black',
flex: 1,
},
datetitle: {
fontSize: 17,
color: 'black',
marginLeft: responsiveWidth(2),
},
datetext: {
fontSize: 16,
marginLeft: responsiveWidth(5),
},
content: {
flex: 2,
},
btnContainer: {
flexDirection: 'row',
width: responsiveWidth(100),
alignSelf: 'flex-end',
flex: 2,
},
btn: {
flex: 1,
borderColor: 'transparent',
borderRadius: 0,
},
btntext: {
fontWeight: 'bold',
color: accent,
},
container: {
flex: 1,
justifyContent: 'space-evenly',
},
})
const styles = StyleSheet.create({
slidingup: {
width: responsiveHeight(100),
},
root: {
flex: 1,
},
container: {
flex: 1,
backgroundColor: 'white',
justifyContent: 'center',
alignItems: 'center',
},
emptylist: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
backgroundd_drawer: {
backgroundColor: '#000',
},
listbackground: {
},
actionButtonIcon: {
fontSize: 20,
height: 22,
color: 'white',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
dateText: {
marginTop: 20,
marginLeft: responsiveWidth(13),
marginBottom: 20,
fontSize: 17,
},
titlecontent: {
fontSize: 17,
marginLeft: responsiveWidth(10),
color: 'black',
},
content: {
flex: 8,
},
title: {
fontSize: 20,
marginLeft: 20,
marginTop: 20,
color: 'black',
fontWeight: 'bold',
},
});