/**
* 新版充电预定页面
* @邠心vbe on 2023/02/06
*/
import React, { Component } from 'react'
import { Image, RefreshControl, ScrollView, StyleSheet, Text, View } from 'react-native'
import Button from '../../components/Button';
import { ChargeStyle, EnterStationDialog, TypeImage } from './Charging';
import apiCharge from '../../api/apiCharge';
import Dialog from '../../components/Dialog';
import { PageList } from '../Router';
import { CancelReserveDialog } from './InfoDialog';
import PagerUtil from './PagerUtil';
import BadgeSelectItem from '../../components/BadgeSelectItem';
import TextView from '../../components/TextView';
import { MyRefreshProps } from '../../components/ThemesConfig';
import QRResult from '../charge/QRResult';
import { PagerList } from './ChargeAdapter';
export default class TabReserve extends Component {
constructor(props) {
super(props);
this.state = {
total: 0,
leftId: 0,
refreshing: false,
checkIndex: -1,
available: false,
showReserve: false,
stationInfo: {},
checkConnector: {},
userReserve: {},
timeLeft: '',
showCancelDialog: false,
showStationDialog: false
};
}
componentDidMount() {
PagerUtil.addOnRefresh(this);
this.onRefresh();
}
onRefresh() {
console.log("Reserve刷新", this.props.route.name);
this.setState({
refreshing: false,
stationInfo: PagerUtil.getStationInfo()
}, () => this.init());
}
onPullRefresh() {
this.setState({
refreshing: true
})
PagerUtil.setBackRefreshing();
}
init() {
this.stopCountdown(true);
if (this.state.stationInfo.rateList && this.state.stationInfo.rateList.length > 0) {
for (var i = 0; i < this.state.stationInfo.rateList.length; i++) {
const item = this.state.stationInfo.rateList[i]
if (item.available) {
this.setState({
checkIndex: i,
checkConnector: item,
})
break;
}
}
this.setState({
total: this.state.stationInfo.rateList.length,
showReserve: this.state.stationInfo.enableReservation ? true : false
})
this.getReserve();
//this.refreshAvailable();
} else {
this.setState({
showReserve: false
})
}
}
//刷新可用充电接口
refreshAvailable() {
const info = this.state.stationInfo
const all = info?.allConnector;
/*if (info.siteType == 'Private') {
this.setState({
isPrivate: true
})
}*/
if (all) {
this.setState({
available: !all.available > 0
});
}
}
checkChange(index) {
if (this.state.checkIndex !== index) {
this.setState({
checkIndex: index,
checkConnector: this.state.stationInfo.rateList[index],
})
}
}
getAvailable(type) {
let count = type;
if (typeof type === 'string') {
count = type == "AC" ? this.state.stationInfo.acConnector : this.state.stationInfo.dcConnector;
}
if (count) {
return count.available + '/' + count.all;
} else {
return '0/0';
}
}
getReserve() {
apiCharge.getUserReserve(this.state.stationInfo.id).then(res => {
if (res.data.reservePk && res.data.reserveEndTimeTimestamp > 0) {
this.setState({
userReserve: res.data
}, () => this.startCountdown());
} else {
this.stopCountdown();
}
}).catch((err) => {
this.stopCountdown();
});
}
onReserve() {
if (this.state.checkConnector?.chargeTypePk) {
Dialog.showProgressDialog();
apiCharge.reserveCharge({
sitePk: this.state.stationInfo.id,
chargeTypePk: this.state.checkConnector.chargeTypePk
}).then(res => {
Dialog.dismissLoading();
toastShort($t('charging.reservedSuccess'));
PagerUtil.setBackRefreshing();
this.getReserve();
}).catch((err) => {
Dialog.dismissLoading();
toastShort(err)
});
} else {
toastShort($t('charging.plsSelectConnnector'))
}
}
onCancel() {
if (this.state.userReserve.reservePk) {
Dialog.showProgressDialog();
apiCharge.cancelReserve(this.state.userReserve.reservePk).then(res => {
Dialog.dismissLoading();
PagerUtil.setBackRefreshing();
toastShort($t('common.cancelSuccess'));
this.getReserve();
}).catch((err) => {
Dialog.dismissLoading();
toastShort(err)
});
}
}
cancelReserve() {
// this.setState({
// showCancelDialog: true
// });
Dialog.showDialog({
title: $t('charging.cancelReservation'),
message: $t('charging.confirmCancelReservation'),
ok: $t('nav.yes'),
cancel: $t('nav.no'),
callback: (btn => {
if (btn == "ok") {
this.onCancel();
}
})
})
}
startCountdown() {
if (this.state.userReserve.reserveEndTimeTimestamp > 0) {
if (!QRResult.haveResult()) {
PagerUtil.onReserve(this.props);
}
const leftId = this.state.leftId;
this.countdown(leftId);
} else {
this.stopCountdown(false, true);
}
}
countdown(leftId) {
if (leftId != this.state.leftId) {
console.log(leftId, this.state.leftId);
return;
}
const now = new Date().getTime();
let left = this.state.userReserve.reserveEndTimeTimestamp - now;
let s = 0, m = 0, h = 0;
if (left > 1000) {
s = left / 1000;
if (s > 60) {
m = s / 60;
s = s % 60;
if (m > 60) {
h = m / 60;
m = m % 60;
}
}
} else {
this.stopCountdown(false, true)
}
this.setState({
timeLeft: this.formatNumber(h) + ' : ' + this.formatNumber(m) + ' : ' + this.formatNumber(s)
});
setTimeout(() => {
this.countdown(leftId);
}, 1000);
}
formatNumber(ins) {
const num = parseInt(ins)
if (num > 0) {
if (num < 10) {
return '0' + num;
} else {
return num;
}
} else {
return '00';
}
}
stopCountdown(just, refresh) {
if (just) {
this.setState({
leftId: this.state.leftId + 1
});
} else {
this.setState({
leftId: this.state.leftId + 1,
userReserve: {}
});
}
if (refresh) {
PagerUtil.setBackRefreshing();
}
}
enterStatioinId() {
PagerUtil.onEnterStation(this.props);
setTimeout(() => {
PagerUtil.setRefreshing(PagerList.tabCharge)
}, 300);
}
render() {
return (
this.onPullRefresh()}
/>
}>
{ this.state.showReserve
? (
this.state.userReserve.reservePk
? this.countdownView()
: this.reserveView()
)
:
{$t('charging.unallowReservation')}
}
{
this.setState({
showCancelDialog: false
});
if (confirm) {
this.onCancel();
}
}}/>
this.enterStatioinId()}
onClose={() => {
this.setState({
showStationDialog: false
});
}}
/>
);
}
//预定页面
reserveView() {
return (
<>
{$t('charging.chooseConnector')}
{ this.state.total > 0
? this.state.stationInfo.rateList.map((item, index) => {
const _type = item.type?.indexOf('AC') >= 0 ? 'AC' : 'DC';
return (
{
if (item.available) {
this.checkChange(index)
}
}
}
checked={index == this.state.checkIndex}>
{/*
*/}
{item.type}
{$t('charging.labelType')}
{item.power}
{$t('charging.labelPower')}
{this.getAvailable(_type)}
{$t('charging.labelAvailableTotal')}
{ item?.connectorCount?.available > 0
? {$t('charging.statusAvailable')}
: {$t('charging.statusUnavailable')}
}
{$t('charging.labelStatus')}
{/* index == this.state.checkIndex
? Selected
: (item.available
? Available
: Unavailable
)
*/}
)
}) : null
}
{ this.state.checkConnector.available
? <>
{$t('charging.chooseRate')}
{$t('charging.labelRate')}
{this.state.checkConnector.rates}
{/* Selected */}
>
:
}
{/* Choose Payment Method
*/}