ilink-world/screens/history-request/MyHistory.js

869 lines
28 KiB
JavaScript
Executable File

import React, {Component} from 'react';
import {
Platform,
StyleSheet,
AppState,
FlatList,
ProgressBarAndroid,
TouchableOpacity,
Text,
View,
Animated,
StatusBar
} from 'react-native';
import ActionButton from 'react-native-action-button';
import Icon from 'react-native-vector-icons/MaterialIcons';
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";
import Calendar from 'react-native-calendario';
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 from "rn-viewpager/viewpager/IndicatorViewPager";
import {PagerTabIndicator,PagerTitleIndicator,PagerDotIndicator} from 'rn-viewpager'
type Props = {};
var sortIcons;
var sectionIcons;
import I18n from 'react-native-i18n'
require('./../../utils/Translations')
import { SinglePickerMaterialDialog } from 'react-native-material-dialog';
import {Header} from "react-native-elements";
import {withNavigationFocus} from "react-navigation";
import IconWithBadge from "../IconWithBadge";
import { Appbar, Paragraph, Menu, Divider, Provider } from 'react-native-paper';
class MyHistory extends React.Component{
static navigatorStyle = {
navBarBackgroundColor: primary,
statusBarColor: primaryDark,
navBarTextColor: '#FFFFFF',
navBarButtonColor: '#FFFFFF',
contextualMenuStatusBarColor:theme.accent,
contextualMenuBackgroundColor: theme.accentLight,
contextualMenuButtonsColor: '#ffffff'
};
static navigationOptions =({navigation})=> {
const {routeName}=navigation.state
return {
tabBarLabel:routeName==="myDemand"?I18n.t('MY_DEMAND'): I18n.t('DEMAND_RECEIVE'),
tabBarIcon:({focused,horizontal,tintColor})=>{
return (<IconWithBadge
badgeCount={navigation.getParam("count",0)}
size={20}
name={routeName==="myDemand"?"mail": "inbox"}
color={focused?tintColor:"grey"}
/>)
},
drawerLabel: I18n.t('CREDIT_MANAGE'),
drawerIcon: ({ tintColor }) => (
<Icon
name={'credit-card'}
size={24}
/>
),
}};
constructor(props) {
super(props, true);
this.state = this.initState();
readUser().then((user)=>{this.setState({user:user})})
this._populateIcons().then(() => {
});
this.navigation=this.props.navigation
};
navigationButtonPressed({ buttonId }) {
if (buttonId === 'id') {
this.showFilter();
}else if(buttonId==='sectionned'){
this.setState({isSectionned:!this.state.isSectionned})
}
}
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: [],
count:0,
translateAnim:new Animated.Value(0),
visibleMenu:false,
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) {
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() {
const {routeName}=this.navigation.state
this.setState({position:routeName==="myDemand"?0:1})
this.refreshData()
this.intervaller=setInterval(()=>{
this.refreshData(false)
}, 2000)
this.animateSlidingUp(false)
this.props.navigation.addListener("didFocus", () => {
this.refreshData(false)
console.warn("loading")
})
}
componentWillUnmount() {
clearInterval(this.intervaller)
}
renderList(list) {
if(this.state.isLoaded && list instanceof Array){
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>{I18n.t('NO_ITEM_REQUEST')}</Text>
</View>
)
}
}
renderOptionsMenu(){
return (
<View
style={{
position:"absolute",
zIndex:100,
paddingTop: 50,
right:10,
flexDirection: 'row',
visible:this.state.visibleMenu,
justifyContent: 'center'
}}>
<Menu
visible={this.state.visibleMenu}
onDismiss={this._closeMenu}
anchor={
<Button onPress={this._openMenu}>Show menu</Button>
}
>
<Menu.Item onPress={() => {
this.setState({isSectionned:!this.state.isSectionned})
this._closeMenu()
}}
title="Section" />
<Divider />
<Menu.Item onPress={() => {
this.animateSlidingUp(!this.state.isSliding)
this._closeMenu()
}} title={I18n.t("FILTER_DATE")} />
</Menu>
</View>
)
}
animateSlidingUp(state=false){
const height = responsiveHeight(100)
let initialValue = !state ? 0:height ,
finalValue = !state ? height:0;
this.setState({isSliding:state})
this.state.translateAnim.setValue(initialValue); //Step 3
Animated.timing( //Step 4
this.state.translateAnim,
{
toValue: finalValue,
duration:500,
useNativeDriver: true,
}
).start()
}
_openMenu = () => this.setState({ visibleMenu: true });
_closeMenu = () => this.setState({ visibleMenu: false });
render() {
return (
<Provider>
<View style={{flex:1}}
>
<StatusBar
backgroundColor={theme.primaryDark}
barStyle="light-content"
translucent={false}
/>
<Appbar.Header dark={true} style={{backgroundColor:theme.primary}}>
<Appbar.BackAction
onPress={()=>{this.props.navigation.pop()}}
/>
<Appbar.Content
title={I18n.t('CREDIT_MANAGE')}
subtitle={this.state.position===0?I18n.t('MY_DEMAND'): I18n.t('DEMAND_RECEIVE')}
/>
<Appbar.Action icon="refresh" onPress={()=>{this.refreshData()}} />
<Appbar.Action icon="more-vert" onPress={()=>this._openMenu()} />
</Appbar.Header>
{this.renderOptionsMenu()}
{this.state.position===0?this._renderListDemandsSend():this._renderListDemandReceive()}
</View>
</Provider>
);
}
renderSliding(){
return (<Animated.View style={[styles.slidingup,{translateY:this.state.translateAnim}]}>
<Calendar
onChange={(range) => console.log(range)}
minDate="2018-04-20"
startDate="2018-04-30"
endDate="2018-05-05"
theme={{
activeDayColor: {},
monthTitleTextStyle: {
color: '#6d95da',
fontWeight: '300',
fontSize: 16,
},
emptyMonthContainerStyle: {},
emptyMonthTextStyle: {
fontWeight: '200',
},
weekColumnsContainerStyle: {},
weekColumnStyle: {
paddingVertical: 10,
},
weekColumnTextStyle: {
color: '#b6c1cd',
fontSize: 13,
},
nonTouchableDayContainerStyle: {},
nonTouchableDayTextStyle: {},
startDateContainerStyle: {},
endDateContainerStyle: {},
dayContainerStyle: {},
dayTextStyle: {
color: '#2d4150',
fontWeight: '200',
fontSize: 15,
},
dayOutOfRangeContainerStyle: {},
dayOutOfRangeTextStyle: {},
todayContainerStyle: {},
todayTextStyle: {
color: '#6d95da',
},
activeDayContainerStyle: {
backgroundColor: '#6d95da',
},
activeDayTextStyle: {
color: 'white',
},
nonTouchableLastMonthDayTextStyle: {}
}}
style={{height:responsiveHeight(60)}}
/>
<View style={{flexDirection:'row'}}>
<Button>{I18n.t('QUIT')}</Button>
<Button>{I18n.t('FILTER')}</Button>
</View>
</Animated.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.navigate(route.credrequester)
}}
>
<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('DEMAND_SEND'),
}]
return <PagerTabIndicator
style={{
height:responsiveHeight(8)
}}
tabs={tabs} />;
}
_renderTabHyper() {
let tabs = [{
text:I18n.t('DEMAND_RECEIVE'),
}]
return <PagerTabIndicator
style={{
height:responsiveHeight(8)
}}
tabs={tabs} />;
}
_renderTabs() {
let tabs = [{
text: I18n.t('MY_DEMAND'),
iconSource:this.state.usersicon
},{
text: I18n.t('DEMAND_RECEIVE'),
iconSource:this.state.charticon
}]
return <PagerTabIndicator
style={{
height:responsiveHeight(8)
}}
tabs={tabs} />;
}
refreshData(autoref=true) {
if(autoref)
this.setState({isRefreshing:true})
loadDemandeCredit().then((data) => {
if(data.success!==undefined) {
this.setState({listdata:[]})
this.updateList(data.demands);
if(this.state.position!==0)this.props.navigation.setParams({count:data.demands.length})
this.setState({isRefreshing:false})
}
}).catch((e)=>{
console.warn(e)
});
loadMyDemandeCredit().then((data)=>{
if(data.success!==undefined) {
this.setState({listdataSend:[]})
this.setState({isRefreshing:false})
if(this.state.position===0)this.props.navigation.setParams({count:data.demands.length})
this.updateMyList(data.demands)
}
}).catch((e)=>{
console.warn(e)
});
}
}
export default MyHistory;
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:{
position:"absolute",
height:responsiveHeight(84),
bottom:0,
backgroundColor:'white',
width:responsiveWidth(100),
zIndex: 1000
},
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'
},
});