2023-12-11 18:04:58 +01:00
|
|
|
<script lang="ts">
|
|
|
|
import { onDestroy, onMount } from 'svelte';
|
|
|
|
import { buzzerState } from '../stores';
|
|
|
|
import { Button } from 'flowbite-svelte';
|
|
|
|
|
2024-01-20 11:16:01 +01:00
|
|
|
export const start = (offset: bigint = 0n) => {
|
|
|
|
timerStartedAt = BigInt(Math.floor(performance.now())) - offset;
|
2024-01-20 10:38:03 +01:00
|
|
|
timerStoppedAt = undefined;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const reset = () => {
|
|
|
|
timerStartedAt = undefined;
|
|
|
|
timerStoppedAt = undefined;
|
|
|
|
currentTimerValue = undefined;
|
|
|
|
};
|
|
|
|
|
|
|
|
export let placeholder: string = '';
|
|
|
|
|
2023-12-11 18:04:58 +01:00
|
|
|
let timerStartedAt: bigint | undefined;
|
|
|
|
let timerStoppedAt: bigint | undefined;
|
|
|
|
|
|
|
|
let currentTimerValue: bigint | undefined;
|
|
|
|
|
|
|
|
let timerInterval: number | undefined;
|
|
|
|
|
|
|
|
onMount(() => {
|
|
|
|
timerInterval = setInterval(() => {
|
|
|
|
if (timerStartedAt) {
|
|
|
|
let now = BigInt(Math.floor(performance.now()));
|
|
|
|
const timerValue = (timerStoppedAt ?? now) - timerStartedAt;
|
|
|
|
currentTimerValue =
|
|
|
|
timerStoppedAt === undefined ? timerValue - (timerValue % 100n) : timerValue;
|
|
|
|
}
|
|
|
|
}, 100);
|
|
|
|
});
|
|
|
|
|
|
|
|
onDestroy(() => {
|
|
|
|
clearInterval(timerInterval);
|
|
|
|
});
|
|
|
|
|
|
|
|
const getTimerColor = (timerStartedAt?: bigint, timerStoppedAt?: bigint) => {
|
|
|
|
if (timerStartedAt === undefined) {
|
|
|
|
return 'white';
|
|
|
|
} else if (timerStartedAt !== undefined && timerStoppedAt === undefined) {
|
|
|
|
return 'red';
|
|
|
|
} else if (timerStartedAt !== undefined && timerStoppedAt !== undefined) {
|
|
|
|
return 'green';
|
|
|
|
} else {
|
|
|
|
return 'white';
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
$: {
|
|
|
|
if (!timerStartedAt || !$buzzerState.lastTriggerTime) {
|
|
|
|
break $;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($buzzerState.lastTriggerTime > timerStartedAt) {
|
|
|
|
timerStoppedAt = $buzzerState.lastTriggerTime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
2024-01-20 10:38:03 +01:00
|
|
|
<div class="flex flex-col items-center gap-3 pb-6">
|
2023-12-11 18:04:58 +01:00
|
|
|
<div class="w-full flex flex-row flex-wrap gap-3 justify-center">
|
|
|
|
<div class="flex flex-grow flex-col items-center">
|
2024-01-20 10:38:03 +01:00
|
|
|
{#if placeholder.length > 0}
|
|
|
|
<span class="text-6xl font-bold text-white py-6 text-center"> {placeholder}</span>
|
|
|
|
{:else}
|
|
|
|
<span
|
|
|
|
class="text-9xl font-bold"
|
|
|
|
style="color: {getTimerColor(timerStartedAt, timerStoppedAt)};"
|
|
|
|
>
|
|
|
|
{(Number(currentTimerValue ?? 0) / 1000).toFixed(3)}
|
|
|
|
</span>
|
|
|
|
{/if}
|
2023-12-11 18:04:58 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|