const DEFAULT_ACCOUNT_EMAIL_TEMPLATES = { verificationSubject: 'Verify your Pulse Signage email address', verificationBody: 'Hello [b][[display_name]][/b]!\n[[action_button]]\nThis [u]link[/u] expires in [i][[expiry_time]][/i].\nConfirm this email address: [[url]]', resetSubject: 'Reset your Pulse Signage password', resetBody: 'Hello [b][[display_name]][/b]!\n[[action_button]]\nThis [u]link[/u] expires in [i][[expiry_time]][/i].\nChoose a new password: [[url]]' }; function formatAccountEmailExpiry(value, unit) { const amount = Number(value); const normalizedAmount = Number.isFinite(amount) && amount > 0 ? Math.round(amount) : 30; const normalizedUnit = unit === 'hours' ? 'hour' : 'minute'; return normalizedAmount + ' ' + normalizedUnit + (normalizedAmount === 1 ? '' : 's'); } function renderAccountEmailTemplate(subject, body, variables) { const values = variables || {}; const replaceVariables = function (value) { return String(value || '').replace(/\[\[([a-z_]+)\]\]/g, function (_match, key) { return Object.prototype.hasOwnProperty.call(values, key) ? String(values[key]) : _match; }); }; const renderedSubject = replaceVariables(subject); const renderedText = replaceVariables(body); const plainText = renderedText.replace(/\[(?:b|i|u)\]([\s\S]*?)\[\/(?:b|i|u)\]/gi, '$1'); const escapedBody = renderedText.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/\[b\]([\s\S]*?)\[\/b\]/gi, '$1').replace(/\[i\]([\s\S]*?)\[\/i\]/gi, '$1').replace(/\[u\]([\s\S]*?)\[\/u\]/gi, '$1'); const actionLabel = String(values.action_label || 'Continue').replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); const actionUrl = values.url ? String(values.url).replace(/&/g, '&').replace(/"/g, '"') : ''; const actionAlignment = values.action_alignment === 'left' || values.action_alignment === 'right' ? values.action_alignment : 'center'; const actionButton = actionUrl ? '' + actionLabel + '' : ''; const actionBlock = actionButton ? '
' + actionButton + '
' : ''; const plainLink = actionUrl ? '' + actionUrl + '' : ''; const escapedBodyUrl = values.url ? String(values.url).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') : ''; const hasButtonPlaceholder = escapedBody.indexOf('[[action_button]]') !== -1; const hasUrlPlaceholder = String(body || '').indexOf('[[url]]') !== -1; const bodyWithAction = hasButtonPlaceholder ? escapedBody.split(escapedBodyUrl).join(plainLink).replace(/\[\[action_button\]\]/g, actionBlock).replace(/\[\[action_link\]\]/g, plainLink) : hasUrlPlaceholder ? escapedBody.split(actionUrl).join(actionBlock + plainLink) : escapedBody.replace(/\[\[action_link\]\]/g, plainLink).replace(actionUrl, plainLink); const bodyHtml = bodyWithAction.split(/\r?\n(?:[ \t]*\r?\n)+/).map(function (paragraph) { const paragraphHtml = paragraph.replace(/\r?\n/g, '
'); if (paragraphHtml.indexOf(actionBlock) !== -1 && actionBlock) { return paragraphHtml.split(actionBlock).map(function (part, index, parts) { const text = part ? '

' + part + '

' : ''; return text + (index < parts.length - 1 ? actionBlock : ''); }).join(''); } return paragraphHtml ? '

' + paragraphHtml + '

' : ''; }).join(''); const html = '
Pulse Signage
' + bodyHtml + '
'; return { subject: renderedSubject, text: plainText, html: html }; } module.exports = { DEFAULT_ACCOUNT_EMAIL_TEMPLATES, formatAccountEmailExpiry, renderAccountEmailTemplate };