wallet user and agent update

This commit is contained in:
Brice Zele 2020-05-30 22:58:22 +01:00
parent 9d935108f4
commit 21f51c7cf5
18 changed files with 2351 additions and 764 deletions

7
App.js
View File

@ -47,6 +47,8 @@ import { store, persistor } from './redux/store';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import WalletDepot from './screens/wallet/WalletDepot'; import WalletDepot from './screens/wallet/WalletDepot';
import WalletRetrait from './screens/wallet/WalletRetrait'; import WalletRetrait from './screens/wallet/WalletRetrait';
import CreateIdentification from './screens/identification/createIdentification';
import WalletDetailUser from './screens/wallet/WalletDetailUser';
const instructions = Platform.select({ const instructions = Platform.select({
ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu', ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
@ -80,9 +82,11 @@ const AppStack = createDrawerNavigator({
navigationOptions: { navigationOptions: {
}, },
}, },
walletSelect: WalletSelect,
notificationview: Notifications, notificationview: Notifications,
configuration: Configurations, configuration: Configurations,
about: About about: About,
walletDetailUser: WalletDetailUser
}) })
}, { contentComponent: OptionsMenu, headerMode: 'none', contentOptions: { activeTintColor: theme.accent } }) }, { contentComponent: OptionsMenu, headerMode: 'none', contentOptions: { activeTintColor: theme.accent } })
@ -92,6 +96,7 @@ const AppAgentStack = createDrawerNavigator({
home: Home, home: Home,
useraccount: UserAccount, useraccount: UserAccount,
walletSelect: WalletSelect, walletSelect: WalletSelect,
createIdentification: CreateIdentification,
Historique: Historique:
{ {
screen: createBottomTabNavigator({ myDemand: MyHistory }, { screen: createBottomTabNavigator({ myDemand: MyHistory }, {

File diff suppressed because one or more lines are too long

View File

@ -54,6 +54,9 @@
"CARD_NUMBER_ERROR": "Card number incorrect", "CARD_NUMBER_ERROR": "Card number incorrect",
"AMOUNT_LABEL": "Amount", "AMOUNT_LABEL": "Amount",
"WITHDRAWAL": "Withdrawal", "WITHDRAWAL": "Withdrawal",
"NANO_CREDIT": "Nano credit",
"NANO_SANTE": "Nano health",
"PAIEMENT_FACTURE": "Bill payment",
"DEMAND_SEND": "Demand send", "DEMAND_SEND": "Demand send",
"WITHDRAWAL_DESCRIPTION": "Make a withdrawal", "WITHDRAWAL_DESCRIPTION": "Make a withdrawal",
"COMMISSION_ACCOUNT_TITLE": "Commission account", "COMMISSION_ACCOUNT_TITLE": "Commission account",
@ -63,6 +66,7 @@
"CONFIRM_TRANSFER_COMMISSION": "Confirm commission transfer", "CONFIRM_TRANSFER_COMMISSION": "Confirm commission transfer",
"CREATION_DATE": "Creation date", "CREATION_DATE": "Creation date",
"PRINCIPAL_ACCOUNT_TITLE": "Principal account", "PRINCIPAL_ACCOUNT_TITLE": "Principal account",
"NUMERO_COMPTE": "Account number",
"NO_WALLET_ACTIVED": "No wallet is activated for your account", "NO_WALLET_ACTIVED": "No wallet is activated for your account",
"TRANSFER_TO_PRINCIPAL_ACCOUNT": "Transfer commissions", "TRANSFER_TO_PRINCIPAL_ACCOUNT": "Transfer commissions",
"PRINCIPAL": "Principal", "PRINCIPAL": "Principal",
@ -94,6 +98,7 @@
"GROUP_MEMBERS": "The group members", "GROUP_MEMBERS": "The group members",
"NAME": "Last name(s)", "NAME": "Last name(s)",
"FIRSTNAME": "First name(s) ", "FIRSTNAME": "First name(s) ",
"AND": "and",
"ADMIN": "Administrator", "ADMIN": "Administrator",
"SUPER_ADMIN": "Super administrator", "SUPER_ADMIN": "Super administrator",
"GEOLOCATED": "Geo located agent", "GEOLOCATED": "Geo located agent",
@ -113,6 +118,13 @@
"PHONE_NUMBER": "Phone", "PHONE_NUMBER": "Phone",
"CHOICE_NETWORK": "Choose a network", "CHOICE_NETWORK": "Choose a network",
"COUNTRY_CHOICE": "Choose a country", "COUNTRY_CHOICE": "Choose a country",
"CHOICE_TOWN": "Choose a town",
"PIECE_IDENTITE": "Identity piece",
"IDENTITY_CARD": "Identity card",
"PASSEPORT": "Passeport",
"OTHER_IDENTITY_PIECE": "Other",
"IDENTITY_NUMBER": "N° of piece",
"IDENTITY_PIECE_EXPIRY_DATE": "Expiry date",
"LAST_STEP": "Last step", "LAST_STEP": "Last step",
"ACTIVE_ACCOUNT": "Activate the account !", "ACTIVE_ACCOUNT": "Activate the account !",
"ACTIVE_USER": "Active", "ACTIVE_USER": "Active",
@ -255,6 +267,13 @@
"FREE": "Available", "FREE": "Available",
"SAVED": "Registered", "SAVED": "Registered",
"ACCOUNT_INFO": "My Account Information", "ACCOUNT_INFO": "My Account Information",
"IDENTIFICATION": " Identification",
"CREATION_IDENTIFICATION": "Creation",
"CREATION_IDENTIFICATION_DESCRIPTION": "Identify a client",
"VALIDATE_IDENTIFICATION": "Validation",
"VALIDATE_IDENTIFICATION_DESCRIPTION": "Validate an identi...",
"CREATE_IDENTIFICATION_TITLE": "Please fill in customer information",
"DATE_NAISSANCE": "Date of birth",
"REGISTER_YOURSELF": "Register", "REGISTER_YOURSELF": "Register",
"REGISTRATION": "Registration", "REGISTRATION": "Registration",
"CHANGE_LANG_LABEL": "Change language", "CHANGE_LANG_LABEL": "Change language",

View File

@ -58,11 +58,15 @@
"PLEASE_ENTER_THE_AMOUNT": "Veuillez renseigne le montant", "PLEASE_ENTER_THE_AMOUNT": "Veuillez renseigne le montant",
"DEPOSIT_DESCRIPTION": "Effectuer un dépôt", "DEPOSIT_DESCRIPTION": "Effectuer un dépôt",
"WITHDRAWAL": "Retrait", "WITHDRAWAL": "Retrait",
"NANO_CREDIT": "Nano crédit",
"NANO_SANTE": "Nano santé",
"PAIEMENT_FACTURE": "Paiement de facture",
"WITHDRAWAL_DESCRIPTION": "Effectuer un retrait", "WITHDRAWAL_DESCRIPTION": "Effectuer un retrait",
"COMMISSION_ACCOUNT_TITLE": "Cpt. commission", "COMMISSION_ACCOUNT_TITLE": "Cpt. commission",
"CONFIRM": "Confirmer", "CONFIRM": "Confirmer",
"CONFIRM_TRANSFER_COMMISSION": "Confirmer le transfert des commissions", "CONFIRM_TRANSFER_COMMISSION": "Confirmer le transfert des commissions",
"PRINCIPAL_ACCOUNT_TITLE": "Cpt. principal", "PRINCIPAL_ACCOUNT_TITLE": "Cpt. principal",
"NUMERO_COMPTE": "N° de compte",
"COMMISSION_TRANSFER_SUCCESS": "Les commissions ont été transférées vers le compte principal", "COMMISSION_TRANSFER_SUCCESS": "Les commissions ont été transférées vers le compte principal",
"COMMISSION_TRANSFER_ERROR_EMPTY": "Le solde commission est vide", "COMMISSION_TRANSFER_ERROR_EMPTY": "Le solde commission est vide",
"TRANSACTIONS": "Transactions", "TRANSACTIONS": "Transactions",
@ -97,6 +101,7 @@
"GROUP_MEMBERS": "Les membres du groupe", "GROUP_MEMBERS": "Les membres du groupe",
"NAME": "Nom (s)", "NAME": "Nom (s)",
"FIRSTNAME": "Prénom (s) ", "FIRSTNAME": "Prénom (s) ",
"AND": "et",
"ADMIN": "Administrateur", "ADMIN": "Administrateur",
"SUPER_ADMIN": "Super administrateur", "SUPER_ADMIN": "Super administrateur",
"GEOLOCATED": "Agent géo-localisé", "GEOLOCATED": "Agent géo-localisé",
@ -117,6 +122,13 @@
"PHONE_NUMBER": "Numéro de téléphone", "PHONE_NUMBER": "Numéro de téléphone",
"CHOICE_NETWORK": "Choisissez un réseau", "CHOICE_NETWORK": "Choisissez un réseau",
"COUNTRY_CHOICE": "Choisissez un pays", "COUNTRY_CHOICE": "Choisissez un pays",
"CHOICE_TOWN": "Choisissez une ville",
"PIECE_IDENTITE": "Pièce d'identité",
"IDENTITY_CARD": "Carte d'identité",
"PASSEPORT": "Passeport",
"OTHER_IDENTITY_PIECE": "Autre",
"IDENTITY_NUMBER": "N° de la pièce",
"IDENTITY_PIECE_EXPIRY_DATE": "Date d'expiration",
"LAST_STEP": "Derniere étape", "LAST_STEP": "Derniere étape",
"ACTIVE_ACCOUNT": "Activez le compte !", "ACTIVE_ACCOUNT": "Activez le compte !",
"ACTIVE_USER": "Activer", "ACTIVE_USER": "Activer",
@ -257,6 +269,14 @@
"FREE": "disponibles", "FREE": "disponibles",
"SAVED": "enregistrés", "SAVED": "enregistrés",
"ACCOUNT_INFO": " Information sur mon compte", "ACCOUNT_INFO": " Information sur mon compte",
"IDENTIFICATION": " Identification",
"CREATION_IDENTIFICATION": "Création",
"CREATION_IDENTIFICATION_CLIENT": "M'identifier",
"CREATION_IDENTIFICATION_DESCRIPTION": "Identifier un client",
"VALIDATE_IDENTIFICATION": "Validation",
"VALIDATE_IDENTIFICATION_DESCRIPTION": "Valider une identi...",
"CREATE_IDENTIFICATION_TITLE": "Veuillez renseigner les informations du client",
"DATE_NAISSANCE": "Date de naissance",
"REGISTER_YOURSELF": "Enregistrez-vous", "REGISTER_YOURSELF": "Enregistrez-vous",
"REGISTRATION": "Inscription", "REGISTRATION": "Inscription",
"CHANGE_LANG_LABEL": "Changer la langue", "CHANGE_LANG_LABEL": "Changer la langue",

View File

@ -1,17 +1,21 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { StyleSheet, View, Text, Image, StatusBar, ScrollView, ProgressBarAndroid, Alert } from 'react-native'; import { StyleSheet, View, Text, Image, StatusBar, TouchableOpacity, ScrollView, ProgressBarAndroid, Alert } from 'react-native';
let theme = require('./../../utils/theme.json'); let theme = require('./../../utils/theme.json');
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import { readUser, deleteUser } from './../../webservice/AuthApi'; import { readUser, deleteUser } from './../../webservice/AuthApi';
import { getAgentNetworksList } from './../../webservice/NetworkApi' import { getAgentNetworksList } from './../../webservice/NetworkApi'
import { responsiveHeight, responsiveWidth } from 'react-native-responsive-dimensions'; import { responsiveHeight, responsiveWidth } from 'react-native-responsive-dimensions';
import MapView, { Marker } from 'react-native-maps'; import MapView, { Marker } from 'react-native-maps';
import Icon from 'react-native-vector-icons/MaterialIcons' import * as Utils from '../../utils/DeviceUtils';
import Button from 'apsl-react-native-button' import Button from 'apsl-react-native-button';
import { Typography, FontWeight } from '../../config/typography';
import CardView from "react-native-cardview"; import CardView from "react-native-cardview";
import I18n from 'react-native-i18n' import I18n from 'react-native-i18n'
import { Header } from 'react-native-elements' import { Header } from 'react-native-elements'
import { IlinkEmitter } from "../../utils/events"; import { IlinkEmitter } from "../../utils/events";
import { Card, CardTitle, CardContent, CardAction, CardButton, CardImage } from 'react-native-material-cards' import { Card, CardTitle, CardContent, CardAction, CardButton, CardImage } from 'react-native-material-cards'
import { Color } from '../../config/Color';
let route = require('../../route.json');
require('./../../utils/Translations') require('./../../utils/Translations')
const height = responsiveHeight(100) - 250; const height = responsiveHeight(100) - 250;
@ -101,7 +105,6 @@ export default class UserAccount extends Component {
this.setState({ user: user }); this.setState({ user: user });
} }
initState() { initState() {
return { return {
user: {}, user: {},
@ -371,7 +374,49 @@ const styles = StyleSheet.create({
container: { container: {
flex: 1, flex: 1,
backgroundColor: '#EEEEEE', backgroundColor: '#EEEEEE',
},
contain: {
flexDirection: 'row',
justifyContent: 'space-between',
},
identificationOptionMenuContainer: {
flexDirection: 'row',
paddingTop: 10,
paddingLeft: 10,
paddingRight: 10,
},
containerTouch: {
flex: 1,
flexDirection: 'row',
marginRight: 2.5,
alignItems: 'center',
shadowColor: Color.borderColor,
borderColor: Color.borderColor,
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,
}, },
textInformation: { textInformation: {
fontSize: 16, fontSize: 16,

View File

@ -105,9 +105,7 @@ class Home extends BaseScreen {
this.setState({ isNeedLoadMore: false, isLoadingMap: true }) this.setState({ isNeedLoadMore: false, isLoadingMap: true })
const camera = await this.mapRef.getCamera() const camera = await this.mapRef.getCamera()
const zoom = camera.zoom - 10 const zoom = camera.zoom - 10
let res = [] let res = [];
this.setState({ isLoadingMap: true });
if (this.state.filternetworkTemp !== undefined) { if (this.state.filternetworkTemp !== undefined) {
let net = this.state.filternetworkTemp.id let net = this.state.filternetworkTemp.id
@ -117,6 +115,8 @@ class Home extends BaseScreen {
} }
if (res.length > 0) { if (res.length > 0) {
this.setState({ isLoadingMap: false })
let reseau = res[0]; let reseau = res[0];
const pos = { longitude: user.longitude, latitude: user.latitude } const pos = { longitude: user.longitude, latitude: user.latitude }
try { try {
@ -1514,7 +1514,7 @@ class Home extends BaseScreen {
const user = usr === null ? this.state.user : usr const user = usr === null ? this.state.user : usr
let { myNetwork } = this.state; let { myNetwork } = this.state;
this.setState({ filternetwork: myNetwork, page: 0, filternetworkTemp: myNetwork, loadingDialog: true }) this.setState({ filternetwork: myNetwork, page: 0, increasePas: 0, filternetworkTemp: myNetwork, loadingDialog: true })
return new Promise(() => { return new Promise(() => {
if (myNetwork !== undefined) { if (myNetwork !== undefined) {
this.loadingMarkers(this.state.myPosition, myNetwork, this.state.value).then((data) => { this.loadingMarkers(this.state.myPosition, myNetwork, this.state.value).then((data) => {
@ -2021,16 +2021,16 @@ class Home extends BaseScreen {
return geolib.getDistance(myPosition, location) <= (value * 1000) return geolib.getDistance(myPosition, location) <= (value * 1000)
&& mark.network === filternetwork.name && mark.network === filternetwork.name
}) })
this.setState({ currentNetworkSize: currentNetwork.length, currentNetworkMarkers: currentNetwork }) this.setState({ currentNetworkSize: currentNetwork.length, showProgress: false, currentNetworkMarkers: currentNetwork })
} catch (e) { } catch (e) {
console.debug("after " + e.message) console.debug("after " + e.message)
} }
/* if (this.state.user.category !== 'geolocated' && this.state.user.category !== 'super' if (this.state.user.category !== 'geolocated' && this.state.user.category !== 'super'
&& this.state.user.category !== 'hyper') { && this.state.user.category !== 'hyper') {
if (data.length === 0) { if (data.length === 0) {
this.loadMoreIfHasNoPoint(); this.loadMoreIfHasNoPoint();
} }
} */ }
console.debug("data:", data, "value" + value * 1000) console.debug("data:", data, "value" + value * 1000)
resolve(data) resolve(data)
}) })
@ -2038,37 +2038,38 @@ class Home extends BaseScreen {
loadMoreIfHasNoPoint = () => { loadMoreIfHasNoPoint = () => {
Alert.alert( /* Alert.alert(
I18n.t("NO_NETWORK_MARKER"), 'INFORMATIONS',
`${I18n.t('LAUNCH_POINT_WITH_FILTER')} ${this.filterOptions[this.state.increasePas + 1].label} ?`, '' + this.state.increasePas
,
[ [
{ text: I18n.t("NO"), onPress: () => { } }, { text: I18n.t("NO"), onPress: () => { } },
{ {
text: I18n.t("YES"), onPress: () => { text: I18n.t("YES"), onPress: () => { }
if (this.state.increasePas === this.filterOptions.length - 1) {
this.setState({ snack_visible: true, snack_text_message: I18n.t('NO_NETWORK_MARKER') })
setTimeout(() => {
this.setState({ snack_visible: false })
}, 5000)
}
else {
this.setState({ increasePas: this.state.increasePas + 1, isLoadingMap: true });
this.onLoadMore();
}
}
} }
], ],
{ cancelable: false } { cancelable: false }
) ); */
if (this.state.increasePas === this.filterOptions.length - 1) {
this.setState({ increasePas: 0, snack_visible: true, snack_text_message: I18n.t('NO_NETWORK_MARKER'), isLoadingMap: false })
setTimeout(() => {
this.setState({ snack_visible: false })
}, 5000);
}
else {
if (this.state.increasePas + 1 !== this.filterOptions.length) {
this.setState({ increasePas: this.state.increasePas + 1, isLoadingMap: true }, () => {
this.onLoadMore();
});
}
}
} }
treatNewData(pos, data, isFilter = false) { treatNewData(pos, data, isFilter = false) {
/*
this.setState({ isLoadingMap: false }); this.setState({ isLoadingMap: false }); */
let items = data; let items = data;
if (data.length > 0) { if (data.length > 0) {
@ -2082,25 +2083,16 @@ class Home extends BaseScreen {
if (items.length < this.state.currentNetworkSize) { if (items.length < this.state.currentNetworkSize) {
this.setState({ isNeedLoadMore: true }) this.setState({ isNeedLoadMore: true })
} else { } else {
/* if (isFilter && items.length <= 0) { if (isFilter && items.length <= 0) {
this.setState({ increasePas: 0, showProgress: false }, () => {
this.loadMoreIfHasNoPoint(); this.loadMoreIfHasNoPoint();
} */ });
}
this.setState({ isNeedLoadMore: false }) this.setState({ isNeedLoadMore: false })
} }
} else if (isFilter) {
this.setState({ markers: data });
this.setState({
snack_visible: true, snack_text_message: I18n.t('NO_NETWORK_CORRESPONDING')
})
setTimeout(() => {
this.setState({ snack_visible: false })
}, 5000)
} else { } else {
this.setState({ markers: data }); this.setState({ showProgress: false, markers: data });
} }
} }

View File

@ -0,0 +1,445 @@
import React, { Component } from 'react';
import { Alert, StyleSheet, Text, View, Image, ScrollView, Platform, ProgressBarAndroid, PermissionsAndroid, Keyboard } from 'react-native';
import PropTypes from 'prop-types';
import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome';
import Ionicons from 'react-native-vector-icons/Ionicons';
import Icon from 'react-native-vector-icons/MaterialIcons';
import { responsiveHeight, responsiveWidth, responsiveFontSize } from 'react-native-responsive-dimensions';
import { Fumi, Kaede } from 'react-native-textinput-effects'
import * as Animatable from 'react-native-animatable';
import Button from 'apsl-react-native-button';
let theme = require('./../../utils/theme.json');
let route = require('./../../route.json');
import I18n from 'react-native-i18n';
import isEqual from 'lodash/isEqual';
import { Color } from '../../config/Color';
import DateTimePicker from '@react-native-community/datetimepicker';
import { Dropdown } from 'react-native-material-dropdown';
import { getPositionInformation } from './../../webservice/MapService';
import { getCountryNetwork, createGeolocatedAccount, createUserAccount, getTownInformationName, getListCountriesActive, getCodeInformation, readUser } from './../../webservice/AuthApi';
import { SinglePickerMaterialDialog, MultiPickerMaterialDialog, MaterialDialog } from "react-native-material-dialog";
import Geolocation from 'react-native-geolocation-service';
import { identityPieces } from '../../utils/UtilsFunction';
const GEOLOCATION_OPTIONS = { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000, useSignificantChanges: true };
const moment = require('moment');
export default class CreateIdentification extends Component {
static navigatorStyle = {
navBarBackgroundColor: Color.primaryColor,
statusBarColor: Color.primaryDarkColor,
navBarTextColor: '#FFFFFF',
navBarButtonColor: '#FFFFFF'
};
static navigationOptions = () => {
return {
drawerLabel: () => null,
headerTitle: I18n.t('CREATION_IDENTIFICATION_DESCRIPTION'),
headerTintColor: 'white',
headerStyle: {
backgroundColor: Color.primaryColor,
marginTop: 0,
color: 'white'
},
headerTitleStyle: {
color: "white"
},
title: I18n.t('CREATION_IDENTIFICATION_DESCRIPTION')
}
};
constructor(props) {
super(props);
this.state = {
password: null,
enterPhone: null,
nameanim: null,
dateNaissance: new Date(),
networksinglePickerVisible: false,
passwordanim: null,
confirmpassanim: null,
isLoging: false,
countries: [],
town: [],
identityPieces: identityPieces(),
identityPiecesName: (identityPieces()[0]).name,
snackVisible: false,
snackText: '',
disableNetwork: false,
networks: [],
showPickerDateNaissance: false,
modalVisible: true,
select_network: I18n.t("SELECT_NETWORK"),
user: null
};
this.dateNaissanceRef = null;
this.surnameanim = null;
this.dateNaissanceFumiProps = {};
}
componentDidMount() {
readUser().then((user) => {
if (user) {
if (user !== undefined) {
this.setState({ user });
}
}
});
if (Platform.OS === 'android') {
this.requestCameraPermission();
} else {
this.watchLocation();
}
}
componentWillUpdate(nextProps, nextState) {
if (this.state.showPickerDateNaissance)
this.dateNaissanceFumiProps.value = moment(nextState.dateNaissance).format('DD-MM-YYYY');
}
componentWillUnmount() {
this.mounted = false;
if (this.watchID) Geolocation.clearWatch(this.watchID);
}
showErrorDialog() {
this.setState({ modalDialog: false })
Aler.alert("Une erreur est survenue", "Impossible de récuperer des informations du pays verifier que votre gps est activé," +
"et que vous êtes connecté à internet puis ressayer", [{
text: "Recommencer", onPress: () => {
this.watchLocation()
}
}, { text: "Annuler", onPress: () => { this.props.navigation.popToTop() } }])
}
async watchLocation() {
Geolocation.getCurrentPosition((position) => {
this.treatPosition(position)
}, (e) => {
this.showErrorDialog()
}, this.props.geolocationOptions);
if (!this.watchID) {
Geolocation.watchPosition((position) => { this.treatPosition(position) }, (e) => { this.showErrorDialog() }, this.props.geolocationOptions)
}
}
async requestCameraPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
'title': 'Cool Photo App Camera Permission',
'message': 'Cool Photo App needs access to your camera ' +
'so you can take awesome pictures.'
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.watchLocation();
} else {
this.setState({ modalDialog: false })
Alert.alert("Echec à l'autorisation",
"L'application n'est pas autorisé à acceder à votre position veuillez verifier que votre GPS est activé et configurer en mode Haute Precision",
[{
text: "Ok", onPress: () => {
this.props.navigation.popToTop()
}
}])
}
} catch (err) {
this.setState({ modalDialog: false })
Alert.alert("Une erreur est Survenue",
"Une erreur est survenu lors du demarrage de l'application veuillez relancer l'application",
[{
text: "Ok", onPress: () => {
BackHandler.exitApp()
}
}])
}
}
treatPosition(position) {
const myLastPosition = this.state.myPosition;
const myPosition = position.coords;
if (!isEqual(myPosition, myLastPosition)) {
getPositionInformation(myPosition).then((response) => {
if (response.results !== undefined) {
if (response.results.length > 0) {
let most = response.results[0]
let { address_components, formatted_address, place_id } = most
this.setState({ address: address_components, textadress: formatted_address, place: place_id })
let results = response.results;
let shortcountry;
let mcountry;
for (let i = 0; i < results[0].address_components.length; i++) {
for (let j = 0; j < results[0].address_components[i].types.length; j++) {
if (results[0].address_components[i].types[j] === "country") {
mcountry = results[0].address_components[i];
shortcountry = mcountry.short_name;
this.setState({ shortCountry: mcountry.short_name, longCountry: mcountry.long_name })
} else if (results[0].address_components[i].types[j] === "locality") {
const name = results[0].address_components[i].short_name;
this.setState({ townName: name });
getTownInformationName(name).then((result) => {
let town = null;
if (result instanceof Array) {
town = result[0];
} else
town = result;
this.setState({ modalVisible: false, town: new Array(town) });
})
}
}
}
getListCountriesActive().then((cnt) => {
this.setState({ countries: cnt })
console.debug(cnt, shortcountry);
var found = false
for (let i of cnt) {
if (i.code_country === shortcountry) {
found = true;
this.setState({ modalVisible: false, indicatif: i.code_dial, country: i.name })
/* this.getNetworks(i.code_dial); */
}
}
if (!found) {
Alert.alert("Impossible de recupérer vos informations", "Nous n'avons pas pu recuperer les informations de votre pays veuillez contacter les administrateurs", [{ text: "OK" }]);
}
})
}
}
}).catch((e) => {
this.showErrorDialog()
});
this.setState({ myPosition: myPosition });
/* if (this.mapRef !== undefined && this.mapRef !== null) {
this.mapRef.animateToCoordinate({
latitude: myPosition.latitude,
longitude: myPosition.longitude
}, 1000);
this.mapRef.animateToRegion({
latitude: myPosition.latitude,
longitude: myPosition.longitude,
latitudeDelta: 0.03,
longitudeDelta: 0.01,
}, 1000)
} */
}
}
onChange = (event, selectedDate) => {
const currentDate = selectedDate || this.state.dateNaissance;
this.setState({
showPickerDateNaissance: Platform.OS === 'ios' || false,
dateNaissance: currentDate,
});
};
renderLoaderModal() {
return (<MaterialDialog
visible={this.state.modalVisible}
title={I18n.t("LOADING_INFO")}
>
<View style={{ justifyContent: 'center', alignItems: 'center' }}>
<Text>{I18n.t("LOADING_DESCRIPTION_COUNTRY")}</Text>
<ProgressBarAndroid />
</View>
</MaterialDialog>)
}
renderDateNaissancePicker = () => {
return (
<DateTimePicker
testID="dateTimePicker"
timeZoneOffsetInMinutes={0}
is24Hour={true}
value={this.state.dateNaissance}
mode='date'
maximumDate={new Date()}
display="calendar"
onChange={this.onChange}
/>
);
}
render() {
console.log("STATE", this.state);
const { showPickerDateNaissance } = this.state;
return (
<>
{this.state.showPickerDateNaissance && this.renderDateNaissancePicker()}
{this.state.modalVisible && this.renderLoaderModal()}
<ScrollView style={styles.container}>
<Text style={styles.subbigtitle}>{I18n.t('CREATE_IDENTIFICATION_TITLE')}</Text>
<Animatable.View ref={(comp) => { this.nameanim = comp }}>
<Fumi ref={(ref) => { this.dateNaissance = ref }}
iconClass={FontAwesomeIcon} iconName={'user'}
label={`${I18n.t('NAME')} ${I18n.t('AND')} ${I18n.t('FIRSTNAME')}`}
iconColor={'#f95a25'}
iconSize={20}
onChangeText={(text) => {
let use = this.state.user;
use.lastname = text;
this.setState({ user: use })
}}
style={styles.input}
>
</Fumi>
</Animatable.View>
<Animatable.View ref={(comp) => { this.surnameanim = comp }}>
<Fumi iconClass={FontAwesomeIcon} iconName={'calendar'}
label={I18n.t('DATE_NAISSANCE')}
iconColor={'#f95a25'}
iconSize={20}
style={styles.input}
onFocus={() => {
Keyboard.dismiss();
this.setState({ showPickerDateNaissance: true })
}}
{...this.dateNaissanceFumiProps}>
</Fumi>
</Animatable.View>
<View
style={{
width: responsiveWidth(90),
height: 60,
marginTop: 20,
alignSelf: 'center',
borderRadius: 10,
paddingLeft: 20,
paddingRight: 20,
backgroundColor: 'white'
}}>
<Dropdown
label={I18n.t('COUNTRY_CHOICE')}
data={this.state.countries}
useNativeDriver={true}
value={this.state.country === null ? "" :
this.state.country}
onChangeText={(value, index, data) => {
this.setState({ country: value });
}}
valueExtractor={(value) => { return value.name }}
labelExtractor={(value) => { return value.name }}
/>
</View>
<View
style={{
width: responsiveWidth(90),
height: 60,
marginTop: 20,
alignSelf: 'center',
borderRadius: 10,
paddingLeft: 20,
paddingRight: 20,
backgroundColor: 'white'
}}>
<Dropdown
label={I18n.t('CHOICE_TOWN')}
data={this.state.town}
useNativeDriver={true}
value={this.state.townName === null ? "" :
this.state.townName}
onChangeText={(value, index, data) => {
this.setState({ townName: value });
}}
valueExtractor={(value) => { return value.name }}
labelExtractor={(value) => { return value.name }}
/>
</View>
<View
style={{
width: responsiveWidth(90),
height: 60,
marginTop: 20,
alignSelf: 'center',
borderRadius: 10,
paddingLeft: 20,
paddingRight: 20,
backgroundColor: 'white'
}}>
<Dropdown
label={I18n.t('PIECE_IDENTITE')}
data={this.state.identityPieces}
useNativeDriver={true}
value={this.state.identityPiecesName}
onChangeText={(value, index, data) => {
this.setState({ identityPiecesName: value });
}}
valueExtractor={(value) => { return value.name }}
labelExtractor={(value) => { return value.name }}
/>
</View>
<Animatable.View ref={(comp) => { this.surnameanim = comp }}>
<Fumi iconClass={FontAwesomeIcon} iconName={'calendar-times-o'}
label={I18n.t('IDENTITY_PIECE_EXPIRY_DATE')}
iconColor={'#f95a25'}
iconSize={20}
style={styles.input}
onFocus={() => {
Keyboard.dismiss();
this.setState({ showPickerDateNaissance: true })
}}
{...this.dateNaissanceFumiProps}>
</Fumi>
</Animatable.View>
<Button style={styles.btnvalide}
textStyle={styles.textbtnvalide}
isLoading={this.state.isLoging}
onPress={() => { this.checkUserGeolocated() }}>
{I18n.t('NEXT')}</Button>
</ScrollView>
</>
)
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: Color.primaryDarkColor,
},
textbtnvalide: {
color: 'white',
fontWeight: 'bold'
},
bigtitle: {
color: 'white',
fontSize: 20,
flex: 1,
fontWeight: 'bold',
textAlign: 'center',
margin: 20,
},
subbigtitle: {
color: 'white',
fontSize: 17,
textAlign: 'center',
margin: 5,
},
btnvalide: {
marginTop: 20,
marginLeft: 20,
marginRight: 20,
borderColor: 'transparent',
backgroundColor: Color.accentLightColor,
height: 52
},
input: {
height: 60,
marginTop: responsiveHeight(2),
marginLeft: responsiveWidth(5),
marginRight: responsiveWidth(5),
borderRadius: 5,
}
});

View File

@ -34,6 +34,7 @@ import WalletDetail from './wallet/WalletDetail';
import walletDepot from './wallet/WalletDepot'; import walletDepot from './wallet/WalletDepot';
import WalletRetrait from './wallet/WalletRetrait'; import WalletRetrait from './wallet/WalletRetrait';
import WalletSelect from './wallet/WalletSelect'; import WalletSelect from './wallet/WalletSelect';
import CreateIdentification from './identification/createIdentification';
let route = require('./../route.json') let route = require('./../route.json')
export function registerScreens() { export function registerScreens() {
@ -50,6 +51,7 @@ export function registerScreens() {
Navigation.registerComponent(route.configurations, () => Configurations); Navigation.registerComponent(route.configurations, () => Configurations);
Navigation.registerComponent(route.typeaccountcreate, () => TypeChoiser); Navigation.registerComponent(route.typeaccountcreate, () => TypeChoiser);
Navigation.registerComponent(route.simpleusercreate, () => CreateAccount); Navigation.registerComponent(route.simpleusercreate, () => CreateAccount);
Navigation.registerComponent(route.createIdentification, () => CreateIdentification);
Navigation.registerComponent(route.historyItemDetails, () => HistoryItemDetails); Navigation.registerComponent(route.historyItemDetails, () => HistoryItemDetails);
Navigation.registerComponent(route.modalhistoryfilter, () => DateFilterHistoryDemand); Navigation.registerComponent(route.modalhistoryfilter, () => DateFilterHistoryDemand);
Navigation.registerComponent(route.superviseurgroup, () => SuperViseurGroupeHome); Navigation.registerComponent(route.superviseurgroup, () => SuperViseurGroupeHome);

View File

@ -44,8 +44,6 @@ export default class CreateAccount extends Component {
} }
initState() { initState() {
return { return {
password: null, password: null,
@ -421,5 +419,5 @@ const styles = StyleSheet.create({
marginRight: responsiveWidth(5), marginRight: responsiveWidth(5),
borderRadius: 5, borderRadius: 5,
} }
}) });

View File

@ -379,9 +379,7 @@ export default class CreateUserStep2 extends Component {
paddingLeft: 20, paddingLeft: 20,
paddingRight: 20, paddingRight: 20,
backgroundColor: 'white' backgroundColor: 'white'
}} }}>
>
<Dropdown <Dropdown
label={I18n.t('COUNTRY_CHOICE')} label={I18n.t('COUNTRY_CHOICE')}
data={this.state.countries} data={this.state.countries}

View File

@ -28,14 +28,8 @@ import DeviceInfo from "react-native-device-info"
import AppContainer, { AppNavigator } from "../../App"; import AppContainer, { AppNavigator } from "../../App";
import Configuration from "../../webservice/persistences/Configuration"; import Configuration from "../../webservice/persistences/Configuration";
import { ScrollView } from 'react-native-gesture-handler'; import { ScrollView } from 'react-native-gesture-handler';
import { store } from "../../redux/store";
import axios from "axios";
import { logoutActionUrl } from '../../webservice/IlinkConstants';
import { bindActionCreators } from 'redux';
import getAuthApiKey from '../../webservice/AuthKeyApi';
import { connect } from 'react-redux';
class OptionsMenu extends Component { export default class OptionsMenu extends Component {
static navigatorStyle = { static navigatorStyle = {
statusBarColor: primaryDarkAdvanced, statusBarColor: primaryDarkAdvanced,
@ -54,22 +48,6 @@ class OptionsMenu extends Component {
this.setState({ user }); this.setState({ user });
} }
}); });
let prevStore = store.getState().authKeyReducer
store.subscribe(() => {
const { authKeyReducer } = store.getState();
console.log("authKeyReducer", authKeyReducer);
if (prevStore !== authKeyReducer) {
if (authKeyReducer.authKey !== null) {
this.setState({
authKey: `${authKeyReducer.authKey.token_type} ${authKeyReducer.authKey.access_token}`,
});
}
}
})
} }
@ -109,10 +87,13 @@ class OptionsMenu extends Component {
return "" return ""
} }
componentDidMount() { componentDidMount() {
const items = this.props.navigation.router.childRouters.sta.childRouters; const items = this.props.navigation.router.childRouters.sta.childRouters;
this.setState({ items: items }) this.setState({ items: items })
this.retrieveAndroidInformation() this.retrieveAndroidInformation()
} }
updateLangue() { updateLangue() {
this.setState({ lang: "change" }) this.setState({ lang: "change" })
@ -164,8 +145,6 @@ class OptionsMenu extends Component {
user: null, user: null,
menu: [], menu: [],
currentId: 0, currentId: 0,
auth: null,
authKey: null
} }
} }
getGeolocatedUserMenu() { getGeolocatedUserMenu() {
@ -221,7 +200,6 @@ class OptionsMenu extends Component {
case "hyper": case "hyper":
menu = this.getHyperUsermenu(); menu = this.getHyperUsermenu();
break; break;
} }
} else { } else {
menu = this.getUserMenu(); menu = this.getUserMenu();
@ -235,6 +213,7 @@ class OptionsMenu extends Component {
return [ return [
{ title: I18n.t('MAP'), id: 0, key: 0, icon: 'md-map', active: true } { title: I18n.t('MAP'), id: 0, key: 0, icon: 'md-map', active: true }
, { title: I18n.t('MY_ACCOUNT'), id: 1, key: 1, icon: 'md-person', active: false } , { title: I18n.t('MY_ACCOUNT'), id: 1, key: 1, icon: 'md-person', active: false }
, { title: I18n.t('WALLET'), id: 6, key: 6, icon: 'md-wallet-outline', active: false }
, { title: I18n.t('NOTIFICATIONS'), id: 3, key: 3, icon: 'md-notifications', active: false } , { title: I18n.t('NOTIFICATIONS'), id: 3, key: 3, icon: 'md-notifications', active: false }
, { title: I18n.t('CONFIGURATIONS'), id: 4, icon: 'md-settings', active: false }] , { title: I18n.t('CONFIGURATIONS'), id: 4, icon: 'md-settings', active: false }]
} }
@ -257,16 +236,22 @@ class OptionsMenu extends Component {
this.props.navigation.navigate(item, { agentId: this.state.user.agentId }); this.props.navigation.navigate(item, { agentId: this.state.user.agentId });
break; break;
case "geolocated":
this.props.navigation.navigate(item);
break;
default: default:
this.props.navigation.navigate(item); if (item === "walletSelect")
item = "walletDetailUser";
this.props.navigation.navigate(item, { userId: this.state.user.id });
break; break;
} }
} }
} }
_renderItem = (item) => { _renderItem = (item) => {
if (item === "creditrequest" || item === 'historyItemDetails' || item === 'filter' || item === 'networks' || item === 'walletDetail' || item === 'walletDepot' || item === 'walletRetrait') { if (item === "creditrequest" || item === 'historyItemDetails' || item === 'filter' || item === 'networks' || item === 'walletDetail' || item === 'walletDetailUser' || item === 'walletDepot' || item === 'walletRetrait' || item === 'createIdentification') {
return null return null
} else { } else {
const color = this.state.currentId === item.id ? theme.accent : "grey" const color = this.state.currentId === item.id ? theme.accent : "grey"
@ -548,17 +533,6 @@ class OptionsMenu extends Component {
{ text: I18n.t('NO'), onPress: () => console.log('Cancel Pressed'), style: 'cancel' }, { text: I18n.t('NO'), onPress: () => console.log('Cancel Pressed'), style: 'cancel' },
{ {
text: I18n.t('YES'), onPress: () => { text: I18n.t('YES'), onPress: () => {
axios({
url: logoutActionUrl,
method: 'POST',
headers: {
'Authorization': this.state.authKey
}
}).then((response) => {
console.log("DECONNECTE", response);
}).catch((error) => {
console.warn("DECONNECTE", error);
})
disconnect().then(() => { disconnect().then(() => {
IlinkEmitter.emit("userdisconnect"); IlinkEmitter.emit("userdisconnect");
this.props.navigation.navigate("Auth") this.props.navigation.navigate("Auth")
@ -580,17 +554,6 @@ class OptionsMenu extends Component {
} }
} }
const mapStateToProps = state => ({
loading: state.authKeyReducer.loading,
authKey: state.authKeyReducer.authKey,
error: state.authKeyReducer.error
});
const mapDispatchToProps = dispatch => bindActionCreators({
getAuthApiKey,
}, dispatch);
export default connect(mapStateToProps, mapDispatchToProps)(OptionsMenu);
const items = StyleSheet.create({ const items = StyleSheet.create({
content: { content: {
width: responsiveWidth(100), width: responsiveWidth(100),

View File

@ -210,7 +210,7 @@ export default class OptionsMenu extends Component<Props> {
, { title: I18n.t('CONFIGURATIONS'), id: 4, icon: 'md-settings', active: false }] , { title: I18n.t('CONFIGURATIONS'), id: 4, icon: 'md-settings', active: false }]
} }
_renderItem = (item) => { _renderItem = (item) => {
if (item === "creditrequest" || item === 'historyItemDetails' || item === 'filter' || item === 'networks') { if (item === "creditrequest" || item === 'historyItemDetails' || item === 'filter' || item === 'networks' || item === 'createIdentification') {
return null return null
} else { } else {
const color = this.state.currentId === item.id ? theme.accent : "grey" const color = this.state.currentId === item.id ? theme.accent : "grey"

View File

@ -31,7 +31,7 @@ import 'moment/locale/en-nz'
import 'moment/locale/en-gb' import 'moment/locale/en-gb'
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import { thousandsSeparators } from '../../utils/UtilsFunction'; import { thousandsSeparators, isEmptyObject } from '../../utils/UtilsFunction';
import DeviceInfo from 'react-native-device-info' import DeviceInfo from 'react-native-device-info'
let route = require('./../../route.json'); let route = require('./../../route.json');
@ -191,17 +191,6 @@ class WalletDetail extends Component {
loading: false loading: false
}) })
} */ } */
isEmptyObject = (obj) => {
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
getWalletIcon = (wallet) => { getWalletIcon = (wallet) => {
return `${baseUrl}/datas/img/network/${slugify(wallet.network, { lower: true })}-logo.png`; return `${baseUrl}/datas/img/network/${slugify(wallet.network, { lower: true })}-logo.png`;
@ -478,7 +467,7 @@ class WalletDetail extends Component {
console.log("WALLET SEND", wallet); console.log("WALLET SEND", wallet);
return ( return (
!this.isEmptyObject(wallet) ? !isEmptyObject(wallet) ?
(<> (<>
{this.state.triggerTransferCommission && this.renderDialogTransferCommissionResponse()} {this.state.triggerTransferCommission && this.renderDialogTransferCommissionResponse()}
{/* {this.state.loading ? {/* {this.state.loading ?
@ -596,6 +585,196 @@ class WalletDetail extends Component {
</TouchableOpacity> </TouchableOpacity>
</View> </View>
</View> </View>
{wallet.network.toLowerCase().includes('ilink') &&
<>
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='cash-multiple'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_CREDIT')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('WITHDRAWAL_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { }}
activeOpacity={0.9}>
<Icon name='heart-multiple'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_SANTE')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text numberOfLines={1} style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('VALIDATE_IDENTIFICATION_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
</View>
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='file-document'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('PAIEMENT_FACTURE')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={{ flex: 1 }}>
{/* <TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='md-outline'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_CREDIT')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('WITHDRAWAL_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity> */}
</View>
</View>
<View style={[styles.checkDefault, { borderBottomColor: Color.borderColor }]}>
<Text
style={[Typography.title3, Typography.semibold]}>
{I18n.t('IDENTIFICATION')}
</Text>
</View>
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='pencil-plus'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('CREATION_IDENTIFICATION')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('CREATION_IDENTIFICATION_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { }}
activeOpacity={0.9}>
<Icon name='check-circle'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('VALIDATE_IDENTIFICATION')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text numberOfLines={1} style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('VALIDATE_IDENTIFICATION_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
</View>
</>
}
</> </>
)} )}

View File

@ -0,0 +1,834 @@
import React, { Component } from 'react';
import { Animated, Alert, Platform, StyleSheet, View, Image, StatusBar, ScrollView, Text, ProgressBarAndroid, ActivityIndicator, TouchableOpacity } from 'react-native';
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
import I18n from 'react-native-i18n'
import { TabView, TabBar, SceneMap } from 'react-native-tab-view';
import * as Utils from '../../utils/DeviceUtils';
import Icons from 'react-native-vector-icons/Ionicons'
import { Images } from '../../config/Images';
import CustomButton from '../../components/CustomButton';
import { Color } from '../../config/Color';
import Tag from '../../components/Tag';
import { IlinkEmitter } from "../../utils/events";
import { CreditCardInput } from "react-native-credit-card-input";
import { Typography, FontWeight } from '../../config/typography';
import { responsiveHeight, responsiveWidth, } from 'react-native-responsive-dimensions';
import { getWalletDetailActivated, resetWalletListDetailReducer } from '../../webservice/WalletApi';
import { depositActionReset } from '../../webservice/DepositApi';
import { getWalletTransactionHistory, getWalletTransactionHistoryReset } from '../../webservice/WalletTransactionHistoryApi';
import { transferCommissionAction } from '../../webservice/WalletTransferCommission';
import { resetCommissionReducer } from '../../webservice/WalletTransferCommission';
import Dialog, { DialogContent, DialogTitle, DialogFooter, DialogButton } from 'react-native-popup-dialog';
import { baseUrl } from '../../webservice/IlinkConstants';
let moment = require('moment-timezone');
import 'moment/locale/fr'
import 'moment/locale/es-us'
import 'moment/locale/en-au'
import 'moment/locale/en-ca'
import 'moment/locale/en-ie'
import 'moment/locale/en-il'
import 'moment/locale/en-nz'
import 'moment/locale/en-gb'
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { thousandsSeparators, isEmptyObject, transactionHistoryUser } from '../../utils/UtilsFunction';
import DeviceInfo from 'react-native-device-info'
let route = require('./../../route.json');
let slugify = require('slugify');
require('../../utils/Translations');
class WalletDetailUser extends Component {
constructor(props) {
super(props);
this.state = {
index: 0,
heightHeader: Utils.heightHeader(),
isModalConfirmVisible: false,
wallet: null,
triggerTransferCommission: false,
loading: false,
isTriggerRefresh: false,
scrollHeaderY: 0
};
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.currentLocale = DeviceInfo.getDeviceLocale().includes("fr") ? "fr" : "en-gb";
moment.locale(this.currentLocale);
IlinkEmitter.on("langueChange", this.updateLangue.bind(this));
/* this.props.getWalletTransactionHistoryReset();
this.props.depositActionReset();
this.props.resetWalletListDetailReducer();
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
})
}
} */
}
shouldComponentUpdate(nextProps, nextState) {
if (this.state.triggerTransferCommission !== nextState.triggerTransferCommission) {
return false;
} else {
return true;
}
}
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);
}
}
renderHeader = () => (
<View style={[
styles.containField,
{
backgroundColor: Color.cardBackgroundColor,
zIndex: 11,
shadowColor: Color.borderColor,
borderColor: Color.borderColor,
}
]}>
<View style={[styles.contentLeftItem]}>
<Text numberOfLines={1} style={[Typography.body1, Typography.semibold]}>{I18n.t('COUNTRY')}</Text>
<Text numberOfLines={1} adjustsFontSizeToFit={true} style={Typography.caption1}>Gabon</Text>
</View>
<View style={{
flex: 1,
alignItems: 'center',
justifyContent: 'flex-end',
}}>
<Animated.Image
source={{ uri: `https://ilink-app.com/mobilebackend/datas/img/network/uba-fs-ilink-logo.png` }}
style={{
width: 120,
height: 120,
borderRadius: 60,
position: 'absolute',
alignSelf: 'center',
backgroundColor: Color.whiteColor,
bottom: 70,
transform: [{
scale: this.imageScale()
},
{
translateY: this.imageTranslateY()
}]
}} />
<View style={{
marginTop: 1, flex: 1,
alignItems: 'center',
justifyContent: 'flex-end'
}}>
<Text style={[Typography.headline, Typography.semibold]} numberOfLines={1}>UBA FS iLink</Text>
<Tag primary style={styles.tagFollow}>
{I18n.t('CREATION_IDENTIFICATION_CLIENT')}
</Tag>
</View>
</View>
<View style={styles.contentLeftItem}>
<Text numberOfLines={1} style={[Typography.body1, Typography.semibold]} >{I18n.t('CREATION_DATE')}</Text>
<Text numberOfLines={1} adjustsFontSizeToFit={true} style={Typography.caption1}>Il y'a deux jours</Text>
</View>
</View>
);
renderLoader = () => {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid />
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="large" color={'#ccc'} />
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
)
}
renderAccountDetail = (wallet) => (
<View style={{ flexDirection: 'row', flex: 1, justifyContent: 'space-between' }}>
<View
style={{
flexDirection: 'row',
alignItems: 'center',
}}>
<View
style={[
styles.circlePoint,
{ backgroundColor: Color.primaryColor },
]}>
<Icons name='md-wallet'
size={28}
color={Color.whiteColor}
/>
</View>
<View>
<Text style={[Typography.title3, Color.primaryColor], { marginBottom: 3 }}>
{I18n.t('PRINCIPAL_ACCOUNT_TITLE')}
</Text>
<Text style={[Typography.body2]}>0</Text>
</View>
</View>
<View
style={{
flexDirection: 'row',
alignItems: 'center',
}}>
<View
style={[
styles.circlePoint,
{ backgroundColor: Color.primaryColor },
]}>
<Icons name='md-key'
size={28}
color={Color.whiteColor}
/>
</View>
<View>
<Text style={[Typography.title3, Color.primaryColor], { marginBottom: 3 }}>
{I18n.t('NUMERO_COMPTE')}
</Text>
<Text style={[Typography.body2]}>123456789</Text>
</View>
</View>
</View>
);
renderDetailWallet = () => {
return (
(<>
{this.state.triggerTransferCommission && this.renderDialogTransferCommissionResponse()}
<View
style={styles.container}>
<Animated.View style={{
position: 'absolute',
width: "100%",
zIndex: 1,
backgroundColor: Color.primaryColor,
height: 140 - this.state.scrollHeaderY,
}} />
<ScrollView 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 }); } })}>
<View style={{ marginTop: 80, }}>
{this.renderHeader()}
<View
style={[styles.blockView, { borderBottomColor: Color.borderColor }]}>
{this.renderAccountDetail()}
<>
<View style={[styles.checkDefault, { borderBottomColor: Color.borderColor }]}>
<Text
style={[Typography.title3, Typography.semibold]}>
{I18n.t('TRANSACTIONS')}
</Text>
</View>
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { }}
activeOpacity={0.9}>
<Icon name='arrow-bottom-right'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('DEPOSIT')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text numberOfLines={1} style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('DEPOSIT_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='arrow-top-left'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('WITHDRAWAL')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('WITHDRAWAL_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
</View>
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='cash-multiple'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_CREDIT')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('WITHDRAWAL_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { }}
activeOpacity={0.9}>
<Icon name='heart-multiple'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_SANTE')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text numberOfLines={1} style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('VALIDATE_IDENTIFICATION_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
</View>
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='file-document'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('PAIEMENT_FACTURE')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={{ flex: 1 }}>
{/* <TouchableOpacity style={styles.contain}
onPress={() => { this.props.navigation.push(route.createIdentification) }}
activeOpacity={0.9}>
<Icon name='md-outline'
color={Color.primaryColor}
size={30}
style={styles.imageBanner} />
<View style={[styles.content]}>
<View style={styles.contentTitle}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_CREDIT')}
</Text>
</View>
<View style={{ flex: 1 }}>
<Text style={[Typography.overline, Color.grayColor], { paddingVertical: 5 }} numberOfLines={5}>
{I18n.t('WITHDRAWAL_DESCRIPTION')}
</Text>
</View>
</View>
</TouchableOpacity> */}
</View>
</View>
</>
{this.renderHistoryTransaction()}
</View>
</View>
</ScrollView>
</View>
</>)
)
}
renderHistoryTransactionItem = (item) => {
let re = moment.tz(item.date, 'Etc/GMT+0').format();
let date = moment(re).fromNow();
return (
<View
key={item.id}
style={[styles.paymentItem, { borderBottomColor: Color.borderColor }]}>
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<View style={styles.iconContent}>
<Icon name='arrow-bottom-right'
color={Color.primaryColor} size={20} />
</View>
<View>
<Text style={Typography.subhead}>{item.description}</Text>
<Text style={[Typography.caption1, Color.grayColor]} style={{ marginTop: 5 }}>
{date}
</Text>
</View>
</View>
</View>
);
}
renderHistoryTransactionList = () => {
return (
transactionHistoryUser().map((item, ) => (
this.renderHistoryTransactionItem(item)
))
)
}
renderHistoryTransaction = () => {
return (
<>
<View style={[styles.checkDefault, { borderBottomColor: Color.borderColor }]}>
<Text
style={[Typography.title3, Typography.semibold]}>
{I18n.t('TRANSACTION_HISTORY')}
</Text>
</View>
<ScrollView style={styles.transactionContainer}>
{
this.props.loadingTransaction ?
(
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid />
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="large" color={'#ccc'} />
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
) : this.renderHistoryTransactionList()
}
</ScrollView>
</>
)
}
render() {
return (
<>
<StatusBar
backgroundColor={Color.primaryDarkColor}
barStyle="light-content"
translucent={true}
/>
{
this.renderDetailWallet()
}
</>
);
}
}
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)(WalletDetailUser);
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',
},
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,
paddingTop: 10,
paddingLeft: 10,
paddingRight: 10,
},
containerTouch: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
marginRight: 1,
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,
}
})

View File

@ -1,5 +1,44 @@
import I18n from 'react-native-i18n';
export const thousandsSeparators = (num) => { export const thousandsSeparators = (num) => {
var num_parts = num.toString().split("."); var num_parts = num.toString().split(".");
num_parts[0] = num_parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, " "); num_parts[0] = num_parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, " ");
return num_parts.join("."); return num_parts.join(".");
} }
export const identityPieces = () => {
return [
{
name: I18n.t('IDENTITY_CARD')
},
{
name: I18n.t('PASSEPORT')
},
{
name: I18n.t('OTHER_IDENTITY_PIECE')
},
]
}
export const transactionHistoryUser = () => {
return [
{
description: `Dépôt de 10 000 dans le wallet UBA Fs iLink à destination de Brice Zele (+237690662238) `,
date: '2020-05-15'
},
{
description: `Retrait de 10 000 dans le wallet UBA Fs iLink à destination de Brice Zele (+237690662238) `,
date: '2020-05-20'
},
];
}
export const isEmptyObject = (obj) => {
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}

View File

@ -54,6 +54,9 @@
"CARD_NUMBER_ERROR": "Card number incorrect", "CARD_NUMBER_ERROR": "Card number incorrect",
"AMOUNT_LABEL": "Amount", "AMOUNT_LABEL": "Amount",
"WITHDRAWAL": "Withdrawal", "WITHDRAWAL": "Withdrawal",
"NANO_CREDIT": "Nano credit",
"NANO_SANTE": "Nano health",
"PAIEMENT_FACTURE": "Bill payment",
"DEMAND_SEND": "Demand send", "DEMAND_SEND": "Demand send",
"WITHDRAWAL_DESCRIPTION": "Make a withdrawal", "WITHDRAWAL_DESCRIPTION": "Make a withdrawal",
"COMMISSION_ACCOUNT_TITLE": "Commission account", "COMMISSION_ACCOUNT_TITLE": "Commission account",
@ -63,6 +66,7 @@
"CONFIRM_TRANSFER_COMMISSION": "Confirm commission transfer", "CONFIRM_TRANSFER_COMMISSION": "Confirm commission transfer",
"CREATION_DATE": "Creation date", "CREATION_DATE": "Creation date",
"PRINCIPAL_ACCOUNT_TITLE": "Principal account", "PRINCIPAL_ACCOUNT_TITLE": "Principal account",
"NUMERO_COMPTE": "Account number",
"NO_WALLET_ACTIVED": "No wallet is activated for your account", "NO_WALLET_ACTIVED": "No wallet is activated for your account",
"TRANSFER_TO_PRINCIPAL_ACCOUNT": "Transfer commissions", "TRANSFER_TO_PRINCIPAL_ACCOUNT": "Transfer commissions",
"PRINCIPAL": "Principal", "PRINCIPAL": "Principal",
@ -94,6 +98,7 @@
"GROUP_MEMBERS": "The group members", "GROUP_MEMBERS": "The group members",
"NAME": "Last name(s)", "NAME": "Last name(s)",
"FIRSTNAME": "First name(s) ", "FIRSTNAME": "First name(s) ",
"AND": "and",
"ADMIN": "Administrator", "ADMIN": "Administrator",
"SUPER_ADMIN": "Super administrator", "SUPER_ADMIN": "Super administrator",
"GEOLOCATED": "Geo located agent", "GEOLOCATED": "Geo located agent",
@ -113,6 +118,13 @@
"PHONE_NUMBER": "Phone", "PHONE_NUMBER": "Phone",
"CHOICE_NETWORK": "Choose a network", "CHOICE_NETWORK": "Choose a network",
"COUNTRY_CHOICE": "Choose a country", "COUNTRY_CHOICE": "Choose a country",
"CHOICE_TOWN": "Choose a town",
"PIECE_IDENTITE": "Identity piece",
"IDENTITY_CARD": "Identity card",
"PASSEPORT": "Passeport",
"OTHER_IDENTITY_PIECE": "Other",
"IDENTITY_NUMBER": "N° of piece",
"IDENTITY_PIECE_EXPIRY_DATE": "Expiry date",
"LAST_STEP": "Last step", "LAST_STEP": "Last step",
"ACTIVE_ACCOUNT": "Activate the account !", "ACTIVE_ACCOUNT": "Activate the account !",
"ACTIVE_USER": "Active", "ACTIVE_USER": "Active",
@ -255,6 +267,13 @@
"FREE": "Available", "FREE": "Available",
"SAVED": "Registered", "SAVED": "Registered",
"ACCOUNT_INFO": "My Account Information", "ACCOUNT_INFO": "My Account Information",
"IDENTIFICATION": " Identification",
"CREATION_IDENTIFICATION": "Creation",
"CREATION_IDENTIFICATION_DESCRIPTION": "Identify a client",
"VALIDATE_IDENTIFICATION": "Validation",
"VALIDATE_IDENTIFICATION_DESCRIPTION": "Validate an identi...",
"CREATE_IDENTIFICATION_TITLE": "Please fill in customer information",
"DATE_NAISSANCE": "Date of birth",
"REGISTER_YOURSELF": "Register", "REGISTER_YOURSELF": "Register",
"REGISTRATION": "Registration", "REGISTRATION": "Registration",
"CHANGE_LANG_LABEL": "Change language", "CHANGE_LANG_LABEL": "Change language",

View File

@ -58,11 +58,15 @@
"PLEASE_ENTER_THE_AMOUNT": "Veuillez renseigne le montant", "PLEASE_ENTER_THE_AMOUNT": "Veuillez renseigne le montant",
"DEPOSIT_DESCRIPTION": "Effectuer un dépôt", "DEPOSIT_DESCRIPTION": "Effectuer un dépôt",
"WITHDRAWAL": "Retrait", "WITHDRAWAL": "Retrait",
"NANO_CREDIT": "Nano crédit",
"NANO_SANTE": "Nano santé",
"PAIEMENT_FACTURE": "Paiement de facture",
"WITHDRAWAL_DESCRIPTION": "Effectuer un retrait", "WITHDRAWAL_DESCRIPTION": "Effectuer un retrait",
"COMMISSION_ACCOUNT_TITLE": "Cpt. commission", "COMMISSION_ACCOUNT_TITLE": "Cpt. commission",
"CONFIRM": "Confirmer", "CONFIRM": "Confirmer",
"CONFIRM_TRANSFER_COMMISSION": "Confirmer le transfert des commissions", "CONFIRM_TRANSFER_COMMISSION": "Confirmer le transfert des commissions",
"PRINCIPAL_ACCOUNT_TITLE": "Cpt. principal", "PRINCIPAL_ACCOUNT_TITLE": "Cpt. principal",
"NUMERO_COMPTE": "N° de compte",
"COMMISSION_TRANSFER_SUCCESS": "Les commissions ont été transférées vers le compte principal", "COMMISSION_TRANSFER_SUCCESS": "Les commissions ont été transférées vers le compte principal",
"COMMISSION_TRANSFER_ERROR_EMPTY": "Le solde commission est vide", "COMMISSION_TRANSFER_ERROR_EMPTY": "Le solde commission est vide",
"TRANSACTIONS": "Transactions", "TRANSACTIONS": "Transactions",
@ -97,6 +101,7 @@
"GROUP_MEMBERS": "Les membres du groupe", "GROUP_MEMBERS": "Les membres du groupe",
"NAME": "Nom (s)", "NAME": "Nom (s)",
"FIRSTNAME": "Prénom (s) ", "FIRSTNAME": "Prénom (s) ",
"AND": "et",
"ADMIN": "Administrateur", "ADMIN": "Administrateur",
"SUPER_ADMIN": "Super administrateur", "SUPER_ADMIN": "Super administrateur",
"GEOLOCATED": "Agent géo-localisé", "GEOLOCATED": "Agent géo-localisé",
@ -117,6 +122,13 @@
"PHONE_NUMBER": "Numéro de téléphone", "PHONE_NUMBER": "Numéro de téléphone",
"CHOICE_NETWORK": "Choisissez un réseau", "CHOICE_NETWORK": "Choisissez un réseau",
"COUNTRY_CHOICE": "Choisissez un pays", "COUNTRY_CHOICE": "Choisissez un pays",
"CHOICE_TOWN": "Choisissez une ville",
"PIECE_IDENTITE": "Pièce d'identité",
"IDENTITY_CARD": "Carte d'identité",
"PASSEPORT": "Passeport",
"OTHER_IDENTITY_PIECE": "Autre",
"IDENTITY_NUMBER": "N° de la pièce",
"IDENTITY_PIECE_EXPIRY_DATE": "Date d'expiration",
"LAST_STEP": "Derniere étape", "LAST_STEP": "Derniere étape",
"ACTIVE_ACCOUNT": "Activez le compte !", "ACTIVE_ACCOUNT": "Activez le compte !",
"ACTIVE_USER": "Activer", "ACTIVE_USER": "Activer",
@ -257,6 +269,14 @@
"FREE": "disponibles", "FREE": "disponibles",
"SAVED": "enregistrés", "SAVED": "enregistrés",
"ACCOUNT_INFO": " Information sur mon compte", "ACCOUNT_INFO": " Information sur mon compte",
"IDENTIFICATION": " Identification",
"CREATION_IDENTIFICATION": "Création",
"CREATION_IDENTIFICATION_CLIENT": "M'identifier",
"CREATION_IDENTIFICATION_DESCRIPTION": "Identifier un client",
"VALIDATE_IDENTIFICATION": "Validation",
"VALIDATE_IDENTIFICATION_DESCRIPTION": "Valider une identi...",
"CREATE_IDENTIFICATION_TITLE": "Veuillez renseigner les informations du client",
"DATE_NAISSANCE": "Date de naissance",
"REGISTER_YOURSELF": "Enregistrez-vous", "REGISTER_YOURSELF": "Enregistrez-vous",
"REGISTRATION": "Inscription", "REGISTRATION": "Inscription",
"CHANGE_LANG_LABEL": "Changer la langue", "CHANGE_LANG_LABEL": "Changer la langue",