2022-04-14 21:25:24 +00:00
|
|
|
import { I18n } from "next-i18next";
|
2022-05-05 21:16:25 +00:00
|
|
|
import { RRule } from "rrule";
|
|
|
|
|
2022-06-28 20:40:58 +00:00
|
|
|
import dayjs, { Dayjs } from "@calcom/dayjs";
|
2022-07-28 19:58:26 +00:00
|
|
|
import { detectBrowserTimeFormat } from "@calcom/lib/timeFormat";
|
2022-07-22 17:27:06 +00:00
|
|
|
import { inferQueryOutput } from "@calcom/trpc/react";
|
2022-07-28 19:58:26 +00:00
|
|
|
import type { RecurringEvent } from "@calcom/types/Calendar";
|
2022-04-14 21:25:24 +00:00
|
|
|
|
|
|
|
import { parseZone } from "./parseZone";
|
|
|
|
|
2022-05-05 21:16:25 +00:00
|
|
|
const processDate = (date: string | null | Dayjs, i18n: I18n) => {
|
2022-04-14 21:25:24 +00:00
|
|
|
const parsedZone = parseZone(date);
|
|
|
|
if (!parsedZone?.isValid()) return "Invalid date";
|
|
|
|
const formattedTime = parsedZone?.format(detectBrowserTimeFormat);
|
|
|
|
return formattedTime + ", " + dayjs(date).toDate().toLocaleString(i18n.language, { dateStyle: "full" });
|
|
|
|
};
|
2022-05-05 21:16:25 +00:00
|
|
|
|
|
|
|
export const parseDate = (date: string | null | Dayjs, i18n: I18n) => {
|
|
|
|
if (!date) return ["No date"];
|
|
|
|
return processDate(date, i18n);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const parseRecurringDates = (
|
|
|
|
{
|
|
|
|
startDate,
|
2022-07-07 01:08:38 +00:00
|
|
|
timeZone,
|
2022-05-05 21:16:25 +00:00
|
|
|
recurringEvent,
|
|
|
|
recurringCount,
|
2022-07-07 01:08:38 +00:00
|
|
|
}: {
|
|
|
|
startDate: string | null | Dayjs;
|
|
|
|
timeZone?: string;
|
|
|
|
recurringEvent: RecurringEvent | null;
|
|
|
|
recurringCount: number;
|
|
|
|
},
|
2022-05-05 21:16:25 +00:00
|
|
|
i18n: I18n
|
|
|
|
): [string[], Date[]] => {
|
2022-05-17 20:43:27 +00:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
2022-06-10 00:32:34 +00:00
|
|
|
const { count, ...restRecurringEvent } = recurringEvent || {};
|
2022-05-05 21:16:25 +00:00
|
|
|
const rule = new RRule({
|
|
|
|
...restRecurringEvent,
|
|
|
|
count: recurringCount,
|
|
|
|
dtstart: dayjs(startDate).toDate(),
|
|
|
|
});
|
|
|
|
const dateStrings = rule.all().map((r) => {
|
2022-07-07 01:08:38 +00:00
|
|
|
return processDate(dayjs(r).tz(timeZone), i18n);
|
2022-05-05 21:16:25 +00:00
|
|
|
});
|
|
|
|
return [dateStrings, rule.all()];
|
|
|
|
};
|
2022-07-19 19:06:23 +00:00
|
|
|
|
|
|
|
type BookingItem = inferQueryOutput<"viewer.bookings">["bookings"][number];
|
|
|
|
|
|
|
|
export const extractRecurringDates = (
|
|
|
|
bookings: BookingItem[],
|
|
|
|
timeZone: string | undefined,
|
|
|
|
i18n: I18n
|
|
|
|
): [string[], Date[]] => {
|
|
|
|
const dateStrings = bookings.map((booking) => processDate(dayjs(booking.startTime).tz(timeZone), i18n));
|
|
|
|
const allDates = dateStrings.map((dateString) => dayjs(dateString).tz(timeZone).toDate());
|
|
|
|
return [dateStrings, allDates];
|
|
|
|
};
|