import React, { useCallback, useContext, useEffect, useState } from 'react' import DateSelector from '../DateSelector/DateSelector' import './editing.scss' import { MonthlyNewsService } from '../../services/monthlyNews.service' import { UserContext, UserContextProps } from '../../hooks/userContext' import { IMonthlyNews } from '../../models/monthlyNews.model' import Poll from '../Poll/Poll' import MonthlyNews from '../MonthlyNews/MonthlyNews' import { IPoll } from '../../models/poll.model' const Editing: React.FC = () => { const [date, setDate] = useState<Date>(new Date()) const [header, setHeader] = useState<string>('') const [quote, setQuote] = useState<string>('') const [question, setQuestion] = useState<string>('') const [link, setLink] = useState<string>('') const [isTouched, setIsTouched] = useState<boolean>(false) const [isMontlyNewsUpdating, setisMontlyNewsUpdating] = useState<boolean>(false) const [isPollUpdating, setisPollUpdating] = useState<boolean>(false) const { user }: Partial<UserContextProps> = useContext(UserContext) const handleSaveMonthlyNews = async (): Promise<void> => { if (user) { const monthlyNewsService = new MonthlyNewsService() await monthlyNewsService.createMonthlyReport( date, header, quote, user.xsrftoken ) console.log('saved') setIsTouched(false) } } const handleSavePoll = async (): Promise<void> => { if (user) { const monthlyNewsService = new MonthlyNewsService() await monthlyNewsService.createPoll(date, question, link, user.xsrftoken) console.log('saved') setIsTouched(false) } } const handleCancelMonthlyNews = useCallback(() => { setQuote('') setHeader('') }, []) const handleCancelPoll = useCallback(() => { setLink('') setQuestion('') }, []) const isEmpty = (): boolean => { if ((quote !== '' || header !== '') && isTouched) { return false } else return true } const handleEditorChange = ( value: string, type: 'header' | 'quote' | 'question' | 'link' ): void => { setIsTouched(true) if (type === 'header') { setHeader(value) } if (type === 'quote') { setQuote(value) } if (type === 'question') { setQuestion(value) } if (type === 'link') { setLink(value) } } const resetFields = useCallback(() => { setQuote('') setHeader('') setLink('') setQuestion('') }, []) useEffect(() => { let subscribed = true resetFields() async function getCurrentMonthlyNews() { if (user) { const monthlyNewsService = new MonthlyNewsService() const montlhyNews: IMonthlyNews | null = await monthlyNewsService.getSingleMonthlyReport( date.getFullYear(), date.getMonth(), user.xsrftoken ) const poll: IPoll | null = await monthlyNewsService.getSinglePoll( date.getFullYear(), date.getMonth(), user.xsrftoken ) if (montlhyNews) { setHeader(montlhyNews.header) setQuote(montlhyNews.quote) setIsTouched(false) setisMontlyNewsUpdating(true) } if (poll) { setLink(poll.link) setQuestion(poll.question) setIsTouched(false) setisPollUpdating(true) } } } if (subscribed) { getCurrentMonthlyNews() console.log('updating?', isMontlyNewsUpdating) } return () => { subscribed = false } }, [date, user]) return ( <> <div className="header"> <p className="title pagetitle"> Édition des informations et de la citation du mois </p> </div> <div className="content"> <DateSelector date={date} setDate={setDate} isEmpty={isEmpty} /> <MonthlyNews header={header} quote={quote} onSave={handleSaveMonthlyNews} onCancel={handleCancelMonthlyNews} handleChange={handleEditorChange} /> <hr /> <Poll question={question} link={link} handleChange={handleEditorChange} onSave={handleSavePoll} onCancel={handleCancelPoll} /> </div> </> ) } export default Editing