Skip to content

Commit 23c73f9

Browse files
committed
chore(ui): fix negative numbers and styling issue in the time tracker component
1 parent 0349637 commit 23c73f9

2 files changed

Lines changed: 31 additions & 27 deletions

File tree

components/time-tracker.tsx

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ export function TimeTracker({ userId }: { userId: number }) {
124124
useEffect(() => {
125125
const now = new Date()
126126
if (status === "working" && startTime) {
127-
const totalElapsed = Math.floor((now.getTime() - startTime.getTime()) / 1000) * 1000
127+
const totalElapsed = Math.max(0, Math.floor((now.getTime() - startTime.getTime()) / 1000) * 1000)
128128
setElapsedTime(totalElapsed)
129129
} else if (status === "break" && breakStartTime) {
130-
const elapsedBreak = Math.floor((now.getTime() - breakStartTime.getTime()) / 1000) * 1000
131-
const elapsedTotal = Math.floor((now.getTime() - startTime!.getTime()) / 1000) * 1000
130+
const elapsedBreak = Math.max(0, Math.floor((now.getTime() - breakStartTime.getTime()) / 1000) * 1000)
131+
const elapsedTotal = Math.max(0, Math.floor((now.getTime() - startTime!.getTime()) / 1000) * 1000)
132132
setElapsedTime(elapsedTotal)
133133
setBreakTime(elapsedBreak)
134134
}
@@ -369,7 +369,8 @@ export function TimeTracker({ userId }: { userId: number }) {
369369
};
370370

371371
const formatDurationForPanel = () => {
372-
const dur = formatDuration(elapsedTime - totalBreakTime - (status === "break" ? breakTime : 0));
372+
const durationMs = Math.max(0, elapsedTime - totalBreakTime - (status === "break" ? breakTime : 0));
373+
const dur = formatDuration(durationMs);
373374
let part1 = dur.split(' ')[0].replace('h', ':')
374375
let part2 = dur.split(' ')[1].replace('m', '')
375376
return part1 + part2
@@ -484,18 +485,32 @@ export function TimeTracker({ userId }: { userId: number }) {
484485
</div>
485486

486487
{status !== "idle" && (
487-
<div className="rounded-lg bg-muted/50 p-3 text-center text-xs text-muted-foreground">
488-
Started working at{" "}
489-
<span className="font-medium text-foreground">
490-
{startTime?.toLocaleTimeString([], {
491-
hour: "2-digit",
492-
minute: "2-digit",
493-
})}
494-
</span>
488+
<div className="rounded-lg bg-muted/50 px-3 py-1.5 flex flex-wrap items-center justify-between gap-x-2 text-xs text-muted-foreground min-h-10">
489+
<div className="flex flex-wrap items-center">
490+
<span>Started working at </span>
491+
<span className="font-medium text-foreground ml-1">
492+
{startTime?.toLocaleTimeString([], {
493+
hour: "2-digit",
494+
minute: "2-digit",
495+
})}
496+
</span>
497+
{status === "break" && (
498+
<span className="flex items-center">
499+
<span className="mx-1 opacity-50"></span>
500+
<span>Break started at </span>
501+
<span className="font-medium text-foreground ml-1">
502+
{breakStartTime?.toLocaleTimeString([], {
503+
hour: "2-digit",
504+
minute: "2-digit",
505+
})}
506+
</span>
507+
</span>
508+
)}
509+
</div>
495510
<Button
496511
variant="ghost"
497512
size="sm"
498-
className="ml-2 h-7 px-2 text-[10px] text-blue-600 hover:text-blue-700 hover:bg-blue-50 dark:text-blue-400 dark:hover:bg-blue-900/20"
513+
className="h-7 px-2 text-[10px] text-blue-600 hover:text-blue-700 hover:bg-blue-50 dark:text-blue-400 dark:hover:bg-blue-900/20"
499514
onClick={() => {
500515
if (startTime) {
501516
setAdjustedStartTime(formatTimeForInput(startTime));
@@ -506,18 +521,6 @@ export function TimeTracker({ userId }: { userId: number }) {
506521
<Clock className="mr-1 h-3 w-3" />
507522
Delayed entry?
508523
</Button>
509-
{status === "break" && (
510-
<span>
511-
{" "}
512-
• Break started at{" "}
513-
<span className="font-medium text-foreground">
514-
{breakStartTime?.toLocaleTimeString([], {
515-
hour: "2-digit",
516-
minute: "2-digit",
517-
})}
518-
</span>
519-
</span>
520-
)}
521524
</div>
522525
)}
523526

lib/utils.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ export function cn(...inputs: ClassValue[]) {
88

99
// Helper function to format time in hours and minutes
1010
export function formatDuration(milliseconds: number): string {
11-
const hours = Math.floor(milliseconds / (1000 * 60 * 60))
12-
const minutes = Math.floor((milliseconds % (1000 * 60 * 60)) / (1000 * 60))
11+
const ms = Math.max(0, milliseconds)
12+
const hours = Math.floor(ms / (1000 * 60 * 60))
13+
const minutes = Math.floor((ms % (1000 * 60 * 60)) / (1000 * 60))
1314
return `${hours}h ${minutes.toString().padStart(2, "0")}m`
1415
}
1516

0 commit comments

Comments
 (0)