
* Init dev * UI changes for recurring event + prisma * Revisiting schema + changes WIP * UI done, BE WIP * Feature completion * Unused query param removed * Invalid comment removed * Removed unused translation * Update apps/web/public/static/locales/en/common.json Thanks! Co-authored-by: Peer Richelsen <peeroke@gmail.com> * Success page changes * More progress * Email text tweaks + test + seed * Tweaking emails + Cal Apps support WIP * No app integration for now Final email and pages tweaks to avoid recurring info showed * Missing comment for clarity * Yet again, comment * Last minute fix * Missing tooltip for upcoming bookings * Fixing seed * Fixing import * Increasing timeout for e2e * Fixing any * Apply suggestions from code review Co-authored-by: Omar López <zomars@me.com> * Update apps/web/pages/d/[link]/book.tsx Co-authored-by: Omar López <zomars@me.com> * Code improvements * More code improvements * Reverting back number input arrows * Update BookingPage.tsx * Update BookingPage.tsx * Adds fallback for sendOrganizerPaymentRefundFailedEmail * Type overkill * Type fixes * Type fixes * Nitpicks * Update success.tsx * Update success.tsx * Update success.tsx * Fixing types Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Omar López <zomars@me.com>
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import dayjs, { Dayjs } from "dayjs";
|
|
import { I18n } from "next-i18next";
|
|
import { RRule } from "rrule";
|
|
|
|
import { recurringEvent } from "@calcom/prisma/zod-utils";
|
|
import { RecurringEvent } from "@calcom/types/Calendar";
|
|
|
|
import { detectBrowserTimeFormat } from "@lib/timeFormat";
|
|
|
|
import { parseZone } from "./parseZone";
|
|
|
|
const processDate = (date: string | null | Dayjs, i18n: I18n) => {
|
|
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" });
|
|
};
|
|
|
|
export const parseDate = (date: string | null | Dayjs, i18n: I18n) => {
|
|
if (!date) return ["No date"];
|
|
return processDate(date, i18n);
|
|
};
|
|
|
|
export const parseRecurringDates = (
|
|
{
|
|
startDate,
|
|
recurringEvent,
|
|
recurringCount,
|
|
}: { startDate: string | null | Dayjs; recurringEvent: RecurringEvent; recurringCount: number },
|
|
i18n: I18n
|
|
): [string[], Date[]] => {
|
|
const { count, ...restRecurringEvent } = recurringEvent;
|
|
const rule = new RRule({
|
|
...restRecurringEvent,
|
|
count: recurringCount,
|
|
dtstart: dayjs(startDate).toDate(),
|
|
});
|
|
const dateStrings = rule.all().map((r) => {
|
|
return processDate(dayjs(r), i18n);
|
|
});
|
|
return [dateStrings, rule.all()];
|
|
};
|