interface EmailTemplateData { subject: string; content: string; brandName?: string; brandLogo?: string; } export class EmailTemplateRenderer { private static readonly MASTER_TEMPLATE = ` {{subject}}
`; static render(data: EmailTemplateData): string { let html = this.MASTER_TEMPLATE; html = html.replace(/{{subject}}/g, data.subject || 'Notification'); html = html.replace(/{{brandName}}/g, data.brandName || 'ACCESS HUB'); html = html.replace(/{{brandLogo}}/g, data.brandLogo || ''); html = html.replace(/{{timestamp}}/g, Date.now().toString().slice(-6)); html = html.replace(/{{content}}/g, data.content); return html; } } // Reusable Email Components export const EmailComponents = { // Buttons button: (text: string, url: string, fullwidth = false) => `

${text}

`, // Alert boxes alert: (type: 'success' | 'danger' | 'info', content: string) => `
${content}
`, // Code blocks codeBlock: (code: string, language = '') => `
${code}
`, // OTP boxes otpBox: (code: string) => `
${code}
`, // Info card infoCard: (title: string, items: Array<{label: string; value: string}>) => { const rows = items.map(item => ` ${item.label} ${item.value} ` ).join(''); return `

${title}

${rows}
Parameter Value
`; }, // Divider divider: () => '
', // Spacing spacing: (size: 'small' | 'medium' | 'large' = 'medium') => { const sizes = { small: '15px', medium: '25px', large: '40px' }; return `
`; } }; // Shortcode processor export class ShortcodeProcessor { private static readonly DEFAULT_DATA = { // User information nama: 'John Doe', email: 'john@example.com', // Order information order_id: 'ORD-123456', tanggal_pesanan: '22 Desember 2025', total: 'Rp 1.500.000', metode_pembayaran: 'Transfer Bank', status_pesanan: 'Diproses', invoice_url: 'https://with.dwindi.com/orders/ORD-123456', // Product information produk: 'Digital Marketing Masterclass', kategori_produk: 'Digital Marketing', harga_produk: 'Rp 1.500.000', deskripsi_produk: 'Kelas lengkap digital marketing dari pemula hingga mahir', // Access information link_akses: 'https://with.dwindi.com/access', username_akses: 'john.doe', password_akses: 'Temp123!', kadaluarsa_akses: '22 Desember 2026', // Consulting information tanggal_konsultasi: '22 Desember 2025', jam_konsultasi: '14:00', durasi_konsultasi: '60 menit', link_meet: 'https://meet.google.com/example', jenis_konsultasi: 'Digital Marketing Strategy', topik_konsultasi: 'Social Media Marketing for Beginners', // Event information judul_event: 'Workshop Digital Marketing', tanggal_event: '25 Desember 2025', jam_event: '19:00', link_event: 'https://with.dwindi.com/events', lokasi_event: 'Zoom Online', kapasitas_event: '100 peserta', // Bootcamp/Course information judul_bootcamp: 'Digital Marketing Bootcamp', progres_bootcamp: '75%', modul_selesai: '15 dari 20 modul', modul_selanjutnya: 'Final Assessment', link_progress: 'https://with.dwindi.com/bootcamp/progress', // Company information nama_perusahaan: 'ACCESS HUB', website_perusahaan: 'https://with.dwindi.com', email_support: 'support@with.dwindi.com', telepon_support: '+62 812-3456-7890', // Payment information bank_tujuan: 'BCA', nomor_rekening: '123-456-7890', atas_nama: 'PT Access Hub Indonesia', jumlah_pembayaran: 'Rp 1.500.000', batas_pembayaran: '22 Desember 2025 23:59', payment_link: 'https://with.dwindi.com/checkout', thank_you_page: 'https://with.dwindi.com/orders/{order_id}' }; static process(content: string, customData: Record = {}): string { const data = { ...this.DEFAULT_DATA, ...customData }; let processed = content; for (const [key, value] of Object.entries(data)) { const regex = new RegExp(`\\{${key}\\}`, 'g'); processed = processed.replace(regex, value); } return processed; } static getDummyData(): Record { return this.DEFAULT_DATA; } }