Fix time duration and visuals

This commit is contained in:
2026-04-24 22:43:45 +02:00
parent ee0bb780c1
commit 192432f8e5
14 changed files with 281 additions and 111 deletions
+27 -33
View File
@@ -13,7 +13,6 @@ export function formatMinutesAfter(minutes: number | null, reference: string = "
const [refHours, refMinutes] = reference.split(":").map(Number);
const totalRefMinutes = refHours * 60 + refMinutes;
const targetMinutes = totalRefMinutes + minutes;
// Handle wrap around midnight
const normalizedMinutes = ((targetMinutes % 1440) + 1440) % 1440;
@@ -34,26 +33,23 @@ export function toLocalDatetimeInputValue(date: Date): string {
return localDate.toISOString().slice(0, 16);
}
/**
* Format elapsed time in human-readable format
* @param startTime - start time as ISO string or Date
* @returns formatted string like "2h 35m" or "just now"
*/
export function formatElapsedTime(startTime: string | Date): string {
const start = typeof startTime === "string" ? new Date(startTime) : startTime;
export function formatElapsedTime(utcTimestamp: string): string {
let isoString = utcTimestamp;
if (utcTimestamp.includes(' ')) {
isoString = utcTimestamp.replace(' ', 'T');
}
if (!isoString.endsWith('Z')) {
isoString += 'Z';
}
const then = new Date(isoString);
const now = new Date();
const diffMs = now.getTime() - start.getTime();
const diffMs = now - then;
const diffMins = Math.floor(diffMs / 60000);
const hours = Math.floor(diffMins / 60);
const mins = diffMins % 60;
if (diffMs < 0) return "just now";
const totalMinutes = Math.floor(diffMs / 60000);
const hours = Math.floor(totalMinutes / 60);
const minutes = totalMinutes % 60;
if (hours === 0 && minutes === 0) return "just now";
if (hours === 0) return `${minutes}m`;
if (minutes === 0) return `${hours}h`;
return `${hours}h ${minutes}m`;
if (hours > 0) return `${hours}h ${mins}m`;
return `${mins}m`;
}
/**
@@ -77,6 +73,7 @@ export function clampToDay(date: Date, bound: "start" | "end"): Date {
* @param timeStr - HH:MM format
* @param baseDate - base date (defaults to today)
* @returns Date object
* @throws Error if timeStr is invalid
*/
export function parseTime(timeStr: string, baseDate: Date = new Date()): Date {
const [hours, minutes] = timeStr.split(":").map(Number);
@@ -85,19 +82,6 @@ export function parseTime(timeStr: string, baseDate: Date = new Date()): Date {
return result;
}
/**
* Format minutes as hours and minutes string
* @param minutes - total minutes
* @returns formatted string like "12h 30m"
*/
export function formatMinutes(minutes: number): string {
const hours = Math.floor(minutes / 60);
const mins = minutes % 60;
if (hours === 0) return `${mins}m`;
if (mins === 0) return `${hours}h`;
return `${hours}h ${mins}m`;
}
/**
* Get date string for N days ago
* @param days - number of days ago
@@ -115,4 +99,14 @@ export function getDaysAgo(days: number): string {
*/
export function getToday(): string {
return new Date().toISOString().split("T")[0];
}
}
/**
* Convert HH:MM time string to total minutes from start of day
* @param timeStr - HH:MM format
* @returns total minutes
*/
export function timeToMinutes(timeStr: string): number {
const [hours, minutes] = timeStr.split(":").map(Number);
return hours * 60 + minutes;
}