import * as React from 'react'
import { Body, Container, Head, Html, Preview, Section, Text } from '@react-email/components'
export type OtpCodeEmailCopy = {
preview: string
title: string
body: string
codeLabel: string
expiry: string
hint: string
}
export type OtpCodeEmailProps = {
code: string
expiresInMinutes: number
copy?: Partial
}
const defaultCopy: OtpCodeEmailCopy = {
preview: 'Your Open Mercato verification code',
title: 'Verify your sign in',
body: 'Use the one-time code below to complete sign in.',
codeLabel: 'Verification code',
expiry: 'This code expires in {minutes} minutes.',
hint: 'If you did not request this code, you can ignore this email.',
}
export function OtpCodeEmail({ code, expiresInMinutes, copy }: OtpCodeEmailProps) {
const mergedCopy: OtpCodeEmailCopy = {
...defaultCopy,
...(copy ?? {}),
}
const expiry = mergedCopy.expiry.replace('{minutes}', String(expiresInMinutes))
return (
{mergedCopy.preview}
{mergedCopy.title}
{mergedCopy.body}
{mergedCopy.codeLabel}
{code}
{expiry}
{mergedCopy.hint}
)
}
const body: React.CSSProperties = { backgroundColor: '#f9fafb', margin: 0, padding: '24px 0' }
const container: React.CSSProperties = {
backgroundColor: '#ffffff',
borderRadius: 12,
padding: 24,
margin: '0 auto',
maxWidth: 520,
boxShadow: '0 1px 4px rgba(0,0,0,0.06)',
}
const title: React.CSSProperties = { fontSize: 20, fontWeight: 600, color: '#111827', margin: '0 0 12px' }
const paragraph: React.CSSProperties = { fontSize: 14, color: '#4b5563', lineHeight: '20px', margin: '0 0 16px' }
const label: React.CSSProperties = { fontSize: 12, color: '#6b7280', margin: '0 0 6px' }
const codeStyle: React.CSSProperties = {
fontSize: 32,
fontWeight: 700,
letterSpacing: '0.2em',
color: '#111827',
margin: '0 0 12px',
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
}
const expiryStyle: React.CSSProperties = { fontSize: 13, color: '#4b5563', margin: '0 0 12px' }
const hint: React.CSSProperties = { fontSize: 12, color: '#6b7280', marginTop: 16 }
export default OtpCodeEmail