import { NewsletterCampaign, ProductItem } from '@/types/newsletter';
import { SUPABASE_ASSETS_BASE } from './defaultCampaign';
export function renderEmailHtml(campaign: NewsletterCampaign): string {
const renderedModules = campaign.modules.map((m) => renderModule(m, campaign)).join('\n');
return `
${escapeHtml(campaign.title)}
${escapeHtml(campaign.preheader || '')}
͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏
`;
}
export function renderSingleModuleHtml(m: any, campaign: NewsletterCampaign): string {
return renderModule(m, campaign);
}
function renderModule(m: any, campaign: NewsletterCampaign): string {
switch (m.type) {
case 'announcement':
return `
|
${escapeHtml(m.data.tipBadge || 'TIP')}
${escapeHtml(m.data.text || '')}
${m.data.linkText ? `
` : ''}
|
|
`;
case 'header':
const rawNav = m.data.navLinks && m.data.navLinks.length > 0 ? m.data.navLinks : [
{ label: 'Letáky', url: 'https://www.coop.sk/sk/letaky', variant: 'outline' },
{ label: 'COOP Klub', url: 'https://www.coopklub.sk', variant: 'filled' }
];
const navLinks = rawNav.map((link: any) => {
if (link.variant === 'filled') {
return ``;
}
return ``;
}).join('\n');
return `
`;
case 'banner':
return `
|
${m.data.title || m.data.description || m.data.buttonText ? `
${m.data.title ? `${escapeHtml(m.data.title)}` : ''}
${m.data.description ? `${escapeHtml(m.data.description)} ` : ''}
${m.data.buttonText ? `
` : ''}
|
` : ''}
`;
case 'products_grid':
const globalValidity = m.data.globalValidity || '';
const products: ProductItem[] = m.data.products || [];
const cardBg = m.data.cardBgColor || '#feeaea';
const cardBorder = m.data.cardBorderColor || '#f5d4d4';
const badgeHdrBg = m.data.badgeHeaderBg || '#fefefe';
const badgeHdrColor = m.data.badgeHeaderColor || '#000000';
const badgePrcBg = m.data.badgePriceBg || '#e2001a';
const badgePrcColor = m.data.badgePriceColor || '#fefefe';
const badgeCustomTxt = m.data.badgeHeaderCustomText || null;
const rows: ProductItem[][] = [];
for (let i = 0; i < products.length; i += 2) {
rows.push(products.slice(i, i + 2));
}
const rowsHtml = rows.map((row) => `
${row.map((p, idx) => `
|
${renderExactProductCard(p, globalValidity, cardBg, cardBorder, badgeHdrBg, badgeHdrColor, badgePrcBg, badgePrcColor, badgeCustomTxt)}
| `).join('\n')}
${row.length === 1 ? ' | ' : ''}
`).join('\n');
return `
${m.data.sectionTitle ? `
${escapeHtml(m.data.sectionTitle)}
|
` : ''}
|
${rowsHtml}
|
`;
case 'loyalty_club':
if (m.data.enabled === false) {
return '';
}
const lProducts = m.data.products || [];
return `
${escapeHtml(m.data.sectionTitle || 'Vernostné zľavy')}
|
|
|
${lProducts.map((p: any, idx: number) => `
|
${renderExactLoyaltyCard(p, m.data.globalValidity || '2. 5. – 15. 5. 2026')}
| `).join('\n')}
|
`;
case 'articles_row':
const it1 = m.data.item1;
const it2 = m.data.item2;
// Ak ide o letáky
if (it1?.btnText) {
return `
|
${escapeHtml(it1.title)}
|
|
|
${escapeHtml(it2.title)}
|
|
`;
}
// Inak články / recepty
return `
`;
case 'footer':
return `
`;
default:
return '';
}
}
function renderExactProductCard(
p: ProductItem,
globalValidity: string,
cardBg: string,
cardBorder: string,
badgeHdrBg: string,
badgeHdrColor: string,
badgePrcBg: string,
badgePrcColor: string,
badgeCustomTxt: string | null
): string {
const validity = p.validityOverride || globalValidity;
const storesHtml = `
${p.stores?.potraviny ? ` |
` : ''}
${p.stores?.supermarket ? ` |
` : ''}
${p.stores?.tempo ? ` |
` : ''}
`;
return `
| ${escapeHtml(validity)} |
${storesHtml} |
|
|
${escapeHtml(p.title)}
|
${p.customBadgePngUrl ? `
` : `
${badgeCustomTxt ? `
|
${escapeHtml(badgeCustomTxt)}
|
` : (p.discountText ? `
|
${escapeHtml(p.badgeText || 'zľava')}
${escapeHtml(p.discountText)}
|
` : '')}
|
${escapeHtml(p.priceMain)}${escapeHtml(p.priceSub)}
|
|
${p.showSlovakFlag ? `
|
` : ''}
`}
${p.unitPrice ? `${escapeHtml(p.unitPrice)} ` : ''}
|
`;
}
function renderExactLoyaltyCard(p: any, validity: string): string {
const cardValidity = p.validityOverride || validity;
const storesHtml = `
${p.stores?.potraviny ? ` |
` : ''}
${p.stores?.supermarket ? ` |
` : ''}
${p.stores?.tempo ? ` |
` : ''}
`;
return `
| ${escapeHtml(cardValidity)} |
${storesHtml} |
|
|
${escapeHtml(p.title)}
|
|
Bez karty
zľava ${escapeHtml(p.noCardDiscount)}
|
|
${escapeHtml(p.noCardPriceMain)}${escapeHtml(p.noCardPriceSub)}
|
|
|
S kartou
zľava
${escapeHtml(p.cardDiscount)}
|
|
${escapeHtml(p.cardPriceMain)}${escapeHtml(p.cardPriceSub)}
|
|
|
${p.showSlovakFlag ? `
|
` : ''}
|
${escapeHtml(p.noCardUnitPrice)}
|
${escapeHtml(p.cardUnitPrice)}
|
|
`;
}
function escapeHtml(str: string): string {
if (!str) return '';
return String(str)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}