refactored timetracking to only use client-supplied times

This commit is contained in:
2025-08-28 22:52:04 +02:00
parent 3a43c5a7ba
commit dabd5eef0b
10 changed files with 176 additions and 124 deletions

View File

@@ -2,10 +2,10 @@
import { onDestroy, onMount } from 'svelte';
import { useTinyRouter } from 'svelte-tiny-router';
import { api } from '../urls.svelte.js';
import { logout, user } from '../user.svelte.js';
import { t } from '../translations.svelte.js';
import { timetrack } from '../user.svelte.js';
import TimeRecorder from './TimeRecorder.svelte';
let key = $state(null);
const router = useTinyRouter();
@@ -30,56 +30,12 @@ function go(path){
return false;
}
function msToTime(ms) {
const days = Math.floor(ms / (24 * 60 * 60 * 1000));
ms %= 24 * 60 * 60 * 1000;
const hours = Math.floor(ms / (60 * 60 * 1000));
ms %= 60 * 60 * 1000;
const minutes = Math.floor(ms / (60 * 1000));
ms %= 60 * 1000;
const seconds = Math.floor(ms / 1000);
let daysStr = days > 0 ? padTo2Digits(days) + ':' : '';
return `${daysStr}${padTo2Digits(hours)}:${padTo2Digits(minutes)}:${padTo2Digits(seconds)}`;
}
function padTo2Digits(num) {
return num.toString().padStart(2, '0');
}
async function search(e){
e.preventDefault();
router.navigate(`/search?key=${key}`);
return false;
}
async function stopTrack(){
if (timetrack.running.id){
const url = api(`time/${timetrack.running.id}/stop`);
const res = await fetch(url,{credentials:'include'});
if (res.ok){
timetrack.running = null;
timetrack.elapsed = null;
timetrack.start = null;
router.navigate('/time');
}
}
}
let interval = null;
$effect(() => {
if (timetrack.running) {
console.log('effect!');
timetrack.start = Date.parse(timetrack.running.start_time);
interval = setInterval(() => { timetrack.elapsed = msToTime(Date.now() - timetrack.start); },1000);
} else {
clearInterval(interval);
timetrack.elapsed = null;
interval = null;
}
});
onMount(fetchModules);
onDestroy(() => {
@@ -113,9 +69,5 @@ onDestroy(() => {
{#if user.name }
<a onclick={logout}>{t('logout')}</a>
{/if}
{#if timetrack.running}
<span class="timetracking">{timetrack.elapsed} {timetrack.running.subject}
<button onclick={stopTrack} title={t('stop')} class="symbol"></button>
</span>
{/if}
<TimeRecorder />
</nav>