NewsletterCreator / src / utils / renderNewsletter.js
renderNewsletter.js
Raw
import predefinedNewsletterElements from 'src/utils/predefinedNewsletterElements'

export default function renderNewsletter (state) {
  const newsletterData = JSON.parse(JSON.stringify(state.newsletter)) // Create a deep copy of the newsletter data

  // Filter out sections with no elements
  newsletterData.sections = newsletterData.sections.filter(section => section.elements.length > 0)
  if (newsletterData.sections.length === 0) return ''

  // Function to render newsletter for a given language and layout (desktop or mobile)
  const renderForLanguageAndLayout = (language, layoutType) => {
    let newsletterHtml = ''

    // Choose the appropriate header, navigation, footer, and section title methods based on layout type
    const predefinedHeader = layoutType === 'desktop'
      ? predefinedNewsletterElements.headerDesktop
      : predefinedNewsletterElements.headerMobile

    const predefinedNav = layoutType === 'desktop'
      ? predefinedNewsletterElements.navDesktop
      : predefinedNewsletterElements.navMobile

    const predefinedFooter = layoutType === 'desktop'
      ? predefinedNewsletterElements.footerDesktop
      : predefinedNewsletterElements.footerMobile

    const predefinedSectionTitle = layoutType === 'desktop'
      ? predefinedNewsletterElements.sectionTitle
      : predefinedNewsletterElements.mobileSectionTitle

    const predefinedSpacer = layoutType === 'desktop'
      ? state.elements.spacer.renderDesktop
      : state.elements.spacer.renderMobile

    // Render header, navigation, and sections
    newsletterHtml += predefinedHeader(language)
    newsletterHtml += predefinedNav(newsletterData, language)

    // Loop through sections and render elements within each section
    newsletterData.sections.forEach(section => {
      // Only render section title if it's not named "preface"
      if (section.name.toLowerCase() !== 'preface' && section.name.toLowerCase() !== 'outro') {
        newsletterHtml += predefinedSectionTitle(section.name, language)
      }

      section.elements.forEach(element => {
        // Render each element based on its type (desktop or mobile)
        newsletterHtml += state.elements[element.type][layoutType === 'desktop' ? 'renderDesktop' : 'renderMobile'](element, language)
      })
    })

    // Render footer and spacer
    newsletterHtml += predefinedFooter(language)
    newsletterHtml += predefinedSpacer({ data: { height: 1000 } })

    return newsletterHtml
  }

  // Initialize the final newsletter HTML by rendering for both languages and layouts
  let newsletterHtml = '';
  ['german', 'english'].forEach(language => {
    ['desktop', 'mobile'].forEach(layoutType => {
      // Render newsletter for each language and layout combination
      newsletterHtml += renderForLanguageAndLayout(language, layoutType)
    })
  })

  // Return the final HTML wrapped in a document structure
  return predefinedNewsletterElements.document(newsletterHtml)
}