* translate {EVENT_DATE} variable to correct language
* fix locale for cron schedule reminder emails/sms
* fix type error
* add missing locale to attendees
* fix type error
* code clean up
* revert last commit
* using Intl for date translations
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
74 lines
2.6 KiB
TypeScript
74 lines
2.6 KiB
TypeScript
import { guessEventLocationType } from "@calcom/app-store/locations";
|
|
import { Dayjs } from "@calcom/dayjs";
|
|
import { Prisma } from "@calcom/prisma/client";
|
|
|
|
export type VariablesType = {
|
|
eventName?: string;
|
|
organizerName?: string;
|
|
attendeeName?: string;
|
|
attendeeEmail?: string;
|
|
eventDate?: Dayjs;
|
|
eventTime?: Dayjs;
|
|
timeZone?: string;
|
|
location?: string | null;
|
|
additionalNotes?: string | null;
|
|
customInputs?: Prisma.JsonValue;
|
|
meetingUrl?: string;
|
|
};
|
|
|
|
const customTemplate = async (text: string, variables: VariablesType, locale: string) => {
|
|
const translatedDate = new Intl.DateTimeFormat(locale, {
|
|
weekday: "long",
|
|
month: "long",
|
|
day: "numeric",
|
|
year: "numeric",
|
|
}).format(variables.eventDate?.toDate());
|
|
|
|
const timeWithTimeZone = `${variables.eventTime?.format("HH:mm")} (${variables.timeZone})`;
|
|
let locationString = variables.location || "";
|
|
|
|
if (text.includes("{LOCATION}")) {
|
|
locationString = guessEventLocationType(locationString)?.label || locationString;
|
|
}
|
|
|
|
let dynamicText = text
|
|
.replaceAll("{EVENT_NAME}", variables.eventName || "")
|
|
.replaceAll("{ORGANIZER}", variables.organizerName || "")
|
|
.replaceAll("{ATTENDEE}", variables.attendeeName || "")
|
|
.replaceAll("{ORGANIZER_NAME}", variables.organizerName || "") //old variable names
|
|
.replaceAll("{ATTENDEE_NAME}", variables.attendeeName || "") //old variable names
|
|
.replaceAll("{EVENT_DATE}", translatedDate)
|
|
.replaceAll("{EVENT_TIME}", timeWithTimeZone)
|
|
.replaceAll("{LOCATION}", locationString)
|
|
.replaceAll("{ADDITIONAL_NOTES}", variables.additionalNotes || "")
|
|
.replaceAll("{ATTENDEE_EMAIL}", variables.attendeeEmail || "")
|
|
.replaceAll("{MEETING_URL}", variables.meetingUrl || "");
|
|
|
|
const customInputvariables = dynamicText.match(/\{(.+?)}/g)?.map((variable) => {
|
|
return variable.replace("{", "").replace("}", "");
|
|
});
|
|
|
|
customInputvariables?.forEach((variable) => {
|
|
if (variables.customInputs) {
|
|
Object.keys(variables.customInputs).forEach((customInput) => {
|
|
const formatedToVariable = customInput
|
|
.replace(/[^a-zA-Z0-9 ]/g, "")
|
|
.trim()
|
|
.replaceAll(" ", "_")
|
|
.toUpperCase();
|
|
if (variable === formatedToVariable && variables.customInputs) {
|
|
dynamicText = dynamicText.replace(
|
|
`{${variable}}`,
|
|
variables.customInputs[customInput as keyof typeof variables.customInputs]
|
|
);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
const textHtml = `<body style="white-space: pre-wrap;">${dynamicText}</body>`;
|
|
return { text: dynamicText, html: textHtml };
|
|
};
|
|
|
|
export default customTemplate;
|