cal.pub0.org/lib/CalEventParser.ts

101 lines
3.0 KiB
TypeScript
Raw Normal View History

import { CalendarEvent } from "./calendarClient";
import { v5 as uuidv5 } from "uuid";
import short from "short-uuid";
import { stripHtml } from "./emails/helpers";
const translator = short();
export default class CalEventParser {
2021-07-25 17:15:31 +00:00
protected calEvent: CalendarEvent;
protected maybeUid: string;
2021-07-25 17:15:31 +00:00
constructor(calEvent: CalendarEvent, maybeUid: string = null) {
this.calEvent = calEvent;
2021-07-25 17:15:31 +00:00
this.maybeUid = maybeUid;
}
/**
* Returns a link to reschedule the given booking.
*/
public getRescheduleLink(): string {
return process.env.BASE_URL + "/reschedule/" + this.getUid();
}
/**
* Returns a link to cancel the given booking.
*/
public getCancelLink(): string {
return process.env.BASE_URL + "/cancel/" + this.getUid();
}
/**
* Returns a unique identifier for the given calendar event.
*/
public getUid(): string {
2021-07-25 17:15:31 +00:00
return this.maybeUid ?? translator.fromUUID(uuidv5(JSON.stringify(this.calEvent), uuidv5.URL));
}
/**
* Returns a footer section with links to change the event (as HTML).
*/
public getChangeEventFooterHtml(): string {
2021-07-16 20:57:44 +00:00
return `<p style="color: #4b5563; margin-top: 20px;">Need to make a change? <a href="${this.getCancelLink()}" style="color: #161e2e;">Cancel</a> or <a href="${this.getRescheduleLink()}" style="color: #161e2e;">reschedule</a>.</p>`;
}
/**
* Returns a footer section with links to change the event (as plain text).
*/
public getChangeEventFooter(): string {
return stripHtml(this.getChangeEventFooterHtml());
}
/**
* Returns an extended description with all important information (as HTML).
*
* @protected
*/
public getRichDescriptionHtml(): string {
2021-06-29 22:31:30 +00:00
// This odd indentation is necessary because otherwise the leading tabs will be applied into the event description.
return (
`
2021-06-29 22:50:34 +00:00
<strong>Event Type:</strong><br />${this.calEvent.type}<br />
<strong>Invitee Email:</strong><br /><a href="mailto:${this.calEvent.attendees[0].email}">${this.calEvent.attendees[0].email}</a><br />
2021-06-29 22:31:30 +00:00
` +
(this.calEvent.location
2021-06-29 22:50:34 +00:00
? `<strong>Location:</strong><br />${this.calEvent.location}<br />
2021-06-29 22:31:30 +00:00
`
: "") +
2021-06-29 22:50:34 +00:00
`<strong>Invitee Time Zone:</strong><br />${this.calEvent.attendees[0].timeZone}<br />
<strong>Additional notes:</strong><br />${this.calEvent.description}<br />` +
2021-06-29 22:11:16 +00:00
this.getChangeEventFooterHtml()
);
}
/**
* Returns an extended description with all important information (as plain text).
*
* @protected
*/
public getRichDescription(): string {
return stripHtml(this.getRichDescriptionHtml());
}
/**
* Returns a calendar event with rich description.
*/
public asRichEvent(): CalendarEvent {
const eventCopy: CalendarEvent = { ...this.calEvent };
eventCopy.description = this.getRichDescriptionHtml();
return eventCopy;
}
2021-07-21 12:01:48 +00:00
/**
* Returns a calendar event with rich description as plain text.
*/
public asRichEventPlain(): CalendarEvent {
const eventCopy: CalendarEvent = { ...this.calEvent };
eventCopy.description = this.getRichDescription();
return eventCopy;
}
}