Merge branch 'IDTEAM-1.26.0' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / calendar / alarms / getAlarmMessageText.ts
blob3878efdce4f4023e9b74df85032cd2826d453a3d
1 import { c } from 'ttag';
3 import { MINUTE } from '../../constants';
4 import { format as formatUTC, isNextDay, isSameDay, isSameMonth, isSameYear } from '../../date-fns-utc';
6 const getStartsTodayText = (title: string) => {
7     return c('Alarm notification').t`${title} starts today`;
8 };
10 const getStartsAtText = (title: string, formattedHour: string) => {
11     return c('Alarm notification').t`${title} starts at ${formattedHour}`;
14 const getStartsOnText = (title: string, formattedDate: string) => {
15     return c('Alarm notification').t`${title} starts on ${formattedDate}`;
18 const getStartsOnAtText = (title: string, formattedDate: string, formattedHour: string) => {
19     return c('Alarm notification').t`${title} starts on ${formattedDate} at ${formattedHour}`;
22 const getStartedAtText = (title: string, formattedHour: string) => {
23     return c('Alarm notification').t`${title} started at ${formattedHour}`;
26 const getStartedOnText = (title: string, formattedDate: string) => {
27     return c('Alarm notification').t`${title} started on ${formattedDate}`;
30 const getStartedOnAtText = (title: string, formattedDate: string, formattedHour: string) => {
31     return c('Alarm notification').t`${title} started on ${formattedDate} at ${formattedHour}`;
34 interface Arguments {
35     isAllDay: boolean;
36     title: string;
37     startFakeUTCDate: Date;
38     nowFakeUTCDate: Date;
39     formatOptions: any;
41 const getAlarmMessageText = ({ title, isAllDay, startFakeUTCDate, nowFakeUTCDate, formatOptions }: Arguments) => {
42     const formattedHour = formatUTC(startFakeUTCDate, 'p', formatOptions);
43     // because of browser timer imprecision, allow for a one-minute margin to determine simultaneity
44     const isNow = Math.abs(+startFakeUTCDate - +nowFakeUTCDate) <= MINUTE / 2;
45     const isInFuture = startFakeUTCDate > nowFakeUTCDate;
47     if (isNow) {
48         return c('Alarm notification').t`${title} starts now`;
49     }
51     if (!isInFuture) {
52         if (isSameDay(nowFakeUTCDate, startFakeUTCDate)) {
53             if (isAllDay) {
54                 return getStartsTodayText(title);
55             }
56             return getStartedAtText(title, formattedHour);
57         }
59         if (isNextDay(startFakeUTCDate, nowFakeUTCDate)) {
60             if (isAllDay) {
61                 return c('Alarm notification').t`${title} started yesterday`;
62             }
63             return c('Alarm notification').t`${title} started yesterday at ${formattedHour}`;
64         }
66         if (isSameMonth(nowFakeUTCDate, startFakeUTCDate)) {
67             const formattedDate = formatUTC(startFakeUTCDate, 'eeee do', formatOptions);
68             if (isAllDay) {
69                 return getStartedOnText(title, formattedDate);
70             }
71             return getStartedOnAtText(title, formattedDate, formattedHour);
72         }
74         if (isSameYear(nowFakeUTCDate, startFakeUTCDate)) {
75             const formattedDate = formatUTC(startFakeUTCDate, 'eeee do MMMM', formatOptions);
76             if (isAllDay) {
77                 return getStartedOnText(title, formattedDate);
78             }
79             return getStartedOnAtText(title, formattedDate, formattedHour);
80         }
82         if (isAllDay) {
83             const formattedDateWithoutTime = formatUTC(startFakeUTCDate, 'PPPP', formatOptions);
84             return getStartedOnText(title, formattedDateWithoutTime);
85         }
86         const formattedDateWithTime = formatUTC(startFakeUTCDate, 'PPPPp', formatOptions);
87         return getStartedOnText(title, formattedDateWithTime);
88     }
90     if (isSameDay(nowFakeUTCDate, startFakeUTCDate)) {
91         if (isAllDay) {
92             return getStartsTodayText(title);
93         }
94         return getStartsAtText(title, formattedHour);
95     }
97     if (isNextDay(nowFakeUTCDate, startFakeUTCDate)) {
98         if (isAllDay) {
99             return c('Alarm notification').t`${title} starts tomorrow`;
100         }
101         return c('Alarm notification').t`${title} starts tomorrow at ${formattedHour}`;
102     }
104     if (isSameMonth(nowFakeUTCDate, startFakeUTCDate)) {
105         const formattedDate = formatUTC(startFakeUTCDate, 'eeee do', formatOptions);
106         if (isAllDay) {
107             return getStartsOnText(title, formattedDate);
108         }
109         return getStartsOnAtText(title, formattedDate, formattedHour);
110     }
112     if (isSameYear(nowFakeUTCDate, startFakeUTCDate)) {
113         const formattedDate = formatUTC(startFakeUTCDate, 'eeee do MMMM', formatOptions);
114         if (isAllDay) {
115             return getStartsOnText(title, formattedDate);
116         }
117         return getStartsOnAtText(title, formattedDate, formattedHour);
118     }
120     if (isAllDay) {
121         const formattedDateWithoutTime = formatUTC(startFakeUTCDate, 'PPPP', formatOptions);
122         return getStartsOnText(title, formattedDateWithoutTime);
123     }
125     const formattedDateWithTime = formatUTC(startFakeUTCDate, 'PPPPp', formatOptions);
126     return getStartsOnText(title, formattedDateWithTime);
129 export default getAlarmMessageText;