UNPKG

@tutorbook/emails

Version:

Handlebar email templates for the COVID Tutoring Initiative website.

66 lines (58 loc) 2.04 kB
import Utils from '@tutorbook/covid-utils'; import { Appt, AttendeeInterface, User, UserWithRoles } from '@tutorbook/model'; import { Email } from '../common'; import Handlebars from '../handlebars'; import Template from './template.hbs'; interface Data { attendees: UserWithRoles[]; recipient: UserWithRoles; appt: Appt; } /** * The email that is sent to all the appointment attendees once we receive * parental approval for a pending lesson request. This emails contains the link * to the Bramble room and instructions for how to make the most out of the * virtual tutoring session. */ export class ApptEmail implements Email { private static readonly render: Handlebars.TemplateDelegate< Data > = Handlebars.compile(Template); public readonly from: string = 'Tutorbook <team@tutorbook.org>'; public readonly bcc: string = 'team@tutorbook.org'; public readonly to: string; public readonly subject: string; public readonly html: string; public readonly text: string; private addRoles(user: User): UserWithRoles { const attendee: AttendeeInterface | undefined = this.appt.attendees.find( (attendee: AttendeeInterface) => attendee.uid === user.uid ); return Object.assign(Object.assign({}, user), { roles: attendee ? attendee.roles : [], }); } private get attendeesWithRoles(): UserWithRoles[] { return this.attendees.map((attendee: User) => this.addRoles(attendee)); } private get recipientWithRoles(): UserWithRoles { return this.addRoles(this.recipient); } public constructor( private readonly recipient: User, private readonly appt: Appt, private readonly attendees: ReadonlyArray<User> ) { this.to = recipient.email; this.subject = `You now have ${Utils.join( appt.subjects )} lessons on Tutorbook!`; this.text = this.subject; const data: Data = { recipient: this.recipientWithRoles, attendees: this.attendeesWithRoles, appt: this.appt, }; this.html = ApptEmail.render(data); } }