Hangry/app/stores/user_store.js

614 lines
16 KiB
JavaScript
Executable File

import { observable, action, transaction, AsyncStorage } from "mobx";
import api from "./api";
import axios from "axios";
import { Alert } from "react-native";
import AsyncStorageHelper from "../config/asyncStorageHelper";
import Toast, { DURATION } from "react-native-easy-toast";
import Permissions from "react-native-permissions";
import firebase from "react-native-firebase";
import { Notification } from "react-native-firebase";
import { Geolocation } from "react-native";
import language from "../config/language";
import Global from "../../app/Global";
import ConnectFail from "../config/connectFail";
const asyncStorageHelper = new AsyncStorageHelper();
const connectFail = new ConnectFail();
class User_store {
@observable
logined = false;
@observable
userData = {};
@observable
signUpData = {};
@observable
loading = false;
@observable
resend = false;
@observable
addedCard = false;
@observable
creditCardinfo = {};
@observable
countdown = 10;
@observable
pickupPointId = null;
pickupLoactionPoint = {};
pickupPointLabel = [];
pickupIndex = 0;
cardInfo = null;
cardNumber = null;
@observable
userLocation = null;
perdefinedPlaces = [];
@observable
isSignUp = false;
@observable
isSignUpVerify = false;
@observable
text = language.en;
@observable
languageSelection = "english";
@observable
OrderEndTime = { orderEndTime: "", orderStartTime: "" };
notificationInit(mid) {
firebase
.messaging()
.hasPermission()
.then(enabled => {
if (enabled) {
firebase
.messaging()
.getToken()
.then(notificationToken => {
console.log("LOG: ", notificationToken);
this.regUserNotificationToken(notificationToken, mid);
});
// user has permissions
} else {
firebase
.messaging()
.requestPermission()
.then(() => {
// alert("User Now Has Permission");
})
.catch(error => {
console.log(error);
// alert("Error", error);
// User has rejected permissions
});
}
});
this.notificationListener = firebase
.notifications()
.onNotification(notification => {
// Process your notification as required
const {
body,
data,
notificationId,
sound,
subtitle,
title
} = notification;
console.log("LOG: ", title, body, JSON.stringify(data));
});
}
@action
async regUserNotificationToken(notificationToken, mid) {
var token = this.userData.data.token;
var requestURL = api.regPushToken;
var data = {
mid: mid,
token: notificationToken
};
try {
const response = await axios.put(requestURL, data, {
headers: {
Authorization: token,
"Content-Type": "application/json"
}
});
asyncStorageHelper.saveString("notificationToken", notificationToken);
console.log(response);
} catch (e) {
// this.loading = false;
console.log(e);
}
}
@action
async regUserNotificationTokenWithNoMid(notificationToken) {
//var token = this.userData.data.token;
var requestURL = api.regPushToken;
var data = {
token: notificationToken
};
try {
const response = await axios.put(requestURL, data, {
headers: {
// Authorization: token,
"Content-Type": "application/json"
}
});
asyncStorageHelper.saveString("notificationToken", notificationToken);
console.log(response);
} catch (e) {
// this.loading = false;
console.log(e);
}
}
@action
async savePickupPointToServer(pickuppointid){
var token = this.userData.data.token;
var id = this.userData.data.member.id;
var requestURL = api.member+'id'+'/select_pickup_location/'+pickuppointid
try {
const response = await axios.post(requestURL, token);
} catch (e) {
console.log(e);
}
}
@action
async sendsmsVerify(data,self){
this.loading = true;
var requestURL = api.smsVerify;
try {
const response = await axios.post(requestURL,data, {
headers: {
"Content-Type":'multipart/form-data'
},
timeout: 5000
});
this.loading = false;
self.startToCountDown()
console.log(response);
} catch (e) {
console.log(e);
this.loading = false;
self.handleNetworkFailed()
self.refs.toast.show(e.response);
}
}
@action
async loginPost(data, self, navAction) {
this.loading = true;
var requestURL = api.login;
try {
const response = await axios.post(requestURL, data, {
headers: {
"Content-Type": "application/json"
},
timeout: 5000
});
Global.login = true;
transaction(() => {
this.userData = response;
this.logined = true;
this.loading = false;
});
this.getCreditCard();
this.notificationInit(response.data.member.id);
console.log(response);
if (navAction) {
asyncStorageHelper.saveData("userInfo", data);
self.navigatieAction("menu");
}
} catch (e) {
self.refs.toast.show("Login Fail");
this.loading = false;
//connectFail.fail();
console.log(e);
}
}
@action
async languageInit() {
asyncStorageHelper.getData("language", lang => {
if (lang != null) {
console.log(lang);
this.languageSelection = lang;
this.changeLanguage(lang);
console.log(this.languageSelection);
}
});
}
@action
changeLanguage(lang) {
console.log(lang);
if (lang == "english") {
console.log("select english");
this.text = language.en;
} else if (lang == "chinese") {
console.log("select chinese");
this.text = language.zh;
}
}
@action
dataLanguage(data, value) {
if (this.languageSelection == "english") {
switch (value) {
case "name":
return data.nameEn;
break;
case "addr":
return data.addrEn;
break;
case "intro":
return data.intro_en
break;
case 'placeName':
return data.descriptionEn
break;
}
} else {
switch (value) {
case "name":
return data.name;
break;
case "addr":
return data.addr;
break;
case "intro":
return data.intro_ch
break;
case 'placeName':
return data.description
break;
}
}
}
@action
saveLanguage(lang) {
this.languageSelection = lang;
this.changeLanguage(lang);
asyncStorageHelper.saveString("language", lang);
}
@action
async logoutPost(self,reset,data) {
this.loading = true;
var token = this.userData.data.token;
var requestURL = api.logout;
try {
const response = await axios.post(requestURL, token);
Global.login = false;
this.regUserNotificationToken("");
asyncStorageHelper.removeItemValue("userInfo");
//asyncStorageHelper.removeItemValue("pickupPointId");
if(reset){
this.loginPost(data, self, true);
}else{
self.navigatieAction("menu");
transaction(() => {
this.userData = [];
this.logined = false;
this.creditCardinfo = {};
this.addedCard = false;
this.loading = false;
});
}
} catch (e) {
this.loading = false;
console.log(e);
}
}
@action
async pickupLoaction(self, pickupPointExist, pickupPointId) {
var requestURL = api.pickUpLocation;
console.log("userStore pickupPointId: " + pickupPointId);
this.pickupPointId = pickupPointId;
try {
const response = await axios.get(requestURL);
response.data.content.sort((a, b) => a.id - b.id);
this.pickupLoactionPoint = response;
console.log(this.pickupLoactionPoint);
this.pickupPointLabel = [];
response.data.content.forEach(element => {
if(element.status == 'A'){
var label = {
value: element.name,
id: element.id,
name: element.name,
nameEn: element.nameEn,
pickupStartTime: element.pickupStartTime,
pickupEndTime: element.pickupEndTime,
photo: element.photo,
lat: element.lat,
lng: element.lng
};
var place = {
description: element.name,
descriptionEn: element.nameEn,
geometry: { location: { lat: element.lat, lng: element.lng } },
id: element.id,
pickupTime: {
pickupEndTime: element.pickupEndTime,
pickupStartTime: element.pickupStartTime,
orderEndTime: element.orderEndTime,
orderStartTime: element.orderStartTime
}
};
this.pickupPointLabel.push(label);
this.perdefinedPlaces.push(place);
}
});
if (!pickupPointExist) {
this._requestPermission(self);
} else {
if(this.getIndex(pickupPointId) === -1){
console.log("can't find index")
self.navigatieAction('LocationRequest');
}else{
console.log("find index");
self.getMenuItemFromInit();
}
}
} catch (e) {
console.log(e.message);
Alert.alert(
e.message,
e.message,
[
{
text: "Try again",
onPress: () => {
this.pickupLoaction(self, pickupPointExist, pickupPointId);
}
}
],
{ cancelable: false }
);
}
}
getIndex(id){
var index = this.pickupPointLabel.findIndex(function(item, i){
return item.id == parseInt(id)
});
return index
}
_requestPermission(self) {
Permissions.request("location").then(response => {
// Returns once the user has chosen to 'allow' or to 'not allow' access
// Response is one of: 'authorized', 'denied', 'restricted', or 'undetermined'
// this.setState({ photoPermission: response })
if (
response == "allow" ||
response == "restricted" ||
response == "authorized"
) {
navigator.geolocation.getCurrentPosition(
position => {
this.userLocation = position;
console.log(position);
// self.navigatieAction("LocationRequest");
self.navigatieAction('Tutorial',{data:'store'})
},
error => {
console.log(error);
//self.navigatieAction("LocationRequest");
self.navigatieAction('Tutorial',{data:'store'})
},
{ enableHighAccuracy: false, timeout: 4000, maximumAge: 10000 }
);
} else {
// self.navigatieAction("LocationRequest");
self.navigatieAction('Tutorial',{data:'store'})
}
});
}
@action
async getCreditCard() {
var data = {};
var requestURL = api.creditCard;
var token = this.userData.data.token;
try {
const response = await axios.get(requestURL, {
headers: {
Authorization: token,
"Content-Type": "application/json"
},
timeout: 5000
});
console.log(response.data);
if (response.data.content.length > 0) {
this.addedCard = true;
this.creditCardinfo = response.data.content[0];
}
//self.navigatieAction("menu");
} catch (e) {
console.log(e);
}
}
@action
async deleCreditCard(self) {
this.loading = true;
var token = this.userData.data.token;
var requestURL = api.creditCard + "/" + this.creditCardinfo.id.toString();
try {
const response = await axios.delete(requestURL, {
headers: {
Authorization: token,
"Content-Type": "application/json"
},
timeout: 5000
});
this.creditCardinfo = {}
this.loading = false;
this.addedCard = false;
console.log(response);
} catch (e) {
this.loading = false;
console.log(e);
}
}
@action
async postCreditCard(self, data) {
console.log(data);
this.loading = true;
var token = this.userData.data.token;
var requestURL = api.creditCard;
var testString = "cvc: " + data.cvc+" expiry: "+data.expiry+" num: "+data.num
// self.testing(token,testString)
try {
const response = await axios.post(requestURL, data, {
headers: {
Authorization: token,
"Content-Type": "application/json"
}
});
transaction(() => {
this.creditCardinfo = response.data;
this.loading = false;
this.addedCard = true;
});
console.log(response);
self.addCard = false;
self.cardData = null;
//navigation.goBack();
// self.navigatieAction("menu");
} catch (e) {
this.loading = false;
console.log(e);
self.refs.toast.show(e.message);
}
}
@action
async signupPost(self) {
this.loading = true;
var requestURL = api.signup;
try {
const response = await axios.post(requestURL, this.signUpData, {
headers: {
"Content-Type": "application/json"
}
});
transaction(() => {
this.loading = false;
this.isSignUp = false;
this.isSignUpVerify = false;
this.userData = response;
});
console.log(response);
// self.navigatieAction("menu");
var data = { id: this.signUpData.email, pwd: this.signUpData.pwd };
this.loginPost(data, self, true);
} catch (e) {
console.log(e.response.data);
self.refs.toast.show("SignUp Fail: "+ e.response.data);
this.loading = false;
}
}
@action
async forgotPassword(data,self) {
this.loading = true;
var requestURL = api.forgotPassword;
try {
const response = await axios.post(requestURL, data, {
headers: {
"Content-Type": "application/json"
}
});
this.loading = false;
if(!this.logined){
self.backAction()
}else{
self.password = "";
self.verificationCode = "";
self.handleStopCountdown()
self.refs.toast.show("Reset Password success");
// self.navigatieAction('menu');
var data = {id:this.userData.data.member.email,pwd:data.password}
this.logoutPost(self,true,data)
}
console.log(response);
} catch (e) {
console.log(e.response.data);
self.refs.toast.show("Reset Password Fail: "+ e.response.data);
this.loading = false;
}
}
@action
async checkMember(data, self) {
this.loading = true;
var requestURL = api.check;
var checkData = {
email: data.email,
mobileWithCountryCode: data.countryCode + data.mobile
};
try {
const response = await axios.post(requestURL, checkData, {
headers: {
"Content-Type": "application/json"
}
});
console.log( response)
console.log( response.data[Object.keys(response.data)[1]] +" "+response.data[Object.keys(response.data)[0]])
if (
response.data[Object.keys(response.data)[1]] &&
response.data[Object.keys(response.data)[0]]
) {
transaction(() => {
this.signUpData = data;
this.loading = false;
});
self.navigatieAction("SignUpVerify");
//this.isSignUpVerify = true;
} else if (!response.data[Object.keys(response.data)[1]] && response.data[Object.keys(response.data)[0]]) {
self.refs.toast.show("Sign up failed. Phone number already in use.");
this.loading = false;
} else if (!response.data[Object.keys(response.data)[0]]&& response.data[Object.keys(response.data)[1]]) {
self.refs.toast.show("Sign up failed. Email already in use.");
this.loading = false;
}
} catch (e) {
self.refs.toast.show("SignUp Fail");
this.loading = false;
console.log(e);
}
}
}
const userStore = new User_store();
export default userStore;