import React, { useState, useEffect, useRef, useReducer } from 'react'; import Button from '@mui/material/Button'; import Dialog from '@mui/material/Dialog'; import DialogActions from '@mui/material/DialogActions'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import PropTypes from 'prop-types'; import Box from '@mui/material/Box'; import SelectField from "../../Report/SelectField"; import DatePicker from '../../Report/DatePicker' import TimerPickerSelect from '../TimerPickerSelect' import TextareaAutosize from '@mui/material/TextareaAutosize'; // import { subHours } from "date-fns"; import { IconButton, Paper, Table, TableBody, TableCell, TableHead, TableRow, } from "@material-ui/core"; import { DeleteOutline } from "@material-ui/icons"; import { toast } from "react-toastify"; import api from "../../../services/api"; import toastError from "../../../errors/toastError"; import ConfirmationModal from "../../ConfirmationModal"; const reducer = (state, action) => { if (action.type === "LOAD_SCHEDULES") { const schedulesContact = action.payload; const newSchedules= []; schedulesContact.forEach((schedule) => { const scheduleIndex = state.findIndex((s) => s.id === schedule.id); if (scheduleIndex !== -1) { state[scheduleIndex] = schedule; } else { newSchedules.push(schedule); } }); return [...state, ...newSchedules]; } if (action.type === "DELETE_SCHEDULE") { const scheduleId = action.payload; const scheduleIndex = state.findIndex((q) => q.id === scheduleId); if (scheduleIndex !== -1) { state.splice(scheduleIndex, 1); } return [...state]; } if (action.type === "RESET") { return []; } }; const Item = (props) => { const { sx, ...other } = props; return ( <Box sx={{ bgcolor: (theme) => (theme.palette.mode === 'dark' ? '#101010' : '#fff'), color: (theme) => (theme.palette.mode === 'dark' ? 'grey.300' : 'grey.800'), border: '1px solid', borderColor: (theme) => theme.palette.mode === 'dark' ? 'grey.800' : 'grey.300', p: 1, m: 1, borderRadius: 2, fontSize: '0.875rem', fontWeight: '700', ...sx, }} {...other} /> ); } Item.propTypes = { sx: PropTypes.oneOfType([ PropTypes.arrayOf( PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool]), ), PropTypes.func, PropTypes.object, ]), }; const Modal = (props) => { // const [clientSchedules, dispatch] = useReducer(reducer, []); const [selectedSchedule, setSelectedSchedule] = useState(null); const [confirmModalOpen, setConfirmModalOpen] = useState(false); const [open, setOpen] = useState(true); const [scroll, /*setScroll*/] = useState('body'); const [statusChatEndId, setStatusChatEnd] = useState(null) const [startDate, setDatePicker] = useState(new Date()) const [timerPicker, setTimerPicker] = useState(new Date()) const [textArea1, setTextArea1] = useState() const [schedulesContact, dispatch] = useReducer(reducer, []); const handleCancel = (event, reason) => { if (reason && reason === "backdropClick") return; setOpen(false); }; useEffect(() => { (async () => { try { const { data } = await api.get("/tickets/" + props.ticketId); dispatch({ type: "LOAD_SCHEDULES", payload: data.schedulesContact }); } catch (err) { toastError(err); } })(); }, [props]); function formatedTimeHour(timer){ return `${timer.getHours().toString().padStart(2, '0')}:${timer.getMinutes().toString().padStart(2, '0')}` } function formatedFullCurrentDate(){ let dateCurrent = new Date() let day = dateCurrent.getDate().toString().padStart(2, '0'); let month = (dateCurrent.getMonth()+1).toString().padStart(2, '0'); let year = dateCurrent.getFullYear(); return `${year}-${month}-${day}`; } const handleCloseConfirmationModal = () => { setConfirmModalOpen(false); setSelectedSchedule(null); }; const handleDeleteSchedule = async (scheduleId) => { try { await api.delete(`/schedule/${scheduleId}`); toast.success(("Lembrete deletado com sucesso!")); dispatch({ type: "DELETE_SCHEDULE", payload: scheduleId }); } catch (err) { toastError(err); } setSelectedSchedule(null); }; // Get from child 2 const datePickerValue = (data) => { console.log('datePickerValue: ',(data)); setDatePicker(data) } // Get from child 3 const timerPickerValue = (data) => { console.log('timerPickerValue: ',(data)); setTimerPicker(data) } const handleChatEnd = (event, reason) => { let dataSendServer = {'statusChatEndId': statusChatEndId} if (reason && reason === "backdropClick") return; if (statusChatEndId === '2'){ console.log('Entrou! textArea1: ', textArea1) if(textArea1 && textArea1.trim().length<5){ alert('Mensagem muito curta!') return } else if(!textArea1){ alert('Defina uma mensagem para enviar para o cliente!') return } else if(formatedFullCurrentDate()===startDate){ if((new Date(timerPicker).getHours() < new Date().getHours() && new Date(timerPicker).getMinutes() <= new Date().getMinutes()) || (new Date(timerPicker).getHours() === new Date().getHours() && new Date(timerPicker).getMinutes() <= new Date().getMinutes()) || (new Date(timerPicker).getHours() < new Date().getHours() && new Date(timerPicker).getMinutes() >= new Date().getMinutes()) || (new Date(timerPicker).getHours() < new Date().getHours)){ alert('Horário menor ou igual horário atual!') return } } else if((new Date(timerPicker).getHours() > 20 && new Date(timerPicker).getMinutes() > 0) || (new Date(timerPicker).getHours() < 6)){ alert('Horário comercial inválido!\n Selecione um horário de lembrete válido entre às 06:00 e 20:00') return } dataSendServer = { 'statusChatEndId': statusChatEndId, 'schedulingDate': startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`)), 'schedulingTime': startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`)), 'message': textArea1 } } props.func(dataSendServer) setOpen(false); }; const descriptionElementRef = useRef(null); useEffect(() => { if (open) { const { current: descriptionElement } = descriptionElementRef; if (descriptionElement !== null) { descriptionElement.focus(); } } }, [open]); // Get from child 1 const textFieldSelect = (data) => { console.log('textFieldSelect: ',data); setStatusChatEnd(data) } const handleChange = (event) => { setTextArea1(event.target.value); }; return ( <Dialog open={open} onClose={handleCancel} // fullWidth={true} // maxWidth={true} disableEscapeKeyDown scroll={scroll} aria-labelledby="scroll-dialog-title" aria-describedby="scroll-dialog-description" > <DialogTitle id="scroll-dialog-title">{props.modal_header}</DialogTitle> <DialogContent dividers={scroll === 'body'}> <DialogContentText id="scroll-dialog-description" ref={descriptionElementRef} tabIndex={-1} > </DialogContentText> <Box sx={{ width: 500, height: '100%', // backgroundColor: 'primary.dark', // '&:hover': {backgroundColor: 'primary.main', opacity: [0.9, 0.8, 0.7],}, }}> <Box sx={{ display: 'grid', }}> <Item> <span>Selecione uma opção para encerrar o Atendimento</span> <SelectField func={textFieldSelect} emptyField={false} header={'Opções de encerramento do atendimento'} currencies={props.statusChatEnd.map((obj)=>{ return {'value': obj.id, 'label': obj.name} })}/> </Item> </Box> {statusChatEndId==='2' && <Item> <span>Lembrete</span> <Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)' }}> <Item><DatePicker func={datePickerValue} minDate={true} startEmpty={true} title={'Data do lembrete'}/></Item> <Item><TimerPickerSelect func={timerPickerValue} title={'Hora do lembrete'}/></Item> </Box> <Box sx={{display: 'flex', flexDirection: 'column' }}> <Item> <TextareaAutosize aria-label="minimum height" minRows={3} value={textArea1} placeholder={'Mensagem de envio para cliente'} onChange={ handleChange} style={{ width: '100%' }} /> </Item> </Box> </Item> } {schedulesContact.length>0 && <Item> <ConfirmationModal title={selectedSchedule && `Deletar lembrete do dia ${selectedSchedule.schedulingTime.split(' ')[0]} ${selectedSchedule.schedulingTime.split(' ')[1]} ?`} open={confirmModalOpen} onClose={handleCloseConfirmationModal} onConfirm={() => handleDeleteSchedule(selectedSchedule.id)} > <span>Deseja realmente deletar esse Lembrete? </span> </ConfirmationModal> <span>Lembretes</span> <Paper variant="outlined"> <Table size="small"> <TableHead> <TableRow> <TableCell align="center"> Data </TableCell> <TableCell align="center"> Hora </TableCell> <TableCell align="center"> Mensagem </TableCell> <TableCell align="center"> Deletar </TableCell> </TableRow> </TableHead> <TableBody> <> {schedulesContact.map((scheduleData, index) => ( <TableRow key={scheduleData.id}> <TableCell align="center">{scheduleData.schedulingDate.split(' ')[0]}</TableCell> <TableCell align="center">{scheduleData.schedulingTime.split(' ')[1]}</TableCell> <TableCell align="center">{scheduleData.message}</TableCell> <TableCell align="center"> <IconButton size="small" onClick={() => { setSelectedSchedule(scheduleData); setConfirmModalOpen(true); }} > <DeleteOutline /> </IconButton> </TableCell> </TableRow> ))} </> </TableBody> </Table> </Paper> </Item>} </Box> </DialogContent> <DialogActions> <div style={{marginRight:'50px'}}> <Button onClick={handleCancel}>Cancelar</Button> </div> <Button onClick={handleChatEnd}>Ok</Button> </DialogActions> </Dialog> ); } export default Modal