Merge branch 'IDTEAM-1.26.0' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / calendar / alarms / getValarmTrigger.ts
blobfe42da239731fe5b4b4c6c53142e4885ff8581bd
1 import type { NotificationModel } from '../../interfaces/calendar/Notification';
2 import { NOTIFICATION_UNITS, NOTIFICATION_WHEN } from '../constants';
3 import { transformBeforeAt } from './trigger';
5 const getValarmTriggerUnit = (unit: NOTIFICATION_UNITS) => {
6     return (
7         {
8             [NOTIFICATION_UNITS.WEEK]: 'weeks',
9             [NOTIFICATION_UNITS.DAY]: 'days',
10             [NOTIFICATION_UNITS.HOUR]: 'hours',
11             [NOTIFICATION_UNITS.MINUTE]: 'minutes',
12         }[unit] || 'days'
13     );
16 const getAllDayValarmTrigger = ({
17     isNegative,
18     unit,
19     value = 0,
20     at,
21 }: {
22     isNegative: boolean;
23     unit: NOTIFICATION_UNITS;
24     value?: number;
25     at: Date;
26 }) => {
27     const modifiedAt = isNegative ? transformBeforeAt(at) : at;
29     const hours = modifiedAt.getHours();
30     const minutes = modifiedAt.getMinutes();
32     const modifyNegativeDay = isNegative && (minutes > 0 || hours > 0);
34     const [weeks, days] = (() => {
35         const weeksValue = unit === NOTIFICATION_UNITS.WEEK ? value : 0;
36         const daysValue = unit === NOTIFICATION_UNITS.DAY ? value : 0;
38         if (modifyNegativeDay && weeksValue === 0) {
39             return [0, daysValue - 1];
40         }
41         if (modifyNegativeDay && weeksValue >= 1) {
42             return [weeksValue - 1, 6];
43         }
44         return [weeksValue, daysValue];
45     })();
47     return {
48         weeks: Math.max(0, weeks),
49         days: Math.max(0, days),
50         hours,
51         minutes,
52         seconds: 0,
53         isNegative,
54     };
57 const getPartDayValarmTrigger = ({
58     isNegative,
59     unit,
60     value = 0,
61 }: {
62     isNegative: boolean;
63     unit: NOTIFICATION_UNITS;
64     value?: number;
65 }) => {
66     return {
67         weeks: 0,
68         days: 0,
69         hours: 0,
70         minutes: 0,
71         seconds: 0,
72         [getValarmTriggerUnit(unit)]: value,
73         isNegative,
74     };
77 export const getValarmTrigger = ({ isAllDay, unit, when, value, at }: NotificationModel) => {
78     const isNegative = when === NOTIFICATION_WHEN.BEFORE;
79     if (isAllDay) {
80         if (!at) {
81             throw new Error('Missing at');
82         }
83         return getAllDayValarmTrigger({ isNegative, unit, value, at });
84     }
85     return getPartDayValarmTrigger({ isNegative, unit, value });