import { useLanguage } from '@rocket.chat/ui-contexts'; import { isSameDay } from 'date-fns'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useFormatDate } from './useFormatDate'; import { useFormatTime } from './useFormatTime'; // Handles Date, ISO string, and EJSON { $date } (from DDP streamer which does raw JSON.parse without EJSON deserialization) function parseExpiresAt(value?: unknown): Date | undefined { if (!value) { return undefined; } if (value instanceof Date) { return Number.isNaN(value.getTime()) ? undefined : value; } if (typeof value === 'object' && '$date' in (value as Record)) { const date = new Date((value as { $date: number }).$date); return Number.isNaN(date.getTime()) ? undefined : date; } if (typeof value === 'string') { const date = new Date(value); return Number.isNaN(date.getTime()) ? undefined : date; } return undefined; } export function useExpirationText(statusExpiresAt?: Date | string) { const { t } = useTranslation(); const language = useLanguage(); const formatTime = useFormatTime(); const formatDate = useFormatDate(); return useMemo(() => { const expiresAt = parseExpiresAt(statusExpiresAt); if (!expiresAt || expiresAt.getTime() <= Date.now()) { return undefined; } const now = new Date(); if (isSameDay(expiresAt, now)) { return t('Until_time', { time: formatTime(expiresAt) }); } if (expiresAt.getFullYear() === now.getFullYear()) { return t('Until_date', { date: new Intl.DateTimeFormat(language, { month: 'long', day: 'numeric' }).format(expiresAt) }); } return t('Until_date', { date: formatDate(expiresAt) }); }, [statusExpiresAt, t, language, formatTime, formatDate]); }