Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / shared / lib / date / date.ts
blobda2d887ba75402c2f2bce0638000e52ea14aeae5
1 import {
2     addMonths,
3     differenceInMilliseconds,
4     eachDayOfInterval,
5     endOfWeek,
6     format,
7     getDaysInMonth,
8     isAfter,
9     startOfWeek,
10     startOfYear,
11     sub,
12 } from 'date-fns';
14 import { DAY } from '../constants';
16 interface FormatOptions {
17     locale?: Locale;
20 export const YEAR_REGEX = /[0-9]{4}/i;
22 /**
23  * Get a list with the names of the days of the week according to current locale, where Sunday is the start of the week.
24  */
25 export const getFormattedWeekdays = (stringFormat: string, options?: FormatOptions) => {
26     const zeroTime = new Date(0);
27     const weekdays = eachDayOfInterval({ start: startOfWeek(zeroTime), end: endOfWeek(zeroTime) });
29     return weekdays.map((day) => format(day, stringFormat, options));
32 /**
33  * Get a list with the names of the days of the week according to current locale
34  */
35 export const getFormattedMonths = (stringFormat: string, options?: FormatOptions) => {
36     const dummyDate = startOfYear(new Date(0));
37     const dummyMonths = Array.from({ length: 12 }).map((_, i) => addMonths(dummyDate, i));
39     return dummyMonths.map((date) => format(date, stringFormat, options));
42 /**
43  * Get the index of the start of week day for a given date-fn locale
44  */
45 export const getWeekStartsOn = (locale?: Locale) => {
46     return locale?.options?.weekStartsOn || 0;
49 export const getTimeRemaining = (earlierDate: Date, laterDate: Date) => {
50     const result = {
51         years: 0,
52         months: 0,
53         days: 0,
54         hours: 0,
55         minutes: 0,
56         seconds: 0,
57         firstDateWasLater: false,
58     };
60     if (earlierDate === laterDate) {
61         return result;
62     }
64     let earlier;
65     let later;
66     if (isAfter(earlierDate, laterDate)) {
67         later = earlierDate;
68         earlier = laterDate;
69         result.firstDateWasLater = true;
70     } else {
71         earlier = earlierDate;
72         later = laterDate;
73     }
75     result.years = later.getFullYear() - earlier.getFullYear();
76     result.months = later.getMonth() - earlier.getMonth();
77     result.days = later.getDate() - earlier.getDate();
78     result.hours = later.getHours() - earlier.getHours();
79     result.minutes = later.getMinutes() - earlier.getMinutes();
80     result.seconds = later.getSeconds() - earlier.getSeconds();
82     if (result.seconds < 0) {
83         result.seconds += 60;
84         result.minutes--;
85     }
87     if (result.minutes < 0) {
88         result.minutes += 60;
89         result.hours--;
90     }
92     if (result.hours < 0) {
93         result.hours += 24;
94         result.days--;
95     }
97     if (result.days < 0) {
98         const daysInLastFullMonth = getDaysInMonth(
99             sub(new Date(`${later.getFullYear()}-${later.getMonth() + 1}`), { months: 1 })
100         );
101         if (daysInLastFullMonth < earlier.getDate()) {
102             // 31/01 -> 2/03
103             result.days += daysInLastFullMonth + (earlier.getDate() - daysInLastFullMonth);
104         } else {
105             result.days += daysInLastFullMonth;
106         }
107         result.months--;
108     }
110     if (result.months < 0) {
111         result.months += 12;
112         result.years--;
113     }
115     return result;
118 export const getDifferenceInDays = (earlierDate: Date, laterDate: Date) => {
119     const diff = differenceInMilliseconds(laterDate, earlierDate);
120     return Math.floor(diff / DAY);
123 export const isValidDate = (date: Date) => {
124     return date instanceof Date && !Number.isNaN(date.getTime());