ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/about/ui/news.tsx

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import React, { useEffect, useState } from 'react'
import ReactMarkdown from 'react-markdown'
import newsletter16 from 'about/ui/newsletter/016.md'
import newsletter15 from 'about/ui/newsletter/015.md'
import newsletter14 from 'about/ui/newsletter/014.md'
import newsletter13 from 'about/ui/newsletter/013.md'
import newsletter12 from 'about/ui/newsletter/012.md'
import newsletter11 from 'about/ui/newsletter/011.md'
import newsletter10 from 'about/ui/newsletter/010.md'
import newsletter9 from 'about/ui/newsletter/009.md'
import newsletter8 from 'about/ui/newsletter/008.md'
import newsletter7 from 'about/ui/newsletter/007.md'
import newsletter6 from 'about/ui/newsletter/006.md'
import newsletter5 from 'about/ui/newsletter/005.md'
import newsletter4 from 'about/ui/newsletter/004.md'
import newsletter3 from 'about/ui/newsletter/003.md'
import newsletter2 from 'about/ui/newsletter/002.md'
import newsletter1 from 'about/ui/newsletter/001.md'
import { Nav, Container, Row, Col } from 'react-bootstrap'
import { useHistory } from 'react-router-dom'
import { History } from 'history'

interface Newsletter {
  readonly content: string
  readonly date: Date
  readonly number: number
}

export const newsletters: readonly Newsletter[] = [
  { content: newsletter16, date: new Date('05/14/2024'), number: 16 },
  { content: newsletter15, date: new Date('02/04/2024'), number: 15 },
  { content: newsletter14, date: new Date('11/06/2023'), number: 14 },
  { content: newsletter13, date: new Date('06/21/2023'), number: 13 },
  { content: newsletter12, date: new Date('02/23/2023'), number: 12 },
  { content: newsletter11, date: new Date('10/28/2022'), number: 11 },
  { content: newsletter10, date: new Date('10/10/2022'), number: 10 },
  { content: newsletter9, date: new Date('07/25/2022'), number: 9 },
  { content: newsletter8, date: new Date('06/09/2022'), number: 8 },
  { content: newsletter7, date: new Date('03/01/2022'), number: 7 },
  { content: newsletter6, date: new Date('10/14/2021'), number: 6 },
  { content: newsletter5, date: new Date('07/09/2021'), number: 5 },
  { content: newsletter4, date: new Date('06/08/2021'), number: 4 },
  { content: newsletter3, date: new Date('04/07/2021'), number: 3 },
  { content: newsletter2, date: new Date('02/05/2021'), number: 2 },
  { content: newsletter1, date: new Date('09/28/2020'), number: 1 },
]

const message = `**Get the most out of eBL!**  
We will be hosting regular Zoom sessions to showcase its features and tools. 
These sessions will include a Q&A – please feel free to submit questions in 
advance per [e-mail](mailto:${process.env.REACT_APP_INFO_EMAIL}).
The second session is scheduled for May 31st at 6:00 PM CET. This time we shall focus on the Editors' work.
If you would like to attend, please register at the
[link](https://lmu-munich.zoom-x.de/meeting/register/u5cldemhqDwtGtR-CKF5V1fnntrrTsYbLXEf).
`

const newsUrl = '/about/news/'

function NewsletterMenu({
  activeNewsletterNumber,
  setActiveNewsletter,
}: {
  activeNewsletterNumber: number
  setActiveNewsletter: React.Dispatch<React.SetStateAction<Newsletter>>
}): JSX.Element {
  const history = useHistory()
  return (
    <Nav defaultActiveKey={activeNewsletterNumber} className="flex-column">
      {newsletters.map((newsletter) => {
        const { number } = newsletter
        return (
          <Nav.Link
            onClick={(event) => {
              event.preventDefault()
              history.push(`${newsUrl}${newsletter.number}`)
              setActiveNewsletter(newsletter)
            }}
            href={`${number}`}
            key={number}
            disabled={activeNewsletterNumber === number}
          >
            Nr. {number}
            <br />
            <span style={{ fontSize: '10pt' }}>
              {newsletter.date.toLocaleDateString('en-US', {
                year: 'numeric',
                month: 'long',
                day: 'numeric',
              })}
            </span>
          </Nav.Link>
        )
      })}
    </Nav>
  )
}

const onHistoryChange = ({
  activeNewsletter,
  setActiveNewsletter,
  history,
}: {
  activeNewsletter: Newsletter
  setActiveNewsletter: React.Dispatch<React.SetStateAction<Newsletter>>
  history: History
}): void => {
  if (history.action === 'POP') {
    const newsletterNumber = parseInt(
      history.location.pathname.split('/').pop() ?? ''
    )
    if (newsletterNumber !== activeNewsletter.number) {
      setActiveNewsletter(getActiveNewsletter(newsletterNumber))
    }
  }
}

function getActiveNewsletter(activeNewsletterNumber?: number): Newsletter {
  let newsletter: Newsletter | undefined
  if (activeNewsletterNumber) {
    newsletter = newsletters.find(
      (newsletter) => newsletter.number === activeNewsletterNumber
    )
  }
  return newsletter ?? newsletters[0]
}

export default function AboutNews({
  activeNewsletterNumber,
}: {
  activeNewsletterNumber?: number
}): JSX.Element {
  const [newsletterMarkdown, setNewsletterMarkdown] = useState('')
  const [activeNewsletter, setActiveNewsletter] = useState(
    getActiveNewsletter(activeNewsletterNumber)
  )
  const history = useHistory()
  useEffect(() => setNewsletterMarkdown(activeNewsletter.content), [
    activeNewsletter,
  ])
  useEffect(() => () =>
    onHistoryChange({ activeNewsletter, setActiveNewsletter, history })
  )

  return (
    <>
      <div className="border border-dark m-3 p-2">
        <ReactMarkdown>{message}</ReactMarkdown>
      </div>
      <Container>
        <Row>
          <Col>
            <div className="flex-column">
              <ReactMarkdown>{newsletterMarkdown}</ReactMarkdown>
            </div>
          </Col>
          <Col sm={2}>
            <NewsletterMenu
              activeNewsletterNumber={activeNewsletter.number}
              setActiveNewsletter={setActiveNewsletter}
            />
          </Col>
        </Row>
      </Container>
    </>
  )
}