2019-05-25 17:18:04 +08:00
|
|
|
import * as moment from 'moment';
|
|
|
|
import interopDefault from '../_util/interopDefault';
|
|
|
|
import { cloneElement } from '../_util/vnode';
|
2020-01-19 16:58:38 +08:00
|
|
|
import { initDefaultProps, getListeners } from '../_util/props-util';
|
2019-05-25 17:18:04 +08:00
|
|
|
import Statistic, { StatisticProps } from './Statistic';
|
|
|
|
import { formatCountdown } from './utils';
|
|
|
|
|
|
|
|
const REFRESH_INTERVAL = 1000 / 30;
|
|
|
|
|
|
|
|
function getTime(value) {
|
|
|
|
return interopDefault(moment)(value).valueOf();
|
|
|
|
}
|
|
|
|
|
|
|
|
export default {
|
|
|
|
name: 'AStatisticCountdown',
|
|
|
|
props: initDefaultProps(StatisticProps, {
|
|
|
|
format: 'HH:mm:ss',
|
|
|
|
}),
|
|
|
|
|
2019-09-18 20:03:13 +08:00
|
|
|
created() {
|
|
|
|
this.countdownId = undefined;
|
2019-05-25 17:18:04 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
mounted() {
|
2019-09-18 20:03:13 +08:00
|
|
|
this.syncTimer();
|
2019-05-25 17:18:04 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
updated() {
|
2019-09-18 20:03:13 +08:00
|
|
|
this.syncTimer();
|
2019-05-25 17:18:04 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
beforeDestroy() {
|
|
|
|
this.stopTimer();
|
|
|
|
},
|
|
|
|
|
|
|
|
methods: {
|
|
|
|
syncTimer() {
|
|
|
|
const { value } = this.$props;
|
|
|
|
const timestamp = getTime(value);
|
|
|
|
if (timestamp >= Date.now()) {
|
|
|
|
this.startTimer();
|
|
|
|
} else {
|
|
|
|
this.stopTimer();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
startTimer() {
|
2019-09-18 20:03:13 +08:00
|
|
|
if (this.countdownId) return;
|
2019-05-25 17:18:04 +08:00
|
|
|
this.countdownId = window.setInterval(() => {
|
2019-09-18 20:03:13 +08:00
|
|
|
this.$refs.statistic.$forceUpdate();
|
2019-05-25 17:18:04 +08:00
|
|
|
}, REFRESH_INTERVAL);
|
|
|
|
},
|
|
|
|
|
|
|
|
stopTimer() {
|
|
|
|
const { value } = this.$props;
|
|
|
|
if (this.countdownId) {
|
|
|
|
clearInterval(this.countdownId);
|
|
|
|
this.countdownId = undefined;
|
|
|
|
|
|
|
|
const timestamp = getTime(value);
|
|
|
|
if (timestamp < Date.now()) {
|
|
|
|
this.$emit('finish');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2019-09-18 20:03:13 +08:00
|
|
|
formatCountdown({ value, config }) {
|
2019-05-25 17:18:04 +08:00
|
|
|
const { format } = this.$props;
|
|
|
|
return formatCountdown(value, { ...config, format });
|
|
|
|
},
|
|
|
|
|
|
|
|
// Countdown do not need display the timestamp
|
|
|
|
valueRenderHtml: node =>
|
|
|
|
cloneElement(node, {
|
|
|
|
props: {
|
|
|
|
title: undefined,
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
|
|
|
|
render() {
|
|
|
|
return (
|
|
|
|
<Statistic
|
2019-09-18 20:03:13 +08:00
|
|
|
ref="statistic"
|
2019-05-25 17:18:04 +08:00
|
|
|
{...{
|
|
|
|
props: {
|
|
|
|
...this.$props,
|
|
|
|
valueRender: this.valueRenderHtml,
|
|
|
|
formatter: this.formatCountdown,
|
|
|
|
},
|
2020-01-19 16:58:38 +08:00
|
|
|
on: getListeners(this),
|
2019-05-25 17:18:04 +08:00
|
|
|
}}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
},
|
|
|
|
};
|