import dayjs, { Dayjs } from "dayjs"; import localizedFormat from "dayjs/plugin/localizedFormat"; import timezone from "dayjs/plugin/timezone"; import utc from "dayjs/plugin/utc"; import { CalendarEvent } from "@lib/calendarClient"; import EventMail from "./EventMail"; dayjs.extend(utc); dayjs.extend(timezone); dayjs.extend(localizedFormat); export default class EventPaymentMail extends EventMail { paymentLink: string; constructor(paymentLink: string, calEvent: CalendarEvent) { super(calEvent); this.paymentLink = paymentLink; } /** * Returns the email text as HTML representation. * * @protected */ protected getHtmlRepresentation(): string { return ( `

${this.calEvent.language("meeting_awaiting_payment")}

${this.calEvent.language( "emailed_you_and_any_other_attendees" )}


${this.calEvent.language("what")} ${this.calEvent.type}
${this.calEvent.language("when")} ${this.getInviteeStart().format("dddd, LL")}
${this.getInviteeStart().format("h:mma")} (${ this.calEvent.attendees[0].timeZone })
${this.calEvent.language("who")} ${this.calEvent.organizer.name}
${this.calEvent.organizer.email}
${this.calEvent.language("where")} ${this.getLocation()}
${this.calEvent.language("notes")}Notes ${this.calEvent.description}
` + this.getAdditionalBody() + "
" + `
Cal.com Logo
` ); } /** * Adds the video call information to the mail body. * * @protected */ protected getLocation(): string { if (this.calEvent.additionInformation?.hangoutLink) { return `${this.calEvent.additionInformation?.hangoutLink}
`; } if ( this.calEvent.additionInformation?.entryPoints && this.calEvent.additionInformation?.entryPoints.length > 0 ) { const locations = this.calEvent.additionInformation?.entryPoints .map((entryPoint) => { return ` ${this.calEvent.language("join_by_entrypoint", { entryPoint: entryPoint.entryPointType })}:
${entryPoint.label}
`; }) .join("
"); return `${locations}`; } return this.calEvent.location ? `${this.calEvent.location}

` : ""; } protected getAdditionalBody(): string { return `${this.calEvent.language("pay_now")}`; } /** * Returns the payload object for the nodemailer. * * @protected */ protected getNodeMailerPayload(): Record { return { to: `${this.calEvent.attendees[0].name} <${this.calEvent.attendees[0].email}>`, from: `${this.calEvent.organizer.name} <${this.getMailerOptions().from}>`, replyTo: this.calEvent.organizer.email, subject: this.calEvent.language("awaiting_payment", { eventType: this.calEvent.type, organizerName: this.calEvent.organizer.name, date: this.getInviteeStart().format("dddd, LL"), }), html: this.getHtmlRepresentation(), text: this.getPlainTextRepresentation(), }; } protected printNodeMailerError(error: Error): void { console.error("SEND_BOOKING_PAYMENT_ERROR", this.calEvent.attendees[0].email, error); } /** * Returns the inviteeStart value used at multiple points. * * @private */ protected getInviteeStart(): Dayjs { return dayjs(this.calEvent.startTime).tz(this.calEvent.attendees[0].timeZone); } }