Newer
Older
import { Button, Dialog } from '@mui/material'
import React, { useCallback, useEffect, useMemo, useState } from 'react'
import { getAxiosXSRFHeader } from '../../axios.config'
import { useWhoAmI } from '../../hooks/useWhoAmI'
import { NewsletterService } from '../../services/newsletter.service'
import Loader from '../Loader/Loader'
import { EditorType } from './CustomEditor'
import DateSelector from './DateSelector/DateSelector'
import MonthlyInfo from './MonthlyInfo/MonthlyInfo'
import MonthlyNews from './MonthlyNews/MonthlyNews'
import Poll from './Poll/Poll'
import './newsletter.scss'
export type ContentItems =
| 'monthlyInfo'
| 'monthlyNews'
| 'poll'
| 'subject'
| ''
const { data: user } = useWhoAmI()
/** Display previous month until the newsletter is sent on the 3rd day of the month */
const getCurrentNewsletterDate = (): Date => {
const today = new Date()
const currentDay = today.getDate()
const currentMonth = today.getMonth()
const currentYear = today.getFullYear()
return currentDay < 3
? new Date(currentYear, currentMonth, 1)
: new Date(currentYear, currentMonth + 1, 1)
}
const [date, setDate] = useState<Date>(getCurrentNewsletterDate())
const [info, setInfo] = useState<string>('')
const [title, setTitle] = useState<string>('')
const [subject, setSubject] = useState<string>('')
const [imageURL, setImageURL] = useState<string>('')
const [content, setContent] = useState<string>('')
const [question, setQuestion] = useState<string>('')
const [link, setLink] = useState<string>('')
const [isTouched, setIsTouched] = useState<boolean>(false)
const [refreshData, setRefreshData] = useState(false)
const [isLoading, setIsLoading] = useState<boolean>(false)
const [warningModal, setWarningModal] = useState<boolean>(false)
const [toDelete, setToDelete] = useState<ContentItems>('')
const newsletterService = useMemo(() => {
return new NewsletterService()
}, [])
const handleSaveSubject = async (): Promise<void> => {
if (user) {
await newsletterService.saveMailSubject(
date,
subject,
getAxiosXSRFHeader(user.xsrftoken)
)
const handleSaveMonthlyInfo = async (): Promise<void> => {
if (user) {
await newsletterService.saveMonthlyInfo(
date,
info,
imageURL,
)
setIsTouched(false)
}
}
const handleSaveMonthlyNews = async (): Promise<void> => {
if (user) {
await newsletterService.saveMonthlyNews(
date,
title,
content,
)
setIsTouched(false)
}
}
const handleSavePoll = async (): Promise<void> => {
if (user) {
await newsletterService.savePoll(
date,
question,
link,
getAxiosXSRFHeader(user.xsrftoken)
)
setIsTouched(false)
}
}
const handleDeleteMailSubject = async (): Promise<void> => {
if (user) {
await newsletterService.deleteMailSubject(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
const handleDeleteMonthlyInfo = async (): Promise<void> => {
if (user) {
await newsletterService.deleteMonthlyInfo(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
}
}
const handleDeleteMonthlyNews = async (): Promise<void> => {
if (user) {
await newsletterService.deleteMonthlyNews(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
}
}
const handleDeletePoll = async (): Promise<void> => {
if (user) {
await newsletterService.deletePoll(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
}
}
const handleOpenDeleteModal = (target: ContentItems) => {
}
const handleConfirmAlert = () => {
if (toDelete === 'subject') {
handleDeleteMailSubject()
}
if (toDelete === 'monthlyInfo') {
handleDeleteMonthlyInfo()
}
if (toDelete === 'monthlyNews') {
handleDeleteMonthlyNews()
}
if (toDelete === 'poll') {
handleDeletePoll()
}
}
const isEmpty = (): boolean => {
if (
(info !== '' ||
title !== '' ||
content !== '' ||
question !== '' ||
imageURL !== '' ||
isTouched
) {
return false
} else return true
}
const handleEditorChange = (value: string, type: EditorType): void => {
switch (type) {
case 'info':
setInfo(value)
break
case 'title':
setTitle(value)
break
case 'content':
setContent(value)
break
case 'question':
setQuestion(value)
break
case 'link':
setLink(value)
break
case 'subject':
setSubject(value)
break
case 'image':
setImageURL(value)
break
default:
break
const resetFields = useCallback(() => {
setImageURL('')
setInfo('')
setTitle('')
setContent('')
setLink('')
setQuestion('')
}, [])
const getContentItemString = (contentItem: ContentItems) => {
if (contentItem === 'monthlyInfo') return 'cette info mensuelle'
if (contentItem === 'monthlyNews') return 'cette news mensuelle'
if (contentItem === 'subject') return 'cet objet'
return 'ce sondage'
}
useEffect(() => {
let subscribed = true
resetFields()
async function getCurrentMonthlyNews() {
if (user) {
const mailSubject = await newsletterService.getSingleMailSubject(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
const monthlyInfo = await newsletterService.getSingleMonthlyInfo(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
const monthlyNews = await newsletterService.getSingleMonthlyNews(
date,
getAxiosXSRFHeader(user.xsrftoken)
)
const poll = await newsletterService.getSinglePoll(
if (mailSubject) {
setSubject(mailSubject.subject)
setIsTouched(false)
}
if (monthlyInfo) {
setInfo(monthlyInfo.info)
setImageURL(monthlyInfo.image)
setIsTouched(false)
}
if (monthlyNews) {
setTitle(monthlyNews.title)
setContent(monthlyNews.content)
setIsTouched(false)
}
if (poll) {
setLink(poll.link)
setQuestion(poll.question)
setIsTouched(false)
}
}
}
if (subscribed) {
getCurrentMonthlyNews()
}
return () => {
subscribed = false
setRefreshData(false)
}
}, [date, user, refreshData, resetFields, newsletterService])
return (
<>
<div className="header">
<h1 className="title pageTitle">Édition de la newsletter</h1>
<DateSelector date={date} setDate={setDate} isEmpty={isEmpty} />
</div>
{isLoading && <Loader />}
{!isLoading && (
<div className="content">
<MailSubject
onSave={handleSaveSubject}
onCancel={handleCancel}
subject={subject}
handleChange={handleEditorChange}
onDelete={handleOpenDeleteModal}
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
<MonthlyInfo
info={info}
onSave={handleSaveMonthlyInfo}
onCancel={handleCancel}
handleChange={handleEditorChange}
onDelete={handleOpenDeleteModal}
imageURL={imageURL}
/>
<hr />
<MonthlyNews
title={title}
content={content}
onSave={handleSaveMonthlyNews}
onCancel={handleCancel}
handleChange={handleEditorChange}
onDelete={handleOpenDeleteModal}
/>
<hr />
<Poll
question={question}
link={link}
onSave={handleSavePoll}
onCancel={handleCancel}
handleChange={handleEditorChange}
onDelete={handleOpenDeleteModal}
/>
</div>
)}
<Dialog open={warningModal}>
<div className="modal-text">
Êtes-vous sûr de vouloir supprimer {getContentItemString(toDelete)}
?
</div>
<div className="buttons">
<Button variant="outlined" onClick={() => setWarningModal(false)}>
Annuler
</Button>
<Button onClick={handleConfirmAlert}>Continuer</Button>
</div>
</Dialog>