]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat(files_reminders): add datetime utils
authorChristopher Ng <chrng8@gmail.com>
Thu, 3 Aug 2023 02:15:00 +0000 (19:15 -0700)
committerChristopher Ng <chrng8@gmail.com>
Wed, 9 Aug 2023 17:41:17 +0000 (10:41 -0700)
Signed-off-by: Christopher Ng <chrng8@gmail.com>
apps/files_reminders/src/shared/utils.ts [new file with mode: 0644]

diff --git a/apps/files_reminders/src/shared/utils.ts b/apps/files_reminders/src/shared/utils.ts
new file mode 100644 (file)
index 0000000..52d8c2a
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * @copyright 2023 Christopher Ng <chrng8@gmail.com>
+ *
+ * @author Christopher Ng <chrng8@gmail.com>
+ *
+ * @license AGPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+import moment from '@nextcloud/moment'
+import { getCanonicalLocale } from '@nextcloud/l10n'
+
+export enum DateTimePreset {
+       LaterToday,
+       Tomorrow,
+       ThisWeekend,
+       NextWeek,
+}
+
+export const getDateTime = (dateTime: DateTimePreset): Date => {
+       const matchPreset = {
+               [DateTimePreset.LaterToday]: () => {
+                       const hour = moment().get('hour')
+                       const later = moment()
+                               .startOf('day')
+                               .add(hour + 2, 'hour')
+                       return later.toDate()
+               },
+
+               [DateTimePreset.Tomorrow]: () => {
+                       const day = moment()
+                               .add(1, 'day')
+                               .startOf('day')
+                               .add(9, 'hour')
+                               .toDate()
+                       return day
+               },
+
+               [DateTimePreset.ThisWeekend]: () => {
+                       const today = moment()
+                       const weekendFirstDay = moment()
+                               .startOf('isoWeek')
+                               .add(5, 'day')
+                               .add(9, 'hour')
+                       const weekendSecondDay = moment()
+                               .startOf('isoWeek')
+                               .add(6, 'day')
+                               .add(9, 'hour')
+                       if (today.isSame(weekendFirstDay, 'date')) {
+                               return weekendFirstDay
+                                       .add(1, 'day')
+                                       .toDate()
+                       }
+                       if (today.isSame(weekendSecondDay, 'date')) {
+                               return weekendSecondDay
+                                       .add(1, 'week')
+                                       .startOf('isoWeek')
+                                       .add(5, 'day')
+                                       .add(9, 'hour')
+                                       .toDate()
+                       }
+                       return weekendFirstDay.toDate()
+               },
+
+               [DateTimePreset.NextWeek]: () => {
+                       const day = moment()
+                               .startOf('isoWeek')
+                               .add(1, 'week')
+                               .add(9, 'hour')
+                               .toDate()
+                       return day
+               },
+       }
+
+       return matchPreset[dateTime]()
+}
+
+export const getDateString = (dueDate: Date): string => {
+       let localeOptions: Intl.DateTimeFormatOptions = {
+               weekday: 'short',
+               hour: 'numeric',
+               minute: '2-digit',
+       }
+
+       const today = moment()
+       const dueDateMoment = moment(dueDate)
+       if (!dueDateMoment.isSame(today, 'week')) {
+               localeOptions = {
+                       ...localeOptions,
+                       month: 'short',
+                       day: 'numeric',
+               }
+       }
+
+       return dueDate.toLocaleString(
+               getCanonicalLocale(),
+               localeOptions,
+       )
+}