import { Button, Container, Section, Heading, Text, Row, Column, render, } from '@react-email/components'; import { CSSProperties } from 'react'; import { EmailTemplateLayout } from './EmailTemplateLayout'; import { EmailTemplate } from './EmailTemplate'; export interface InvoicePaymentEmailProps { preview: string; // # Company companyName?: string; companyLogoUri?: string; // # Colors primaryColor?: string; // # Invoice amount invoiceAmount: string; // # Invoice message invoiceMessage: string; // # Invoice total total: string; totalLabel?: string; // # Invoice due amount dueAmount: string; dueAmountLabel?: string; // # Due date dueDate: string; dueDateLabel?: string; // # Invoice number invoiceNumberLabel?: string; invoiceNumber: string; // # View invoice button viewInvoiceButtonLabel?: string; viewInvoiceButtonUrl: string; // # Items items: Array<{ label: string; quantity: string; rate: string }>; } export const InvoicePaymentEmail: React.FC< Readonly > = ({ preview, // # Company companyName, companyLogoUri, // # Colors primaryColor = 'rgb(0, 82, 204)', // # Invoice amount invoiceAmount, // # Invoice message invoiceMessage, // # Due date dueDate, dueDateLabel = 'Due {dueDate}', // # Invoice number invoiceNumber, invoiceNumberLabel = 'Invoice # {invoiceNumber}', // # invoice total total, totalLabel = 'Total', // # Invoice due amount dueAmountLabel = 'Due Amount', dueAmount, // # View invoice button viewInvoiceButtonLabel = 'View Invoice', viewInvoiceButtonUrl, items, }) => { return (
{companyLogoUri && }
{companyName} {invoiceAmount} {invoiceNumberLabel?.replace('{invoiceNumber}', invoiceNumber)} {dueDateLabel.replace('{dueDate}', dueDate)}
{invoiceMessage}
{items.map((item, index) => ( {item.label} {item.quantity} x {item.rate} ))} {dueAmountLabel} {dueAmount} {totalLabel} {total}
); }; export const renderInvoicePaymentEmail = (props: InvoicePaymentEmailProps) => { return render(); }; const headerInfoStyle: CSSProperties = { textAlign: 'center', marginBottom: 20, }; const mainSectionStyle: CSSProperties = {}; const invoiceAmountStyle: CSSProperties = { margin: 0, color: '#383E47', fontWeight: 500, }; const invoiceNumberStyle: CSSProperties = { margin: 0, fontSize: '13px', color: '#404854', }; const invoiceDateStyle: CSSProperties = { margin: 0, fontSize: '13px', color: '#404854', }; const invoiceCompanyNameStyle: CSSProperties = { margin: 0, fontSize: '18px', fontWeight: 500, color: '#404854', }; const viewInvoiceButtonStyle: CSSProperties = { display: 'block', cursor: 'pointer', textAlign: 'center', fontSize: 16, padding: '10px 15px', lineHeight: '1', backgroundColor: 'rgb(0, 82, 204)', color: '#fff', borderRadius: '5px', }; const listItemLabelStyle: CSSProperties = { margin: 0, }; const listItemAmountStyle: CSSProperties = { margin: 0, textAlign: 'right', }; const invoiceMessageStyle: CSSProperties = { whiteSpace: 'pre-line', color: '#000', margin: '0 0 20px 0', lineHeight: '20px', }; const dueAmounLineRowStyle: CSSProperties = { borderBottom: '1px solid #000', height: 40, }; const totalLineRowStyle: CSSProperties = { borderBottom: '1px solid #000', height: 40, }; const totalLineItemLabelStyle: CSSProperties = { ...listItemLabelStyle, fontWeight: 500, }; const totalLineItemAmountStyle: CSSProperties = { ...listItemAmountStyle, fontWeight: 600, }; const dueAmountLineItemLabelStyle: CSSProperties = { ...listItemLabelStyle, fontWeight: 500, }; const dueAmountLineItemAmountStyle: CSSProperties = { ...listItemAmountStyle, fontWeight: 600, }; const itemLineRowStyle: CSSProperties = { borderBottom: '1px solid #D9D9D9', height: 40, }; const totalsSectionStyle = { marginTop: '20px', borderTop: '1px solid #D9D9D9', };