import React, { useCallback, useContext, useEffect, useState } from 'react' import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css' import { getAxiosXSRFHeader } from '../../axios.config' import { CheckboxType } from '../../enum/checkboxType.enum' import { UserContext, UserContextProps } from '../../hooks/userContext' import { ICustomPopup } from '../../models/cutomPopup.model' import { IPartnersInfo } from '../../models/partnersInfo.model' import { CustomPopupService } from '../../services/customPopup.service' import { PartnersInfoService } from '../../services/partnersInfo.service' import Loader from '../Loader/Loader' import './settings.scss' const Settings: React.FC = () => { const [refreshData, setRefreshData] = useState(false) const [isLoading, setIsLoading] = useState(false) const [partnersInfo, setPartnersInfo] = useState<IPartnersInfo>({ grdf_failure: false, enedis_failure: false, egl_failure: false, notification_activated: false, }) const [customPopup, setCustomPopup] = useState<ICustomPopup>({ popupEnabled: false, title: '', description: '', }) const { user }: Partial<UserContextProps> = useContext(UserContext) const isPartnerNotificationOn = () => partnersInfo.enedis_failure || partnersInfo.egl_failure || partnersInfo.grdf_failure const handleCheckboxChange = (value: boolean, type: CheckboxType): void => { switch (type) { case CheckboxType.GRDF: setPartnersInfo((prevPartnersInfo) => ({ ...prevPartnersInfo, grdf_failure: value, })) break case CheckboxType.ENEDIS: setPartnersInfo((prevPartnersInfo) => ({ ...prevPartnersInfo, enedis_failure: value, })) break case CheckboxType.EGL: setPartnersInfo((prevPartnersInfo) => ({ ...prevPartnersInfo, egl_failure: value, })) break case CheckboxType.CUSTOM: setCustomPopup((prev) => ({ ...prev, popupEnabled: value, })) break default: throw new Error('Unknown checkbox type') } } const handlePopupChange = ( event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>, field: 'title' | 'description' ) => { setCustomPopup((prev) => ({ ...prev, [field]: event.target.value, })) } const handleCancel = useCallback(() => { setRefreshData(true) }, [setRefreshData]) const resetFields = useCallback(() => { setPartnersInfo({ grdf_failure: false, enedis_failure: false, egl_failure: false, notification_activated: false, }) }, [setPartnersInfo]) useEffect(() => { let subscribed = true resetFields() setIsLoading(true) async function getSettings() { if (user) { const partnersInfoService = new PartnersInfoService() const customPopupService = new CustomPopupService() const partnersInfoData = await partnersInfoService.getPartnersInfo() const customPopupData = await customPopupService.getCustomPopupInfo() if (partnersInfoData) { setPartnersInfo({ ...partnersInfoData, }) } if (customPopupData) { setCustomPopup({ ...customPopupData, }) } } setIsLoading(false) } if (subscribed) { getSettings() } return () => { subscribed = false setRefreshData(false) } }, [user, refreshData, setPartnersInfo, setCustomPopup, resetFields]) const handleSave = async (): Promise<void> => { if (user) { const partnersInfoService = new PartnersInfoService() const customPopupService = new CustomPopupService() const updatedPartnersInfo = { egl_failure: partnersInfo.egl_failure, enedis_failure: partnersInfo.enedis_failure, grdf_failure: partnersInfo.grdf_failure, notification_activated: isPartnerNotificationOn(), } await partnersInfoService.savePartnersInfo( updatedPartnersInfo, getAxiosXSRFHeader(user.xsrftoken) ) await customPopupService.saveCustomPopup( customPopup, getAxiosXSRFHeader(user.xsrftoken) ) } } return ( <> <div className="header"> <p className="title pagetitle">Paramètres de l'appli</p> </div> <div className="content settings"> {isLoading && <Loader />} {!isLoading && ( <> <h1>Création de Pop-up</h1> <div className="partnersInfo"> <h2 className="title">Affichage des pop-up de panne</h2> <p>Services concernés</p> <div className="switch_div"> <span>Panne Enedis</span> <input type="checkbox" id="switch_enedis" onChange={(event) => { handleCheckboxChange( event.currentTarget.checked, CheckboxType.ENEDIS ) }} checked={partnersInfo.enedis_failure} /> <label htmlFor="switch_enedis"></label> </div> <div className="switch_div"> <span>Panne EGL</span> <input type="checkbox" id="switch_egl" onChange={(event) => { handleCheckboxChange( event.currentTarget.checked, CheckboxType.EGL ) }} checked={partnersInfo.egl_failure} /> <label htmlFor="switch_egl"></label> </div> <div className="switch_div"> <span>Panne GRDF</span> <input type="checkbox" id="switch_grdf" onChange={(event) => { handleCheckboxChange( event.currentTarget.checked, CheckboxType.GRDF ) }} checked={partnersInfo.grdf_failure} /> <label htmlFor="switch_grdf"></label> </div> </div> <div className="customInfo"> <h2 className="title">Affichage de pop-up personnalisée</h2> <div className="switch_div"> <span>Pop-up active</span> <input type="checkbox" id="switch_popup" checked={customPopup.popupEnabled} onChange={(event) => { handleCheckboxChange( event.currentTarget.checked, CheckboxType.CUSTOM ) }} /> <label htmlFor="switch_popup"></label> </div> {customPopup.popupEnabled && ( <> <div className="popupTitle"> <label htmlFor="title">Titre</label> <input type="text" name="title" id="title" placeholder="Titre" value={customPopup.title} onChange={(event) => handlePopupChange(event, 'title')} /> </div> <div className="popupDescription"> <label htmlFor="description">Description</label> <textarea name="description" id="description" placeholder="Description" rows={5} maxLength={250} value={customPopup.description} onChange={(event) => handlePopupChange(event, 'description') } /> <p className="count"> {customPopup.description.length} / 250 </p> </div> </> )} </div> <div className="buttons"> <button className="btnCancel" onClick={handleCancel}> Annuler </button> <button className="btnValid" onClick={handleSave}> Sauvegarder </button> </div> </> )} </div> </> ) } export default Settings