mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-05-05 13:57:10 -04:00
61 lines
1.3 KiB
Vue
61 lines
1.3 KiB
Vue
<script setup lang="ts">
|
|
import { useRafFn } from '@vueuse/core';
|
|
|
|
import { formatMs } from './chronometer.service';
|
|
|
|
const { t } = useI18n();
|
|
const isRunning = ref(false);
|
|
const counter = ref(0);
|
|
|
|
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;
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
<c-card>
|
|
<div class="duration">
|
|
{{ formatMs(counter) }}
|
|
</div>
|
|
</c-card>
|
|
<div mt-5 flex justify-center gap-3>
|
|
<c-button v-if="!isRunning" type="primary" @click="resume">
|
|
{{ t('tools.chronometer.start') }}
|
|
</c-button>
|
|
<c-button v-else type="warning" @click="pause">
|
|
{{ t('tools.chronometer.stop') }}
|
|
</c-button>
|
|
|
|
<c-button @click="counter = 0">
|
|
{{ t('tools.chronometer.reset') }}
|
|
</c-button>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style lang="less" scoped>
|
|
.duration {
|
|
text-align: center;
|
|
font-size: 40px;
|
|
font-family: monospace;
|
|
margin: 20px 0;
|
|
}
|
|
</style>
|