All files / apps/web/src/email utils.tsx

25% Statements 3/12
100% Branches 0/0
0% Functions 0/5
25% Lines 3/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                          6x                                             6x                   6x                  
import React from "react";
 
import { render } from "@react-email/components";
import type { ParseKeys } from "i18next";
 
import { createI18nContext } from "~app/utils/i18n";
import { BaseUrlContext } from "~web/email/components";
import type { UnauthorizedContext } from "~web/handlers/context";
import { getBackendModule, getLanguageFromRequest } from "~web/utils/i18n";
 
import { ConfirmEmailEmail } from "./confirm-email-email";
import { ResetPasswordEmail } from "./reset-password-email";
 
const generateEmail = async (
	element: React.ReactElement,
	titlePath: ParseKeys<"email">,
	{ reqHeaders, baseUrl }: Pick<UnauthorizedContext, "reqHeaders" | "baseUrl">,
) => {
	const language = getLanguageFromRequest(reqHeaders);
	const i18nContext = createI18nContext({
		getLanguage: () => language,
		beforeInit: (instance) => instance.use(getBackendModule()),
	});
	await i18nContext.initialize({ language });
	await i18nContext.loadNamespaces("email");
	return {
		subject: i18nContext.getNamespacedTranslation("email")(titlePath),
		body: await render(
			<i18nContext.Provider>
				<BaseUrlContext value={baseUrl}>{element}</BaseUrlContext>
			</i18nContext.Provider>,
			{ pretty: true },
		),
	};
};
 
export const generateResetPasswordEmail = async (
	token: string,
	ctx: Parameters<typeof generateEmail>[2],
) =>
	generateEmail(
		<ResetPasswordEmail token={token} />,
		"subjects.resetPassword",
		ctx,
	);
 
export const generateConfirmEmailEmail = async (
	token: string,
	ctx: Parameters<typeof generateEmail>[2],
) =>
	generateEmail(
		<ConfirmEmailEmail token={token} />,
		"subjects.confirmEmail",
		ctx,
	);