2022-03-21 05:06:56 +00:00
import React , { useState , useEffect , useReducer , useContext } from "react" ;
import MainContainer from "../../components/MainContainer" ;
import api from "../../services/api" ;
import SelectField from "../../components/Report/SelectField" ;
//import { data } from '../../components/Report/MTable/data';
import DatePicker1 from '../../components/Report/DatePicker'
import DatePicker2 from '../../components/Report/DatePicker'
//import { Button } from "@material-ui/core";
import MTable from "../../components/Report/MTable" ;
import PropTypes from 'prop-types' ;
import Box from '@mui/material/Box' ;
import { AuthContext } from "../../context/Auth/AuthContext" ;
import { Can } from "../../components/Can" ;
import SearchIcon from "@material-ui/icons/Search" ;
import TextField from "@material-ui/core/TextField" ;
import InputAdornment from "@material-ui/core/InputAdornment" ;
import Button from "@material-ui/core/Button" ;
import MaterialTable from 'material-table' ;
import Delete from '@material-ui/icons/Delete' ;
import Edit from '@material-ui/icons/Edit' ;
import Save from '@material-ui/icons/Save' ;
2022-03-23 02:59:01 +00:00
import Dialog from '@mui/material/Dialog' ;
import { render } from '@testing-library/react' ;
// import Modal from "../../../..ChatEnd/ModalChatEnd";
import Modal from "../../components/ModalUpdateScheduleReminder" ;
2022-03-29 21:32:48 +00:00
import openSocket from "socket.io-client" ;
2022-03-23 02:59:01 +00:00
2022-03-21 05:06:56 +00:00
import {
IconButton ,
Paper ,
Table ,
TableBody ,
TableCell ,
TableHead ,
TableRow ,
} from "@material-ui/core" ;
import { DeleteOutline } from "@material-ui/icons" ;
import { toast } from "react-toastify" ;
import toastError from "../../errors/toastError" ;
import ConfirmationModal from "../../components/ConfirmationModal" ;
const reducerQ = ( state , action ) => {
if ( action . type === 'LOAD_QUERY' ) {
console . log ( '----------------action.payload: ' , action . payload )
const queries = action . payload
const newQueries = [ ]
queries . forEach ( ( query ) => {
const queryIndex = state . findIndex ( ( q ) => q . id === query . id )
if ( queryIndex !== - 1 ) {
state [ queryIndex ] = query
}
else {
newQueries . push ( query )
}
} )
return [ ... state , ... newQueries ]
}
2022-03-29 21:32:48 +00:00
// if (action.type === "UPDATE_SCHEDULING") {
// const scheduling = action.payload;
// const schedulingIndex = state.findIndex((u) => u.id === +scheduling.id);
// console.log('**************** UPDATE_SCHEDULING scheduleIndex: ', schedulingIndex)
// if (schedulingIndex !== -1) {
// state[schedulingIndex] = scheduling;
// return [...state];
// } else {
// return [scheduling, ...state];
// }
// }
if ( action . type === "DELETE_SCHEDULING" ) {
2022-03-21 05:06:56 +00:00
const scheduleId = action . payload ;
2022-03-29 21:32:48 +00:00
const scheduleIndex = state . findIndex ( ( u ) => u . id === scheduleId ) ;
console . log ( '**************** scheduleIndex: ' , scheduleIndex )
2022-03-21 05:06:56 +00:00
if ( scheduleIndex !== - 1 ) {
state . splice ( scheduleIndex , 1 ) ;
}
2022-03-29 21:32:48 +00:00
return [ ... state ] ;
2022-03-21 05:06:56 +00:00
}
2022-03-29 21:32:48 +00:00
// if (action.type === "DELETE_QUEUE") {
// const queueId = action.payload;
// const queueIndex = state.findIndex((q) => q.id === queueId);
// if (queueIndex !== -1) {
// state.splice(queueIndex, 1);
// }
// return [...state];
// }
2022-03-21 05:06:56 +00:00
if ( action . type === "RESET" ) {
return [ ] ;
}
}
2022-03-24 22:16:31 +00:00
// const reducer = (state, action) => {
2022-03-21 05:06:56 +00:00
2022-03-24 22:16:31 +00:00
// if (action.type === "LOAD_STATUS_CHAT_END") {
// const users = action.payload;
// const newUsers = [];
// users.forEach((user) => {
// const userIndex = state.findIndex((u) => u.id === user.id);
// if (userIndex !== -1) {
// state[userIndex] = user;
// } else {
// newUsers.push(user);
// }
// });
// return [...state, ...newUsers];
// }
// if (action.type === "RESET") {
// return [];
// }
// };
2022-03-21 05:06:56 +00:00
function 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 ,
] ) ,
} ;
2022-03-24 22:16:31 +00:00
// let columnsData = [
2022-03-21 05:06:56 +00:00
2022-03-24 22:16:31 +00:00
// { title: 'Foto', field: 'ticket.contact.profilePicUrl', render: rowData => <img src={rowData['ticket.contact.profilePicUrl']} style={{width: 40, borderRadius: '50%'}}/> },
2022-03-21 05:06:56 +00:00
2022-03-24 22:16:31 +00:00
// { title: 'Nome', field: 'ticket.contact.name' },
// { title: 'Contato', field: 'ticket.contact.number' },
// { title: 'schedulingTime', field: 'schedulingTime' },
// { title: 'schedulingDate', field: 'schedulingDate' },
// { title: 'message', field: 'message' },
2022-03-21 05:06:56 +00:00
2022-03-24 22:16:31 +00:00
// ];
2022-03-21 05:06:56 +00:00
const SchedulesReminder = ( ) => {
const { user : userA } = useContext ( AuthContext ) ;
//--------
const [ searchParam ] = useState ( "" ) ;
2022-03-24 22:16:31 +00:00
const [ loading , setLoading ] = useState ( null ) ;
2022-03-21 05:06:56 +00:00
//const [hasMore, setHasMore] = useState(false);
const [ pageNumber , setPageNumber ] = useState ( 1 ) ;
2022-03-24 22:16:31 +00:00
// const [users, dispatch] = useReducer(reducer, []);
2022-03-21 05:06:56 +00:00
//const [columns, setColums] = useState([])
const [ startDate , setDatePicker1 ] = useState ( new Date ( ) )
const [ endDate , setDatePicker2 ] = useState ( new Date ( ) )
const [ userId , setUser ] = useState ( null )
const [ query , dispatchQ ] = useReducer ( reducerQ , [ ] )
const [ contactNumber , setContactNumber ] = useState ( "" ) ;
const [ resetChild , setReset ] = useState ( false )
const [ selectedSchedule , setSelectedSchedule ] = useState ( null ) ;
const [ confirmModalOpen , setConfirmModalOpen ] = useState ( false ) ;
const [ dataRows , setData ] = useState ( [ ] ) ;
2022-03-23 02:59:01 +00:00
const [ statusEndChat , setStatusEndChat ] = useState ( null )
2022-03-29 21:32:48 +00:00
useEffect ( ( ) => {
const socket = openSocket ( process . env . REACT _APP _BACKEND _URL ) ;
socket . on ( "schedulingNotify" , ( data ) => {
console . log ( 'SOCKET IO' )
setLoading ( true ) ;
// if (data.action === "update" || data.action === "create") {
// console.log('UPDATE_SCHEDULING: ', data.schedulingNotifyCreate)
// // dispatchQ({ type: "UPDATE_SCHEDULING", payload: data.schedulingNotifyCreate });
// }
if ( data . action === "delete" ) {
console . log ( 'DELETE_SCHEDULING id: ' , data . schedulingNotifyId )
dispatchQ ( { type : "DELETE_SCHEDULING" , payload : + data . schedulingNotifyId } ) ;
//handleDeleteRows(data.schedulingNotifyId)
}
setLoading ( false ) ;
} ) ;
return ( ) => {
socket . disconnect ( ) ;
} ;
} , [ ] ) ;
2022-03-21 05:06:56 +00:00
useEffect ( ( ) => {
2022-03-24 22:16:31 +00:00
// dispatch({ type: "RESET" });
2022-03-21 05:06:56 +00:00
dispatchQ ( { type : "RESET" } )
setPageNumber ( 1 ) ;
} , [ searchParam ] ) ;
2022-03-24 22:16:31 +00:00
//natalia
2022-03-21 05:06:56 +00:00
useEffect ( ( ) => {
2022-03-24 22:16:31 +00:00
// setLoading(true);
2022-03-21 05:06:56 +00:00
const delayDebounceFn = setTimeout ( ( ) => {
2022-03-24 22:16:31 +00:00
const fetchStatusChatEnd = async ( ) => {
2022-03-21 05:06:56 +00:00
try {
2022-03-24 22:16:31 +00:00
const statusChatEndLoad = await api . get ( "/statusChatEnd" , {
2022-03-21 05:06:56 +00:00
params : { searchParam , pageNumber } ,
} ) ;
2022-03-24 22:16:31 +00:00
// dispatch({ type: "LOAD_STATUS_CHAT_END", payload: statusChatEndLoad.data });
console . log ( ':::::::::::::: statusChatEndLoad: ' , statusChatEndLoad . data )
2022-03-29 21:32:48 +00:00
2022-03-24 22:16:31 +00:00
2022-03-29 21:32:48 +00:00
setStatusEndChat ( statusChatEndLoad . data . filter ( status => ( status . id == '2' || status . id == '3' ) ) )
2022-03-21 05:06:56 +00:00
//setHasMore(data.hasMore);
2022-03-24 22:16:31 +00:00
// setLoading(false);
2022-03-21 05:06:56 +00:00
} catch ( err ) {
console . log ( err ) ;
}
} ;
2022-03-24 22:16:31 +00:00
fetchStatusChatEnd ( ) ;
2022-03-21 05:06:56 +00:00
} , 500 ) ;
return ( ) => clearTimeout ( delayDebounceFn ) ;
} , [ searchParam , pageNumber ] ) ;
useEffect ( ( ) => {
2022-03-24 22:16:31 +00:00
setLoading ( true ) ;
2022-03-21 05:06:56 +00:00
const delayDebounceFn = setTimeout ( ( ) => {
const fetchQueries = async ( ) => {
try {
const dataQuery = await api . get ( "/schedules/" , { params : { contactNumber , startDate , endDate } , } ) ;
dispatchQ ( { type : "RESET" } )
dispatchQ ( { type : "LOAD_QUERY" , payload : dataQuery . data } ) ;
2022-03-24 22:16:31 +00:00
setLoading ( false ) ;
2022-03-21 05:06:56 +00:00
} catch ( err ) {
console . log ( err ) ;
}
} ;
fetchQueries ( ) ;
} , 500 ) ;
return ( ) => clearTimeout ( delayDebounceFn ) ;
} , [ contactNumber , startDate , endDate ] ) ;
2022-03-24 22:16:31 +00:00
useEffect ( ( ) => {
if ( ! loading ) {
console . log ( 'carregando table...' )
2022-03-28 19:28:35 +00:00
2022-03-29 21:32:48 +00:00
// const dataLoad = query.map(({ scheduleReminder, ...others }) => (
2022-03-28 19:28:35 +00:00
2022-03-29 21:32:48 +00:00
// { ...others, 'scheduleReminder': others.statusChatEndId == '3' ? 'Agendamento' : 'Lembrete' }
2022-03-28 19:28:35 +00:00
2022-03-29 21:32:48 +00:00
// ));
2022-03-28 19:28:35 +00:00
2022-03-29 21:32:48 +00:00
// console.log('NEW DATA: ', dataLoad)
2022-03-28 19:28:35 +00:00
setData ( query . map ( ( { scheduleReminder , ... others } ) => (
{ ... others , 'scheduleReminder' : others . statusChatEndId == '3' ? 'Agendamento' : 'Lembrete' }
) ) )
2022-03-24 22:16:31 +00:00
}
} , [ loading ] )
2022-03-21 05:06:56 +00:00
// Get from child 1
const datePicker1Value = ( data ) => {
console . log ( 'DATE1: ' , ( data ) ) ;
setDatePicker1 ( data )
}
// Get from child 2
const datePicker2Value = ( data ) => {
console . log ( 'DATE2: ' , ( data ) ) ;
setDatePicker2 ( data )
}
// Get from child 3
const textFieldSelectUser = ( data ) => {
console . log ( 'textField: ' , data ) ;
setUser ( data )
}
const handleSearch = ( event ) => {
setContactNumber ( event . target . value . toLowerCase ( ) ) ;
} ;
const handleClear = ( ) => {
setContactNumber ( '' )
setReset ( true )
}
const handleCloseConfirmationModal = ( ) => {
setConfirmModalOpen ( false ) ;
2022-03-24 22:16:31 +00:00
console . log ( 'cancelou NULL 1' )
2022-03-21 05:06:56 +00:00
setSelectedSchedule ( null ) ;
} ;
const handleDeleteRows = ( id ) => {
let _data = [ ... dataRows ] ;
_data . forEach ( rd => {
_data = _data . filter ( t => t . id !== id ) ;
} ) ;
setData ( _data ) ;
} ;
const handleDeleteSchedule = async ( scheduleId ) => {
try {
await api . delete ( ` /schedule/ ${ scheduleId } ` ) ;
2022-03-28 19:28:35 +00:00
toast . success ( ( "Lembrete/Agendamento deletado com sucesso!" ) ) ;
2022-03-29 21:32:48 +00:00
//handleDeleteRows(scheduleId)
2022-03-21 05:06:56 +00:00
} catch ( err ) {
toastError ( err ) ;
}
2022-03-24 22:16:31 +00:00
console . log ( 'cancelou NULL 2' )
2022-03-21 05:06:56 +00:00
setSelectedSchedule ( null ) ;
} ;
2022-03-24 22:16:31 +00:00
const handleUpdateSchedule = async ( scheduleData , rowsDataNew ) => {
2022-03-28 19:28:35 +00:00
try {
2022-03-24 22:16:31 +00:00
await api . post ( "/schedule" , scheduleData ) ;
2022-03-28 19:28:35 +00:00
toast . success ( ( "Lembrete/Agendamento atualizado com sucesso!" ) ) ;
2022-03-24 22:16:31 +00:00
//////////////////
const dataUpdate = [ ... dataRows ] ;
const index = rowsDataNew . tableData [ 'id' ] ;
dataUpdate [ index ] = rowsDataNew ;
2022-03-28 19:28:35 +00:00
setData ( [ ... dataUpdate ] . map ( ( { scheduleReminder , ... others } ) => (
{ ... others , 'scheduleReminder' : others . statusChatEndId == '3' ? 'Agendamento' : 'Lembrete' }
) ) ) ;
2022-03-24 22:16:31 +00:00
/////////////////
2022-03-23 02:59:01 +00:00
2022-03-24 22:16:31 +00:00
} catch ( err ) {
toastError ( err ) ;
}
//console.log('cancelou NULL 3')
setSelectedSchedule ( null ) ;
} ;
const chatEndVal = ( data , rowsDataNew ) => {
2022-03-23 02:59:01 +00:00
if ( data ) {
console . log ( 'DATA SCHECULE: ' , data )
2022-03-24 22:16:31 +00:00
console . log ( ':::::::::::::::::::: ChatEnd2: ' , ( data ) ) ;
console . log ( ':::::::::::::::::::: Rows data fro child: ' , ( rowsDataNew ) ) ;
2022-03-23 02:59:01 +00:00
2022-03-24 22:16:31 +00:00
handleUpdateSchedule ( data , rowsDataNew )
2022-03-23 02:59:01 +00:00
}
}
const handleModal = ( rowData ) => {
2022-03-28 19:28:35 +00:00
// NATY
2022-03-23 02:59:01 +00:00
render ( < Modal
modal _header = { 'Editar Lembrete/Agendamentos' }
func = { chatEndVal }
2022-03-24 22:16:31 +00:00
statusChatEnd = { statusEndChat }
2022-03-28 19:28:35 +00:00
// textBoxFieldSelected={'2'}
2022-03-24 22:16:31 +00:00
rowData = { rowData }
2022-03-23 02:59:01 +00:00
/ > )
} ;
2022-03-21 05:06:56 +00:00
return (
< MainContainer >
< Box sx = { { display : 'grid' , gridTemplateColumns : 'repeat(3, 1fr)' } } >
< Item >
< TextField
placeholder = 'Numero/Nome...'
type = "search"
value = { contactNumber }
onChange = { handleSearch }
InputProps = { {
startAdornment : (
< InputAdornment position = "start" >
< SearchIcon style = { { color : "gray" } } / >
< / I n p u t A d o r n m e n t >
) ,
} }
/ >
< / I t e m >
{ / * < I t e m >
< SelectField func = { textFieldSelectUser } emptyField = { true } header = { 'Usuário' } currencies = { users . map ( ( obj ) => {
return { 'value' : obj . id , 'label' : obj . name }
} ) } / >
< /Item> */ }
< Item > < DatePicker1 func = { datePicker1Value } minDate = { false } startEmpty = { true } reset = { resetChild } setReset = { setReset } title = { 'Data inicio' } / > < / I t e m >
< Item > < DatePicker2 func = { datePicker2Value } minDate = { false } startEmpty = { true } reset = { resetChild } setReset = { setReset } title = { 'Data fim' } / > < / I t e m >
< Item sx = { { gridColumn : '4 / 5' } } >
{ /* <Button size="small" variant="contained" onClick={()=>{handleQuery()}}>GO</Button>*/ }
< Button
variant = "contained"
color = "primary"
onClick = { ( e ) => handleClear ( ) }
>
{ "CLEAR" }
< / B u t t o n >
< / I t e m >
< / B o x >
< Box sx = { {
display : 'grid' ,
} } >
2022-03-24 22:16:31 +00:00
< Item sx = { { gridColumn : '1' , gridRow : 'span 1' } } >
2022-03-21 05:06:56 +00:00
< ConfirmationModal
2022-03-28 19:28:35 +00:00
title = { selectedSchedule && ` Deletar ${ selectedSchedule . statusChatEndId == '2' ? 'lembrete' : 'agendamento' } do dia ${ selectedSchedule . schedulingDate . split ( ' ' ) [ 0 ] } ${ selectedSchedule . schedulingDate . split ( ' ' ) [ 1 ] } ? ` }
2022-03-21 05:06:56 +00:00
open = { confirmModalOpen }
onClose = { handleCloseConfirmationModal }
onConfirm = { ( ) => handleDeleteSchedule ( selectedSchedule . id ) }
>
2022-03-28 19:28:35 +00:00
< span > Deseja realmente deletar esse lembrete / agendamento ? < / s p a n >
2022-03-21 05:06:56 +00:00
< / C o n f i r m a t i o n M o d a l >
< MaterialTable
title = "Lembretes/Agendamentos"
2022-03-24 22:16:31 +00:00
columns = {
[
{ title : 'Foto' , field : 'ticket.contact.profilePicUrl' , render : rowData => < img src = { rowData [ 'ticket.contact.profilePicUrl' ] } style = { { width : 40 , borderRadius : '50%' } } / > } ,
{ title : 'Nome' , field : 'ticket.contact.name' } ,
2022-03-28 19:28:35 +00:00
{ title : 'Contato' , field : 'ticket.contact.number' } ,
{ title : 'Lemb/Agen' , field : 'scheduleReminder' } ,
{ title : 'Envio' , field : 'schedulingTime' } ,
{ title : 'Data' , field : 'schedulingDate' } ,
{ title : 'Mensagem' , field : 'message' , width : "80%" } ,
2022-03-24 22:16:31 +00:00
]
}
2022-03-21 05:06:56 +00:00
data = { dataRows }
// icons={tableIcons}
actions = { [
{
icon : Edit ,
tooltip : 'Editar' ,
2022-03-23 02:59:01 +00:00
onClick : ( event , rowData ) => {
2022-03-24 22:16:31 +00:00
console . log ( "You want edit data " , rowData )
setSelectedSchedule ( rowData ) ;
handleModal ( rowData )
2022-03-23 02:59:01 +00:00
}
2022-03-24 22:16:31 +00:00
2022-03-21 05:06:56 +00:00
} ,
{
icon : Delete ,
tooltip : 'Deletar' ,
onClick : ( event , rowData ) => {
console . log ( "You want to delete " , rowData )
setSelectedSchedule ( rowData ) ;
setConfirmModalOpen ( true ) ;
}
// onClick: handleDeleteRows
}
] }
2022-03-28 19:28:35 +00:00
options = {
{
2022-03-21 05:06:56 +00:00
search : true ,
selection : false ,
paging : false ,
padding : 'dense' ,
sorting : true ,
//loadingType: 'linear',
searchFieldStyle : {
width : 300 ,
} ,
2022-03-28 19:28:35 +00:00
2022-03-29 21:32:48 +00:00
pageSize : 20 ,
headerStyle : {
position : "sticky" ,
top : "0"
} ,
maxBodyHeight : "400px" ,
2022-03-28 19:28:35 +00:00
rowStyle : {
fontSize : 12 ,
}
2022-03-21 05:06:56 +00:00
} }
/ >
< / I t e m >
< / B o x >
< / M a i n C o n t a i n e r >
)
} ;
export default SchedulesReminder ;