eletrotupi / tcc/ frontend/lib/utils/time.tsc901c35af9c84b6a29e5185545ced1129f33b8f4
1.7 KB | 44 lines Raw
1
import { format, isToday, isYesterday } from 'date-fns';
2
import { ptBR } from 'date-fns/locale';
3
import type { BadgeVariant } from '@/components/ui/Badge';
4

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

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

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

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

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

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

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