forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtaskDue.ts
More file actions
79 lines (74 loc) · 2.23 KB
/
Copy pathtaskDue.ts
File metadata and controls
79 lines (74 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
export interface TaskDueStatus {
text: string;
isOverdue: boolean;
isToday: boolean;
}
/**
* Whole-day difference between a due timestamp and `now`, both floored to
* local midnight so a task due later today counts as 0 days, not -1.
*/
export function daysUntilDue(dueAt: string, now: Date = new Date()): number {
const due = new Date(dueAt);
const today = new Date(now);
today.setHours(0, 0, 0, 0);
due.setHours(0, 0, 0, 0);
return Math.round((due.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));
}
/**
* Format days late/until due
*/
export function formatDueStatus(dueAt: string, now: Date = new Date()): TaskDueStatus {
const diffDays = daysUntilDue(dueAt, now);
const due = new Date(dueAt);
if (diffDays < 0) {
const daysLate = Math.abs(diffDays);
return {
text: daysLate === 1 ? '1 day late' : `${daysLate} days late`,
isOverdue: true,
isToday: false,
};
} else if (diffDays === 0) {
return { text: 'Due today', isOverdue: false, isToday: true };
} else if (diffDays === 1) {
return { text: 'Due tomorrow', isOverdue: false, isToday: false };
} else if (diffDays <= 7) {
return {
text: `Due ${due.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' })}`,
isOverdue: false,
isToday: false,
};
} else {
return {
text: `Due ${due.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`,
isOverdue: false,
isToday: false,
};
}
}
/**
* Compact variant for dense task rows.
*/
export function formatDueBadge(
dueAt: string,
now: Date = new Date(),
): { text: string; isOverdue: boolean } {
const diffDays = daysUntilDue(dueAt, now);
const due = new Date(dueAt);
if (diffDays < 0) {
return { text: `${Math.abs(diffDays)}d late`, isOverdue: true };
} else if (diffDays === 0) {
return { text: 'Today', isOverdue: false };
} else if (diffDays === 1) {
return { text: 'Tomorrow', isOverdue: false };
} else if (diffDays <= 7) {
return {
text: due.toLocaleDateString('en-US', { weekday: 'short' }),
isOverdue: false,
};
} else {
return {
text: due.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),
isOverdue: false,
};
}
}