import React, { Component } from 'react'; import { Modal, StyleSheet, Text, View, Image, ProgressBarAndroid, ScrollView, TouchableOpacity, Platform, PermissionsAndroid, Alert, FlatList, BackHandler } from 'react-native'; import PropTypes from 'prop-types'; import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome'; 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'; import MapView,{Marker} from 'react-native-maps'; import { Dropdown } from 'react-native-material-dropdown'; import isEqual from 'lodash/isEqual'; import {getPositionInformation} from './../../webservice/MapService'; import I18n from 'react-native-i18n' import { material } from 'react-native-typography'; import Icon from 'react-native-vector-icons/MaterialIcons'; import {getCountryNetwork,createGeolocatedAccount,createUserAccount,getTownInformationName,getListCountriesActive,getCodeInformation} from './../../webservice/AuthApi'; import {SinglePickerMaterialDialog,MultiPickerMaterialDialog,MaterialDialog} from "react-native-material-dialog"; import Geolocation from 'react-native-geolocation-service'; const GEOLOCATION_OPTIONS = { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000,useSignificantChanges:true }; let theme=require('./../../utils/theme.json'); let route=require('./../../route.json'); let country=require('./../../utils/country_code.json'); /*var Fabric = require('react-native-fabric'); var { Crashlytics } = Fabric; var { Answers } = Fabric;*/ declare var google; import Spinner from "react-native-loading-spinner-overlay" const propTypes = { ...Marker.propTypes, coordinate: PropTypes.shape({ latitude: PropTypes.number.isRequired, longitude: PropTypes.number.isRequired, }), children: PropTypes.node, geolocationOptions: PropTypes.shape({ enableHighAccuracy: PropTypes.bool, timeout: PropTypes.number, maximumAge: PropTypes.number, }), heading: PropTypes.number, enableHack: PropTypes.bool, }; const defaultProps = { enableHack: false, geolocationOptions: GEOLOCATION_OPTIONS, }; export default class CreateUserStep2 extends Component{ static navigatorStyle = { drawUnderNavBar: true, navBarHidden:true, drawUnderStatusBar: false, statusBarHidden: true, statusBarTextColorScheme: 'light', }; static options(passProps){ return { topBar:{ visible:false, enabled:false, drawBehind: true, }, statusBar:{ drawBehind: true, enabled:false, } } } constructor(props) { super(props); const {navigation} = this.props; this.type = navigation.getParam("type", 0); this.user = navigation.getParam('user', null); this.state = this.initState(); } retreiveCodeInformation(){ const membre=this.state.user.member; return new Promise(async (resolve,reject)=>{ let datas=await getCodeInformation(membre) resolve(datas) }) } initState() { return { password: null, enterPhone: null, nameanim: null, networksinglePickerVisible:false, surnameanim: null, passwordanim: null, confirmpassanim: null, isLoging: false, countries:[], snackVisible: false, snackText: '', disableNetwork:false, networks:[], modalVisible:true, select_network:I18n.t("SELECT_NETWORK"), user: this.user } } render(){ return this.type===1?this.renderUserGeoAccount():this.renderUserAccount() } async getNetworks(indicatif) { if (indicatif){ let result={} try{ result=await this.retreiveCodeInformation() const {category}=result }catch(e){ result=false } console.log(result) if(result){ if(result.child){ this.setState({disableNetwork:true}) if(result.network) this.setState({modalVisible:false,networks:[result.network], network:result.network,select_network:I18n.t("YOUR_NETWORK")}) else { Alert.alert(I18n.t('TITLE_PROBLE_COME'),"Impossible de recuperer les informations du code parrain",[{text:"Revenir",onPress:()=>this.props.navigation.pop()}]) } }else{ console.log("need enable") getCountryNetwork(indicatif).then((result) => { this.reseaux = []; let networks = result; for(let prop in networks){ if(networks[prop]!==""){ this.reseaux.push(networks[prop]); } } this.setState({networks:this.reseaux}); this.setState({modalVisible:false}) }, (err) => { this.setState({modalVisible:false}) this.showErrorDialog() }); } }else{ getCountryNetwork(indicatif).then((result) => { this.reseaux = []; let networks = result; for(let prop in networks){ if(networks[prop]!==""){ this.reseaux.push(networks[prop]); } } this.setState({networks:this.reseaux}); this.setState({modalVisible:false}) }, (err) => { this.setState({modalVisible:false}) this.showErrorDialog() }); } } else { this.setState({modalDialog:false}) Alert.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.setState({modalDialog:true}) this.watchLocation() }},{text:"Annuler",onPress:()=>{this.props.navigation.popToTop()}}]) } } showErrorDialog(){ this.setState({modalDialog:false}) Alert.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()}}]) } componentDidMount() { this.mounted = true; const {type}=this.props; if (this.props.coordinate) return; if (Platform.OS === 'android') { this.requestCameraPermission(); } else { this.watchLocation(); } } 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() }}]) } } 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) } } 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({town: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({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) } } } componentWillUnmount() { this.mounted = false; // eslint-disable-next-line no-undef if (this.watchID) Geolocation.clearWatch(this.watchID); } renderUserGeoAccount() { return ( {this.prepareModal()} this.props.navigation.pop()} /> {I18n.t('LAST_STEP')} { this.setState({country:value,indicatif:value.code_dial,network:null}) this.getNetworks(value.code_dial) }} valueExtractor={(value)=>{return value.name}} labelExtractor={(value)=>{return value.name}} /> {this.numanim=comp}}> { let phonenum=text+this.state.contact!==undefined?this.state.contact:""; this.setState({indicatif:text,phone:phonenum})}} style={{ width:responsiveWidth(30), height:responsiveHeight(10), alignSelf:'center', marginTop:responsiveHeight(2), marginLeft:responsiveWidth(5), marginRight:responsiveWidth(5), borderRadius:5, }} /> {this.num_input=comp}} iconSize={20} onChangeText={(text)=>{ let phonenumber=text this.setState({phone:phonenumber,contact:text})}} style={{ marginTop:responsiveHeight(2), marginRight:responsiveWidth(5), width:responsiveWidth(55), borderRadius:5, }} > {this.num_input=comp}} iconSize={20} onChangeText={(text)=>{ let phonenumber=text this.setState({phoneTransaction:phonenumber,contactTransaction:text})}} style={{ marginTop:responsiveHeight(2), marginRight:responsiveWidth(5), width:responsiveWidth(55), borderRadius:5, }} > {this.networkanim=comp}}> {I18n.t('WAIT_LOADING_POSITION')} {this.mapanim=comp}} > { this.mapRef = ref }} style={styles.map} > {this.state.myPosition!==undefined? : null} {this.state.textadress!==undefined?this.state.textadress:I18n.t('TAKE_MY_POSITION')} ({ value: row, label:row }))} visible={this.state.networksinglePickerVisible} selectedItem={this.state.singlePickerSelectedItem} onCancel={() => this.setState({ networksinglePickerVisible: false })} onOk={result => { this.setState({ networksinglePickerVisible: false }); this.setState({ singlePickerSelectedItem: result.selectedItem }); }} > this.renderRow(item)} /> ) } onRowPress(rowID) { this.setState({network:rowID}) } renderRow = (row) => ( this.onRowPress(row)}> {row.name} ); renderUserAccount() { return ( {this.prepareModal()} this.props.navigation.pop()} /> {I18n.t('LAST_STEP')} { this.setState({country:value,indicatif:value.code_dial,network:null}) this.getNetworks(value.code_dial) }} valueExtractor={(value)=>{return value}} labelExtractor={(value)=>{return value.name}} /> {this.numanim=comp}}> { this.setState({indicatif:text})}} style={{ width:responsiveWidth(30), marginTop:responsiveHeight(2), marginLeft:responsiveWidth(5), marginRight:responsiveWidth(5), borderRadius:5, }} /> {this.num_input=comp}} iconSize={20} onChangeText={(text)=>{ let phonenumber=text this.setState({phone:phonenumber})}} style={{ marginTop:responsiveHeight(2), marginRight:responsiveWidth(5), width:responsiveWidth(55), borderRadius:5, }} > {this.networkanim=comp}}> { this.setState({network:value})}} valueExtractor={(value)=>{return value}} labelExtractor={(value)=>{return value.name}} /> ) } _onUserCreateAccount() { let { myPosition,textaddress,place,user,network,phone,indicatif }=this.state; this.setState({isLoading:true}) if(user!==undefined) { if (this.checkOrShake(myPosition, this.mapanim)) { if (this.checkOrShake(phone, this.numanim)) { if (this.checkOrShake(network, this.networkanim)) { var data={}; data.tag="member" data['type']="create_user" data['phone']=indicatif+phone; data['network']=network; data['town']=this.state.town; data['latitude']=myPosition.latitude; data['longitude']=myPosition.longitude; for(let i in user){ data[i]=user[i]; } console.log(data); createUserAccount(data).then((result)=>{ console.log(data) if(result.success!==undefined && result.success===1){ Alert.alert(I18n.t("CONNEXION_SUCCESSFUL"), I18n.t('ACCOUNT_CREATED_SUCCESS') ,[ {text: 'OK', onPress: () => { this.props.navigation.popToTop() this.setState({isLoading:false})}}],{ cancelable: false }) }else{ if(result.error!==undefined){ switch(result.error){ case -3: Alert.alert(I18n.t("CONNEXION_SUCCESSFUL"),I18n.t('FAILED_TEXT_CONTACT_ADMIN') ,[ {text: 'OK', onPress: () =>""}],{ cancelable: false }) break; default: Alert.alert(I18n.t("CONNEXION_SUCCESSFUL"),result.error_msg ,[ {text: 'OK', onPress: () =>""}],{ cancelable: false }) } this.setState({isLoading:false}) } } }).catch((error)=>{ this.setState({isLoading:false}) }) }else this.setState({isLoading:false}) }else this.setState({isLoading:false}) }else this.setState({isLoading:false}) }else{ this.setState({isLoading:false}) } } checkUserGeolocated() { let { myPosition,textaddress,place,indicatif,user,network,phone,phoneTransaction }=this.state; this.setState({isLoading:true}) if(user!==undefined) { if (this.checkOrShake(myPosition, this.mapanim)) { if (this.checkOrShake(phone, this.numanim)) { if (this.checkOrShake(network, this.networkanim)) { var data={}; data.tag="member"; data.type="create_geolocated_user"; data['phone']=indicatif+phone; data['phone_transaction']=indicatif+phoneTransaction; data['network']=network; data['town']=this.state.town; data['latitude']=myPosition.latitude; data['longitude']=myPosition.longitude; for(let i in user){ data[i]=user[i]; } data['category']=user.category; data['active']='0'; createGeolocatedAccount(data).then((result)=>{ console.log(result); if(result.success!==undefined && result.success===1){ const message=result.category==='super'?I18n.t("HYPERVISOR_MUST_VALIDATE_SUPERVISOR") :I18n.t("ACCOUNT_SUCCESSFULL_CREATED") Alert.alert("",message,[{ text:"Ok", onPress:()=>{ this.props.navigation.popToTop() } }]) setTimeout(()=>{ this.setState({isLoading:false}) },1000) this.props.navigator.push({ screen:route.login }) this.setState({isLoading:false}) }else{ /* Crashlytics.log(JSON.stringify({"type":"erreur lors de la creation","data":result})) Answers.logCustom("error",JSON.stringify(result))*/ console.warn(result) if(result.error!==undefined){ switch(result.error){ case -3: Alert.alert("",I18n.t('UNABLE_TO_CREATE_ACCOUNT'),[{ text:"Ok", onPress:()=>{ } }]) break; default: if(result.error_msg) Alert.alert("",result.error_msg,[{ text:"Ok", onPress:()=>{ } }]) else if(result.sql_error) Alert.alert(I18n.t('UNABLE_TO_CREATE_ACCOUNT'),result.sql_error,[{ text:"Ok", onPress:()=>{ } }]) } this.setState({isLoading:false}) } } }).catch((error)=>{ this.setState({isLoading:false}) }) }else this.setState({isLoading:false}) }else this.setState({isLoading:false}) }else this.setState({isLoading:false}) }else{ this.setState({isLoading:false}) } } checkOrShake(champ,view) { let res=false; if(champ!==undefined && champ.length>0) { res=true; }else if(champ!==Array && champ!==undefined){ res=true } else{ view.shake(800) } return res; } prepareModal() { return ( {I18n.t("LOADING_DESCRIPTION_COUNTRY")} ) } } const SHORT_LIST = ['List element 1', 'List element 2', 'List element 3']; const LONG_LIST = [ 'List element 1', 'List element 2', 'List element 5', 'List element 6', 'List element 7', 'List element 8', , ]; const styles=StyleSheet.create({ rowContainer: { height: 52, flex: 1, flexDirection: 'row', justifyContent: 'flex-start', alignItems: 'center', }, iconContainer: { marginRight: 16, }, container:{ flex:1, backgroundColor:theme.primary, }, 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, }, map: { height: 200, marginRight:responsiveWidth(5), marginLeft:responsiveWidth(5), marginVertical: 10, }, btnvalide:{ marginTop:20, marginLeft:20, marginRight:20, borderColor:'transparent', backgroundColor:theme.accentLight, height:52 }, input:{ height:60, marginTop:responsiveHeight(2), marginLeft:responsiveWidth(5), marginRight:responsiveWidth(5), borderRadius:5, } })