Fix time duration and visuals
This commit is contained in:
+27
-33
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user