2022-07-24 00:58:18 +02:00
|
|
|
<template>
|
|
|
|
<div>
|
|
|
|
<n-card>
|
2022-08-04 09:06:42 +02:00
|
|
|
<div class="duration">{{ formatMs(counter) }}</div>
|
2022-07-24 00:58:18 +02:00
|
|
|
</n-card>
|
2023-04-19 22:44:22 +02:00
|
|
|
<n-space justify="center" mt-5>
|
2023-04-19 21:38:59 +02:00
|
|
|
<c-button v-if="!isRunning" secondary type="primary" @click="resume">Start</c-button>
|
|
|
|
<c-button v-else secondary type="warning" @click="pause">Stop</c-button>
|
2022-07-24 00:58:18 +02:00
|
|
|
|
2023-04-19 21:38:59 +02:00
|
|
|
<c-button @click="counter = 0">Reset</c-button>
|
2022-07-24 00:58:18 +02:00
|
|
|
</n-space>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2022-08-04 09:06:42 +02:00
|
|
|
import { useRafFn } from '@vueuse/core';
|
|
|
|
import { ref } from 'vue';
|
|
|
|
import { formatMs } from './chronometer.service';
|
2022-07-24 00:58:18 +02:00
|
|
|
|
2022-08-04 09:06:42 +02:00
|
|
|
const isRunning = ref(false);
|
|
|
|
const counter = ref(0);
|
2022-07-24 00:58:18 +02:00
|
|
|
|
2022-08-04 09:06:42 +02:00
|
|
|
let previousRafDate = Date.now();
|
|
|
|
const { pause: pauseRaf, resume: resumeRaf } = useRafFn(
|
|
|
|
() => {
|
|
|
|
const deltaMs = Date.now() - previousRafDate;
|
|
|
|
previousRafDate = Date.now();
|
|
|
|
counter.value += deltaMs;
|
|
|
|
},
|
|
|
|
{ immediate: false },
|
|
|
|
);
|
|
|
|
|
|
|
|
function resume() {
|
|
|
|
previousRafDate = Date.now();
|
|
|
|
resumeRaf();
|
|
|
|
isRunning.value = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function pause() {
|
|
|
|
pauseRaf();
|
|
|
|
isRunning.value = false;
|
|
|
|
}
|
2022-07-24 00:58:18 +02:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
.duration {
|
|
|
|
text-align: center;
|
|
|
|
font-size: 40px;
|
|
|
|
font-family: monospace;
|
|
|
|
margin: 20px 0;
|
|
|
|
}
|
|
|
|
</style>
|