2024-07-12 06:03:23 -07:00
|
|
|
<script setup lang="ts">
|
2024-09-19 10:53:23 -07:00
|
|
|
import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
|
2024-07-12 06:03:23 -07:00
|
|
|
import { useI18n } from '@/composables/useI18n';
|
|
|
|
|
|
|
|
const props = defineProps<{
|
|
|
|
startTime: Date;
|
|
|
|
}>();
|
|
|
|
|
|
|
|
const i18n = useI18n();
|
|
|
|
|
|
|
|
const nowTime = ref(-1);
|
|
|
|
const intervalTimer = ref<NodeJS.Timeout | null>(null);
|
|
|
|
|
|
|
|
const time = computed(() => {
|
|
|
|
if (!props.startTime) {
|
|
|
|
return '...';
|
|
|
|
}
|
|
|
|
const msPassed = nowTime.value - new Date(props.startTime).getTime();
|
2024-11-15 16:11:58 -08:00
|
|
|
return i18n.displayTimer(msPassed);
|
2024-07-12 06:03:23 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
setNow();
|
|
|
|
intervalTimer.value = setInterval(() => {
|
|
|
|
setNow();
|
|
|
|
}, 1000);
|
|
|
|
});
|
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
|
// Make sure that the timer gets destroyed once no longer needed
|
|
|
|
if (intervalTimer.value !== null) {
|
|
|
|
clearInterval(intervalTimer.value);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
function setNow() {
|
|
|
|
nowTime.value = new Date().getTime();
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
2019-07-24 05:25:30 -07:00
|
|
|
<template>
|
|
|
|
<span>
|
|
|
|
{{ time }}
|
|
|
|
</span>
|
|
|
|
</template>
|