eletrotupi / tcc/ frontend/lib/utils/time.ts52edfe2a750dc47201b3d3136156a02a8cfa08a5
1.7 KB | 43 lines Raw
1
import { format, isToday, isYesterday } from 'date-fns';
2
import { ptBR } from 'date-fns/locale';
3

4
type TimeBadgeVariant = 'morning' | 'afternoon' | 'night' | 'latenight';
5

6
export const TIME_BADGES: Record<TimeBadgeVariant, { label: string; variant: string; }> = {
7
  morning:   { label: 'Manhã',     variant: "green" },
8
  afternoon: { label: 'Tarde',     variant: "orange" },
9
  night:     { label: 'Noite',     variant: "blue" },
10
  latenight: { label: 'Madrugada', variant: "purple" },
11
};
12

13
export const getTimeBadge = (date: Date) => {
14
  const h = date.getHours();
15
  if (h >= 6  && h < 12) return TIME_BADGES.morning;
16
  if (h >= 12 && h < 18) return TIME_BADGES.afternoon;
17
  if (h >= 18 && h < 24) return TIME_BADGES.night;
18
  return TIME_BADGES.latenight;
19
}
20

21
export const formatMoment = (date: Date): string => {
22
  if (isToday(date))     return `Hoje às ${format(date, "HH'h'mm")}`;
23
  if (isYesterday(date)) return `Ontem às ${format(date, "HH'h'mm")}`;
24
  return format(date, "d 'de' MMM 'às' HH'h'mm", { locale: ptBR });
25
}
26

27
// When it's a raw date only field, it should output stuff like
28
// Hoje, 10/10
29
// Ontem, 09/10
30
// 09/10/26
31
export const formatDate = (date: Date): string => {
32
  if (isToday(date))     return `Hoje, ${format(date, "dd/MM")}`;
33
  if (isYesterday(date)) return `Ontem, ${format(date, "dd/MM")}`;
34

35
  return format(date, "dd/MM/yyyy", { locale: ptBR });
36
}
37

38
// Parse a date-only string (YYYY-MM-DD or ISO UTC midnight) as local noon
39
// to prevent timezone offsets from shifting the calendar day
40
export const parseDateOnly = (dateStr: string | Date): Date => {
41
  const iso = typeof dateStr === 'string' ? dateStr : dateStr.toISOString();
42
  return new Date(`${iso.slice(0, 10)}T12:00:00`);
43
};