Files
acmcc/supabase/functions/_shared/email-templates/invite.tsx
T
admin b1486a0b2a Migrate email pipeline off Lovable + branded auth emails
Replace Lovable-bound email transport and auth webhook so the platform
sends all automated email through its own infrastructure.

- process-email-queue: drop sendLovableEmail/LOVABLE_API_KEY; send via the
  Hostinger Email API (primary) with automatic SMTP fallback. Shared
  transports added in _shared/hostinger-mail.ts and _shared/smtp-send.ts.
- auth-email-hook: verify Supabase's native Send Email hook signature
  (Standard Webhooks via SEND_EMAIL_HOOK_SECRET) instead of Lovable's libs;
  build the GoTrue verify URL; keep enqueue → process-email-queue.
- Recreate the 6 auth email templates under _shared/email-templates/ that
  previously only existed in the deployed function.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 23:07:26 -04:00

91 lines
2.4 KiB
TypeScript

/// <reference types="npm:@types/react@18.3.1" />
import * as React from 'npm:react@18.3.1'
import {
Body,
Button,
Container,
Head,
Heading,
Html,
Link,
Preview,
Text,
} from 'npm:@react-email/components@0.0.22'
interface InviteEmailProps {
siteName: string
siteUrl: string
confirmationUrl: string
}
export const InviteEmail = ({
siteName,
siteUrl,
confirmationUrl,
}: InviteEmailProps) => (
<Html lang="en" dir="ltr">
<Head />
<Preview>You've been invited to join {siteName}</Preview>
<Body style={main}>
<Container style={container}>
<Heading style={h1}>You've been invited</Heading>
<Text style={text}>
You've been invited to join{' '}
<Link href={siteUrl} style={link}>
<strong>{siteName}</strong>
</Link>
. Click the button below to accept the invitation and create your
account.
</Text>
<Button style={button} href={confirmationUrl}>
Accept Invitation
</Button>
<Text style={fallbackText}>
If the button does not open, copy and paste this secure link into your browser:
</Text>
<Text style={fallbackLinkWrapper}>
<Link href={confirmationUrl} style={fallbackLink}>
{confirmationUrl}
</Link>
</Text>
<Text style={footer}>
If you weren't expecting this invitation, you can safely ignore this
email.
</Text>
</Container>
</Body>
</Html>
)
export default InviteEmail
const main = { backgroundColor: '#ffffff', fontFamily: 'Arial, sans-serif' }
const container = { padding: '20px 25px' }
const h1 = {
fontSize: '22px',
fontWeight: 'bold' as const,
color: '#000000',
margin: '0 0 20px',
}
const text = {
fontSize: '14px',
color: '#55575d',
lineHeight: '1.5',
margin: '0 0 25px',
}
const link = { color: 'inherit', textDecoration: 'underline' }
const button = {
backgroundColor: '#000000',
color: '#ffffff',
fontSize: '14px',
borderRadius: '8px',
padding: '12px 20px',
textDecoration: 'none',
}
const fallbackText = { fontSize: '13px', color: '#55575d', lineHeight: '1.5', margin: '24px 0 8px' }
const fallbackLinkWrapper = { margin: '0 0 24px', wordBreak: 'break-all' as const }
const fallbackLink = { color: '#000000', fontSize: '13px', lineHeight: '1.5', textDecoration: 'underline' }
const footer = { fontSize: '12px', color: '#999999', margin: '30px 0 0' }