diff --git a/public/domna-email-logo.png b/public/domna-email-logo.png new file mode 100644 index 0000000..459375f Binary files /dev/null and b/public/domna-email-logo.png differ diff --git a/src/app/api/auth/[...nextauth]/authOptions.ts b/src/app/api/auth/[...nextauth]/authOptions.ts index abcd186..09b6b70 100644 --- a/src/app/api/auth/[...nextauth]/authOptions.ts +++ b/src/app/api/auth/[...nextauth]/authOptions.ts @@ -146,8 +146,8 @@ export const AuthOptions: NextAuthOptions = { .where( and( eq(accounts.userId, dbUser.id), - eq(accounts.provider, account.provider) - ) + eq(accounts.provider, account.provider), + ), ); const emailVerified = @@ -157,7 +157,7 @@ export const AuthOptions: NextAuthOptions = { // This handles the case where we had not set up accounts but // signed up users with oauth console.log( - `Linking ${account.provider} account for user ${normalisedEmail}` + `Linking ${account.provider} account for user ${normalisedEmail}`, ); await db diff --git a/src/app/email_templates/magic_link.ts b/src/app/email_templates/magic_link.ts index 12d3f43..82c44a8 100644 --- a/src/app/email_templates/magic_link.ts +++ b/src/app/email_templates/magic_link.ts @@ -13,7 +13,21 @@ export async function MagicLinksEmail({ url: string; provider: { server: any; from: string }; }) { - const { host } = new URL(url); + const parsed = new URL(url); + const host = parsed.host; + + const baseUrl = parsed.origin; + const logoUrl = `${baseUrl}/domna-email-logo.png`; + + const token = parsed.searchParams.get("token"); + const email = parsed.searchParams.get("email"); + + if (!token || !email) { + throw new Error("Magic link token or email missing"); + } + + // Create a clean login link instead of the NextAuth callback + const loginUrl = `${parsed.origin}/login/${token}/${encodeURIComponent(email)}`; const transport = createTransport(provider.server); @@ -25,9 +39,20 @@ export async function MagicLinksEmail({ const result = await transport.sendMail({ to: identifier, from: provider.from, - subject: "Your secure Ara sign-in link", - text: plainText({ url, host }), - html: domnaHtml({ url, host, brandColor, accentColor, brown, background }), + subject: "Sign in to Ara", + text: plainText({ url: loginUrl, host }), + html: domnaHtml({ + url: loginUrl, + logoUrl, + host, + brandColor, + accentColor, + brown, + background, + }), + headers: { + "List-Unsubscribe": ``, + }, }); const failed = result.rejected.filter(Boolean); @@ -38,6 +63,7 @@ export async function MagicLinksEmail({ function domnaHtml({ url, + logoUrl, host, brandColor, accentColor, @@ -45,6 +71,7 @@ function domnaHtml({ background, }: { url: string; + logoUrl: string; host: string; brandColor: string; accentColor: string; @@ -60,7 +87,7 @@ function domnaHtml({ Domna Logo; +}) { + const { token, email } = await params; + + if (!token || !email) { + redirect("/"); + } + + const decodedEmail = decodeURIComponent(email); + + redirect( + `/api/auth/callback/email?token=${token}&email=${encodeURIComponent(decodedEmail)}`, + ); +}