import isEqual from 'lodash/isEqual'; import omit from 'lodash/omit'; import 'moment/locale/en-au'; import 'moment/locale/en-ca'; import 'moment/locale/en-gb'; import 'moment/locale/en-ie'; import 'moment/locale/en-il'; import 'moment/locale/en-nz'; import 'moment/locale/es-us'; import 'moment/locale/fr'; import React, { Component } from 'react'; import { ActivityIndicator, Alert, Animated, Platform, ProgressBarAndroid, ScrollView, StatusBar, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import DeviceInfo from 'react-native-device-info'; import I18n from 'react-native-i18n'; import { responsiveWidth } from 'react-native-responsive-dimensions'; import { TabBar } from 'react-native-tab-view'; import Icons from 'react-native-vector-icons/Ionicons'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import Tag from '../../components/Tag'; import { Color } from '../../config/Color'; import { Typography } from '../../config/typography'; import * as Utils from '../../utils/DeviceUtils'; import { IlinkEmitter } from "../../utils/events"; import { cutString, isEmptyObject, isIlinkWorldWallet, optionDepotScreen, optionIdentificationScreen, optionPaiementFacture, optionRetraitScreen, transactionHistoryLabel } from '../../utils/UtilsFunction'; import { depositActionReset } from '../../webservice/DepositApi'; import { baseUrl } from '../../webservice/IlinkConstants'; import { getWalletDetailActivated, resetWalletListDetailReducer } from '../../webservice/WalletApi'; import { getWalletTransactionHistory, getWalletTransactionHistoryReset } from '../../webservice/WalletTransactionHistoryApi'; import { resetCommissionReducer, transferCommissionAction } from '../../webservice/WalletTransferCommission'; let moment = require('moment-timezone'); const thousands = require('thousands'); let route = require('./../../route.json'); let slugify = require('slugify'); require('../../utils/Translations'); class WalletDetail extends Component { constructor(props) { super(props); this.state = { index: 0, routes: [ { key: 'depot', title: I18n.t('DEPOSIT') }, { key: 'retrait', title: I18n.t('WITHDRAWAL') } ], heightHeader: Utils.heightHeader(), isModalConfirmVisible: false, wallet: null, triggerTransferCommission: false, loading: false, isTriggerRefresh: false, scrollHeaderY: 0 }; this.renderContent = null; slugify.extend({ '+': 'plus' }); this.scrollY = new Animated.Value(0); this.scrollHeaderY = new Animated.Value(0); this.deltaY = new Animated.Value(0); this.bgBannerY = new Animated.Value(0); this.heightImageBanner = Utils.scaleWithPixel(250, 1); this.marginTopBanner = this.heightImageBanner - this.state.heightHeader - 40; this.isHomeRootView = this.props.navigation.state.params.hasOwnProperty('agentId'); IlinkEmitter.on("langueChange", this.updateLangue.bind(this)); this.props.getWalletTransactionHistoryReset(); this.props.depositActionReset(); this.props.resetWalletListDetailReducer(); this.currentLocale = DeviceInfo.getDeviceLocale().includes("fr") ? "fr" : "en-gb"; moment.locale(this.currentLocale); if (this.isHomeRootView) { let agentId = this.props.navigation.state.params.agentId; this.props.getWalletDetailActivated(agentId, true); } else { this.props.getWalletDetailActivated(this.props.navigation.state.params.wallet.id, false); this.props.getWalletTransactionHistory(this.props.navigation.state.params.wallet.id); } } /* static options(passProps) { return { topBar: { drawBehind: false, visible: true, animate: true, buttonColor: 'white', background: { color: 'white', }, rightButtons: [] }, backButton: { visible: true, color: "white" }, buttonColor: "white", background: { color: Color.primaryDarkColor }, statusBar: { drawBehind: false, visible: true, } }; } */ static navigatorStyle = { navBarBackgroundColor: Color.primaryColor, statusBarColor: Color.primaryDarkColor, navBarTextColor: '#FFFFFF', navBarButtonColor: '#FFFFFF' }; static navigationOptions = () => { return { //title: I18n.t('WALLET'), //title: this.isHomeRootView ? I18n.t('WALLET') : ((typeof this.props.navigation.state.params !== 'undefined') && this.props.navigation.state.params.wallet.network), drawerLabel: () => null, headerTitle: I18n.t('WALLET'), headerTintColor: 'white', headerStyle: { backgroundColor: Color.primaryColor, marginTop: 23, color: 'white' }, headerTitleStyle: { color: "white" }, title: I18n.t('WALLET') } }; componentDidMount() { const { result } = this.props; if (result !== null) { if (typeof result.response !== 'undefined') { const wallet = result.response[0]; this.setState({ wallet: wallet, isTriggerRefresh: false }) } } /*else { if (this.state.isTriggerRefresh) { console.log("this.state.isTriggerRefresh", result); if (result !== null) { if (typeof result.response !== 'undefined') { const wallet = result.response.filter((item) => item.id === this.state.wallet.id); this.setState({ wallet: wallet, isTriggerRefresh: false }) console.log("REPONSE FILTER", result.response.filter((item) => item.id === this.state.wallet.id)); } } } } */ } shouldComponentUpdate(nextProps, nextState) { if (this.state.triggerTransferCommission !== nextState.triggerTransferCommission) { return false; } else { return true; } } /* componentWillReceiveProps(nextProps) { if (nextProps.loading || nextProps.loadingTransferCommission) this.setState({ loading: true }) else this.setState({ loading: false }) } */ getWalletIcon = (wallet) => { return `${baseUrl}/datas/img/network/${slugify(wallet.network, { lower: true })}-logo.png`; } getCreationDateToHumanFormat = (date) => { let re = moment.tz(date, 'Etc/GMT+0').format(); return moment(re).fromNow(); } updateLangue() { this.props.navigation.setParams({ name: I18n.t('WALLET') }) this.forceUpdate() } handleIndexChange = index => this.setState({ index }); imageScale = () => { return this.scrollY.interpolate({ inputRange: [0, 100], outputRange: [1, 0.5], extrapolate: 'clamp', }); } imageTranslateY = () => { return this.scrollY.interpolate({ inputRange: [0, 100], outputRange: [-5, 50], extrapolate: 'clamp', }); } bgHeaderTranslateY = () => { return this.scrollY.interpolate({ inputRange: [0, 150], outputRange: [-5, 0], extrapolate: 'clamp', }); } refresh = () => { const { result } = this.props; console.log("STATE NAVIGATION PARAMS REFRESH", this.props.navigation.state); if (!this.isHomeRootView) { const { wallet } = this.props.navigation.state.params; this.props.getWalletDetailActivated(wallet.id, false); this.props.getWalletTransactionHistory(wallet.id); this.setState({ isTriggerRefresh: true }); /* if (typeof this.props.navigation.state.params.onRefreshDetail !== 'undefined') this.props.navigation.state.params.onRefreshDetail(); */ } else { let agentId = this.props.navigation.state.params.agentId; this.props.getWalletDetailActivated(agentId, true); } } renderTabBar = props => ( ( { (route.key === 'depot') ? () : () } {` ${route.title}`} )} /> ); renderHeader = (wallet) => ( {I18n.t('COUNTRY')} {wallet.country} {wallet.network} } style={{ paddingRight: 10, width: 120, borderTopRightRadius: 0, borderBottomRightRadius: 0, borderRightWidth: 1, borderRightColor: Color.whiteColor }} onPress={() => { const { result } = this.props; if (result !== null) { if (typeof result.response !== 'undefined') { if (parseInt(result.response.balance_com) === 0) { Alert.alert( I18n.t("TRANSFER_COMMISSION_IMPOSSIBLE"), I18n.t("COMMISSION_TRANSFER_ERROR_EMPTY"), [ { text: I18n.t("OK"), onPress: () => { this.props.resetCommissionReducer(); } } ], { cancelable: false } ) } else this.renderDialogConfirmTransferCommission() } } /* else { if (parseInt(this.state.wallet.balance_com) === 0) { Alert.alert( I18n.t("ERROR_TRANSFER_COMMISSION"), I18n.t("COMMISSION_TRANSFER_ERROR_EMPTY"), [ { text: I18n.t("OK"), onPress: () => { this.props.resetCommissionReducer(); } } ], { cancelable: false } ) } else this.renderDialogConfirmTransferCommission() } */ }}> {I18n.t('TRANSFER_TO_PRINCIPAL_ACCOUNT')} } style={{ width: 110, borderTopLeftRadius: 0, borderBottomLeftRadius: 0, }} primary onPress={() => { this._scrollView.scrollToEnd(); }}> {I18n.t('HISTORY')} {I18n.t('CREATION_DATE')} {this.getCreationDateToHumanFormat(wallet.created_date)} ); renderLoader = () => { return ( {Platform.OS === 'android' ? ( <> {I18n.t('LOADING_DOTS')} ) : <> {I18n.t('LOADING_DOTS')} } ) } renderAccountDetail = (wallet) => ( {I18n.t('PRINCIPAL_ACCOUNT_TITLE')} {thousands(wallet.balance_princ, ' ')} {I18n.t('COMMISSION_ACCOUNT_TITLE')} {thousands(wallet.balance_com, ' ')} ); renderDetailWallet = (wallet) => { console.log("WALLET NAME SLUGIFY", slugify(wallet.network)); return ( !isEmptyObject(wallet) ? (<> {this.state.triggerTransferCommission && this.renderDialogTransferCommissionResponse()} {/* {this.state.loading ? {I18n.t("LOADING_DOTS")} : null } */} this._scrollView = component} style={{ paddingHorizontal: 20, position: 'absolute', width: '100%', height: '100%', zIndex: 2 }} scrollEventThrottle={8} onScroll={Animated.event([ { nativeEvent: { contentOffset: { y: this.scrollY }, }, }, ], { listener: (event) => { this.setState({ scrollHeaderY: event.nativeEvent.contentOffset.y }); } })}> {this.renderHeader(wallet)} {this.renderAccountDetail(wallet)} {!this.isHomeRootView && ( <> {I18n.t('TRANSACTIONS')} { if (isIlinkWorldWallet(wallet.network)) { this.props.navigation.push(route.walletOptionSelect, { optionSelect: optionDepotScreen, wallet, onGoBack: () => this.refresh(), lottie: { source: require("./../../datas/json/wallet_with_cash.json"), loop: false } }) } else { this.props.navigation.push(route.walletDepot, { wallet, onGoBack: () => this.refresh(), }) } }} activeOpacity={0.9}> {I18n.t('DEPOSIT')} {I18n.t('DEPOSIT_DESCRIPTION')} { if (isIlinkWorldWallet(wallet.network)) { this.props.navigation.push(route.walletOptionSelect, { optionSelect: optionRetraitScreen, wallet, onGoBack: () => this.refresh(), lottie: { source: require("./../../datas/json/wallet_with_cash.json"), loop: true } }) } else { this.props.navigation.push(route.walletRetrait, { wallet, onGoBack: () => this.refresh(), }) } } } activeOpacity={0.9}> {I18n.t('WITHDRAWAL')} {I18n.t('WITHDRAWAL_DESCRIPTION')} {isIlinkWorldWallet(wallet.network) && <> { }} activeOpacity={0.9}> {I18n.t('NANO_CREDIT')} {I18n.t('NANO_CREDIT_DESCRIPTION')} { }} activeOpacity={0.9}> {I18n.t('NANO_SANTE')} {I18n.t('NANO_SANTE_DESCRIPTION')} { this.props.navigation.push(route.walletOptionSelect, { optionSelect: optionPaiementFacture, onGoBack: () => this.refresh(), lottie: { source: require("./../../datas/json/paiement_facture.json"), loop: true } }) }} activeOpacity={0.9}> {I18n.t('PAIEMENT_FACTURE')} { this.props.navigation.push(route.walletOptionSelect, { optionSelect: optionIdentificationScreen, lottie: { source: require("./../../datas/json/identification.json"), loop: true } }) }} activeOpacity={0.9}> {I18n.t('CREATION_IDENTIFICATION_DESCRIPTION')} } )} {!this.isHomeRootView && this.renderHistoryTransaction()} ) : ( {I18n.t('NO_WALLET_ACTIVED')} ) ) } renderHistoryTransactionItem = (item, index) => { return ( { Object.keys(omit(item, ['id'])).map((element, i) => ( {isEqual(element, 'date') ? this.getCreationDateToHumanFormat(item[element]) : isEqual(element, 'destinataire') ? cutString(item[element], 6) : item[element] } )) } ); /* {item.description} {date} */ } renderHistoryTransactionList = () => { const { resultTransaction, errorTransaction } = this.props; if (errorTransaction !== null) { if (typeof errorTransaction.data !== 'undefined') { return ( {errorTransaction.data.error} ) } else { return ( {errorTransaction} ) } } if (resultTransaction !== null) { if (resultTransaction.response !== null) { return ( Array.isArray(resultTransaction.response) && (resultTransaction.response.length) > 0 ? ( <> { transactionHistoryLabel().map((item, index) => ( {item.label} )) } { resultTransaction.response.map((item, index) => ( this.renderHistoryTransactionItem(item, index) )) } ) : ( {I18n.t('NO_WALLET_HISTORY')} ) ) } } } renderHistoryTransaction = () => { return ( <> { this.props.loadingTransaction ? ( {Platform.OS === 'android' ? ( <> {I18n.t('LOADING_DOTS')} ) : <> {I18n.t('LOADING_DOTS')} } ) : <> {I18n.t('TRANSACTION_HISTORY')} {this.renderHistoryTransactionList()} } ) } renderDialogConfirmTransferCommission = () => { Alert.alert( I18n.t("CONFIRM"), I18n.t('CONFIRM_TRANSFER_COMMISSION') , [ { text: I18n.t("NO"), onPress: () => { } }, { text: I18n.t("YES"), onPress: () => { const { result } = this.props; if (result !== null) { if (typeof result.response !== 'undefined') { this.props.transferCommissionAction(result.response.id); } }/* else this.props.transferCommissionAction(this.state.wallet.id); */ this.setState({ triggerTransferCommission: true }); } } ], { cancelable: false } ) } renderDialogTransferCommissionResponse = () => { const { resultTransferCommission, errorTransferCommission } = this.props; if (errorTransferCommission !== null) { if (typeof errorTransferCommission.data !== 'undefined') { Alert.alert( I18n.t("ERROR_TRANSFER_COMMISSION"), errorTransferCommission.data.error, [ { text: I18n.t("OK"), onPress: () => { this.props.resetCommissionReducer(); } } ], { cancelable: false } ) } } if (resultTransferCommission !== null) { if (resultTransferCommission.response !== null) { Alert.alert( I18n.t("SUCCESS_TRANSFER_COMMISSION"), I18n.t("COMMISSION_TRANSFER_SUCCESS"), [ { text: I18n.t("OK"), onPress: () => { this.props.resetCommissionReducer(); this.refresh(); } } ], { cancelable: false } ) } } } render() { return ( <> { ((this.props.loading || this.props.loadingTransferCommission) ? this.renderLoader() : ( this.props.result !== null ? Array.isArray(this.props.result.response) && (this.props.result.response.length) === 0 ? {I18n.t('NO_WALLET_ACTIVED')} : this.renderDetailWallet(this.props.result.response) : null ) ) } ); } } const mapStateToProps = state => ({ loading: state.walletDetailReducer.loading, result: state.walletDetailReducer.result, error: state.walletDetailReducer.error, loadingTransaction: state.walletHistoryReducer.loadingTransaction, resultTransaction: state.walletHistoryReducer.resultTransaction, errorTransaction: state.walletHistoryReducer.errorTransaction, loadingTransferCommission: state.walletTransferCommissionReducer.loadingTransferCommission, resultTransferCommission: state.walletTransferCommissionReducer.resultTransferCommission, errorTransferCommission: state.walletTransferCommissionReducer.errorTransferCommission, }); const mapDispatchToProps = dispatch => bindActionCreators({ getWalletDetailActivated, getWalletTransactionHistory, transferCommissionAction, resetWalletListDetailReducer, resetCommissionReducer, getWalletTransactionHistoryReset, depositActionReset }, dispatch); export default connect(mapStateToProps, mapDispatchToProps)(WalletDetail); const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: Color.containerBackgroundColor }, indicator: { height: 2 }, tab: { width: Utils.getWidthDevice() / 2 }, tabbar: { height: 40 }, imgBanner: { width: '100%', height: 250, position: 'absolute', }, contentService: { paddingVertical: 10, borderBottomWidth: 0.5, flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'space-between', }, blockView: { paddingVertical: 10, borderBottomWidth: 0.5, }, containField: { padding: 10, marginBottom: 20, borderWidth: 0.5, shadowOffset: { width: 1.5, height: 1.5 }, shadowOpacity: 1.0, elevation: 5, flexDirection: "row", height: 140, borderRadius: 10 }, paymentItem: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", borderBottomWidth: 1, paddingVertical: 5, width: responsiveWidth(100), marginBottom: 15 }, iconContent: { width: 60, marginRight: 10, alignItems: "center" }, contentLeftItem: { flex: 1, paddingTop: 40, paddingLeft: 10, paddingRight: 10, alignItems: "center" }, tagFollow: { width: 150, margin: 10 }, profileItem: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", paddingBottom: 20, paddingTop: 20 }, checkDefault: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", borderBottomWidth: 1, paddingVertical: 10, marginTop: 5 }, blockView: { paddingVertical: 10, borderBottomWidth: 0.5, }, circlePoint: { width: 50, height: 50, borderRadius: 25, marginRight: 5, alignItems: 'center', justifyContent: 'center', }, transactionContainer: { flexDirection: 'row', paddingTop: 10, }, containerTouch: { flex: 1, flexDirection: 'row', alignItems: 'center', shadowColor: Color.borderColor, borderColor: Color.borderColor, borderWidth: 0.5, shadowOffset: { width: 1.5, height: 1.5 }, shadowOpacity: 1.0, elevation: 5, borderRadius: 10, backgroundColor: Color.cardBackgroundColor }, contain: { flexDirection: 'row', justifyContent: 'space-between', }, imageBanner: { marginTop: 15, marginLeft: 5, width: Utils.scaleWithPixel(30), height: Utils.scaleWithPixel(30) }, content: { height: Utils.scaleWithPixel(60), paddingHorizontal: 10, justifyContent: 'space-between', alignItems: 'flex-start', flex: 1, }, contentTitle: { paddingTop: 5, } })