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,
}
})