import { observable, transaction, action, computed } from "mobx"; import api from "./api"; import axios from "axios"; import Toast, { DURATION } from "react-native-easy-toast"; import AsyncStorageHelper from "../config/asyncStorageHelper"; import moment from "moment"; import language from '../config/language' import { Alert,Platform } from "react-native"; const asyncStorageHelper = new AsyncStorageHelper(); class menu_store { @observable menu = []; @observable date = { days: 0, hours: 0, min: 0, sec: 0 }; @observable errorMessage = ""; @observable loading = false; @observable flatListWidth = 0; @observable selected = false; @observable orderHistory = { data: { content: [] } }; @observable currentOrder = []; @observable passOrder = []; @observable coupons = {}; @observable cutoffDateTime = new Date(); @observable timestamp = new Date(); @observable menuDetails = { id: 0, tel: "", count: 0, price: 0, tags: [], name: "", nameEn: "", imageURL: "", intro_ch: "", intro_en: "", restaurant: { name: "", nameEn: "", addrEn: "", addr: "" } }; orderList = []; items = []; orderReturn = {}; pageNo = 1; totalPage = 0; @observable pickupPointId = null; @observable sharemessage = {} couponLabel = [] //for test date1 = new Date(Date.UTC(2018, 9, 31, 3, 0, 0)); pickupDate = "?date=today"; constructor() {} @action async getMenuItem(self) { this.selected = false; this.loading = true; this.pageNo = 1; var requestURL = api.getMenu; asyncStorageHelper.getData("pickupPointId", pickupPointId => { let num = parseInt(pickupPointId); this.pickupPointId = num; pickupPointId = num.toString(); requestURL = requestURL + this.pickupDate + "&pick-up-location-id=" + pickupPointId.toString(); console.log("request:" + pickupPointId); this.getMenu(self, requestURL, pickupPointId); }); } async updateMenu() { this.selected = false; this.loading = true; this.pageNo = 1; var requestURL = api.getMenu; requestURL = requestURL + this.pickupDate + "&pick-up-location-id=" + this.pickupPointId.toString(); this.getMenuByUpdate(requestURL, this.pickupPointId); } @action async updateMenuByMap(self, id) { this.selected = false; this.loading = true; this.pageNo = 1; var requestURL = api.getMenu; let num = parseInt(id); pickupPointId = num.toString(); requestURL = requestURL + this.pickupDate + "&pick-up-location-id=" + pickupPointId.toString(); console.log("request:" + pickupPointId); self.autoPlaceFocus = false; this.getMenu(self, requestURL, num); } @action async getOrder(self, token) { try { var passOrder = []; var currentOrder = []; this.loading = true; var nowDate = new Date(); nowDate.setDate(nowDate.getDate()-30) //nowDate.format('yyyy-mm-dd') console.log(nowDate.toISOString().substring(0, 10)) apiLink = api.order+'created-start='+nowDate.toISOString().substring(0, 10) const response = await axios.get(api.order, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); console.log(response); response.data.content.reverse(); response.data.content.forEach(e => console.log(e.status)); var content = response.data.content; for (var i = 0; i < content.length; i++) { if (content[i].status == "P" || content[i].status == "D") { currentOrder.push(content[i]); } else if (content[i].status == "F" || content[i].status == "V") { passOrder.push(content[i]); } } transaction(() => { this.passOrder = passOrder; this.currentOrder = currentOrder; this.loading = false; this.orderHistory = response; }); } catch (error) { this.loading = false; console.log(error.response); } } @action async goOrderDetail(data, self) { this.loading = true; try { this.loading = false; const response = await axios.get(api.sysTime, { timeout: 5000 }); console.log(response); var momentDate = moment(response.data.timestamp); var timestamp = momentDate.toDate(); var momentCancelDate = moment(data.items[0].cancellation) var cancelDate = momentCancelDate.toDate(); console.log(timestamp) console.log(cancelDate); if (timestamp >= cancelDate) { self.go(data, true); } else { console.log("false"); self.go(data, false); } } catch (error) { this.loading = false; console.log(error); Alert.alert("", error.response.data, [ { text: "Ok", onPress: () => console.log("Cancel") } ]); } } @action async getMenuByUpdate(requestURL, id) { this.loading = true; try { console.log("request:" + requestURL); const response = await axios.get(requestURL, { timeout: 5000 }); response.data.content.forEach(e => (e.count = 0)); var newMenu = this.menuHandler(response, id); transaction(() => { this.menu = newMenu; this.totalPage = response.totalPages; this.loading = false; }); // self.navigatieAction('menu') console.log(this.menu); } catch (error) { this.loading = false; console.log(error.response); // self.refs.toast.show(error); } } @action async getMenu(self, requestURL, id) { try { console.log("request:" + requestURL); const response = await axios.get(requestURL, { timeout: 5000 }); this.sharemessage = response.data.promotions; //language.en.referFriendContent = response.data.promotions[0].contentEn // language.zh.referFriendContent = response.data.promotions[0].content //console.log(language.en.referFriendContent) response.data.content.forEach(e => (e.count = 0)); console.log(response); var newMenu = this.menuHandler(response, id); transaction(() => { this.menu = newMenu; this.totalPage = response.totalPages; this.loading = false; }); self.navigatieAction("menu"); console.log(response); } catch (error) { this.loading = false; console.log(error); self.refs.toast.show(error); } } @action menuHandler(menu, id) { console.log(menu.data.content); var momentDate = moment(menu.data.timestamp); var timestamp = momentDate.toDate(); this.timestamp = timestamp; var newContent = []; if (menu.data.content.length <= 0) { return menu; } else { for (var i = 0; i < menu.data.content.length; i++) { var index = menu.data.content[i].locations.findIndex( x => x.location.id == id ); var momentOrderEndDate = moment( menu.data.content[i].locations[index].orderEnd ); var orderEndDate = momentOrderEndDate.toDate(); console.log(timestamp.getDate() + " " + orderEndDate.getDate()); if (timestamp < orderEndDate) { if (timestamp.getHours() < orderEndDate.getHours()) { console.log(timestamp.getUTCDate()+" "+orderEndDate.getUTCDate()) if (timestamp.getDate() == orderEndDate.getDate()) { newContent.push(menu.data.content[i]); } } else { if (timestamp.getDate() < orderEndDate.getDate()) { newContent.push(menu.data.content[i]); } } } } console.log(newContent); if (newContent.length > 0) { menu.data.content = newContent; var indexOfLocation = newContent[0].locations.findIndex( x => x.location.id == id ); var momentCutoffDateTime = moment( newContent[0].locations[indexOfLocation].orderEnd ); this.cutoffDateTime = momentCutoffDateTime.toDate(); console.log(this.cutoffDateTime); } else { var indexOfLocation = menu.data.content[0].locations.findIndex( x => x.location.id == id ); var momentCutoffDateTime = moment( menu.data.content[0].locations[indexOfLocation].orderEnd ); this.cutoffDateTime = momentCutoffDateTime.toDate(); menu.data.content = newContent; console.log(this.cutoffDateTime); } // console.log(this.cutoffDateTime) return menu; } } @action async menuloadmore(self) { this.loading = true; try { const requestURL = api.getMenu + "?page_no=" + toString(this.pageNo) + "&page_size=10"; const response = await axios.get(requestURL, { timeout: 5000 }); response.data.content.forEach(e => (e.count = 0)); transaction(() => { //this.menu.content = this.menu.content.concat(response.content); this.loading = false; }); console.log(response); } catch (error) { this.loading = false; console.log(error); self.refs.toast.show(error); } } @action async order(token, data, self) { this.loading = true; var requestURL = api.order; try { const response = await axios.post(requestURL, data, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); this.loading = false; console.log(this.loading); console.log(response); this.orderReturn = response; setTimeout(function() { self.pay(); }, 200); } catch (e) { this.loading = false; self.refs.toast.show(e.response.data); console.log(e) } } @action async cancelOrder(token) { console.log(token); var requestURL = "http://takeawayapp.nirons.com:8080/order/" + this.orderReturn.data.id + "/cancel/"; try { const response = await axios.put(requestURL, null, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); console.log(response); } catch (e) { console.log(e.response); } } @action async voidOrder(token, id, self) { this.loading = true; var requestURL = "http://takeawayapp.nirons.com:8080/order/" + id + "/void/"; console.log(requestURL); console.log(token); try { const response = await axios.put(requestURL, null, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); this.loading = false; console.log(response); self.back(); } catch (e) { this.loading = false; console.log(e.response); self.refs.toast.show(e.response.data[0]); } } @action async userCoupon(self,token,check){ this.loading = true var requestURL = api.coupon try { const response = await axios.get(requestURL, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); this.loading = false this.couponLabel = [] response.data.content.forEach(item => { if (item.used) { var value = {value:item.id} // this.couponLabel.push(value) } else { if (item.hasOwnProperty("expiry")) { var nowDatemoment = moment(response.data.timestamp); var nowDate = nowDatemoment.toDate(); var expiryDatemoment = moment(item.expiry); var expiryDate = expiryDatemoment.toDate(); if (nowDate < expiryDate) { var value = {value:item.id} this.couponLabel.push(value) } else { } } else { } } }); this.coupons = response console.log('userCoupon') if(!check){ self.navigatieAction("ConfirmOrder"); }else{ self.navigatieAction("myCoupons"); } console.log(response); } catch (e) { this.loading = false console.log(e.response); // self.refs.toast.show(e.response.data) } } @action async coupon(token, self, coupon) { var requestURL = api.coupon + coupon; console.log("token: " + token + " coupon: " + coupon); var data = {}; try { const response = await axios.get(requestURL, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); console.log(response); self.discountAction(response.data); } catch (e) { console.log(e.response); // self.refs.toast.show(e.response.data) } } @action async pay(token, self, creditCardId) { this.loading = true; let data = { creditCardId: creditCardId }; console.log(data); var requestURL = "http://takeawayapp.nirons.com:8080/order/" + this.orderReturn.data.id + "/pay/"; try { const response = await axios.put(requestURL, data, { headers: { Authorization: token, "Content-Type": "application/json" }, timeout: 5000 }); this.loading = false; console.log(response); if(Platform.OS === 'ios'){ self.navigatieAction("myOrders"); }else{ self.navigatieAction("menu"); } } catch (e) { this.loading = false; console.log(e.response); self.refs.toast.show(e.response.data); } } @action getCount(id) { index = this.menu.data.content.findIndex(obj => obj.id == id); return this.menu.data.content[index].count; } @action addCount(id) { index = this.menu.data.content.findIndex(obj => obj.id == id); this.menu.data.content[index].count += 1; this.check(); } @action sumCount(id) { index = this.menu.data.content.findIndex(obj => obj.id == id); if (this.menu.data.content[index].count > 0) this.menu.data.content[index].count -= 1; this.check(); } @action check() { var index = this.menu.data.content.findIndex(obj => obj.count > 0); if (index != -1) { this.selected = true; } else { this.selected = false; } } @action cancel() { this.menu.data.content.forEach(e => (e.count = 0)); this.selected = false; } @action getOrderedItems(self,token) { this.orderList = []; this.items = []; for (var i = 0; i < this.menu.data.content.length; i++) { if (this.menu.data.content[i].count > 0) { this.orderList.push(this.menu.data.content[i]); var data = { menu: { id: this.menu.data.content[i].id }, qty: this.menu.data.content[i].count }; this.items.push(data); } } this.userCoupon(self,token,false) // self.navigatieAction("ConfirmOrder"); console.log(this.orderList); } @action cleanAll() { transaction(() => { this.menu.data.content.forEach(e => (e.count = 0)); this.selected = false; }); } @computed get totalMoney() { let money = 0; this.menu.data.content.forEach(e => (money += e.price * e.count)); return money; } } const menuStore = new menu_store(); export default menuStore;